pax_global_header00006660000000000000000000000064141636475440014530gustar00rootroot0000000000000052 comment=523a24d81946f2ec6e768a146364ee7c92a56c62 libnumbertext-1.0.8/000077500000000000000000000000001416364754400144225ustar00rootroot00000000000000libnumbertext-1.0.8/.travis.yml000066400000000000000000000003521416364754400165330ustar00rootroot00000000000000language: cpp script: - autoreconf -i - CC=gcc-7 CXX=g++-7 ./configure - make - make -f Makefile.orig check addons: apt: sources: - ubuntu-toolchain-r-test packages: - g++-7 libnumbertext-1.0.8/AUTHORS000066400000000000000000000254641416364754400155050ustar00rootroot00000000000000Authors and contributors of NUMBERTEXT/MONEYTEXT development = Developer = László Németh (nemeth at numbertext dot org): - Soros programming language and its interpreters - several language modules = Language module developers = Mihail Balabanov (m dot balabanov at gmail dot com): - author of Bulgarian module (bg) Alex Bodnaru (alexbodn at 012 dot net dot il): - author of Hebrew module (he_IL) Asterisks at OOo Wiki: - author of Latvian module Adrián Chaves (adrian at chaves dot io): - author of Galician module (gl) - fix for Spanish: use plural for 0 (in currency) Dario Gallucci (dario-gallucci at GitHub - issue #42): - review ordinal numbers in Italian module Ankur Heramb Joshi: - author of Marathi module Mike Kaganski (mikekaganski at hotmail dot com: - author of ordinal numbers of Russian module (ru) - various fixes - tdf#115007: add LibreOffice NatNum codes for cardinal/ordinal number names/indicators Alvar Laigna (alvar at bind dot ee): - review and fix Estonian module (et) Eduardo Moreno (emoreno at tokonhu dot com): - author of the first version of the Portuguese module (pt-PT) - bug reports about Spanish module and short language code "es" Olexandr Nesterenko (olexn at ukr dot net): - various fixes in Ukrainian module Eko Prasetiyo (ekoprasetiyo at gmail): - author of Indonesian module Phillip Samuel (phillipsamuelk3 at gmail dot com): - author of Luganda module Goran Rakić (grakic at devbase dot net): - author of Serbian modules (sh-RS, sr-RS) Randem: - author of Turkish module (tr) Olivier Ronez: - patches for French language module (fr-FR): - Spelling mistakes in the French file (https://bugs.launchpad.net/numbertext/+bug/419718) - 81 in French (https://bugs.launchpad.net/numbertext/+bug/419729) - milliard etc. instead of *milliarde (https://bugs.launchpad.net/numbertext/+bug/419718) - author of Belgian and Swiss French modules (fr-BE and fr-CH): - French numbers in Belgium (https://bugs.launchpad.net/numbertext/+bug/419731) - French numbers in Switzerland (https://bugs.launchpad.net/numbertext/+bug/419734) Mihovil Stanić (mihovil dot stanic at gmail dot com): - author of Croatian module (hr) Suokunlong: (suokunlong at 126 dot com): - author of real native Simplified Chinese module (zh) DaeHyun Sung (sungdh86 at gmail): - review and fix Korean module (ko) and add won unit to English Michel Weimerskirch (michel at weimerskirch dot net): - author of Luxembourgish module (lb-LU) = Contributors = 4560041 at GitHub (issue #93): - bug report about French: use hyphens instead of spaces, e.g. cent-deux Liudas Ališauskas (liudas dot alisauskas at gmail dot com): - fix Lithuanian money handling andritis at GitHub (issue #52): - fix 19 in in Latvian module arena94 at GitHub (issue #89–#90): - bug report about French: missing formal 1100 and feminine armik71 at GitHub (issue #41): - report problem with fix EUR 200, EUR 300 etc. in French module Mushtaque Asghar: - bug report about missing XLS portability in http://extensions.services.openoffice.org/project/numbertext Attilafdd at launchpad dot net: - fix Italian comma in it_IT module ("virgula" instead of "komma"). Ruud Baars: - bug reports about Dutch module Adolfo Jayme Barrientos (fitojb at ubuntu dot com): - fix typo on web page - fix Esperanto ordinal indicators (1-a instead of 1.) Stephan Bergmann: - bug report about CXXFLAGS configuration problem - fixes in LibreOffice for external/libnumbertext - don't depend on en_US.UTF-8 locale Tomáš Chvátal (tchvatal at suse dot com): - add enable-boost option to work with older gcc-4.8 and like using boost, default off Claudio Colombo (claudio underline c77 at yahoo dot it): - it_IT bug report ("*unocento") Dániel Darabos: - suggested __import__ for simple lazy loading in PyUNO implementation of OpenOffice.org NUMBERTEXT extension Susana Sotelo Docío: - fix for numbers containing the string "ientos" (doscientos/as, quinientos/as, novecientos/as, etc) in Spanish module Rene Engelhard: - Debian packaging, fix DEFPATH in spellout, libnumbertext bug reports - report Python FutureWarning: Possible nested set at position Spiros Evangelatos (sevangelatos at gmail): - fixes in Greek module: "and" in currency fractions and "0 euro" Aurimas Fišeras (aurimas at members fsf org): - various fixes for Lithuanian module Gabryha at GitHub: - bug report for Polish: fix ordinal 20-29 Sophie Gautier: - bug report for French: milliard etc. instead of *milliarde georgepyh at OOo extension: - bug report for Russian Lucian Adrian Grijincu (lucian dot grijincu at gmail): - reported missing gender support in Romanian MONEYTEXT implementation: https://bugs.launchpad.net/bugs/421309) Tuomas Hietala (tjhietala at github): - fixes and bug reports for Finnish Stanislav Horáček: - bug report for Czech module Hsonesson1 at GitHub: - bug report for Danish (en million, not et million etc.) Li-Wen Hsu (lwhsu at lwhsu dot org): - add prefix-based datadir handling to Makefile.am Ilya Idamkin (ilya dot idamkin at duallab): - port nn/nb language code handling to Java from C++ - fix handling of Thai 1 - fix typos Bee Ing at GitHub: - add Malay currency MYR Alexander Ivanov (contributorpw at GitHub): - add cardinal functions to Russian module - tutorial fixes - fix feminine RUB, UAH Jmzambon at OOO Wiki: - patch for French un/une handling for currencies Juanma Sanchez (JuanmaSP at GitHub): - bug report for boundary issue with optional function at Spanish and other languages Kent Karlsson: - reported Swedish gender problem with currencies in sv_SE.sor. Vladislav Kiper : - fix Thai numbers greater than 999,999 Viktor Kovács: - add "sch" to "s", "ä" to "é" transliteration to Old Hungarian, fix change of "ü" and "ű" Mantas Kriaučiūnas at Launchpad.net: - hints for Lithuanian module Kty0mka at GitHub: - report bad euro cent in Ukrainian module Rimas Kudelis: - bug report for default Lithuanian currency c-kuehl at GitHub: - patch for German (function year) mike8p at launchpad.net: - Spanish module: bug report for y dos cents -> con dos céntimos Volodymyr Lisivka: - bug report about Ukrainian: replace apostrophe symbol to U+02BC Marcin Miłkowski (milek_pl at o2 dot pl): - patch for Polish: https://bugs.launchpad.net/numbertext/+bug/421031: - correct special affixation of number names after 2, 3 and 4 Ming-Hua at GitHub: - bug report about Chinese: missing ordinal numbers, use always 二 Petr Mladek: - bug report about document language detection in OOo 3.2 Joan Montané (jmontane at openoffice dot org): - patch for Catalan (http://wiki.services.openoffice.org/wiki/Talk:NUMBERTEXT/MONEYTEXT_development#Some_fixes_on_Catalan_definition): - "amb" instead of "und" - "cèntim" instead of (euro)cent - "menys" for negative - reported missing gender support for Catalan and Spanish (http://wiki.services.openoffice.org/wiki/Talk:NUMBERTEXT/MONEYTEXT_development#Some_languages_need_male.2Ffemale_option_for_number_to_text) - various fixes and extensions for Catalan Julien2412 (serval2412 at yahoo dot fr): - bug report and initial patches in Python 3 port (tabulator inconsistency, terminating white spaces) Bernard Marcelly (bmarcelly at openoffice dot org): - bug report for French (http://wiki.services.openoffice.org/wiki/Talk:NUMBERTEXT/MONEYTEXT_development#French_numbering_remarks): - syntax of decimals - cent instead of un cent - milliard etc. instead of *milliarde - "et" instead of "y" - virgule instead of comma - point instead of comma in fr-CH - "moins" instead of "négatif de" - bug report about missing conversion beetween 0 and 1 Jerzy Moruś (morchat at o2 dot pl): - Polish translation of NUMBERTEXT/MONEYTEXT mrw at OOo Extension site: - bug report about document language detection in OOo 3.2 Balázs Meskó: - clean-up Java implementation, adding also Maven support Valter Mura: - bug report for Italian Julien Nabet (serval2412 at yahoo dot fr): - fix cppcheck warnings - report locale compiling problem Stephan Nilsson (Stephan at Nilsson dot tf): - sv_SE bug report: the Swedish 7 is "sju", not *sjo Shantanu Oak (shantanu dot oak at gmail): - various fixes in Marathi module Zoltán Óvári (ovari123 at zoho dot org): - report problem with Old Hungarian transliteration of "Vörösmarty" and similar words in LibreOffice issue tdf#136368 Nicolas Pagni (Nicolas dot Pagni at npagni dot it): - bug report about the bad conversion of 1 eurocent in the Italian module Pintert3 at GitHub: - bug report about outdated documentation Gwenaël Quenette (g_quenette at yahoo dot fr): - bug report for the Portuguese module: cientos -> centos Eike Rathke (er at OpenOffice dot org): - suggested new namespace and compatibility name usage. Modestas Rimkus: - Lithuanian typo, correct ordinal indicator rogerclc at OOo extesion site: - bug report about Russian MONEYTEXT conversion (russian grammar) Johanna Sørensen: - bug report about "Dansk" language name on Numbertext.org home page Martin Srebotnjak: - testing Slovenian module, information about ordinal and ordinal adverbial numbers Marcin Stępniak: - patch to set default UTF-8 encoding in numbertext.jar Supapong at OOo Wiki: - bug report about Thai numbers ending with "01" (Excel BAHTTEXT bug) Sylvaticus at GitHub: - suggesting better introduction on web site Kálmán Szalai (Kami): - ooo-build integration of Numbertext OpenOffice.org extension tengwar: - bug report for Polish (pl) module: bad ordinal numbers András Tímár (timar74 at gmail dot com): - official reviewer, as activist of FSF.hu Foundation, Hungary Tantai Thanakanok (tantai osdev co th): - patch for extended Thai decimal support (1 and more than 2 digits with currencies) Rens Toonen (rens toonen at topicus nl): - Java fix for Windows: replaced the system line seperator with a fixed value. tyindeepit at GitHub: - patch for Thai module to fix currency with 1 digit decimal and handling of digit 1 xhydrogene at launchpad dot net: - bug reports for French (fr_FR) module: - "comma" must be translated in french "virgule" (https://bugs.launchpad.net/numbertext/+bug/421148) - "y" must be translated in french "et" (https://bugs.launchpad.net/numbertext/+bug/421151) - "un mille" must be writed only "mille" in french (https://bugs.launchpad.net/numbertext/+bug/421164) Miklós Vajna (vmiklos at collabora dot co dot uk): - code clean-ups - small performance improvement during Soros compiling - add Travis CI integration - README to MarkDown Laimonas Vėbra (laimis) at LaunchPad: - hints for Lithuanian module wasow at extensions openoffice org: - bug report and patch (+UAH) to the Russian module Friedel Wolff (friedel at translate dot org dot za): - bug report for Africaans module libnumbertext-1.0.8/COPYING000066400000000000000000000027031416364754400154570ustar00rootroot00000000000000Copyright 2009–2019 László Németh et al. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libnumbertext-1.0.8/CalcAddIn.xcu000066400000000000000000000222251416364754400167100ustar00rootroot00000000000000 NUMBERTEXT Converts number to number name. Convierte números en palabras. Przekształca liczbę na postać słowną. Część ułamkowa wymieniana jest jako kolejne cyfry. Convertit un nombre en texte. Számot számnévvé alakít. Исписује број словима. Ispisuje broj slovima. ממיר מספר לייצוגו במילים. Преобразува число към думи. Перетворює число в текст. Add-In org.NUMBERTEXT.numbertext Number Número Liczba Nombre Szám Број Broj מספר Число Число Value. Valor. Wartość. Valeur. Az átalakítandó szám. Вредност. Vrednost. ערך קלט. Стойност. Значення. Language Idioma Język Langue Nyelv Језик Jezik שפה Език Мова Language code (eg. en-US). Código del idioma (p. ej., es-MX). Kod języka w jakim ma być podany rezultat (np. pl - polski, en - angielski, ru - rosyjski). Code langue (exemple fr-BE). Nyelvkód (pl. hu-HU). Код језика (нпр. sr или sh). Kod jezika (npr. sr ili sh). קוד שפה (כגון he-IL). Код на език (напр. bg-BG). Код мови (напр. uk-UA). MONEYTEXT Converts a number to text with the given currency. Convierte números en palabras más la moneda que especifique. Przekształca liczbę na postac słowną z podaniem waluty. Uwzględnia dwa miejsca po przecinku po zaokrągleniu. Convertit un nombre en texte avec la devise indiquée. Számot számnévvé alakít a megadott pénznemmel. Исписује број словима уз истицање ознаке валуте. Ispisuje broj slovima uz isticanje oznake valute. ממיר מספר לייצוגו במילים עם המטבע הנתון. Преобразува число към текст с дадена валута. Перетворює число в текст зі вказаною валютою. Add-In org.NUMBERTEXT.moneytext Number Número Liczba Nombre Szám Број Broj מספר Число Число Input value. Valor de entrada. Wartość przekształcana. Valeur. Az átalakítandó szám. Улазна вредност. Ulazna vrednost. ערך קלט. Входната стойност. Вхідне значення. Currency/function Moneda/función Waluta Devise Pénznem/függvény Валута Valuta מטבע Валута/функция Валюта ISO 4217 code (eg. USD) or Numbertext function (eg. ord = ordinal number). Código ISO 4217 (p. ej., MXN) o función de Numbertext (p. ej., ord = número ordinal). Kod waluty wg ISO 4217 zapisany wersalikami (tak jak w bankach, PLN - dla Polski, XXX - bez waluty). Code ISO 4217 (exemple EUR). ISO 4217 kód (pl. HUF) vagy Numbertext függvény (pl. ord = sorszám). ISO 4217 код (нпр. RSD). ISO 4217 kod (npr. RSD). קוד ISO 4217 (כגון ILS). Код по ISO 4217 (напр. BGN) или функция на Numbertext (напр. ordinal = редни числителни). Код по ISO 4217 (напр. UAH), або функція Numbertext (напр. ordinal = порядковий номер). Language Idioma Język Langue Nyelv Језик Jezik שפה Език Мова Language code (eg. en-US). Código de idioma (p. ej., es-MX). Kod języka w jakim ma być podany rezultat (np. pl - polski, en - angielski, ru - rosyjski). Code langue (exemple fr-BE). Nyelvkód (pl. hu-HU). Код језика (нпр. sr или sh). Kod jezika (npr. sr ili sh). קוד שפה (כגון he-IL). Код на език (напр. bg-BG). Код мови (напр. uk-UA). libnumbertext-1.0.8/ChangeLog000066400000000000000000000562271416364754400162100ustar00rootroot000000000000002021-12-31: 1.0.8 release: * src/Soros.py: fix FutureWarning: Possible nested set at position, reported by Rene Engelhard * fr.sor: - use hyphens instead of spaces, e.g. cent-deux, reported by "4560041" at GitHub - new prefix "informal" for 1100–1900 (onze-cents - dix-neuf-cents) - add prefix "feminine" and "masculine" (1 -> une/un), bug reports by arena94 at GitGub * hu_Hung.sor: - fix transliteration of old Hungarian family names, bug report by Zoltán Óvári - fix 100–199, 1000–1999, 1000000–1999999 and 1000000000–1999999999 (bad ordering) – fix conversion of single letters "í", "Í" and "NY"; - fix unnecessary conversion of words ending with "q", e.g. "IQ"; - fix unnecessary conversion of words not ending with unknown letters * mr.sor: Marathi spelling corrections by Shantanu Oak * pl.sor: fix ordinal 20-29, reported by Gabryha at GitHub * uk.sor, CalcAddIn.xcu, description.xml.in: fix spell by Olexandr Nesterenko - replace apostrophe symbol to U+02BC, reported by Volodymyr Lisivka - up number to 10^42 - add cardinal, update help - add uk locale * zh.sor: add ordinal numbers, use always 二 for 2, reported by Ming-Hua 2021-01-31: 1.0.7 release: * ga.sor: new module Irish by László Németh * lg.sor: new module Luganda by Phillip Samuel * mr.sor: new module Marathi by Ankur Heramb Joshi * mt.sor: new module Maltase by László Németh * fi.sor: fix ordinal 0, bug report by Tuomas Hietala * hu_Hung.sor: - fix transliteration of Vörösmarty, bug report by Zoltán Óvári - replace ü and ű by Viktor Kovács - fix transliteration of dates with affixation * th.sor: fix big (>999,999) numbers by Vladislav Kiper * ua.sor: fix euro cent, bug report by Kty0mka 2020-06-01: 1.0.6 release: * Numbertext.cxx: don't depend on en_US.UTF-8 locale by Stephan Bergmann * Java: - clean-up by Balázs Meskó with Maven support - port special logic for Norwegian language from C++ by Ilya Idamkin * Makefile.am: prefix for datadir by Li-Wen Hsu * bg.sor: avoid using \d and \D by Mihail Balabanov * ee.sor: update Estonian language spellings by Alvar Laigna * el.sor: fix "and" before currency fractions and "zero" in case of 0 whole euro by Spiros Evangelatos * es.sor: fixes by Juanma Sanchez, and based on him report * gl.sor, es.sor: fix ISO codename of Honduran lempira by Ilya Idamkin * fr.sor: fix EUR 200, 300 etc., bug report by armik71 * hu.sor: fix date function for 1 * hu_Hung.sor: - Old Hungarian transliteration support for words - remove obsolete function left-to-right - add sch -> s, ä -> é transliteration by Viktor Kovács * it.sor: fix ordinal numbers, bug report by dario-gallucci * ja.sor: fix word "negative" (负 -> 負), bug report by cmplstofB * ko.sor, en.sor: fix Korean module and add Korean Won unit by DaeHyun Sun * lv.sor: fix 40, 50 ... 90, bug report by andritis * my.sor, en.sor: add Malay currency MYR by Bee Ing * ru.sor, uk.sor: fix cardinal and feminine RUB, UAH usage by Alex Ivanov * th.sor: fix usage of 1 by Ilya Idamkin and tyindeepit 2018-10-09: 1.0.5 release: * et.sor: new Estonian module * Java: fix path separator for Windows by Rens Toonen * spellout: fix DEFPATH in spellout by Rene Engelhard * README: conversion to MarkDown by Miklós Vajna * da.sor: fix "en million", bug report by Hsonesson1 * de.sor: add function year by c-kuehl * eo.sor: fix ordinal-number, ie. "1-a" by Adolfo Jayme Barrientos * fi.sor: fixed and more currencies by Tuomas Hietala * lt.sor: fix ordinal numbers and currencies by Aurimas Fišeras * pl.sor: fix ordinal numbers 4x, 7x, bug report by tengwar * sq.sor: add missing 1000-9999 2018-07-01: 1.0 release: * libnumbertext: - load Bokmål (nb) and Nynorsk (nn) from no.sor - code clean-up by Miklós Vajna - enable-boost option by Tomáš Chvátal - keep CXXFLAGS configurable, bug report by Stephan Bergmann * data: - 4(+1) new language modules and several fixes * gl.sor: new Galician module by Adrian Chaves * no.sor: new Norwegian Bokmål and Nynorsk modules * sq.sor: new Albanian module * uk.sor: new Ukrainian module based on Russian * ca.sor: fix ordinal indicators * da.sor: remove double spaces in money amounts * es.sor: use plural for 0 (in currency) by Adrian Chaves * fi.sor: fix currency names and large cardinals by Tuomas Hietala * hu.sor: various suffixation + spell out + article support with numbers, references and date names for new NatNum12 number format modifier of LibreOffice, for example, extending default date formats. * ru.sor: fix ordinal-neuter * tr.sor: add ordinal numbers * web: - add "Functions (help)" menu item to show help of the modules 2018-05-28: beta 3 release: * src: numbertext renamed to spellout * libnumbertext: fix cppcheck warnings by Julien Nabet * java: add -encoding utf8 to javac call by Rene Engelhard * LO extension: default capitalization, missing capitalization was reported by TileStonePro * bg.sor: new Bulgarian module by Mihail Balabanov * cs.sor: fix for ordinal numbers, bug report by Stanislav Horáček * hu.sor: add number, letter, day and month affixation for extended number, cross reference and date formats * is.sor: new Icelandic module by László Németh * it.sor: add missing groups in ordinal numbers, the problem was reported by Valter Mura * lt.sor: fix typo, correct ordinal-number, problem was reported by Modestas Rimkus * ru.sor: ordinal numbers and fixes by Mike Kaganski * sl.sor: ordinals, also genders and adverbials, using also information by Martin Srebotnjak * sv.sor: fix typos * zh.sor: real native Simplified Chinese expressions by Suokunlong * *.xcu: - Bulgarian translation by Mihail Balabanov - Spanish translation by Adolfo Jayme Barrientos - fix typo by Rene Engelhard * web: - fix typo by Adolfo Jayme Barrientos - add Bulgarian and Icelandic modules 2018-04-26: László Németh (nemeth numbertext org): * rename numbertext executable to spellout, add default data path: /usr/share/numbertext and support environmental variable NUMBERTEXTPATH * fix platform incompabilities * Greek cardinal and ordinal genders 2018-04-19: László Németh (nemeth numbertext org): * Soros programming language: revised draft: - conditional text, prefix macros, language variant program lines * improved interpreters * C++11 port * language data: - More functions: ordinal numbers (prefix: ordinal) ordinal indicator (prefix: ordinal-number) year (prefix: year) gender variants and other functions - list all functions of a module with the input "help" (in Calc: =NUMBERTEXT("help"), but enlarge the row height to see every line of the help text) - new Malaysian and Swiss Standard German - compressed language modules: - instead of hu_HU_2, ja_JP_2, zh_ZH_2, "formal" prefix allows formal number names here. For example, MONEYTEXT(1200;"money HUF";"hu") results "egyezerkettőszáz forint" instead of "ezerkétszáz forint", MONEYTEXT(123;"formal";"ja") results "参百弐拾壱" instead of "三百二十一" - instead of en_US_2, use "money" prefix combined with currencies, eg. MONEYTEXT(1.01;"money USD") results "one and 1/100 U.S. dollar" in LibreOffice instead of "one U.S. dollar and one cent". 2016-05-24: Liudas Ališauskas * Fix Lithuanian module 2014-05-10: Mihovil Stanić (mihovil.stanic gmail com): * new Croatian module 2013-03-16: Jerzy Moruś * Polish translation of LibO extension resource data 2012-12-06: László Németh (nemeth numbertext org): * src/Soros.py, soroside.py, __init__.py, test.py: Python 3 port (back compatible with Python 2) * reg.uno.py, bin/*.py: initial patches for tabulator inconsistency and terminating whitespaces in Python 3 reported by Julien2412 at libreoffice-dev. 2012-10-09: László Németh (nemeth numbertext org): * data/lt_LT.sor: Lithuanian module (hints by Mantas Kriaučiūnas and Laimonas Vėbra (laimis) at LaunchPad #936205) * data/fr_*: fix un/une + currency, based on the patch by Jmzambon at OOO Wiki * data/es_ES.sor: euro: y dos cents -> con dos céntimos, reported by mike8p at launchpad.net * data/pt_*.sor: ciento(s) -> cento(s), reported by Gwenaël Quenette (sent by Zoltán Reizinger and Andrea Pescetti). * java/: sources of the Java jar distribution 2012-03-17: Asterisks at OOo Wiki: * data/lv_LV.sor: Latvian module 2010-11-03: László Németh (nemeth numbertext org): * data/vi_VN.sor: new Vietnamese module * data/ru_RU.sor: - fix for 2 (subunits of EUR, GBP, USD), - add currency UAH, reports and patch by wasow at extensions ooo 2010-08-03: László Németh (nemeth numbertext org): * pythonpath/org/Numbertext/__init__.py: fix rounding differences between Calc and Numbertext functions: rounding by Calc round() in Python code of Numbertext. The problem was reported by Bernard Marcelly on Numbertext OOo Wiki page. * data/{el,en,es,fr,pt,tr}*.sor, : remove "zero cents" etc. from Moneytext output, reported by Bernard Marcelly. * data/{af,sv,tr}*.sor: add missing zero to Moneytext (eg. "nul rand") 2010-08-03: Eko Prasetiyo (ekoprasetiyo at gmail): * data/id_ID.sor: Indonesian module 2010-06-07: László Németh (nemeth numbertext org): * data/ru_RU.sor: fix bad back references in Russian rules. Missing conversion reported by Birioukoff at OOo Extension site. 2010-05-28: László Németh (nemeth numbertext org): * data/en_IN.sor: Indian numbering system. Lakh = 100.000, crore = 10.000.000 (requested by Dhandip at OOo Extensions site). * data/ca_ES.sor: fix Catalan MONEYTEXT in Calc Numbertext extension (Launchpad bug 585782 reported by Bernard Marcelly). * data/en_US.sor, hu_HU.sor: fix 0th * data/sv_SE.sor: fix 0th, 100th, 1000th * data/fr_*.sor: fix ordinal numbers * doc/*odt: modifications: DollarText/BAHTTEXT field formatters of MS Office and ECMA-376, Unicode CLDR, corrections for RBNF, BSD license for example Python and Java interpreters 2010-05-20: László Németh (nemeth numbertext org): * data/sv_SE.sor: - fix 30 (trettio) - reference implementation with grammar and year support, also with gender parameters for currencies. Gender problem with currencies reported by Kent Karlsson in CLDR ticket 2783 * data/Roman.sor: - replaced with the more compact Roman_2.sor - replace "(" and ")" with "\(" and "\)" (parenthesized numerals) * data/Roman_2.sor: - variant with overline and bars - extra functions: historical with the special Unicode characters for 1000, 5000 and 10000 * src/Soros.js: - fix character encoding for \(, \) etc. 2010-04-26: László Németh (nemeth numbertext org): * data/fr_*: ordf and ordm instead of ord-fem and ord-mas * data/ru_RU.sor: fix bugs reported by georgepyh on OOo Extension site * description.xml, CalcAddIn.xcu: add French translation by Bernard Marcelly. * data/he_IL.sor: [^0] -> [1-9], modify function names for MONEYTEXT * src/soroside.py: rename soros.py, suggested by Alex Bodnaru 2010-04-26: Alex Bodnaru (alexbodn at 012 dot net dot il): * data/he_IL.sor: - add ordinal numbers (ord, ordf, ordm functions) - restructuring currencies, etc. 2010-04-22: László Németh (nemeth numbertext org): * data/sv_SE.sor: fix Swedish 11000 (elvatusen instead of elvausen) * data/{he_IL,pl_PL,ru_RU}.sor: replace the complementer bracket expressions (eg. [^1]) to non-complementers (eg. [02-9]). The problem with the Polish Moneytext reported by geo78 at OOo Extensions. * src/soros.py: extended syntax: range with steps by tilde (0-100~10) * data/fr_FR.sor: add ordinal numbers (ord, ord-fem, ord-mas): =MONEYTEXT(5;"ord";"fr") -> cinquième =MONEYTEXT(1;"ord-fem";"fr") -> première =MONEYTEXT(1;"ord-mas";"fr") -> premier * data/th_TH.sor: add ordinal numbers (ord) 2010-04-19: László Németh (nemeth numbertext org): * pythonpath/org/__init__.py: - remove Asian and CTL lang. detection temporarily (problems with document language detection in OOo 3.0 reported by Petr Mladek and mrw at OOo Extension site); - now MONEYTEXT handles unknown currency codes/new function names. Example: = MONEYTEXT(num, "ord", "en") -> ordinal names = MONEYTEXT(num, "ord2", "en") -> ordinal abbreviations (1st, 2nd etc.) Problems with unknown currency codes reported by Bernard Marcelly. * src/Soros.{py,js}: fix broken $n|$ = $n||$ equivalence (it worked only for parenthesized form: $(...)|$... = $(...)||$...) * src/Soros.py: fix output encoding of \$, \(, \), \| * data/{de_DE, hu_HU, hu_HU_2}.sor: - function ord for ordinal numbers - function help for help * data/{en_US, en_US_2}.sor: - function ord for ordinal numbers - function ord2 for ordinal abbreaviations (1st, 2nd, 3rd, 4th etc.) - function help for help * data/hu_HU_2.sor: formal Hungarian rules (eg. egyezeregyszáz) * data/ru_RU.sor: grammatical fixes for Russian money amounts (problems reported by rogerclc on OOo extension site): – for numbers ending in 1 that are not 'teens': (1, 21, 31, 41, 101, 121, etc.): roubles = рубль; kopeks = копейка – for all numbers ending in 1 in the kopeks column (.01, .21, etc): one = одна, eg. 21.00 = двадцать один *рубль* 21.01 = двадцать один *рубль одна* копейка 21.21 = двадцать один *рубль* двадцать *одна копейка* * data/th_TH.sor: fix number 1 in 201, 5001 etc. 1 is เอ็ด in all numbers greater than 1 (หนึ่ง). This is an old Excel bug revived in OOo, too (see OOo Issue 83490), reported by Supapong at OOo Numbertext Wiki. * data/fr_*.sor: add XPF (franc Pacifique), missing monetary unit reported by Bernard Marcelly. * src/places.py: add RON, problem with the new Romanian monetary unit reported by Bernard Marcelly. 2010-04-13: Alex Bodnaru (alexbodn at 012 dot net dot il): * data/he_IL.sor: Hebrew module * Makefile(s): add better clean 2009-11-13: László Németh (nemeth numbertext org): * data/{af_ZA,it_IT,nl_NL}.sor: fix bad conversion of 1 subunit of currencies. The bug in the Italian module reported by Nicolas Pagni (Nicolas dot Pagni at npagni dot it) * data/sv_SE.sor: the Swedish 7 is "sju", not *sjo, reported by Stephan Nilsson (Stephan at Nilsson dot tf) 2009-11-11: Tantai Thanakanok (tantai osdev co th): * data/th_TH.sor: extended Thai decimal support for 1 and more than 2 digits with currencies 2009-11-10: László Németh (nemeth numbertext org): * data/da_DK.sor: new Danish module * data/ca_ES.sor, es_ES.sor, fr_*.sor: 0 euro (without plural), reported by Bernard Marcelly * data/sv_SE.sor: fix bad language code (*sv_SV.sor) and missing plural form of krone. Reported by Bernard Marcelly. * data/fr_*.sor: "moins" for negative. Reported by Bernard Marcelly. * data/tr_TR.sor: add space removing, fix large numbers * src/Soros.{py,js}: replace bad [^0] pattern with [1-9] in the __numbertext__ directive implementation. Missing decimals leading by zero reported by Bernard Marcelly. * doc/sorosspec.odt: replace bad [^0] pattern with [1-9]. 2009-09-25: Susana Sotelo Docío (Roebek at OpenOffice.org Wiki): * data/es_ES.sor: gender fix for numbers containing the string "ientos" (doscientos/as, quinientos/as, novecientos/as, etc) 2009-09-12: Ramdem at OpenOffice.org Wiki: * data/tr_TR.sor: new Turkish module 2009-09-06: Joan Montané: * data/ca_ES.sor: fixes - "1000-1999" must be spelled only "mil ...", it can't be spelled "un mil" (the same fixed French bug) - decimal units for EUR changed from "cent" to "cèntim", as it's usual and accepted - decimal units for USD changed form "cent" to "centau", as it's usual and accepted - millions are spelled as in French: EUR 1000000 --> un milió d'euros (note the " de/d' " preposition") EUR 1000001 --> un milió un euros (it lacks " de/d' " preposition). EUR 1000000,xx --> un milió d'euros amb xx cèntims EUR 1000001,xx --> un milió un euros amb xx cèntims Improvements: - Added all the currencies replaced by EUR - Added all the actives code beginning by A (I'm working in B-Z) - Added some actives codes beginning by X 2009-09-04: László Németh (nemeth numbertext org): * data/en_US*: fix English decimal conversion by replacing bad [^0] (matched decimal separators, too) with "[1-9]", reported by Bernard Marcelly (bmarcelly at openoffice dot org). 2009-09-03: László Németh (nemeth numbertext org): * pythonpath/org/Numbertext/__init__.py: add short language name support: now module names works without country code or with bad or non-available country and variant codes, too. The missing support of short languages was reported by Eduardo Moreno, too. * Makefile: target "ooo" for OOo extensions, first used in ooo-build integration by Kálmán Szalai. * ca_ES.sor, es_ES.sor, pt_PT.sor, pt_BR.sor, ro_RO.sor: add gender support, - ca_ES and es_ES bug fixes, reported by Joan Montané - ro_RO bug fixes, reported by Lucian Adrian Grijincu * data/af_ZA.sor, nl_NL.sor: extended decimal support, reported by Friedel Wolff (friedel at translate dot org dot za) * data/fr_FR.sor: bug fixes: - extended and fixed decimal support, reported by Bernard Marcelly (bmarcelly at openoffice dot org) - using "et" instead of "y", reported by Bernard Marcelly and xhydrogene at launchpad dot net (https://bugs.launchpad.net/numbertext/+bug/421151) - virgule instead of comma, reported by Bernand Marcelly and xhydrogene at launchpad dot net: https://bugs.launchpad.net/numbertext/+bug/421148, also patch by Olivier Ronez - cent and mille instead of un cent and un mille, reported by Bernand Marcelly and xhydrogene at launchpad dot net: https://bugs.launchpad.net/numbertext/+bug/421164, also patch by Olivier Ronez * data/fr_CH.sor: decimal point instead of comma, reported by Bernard Marcelly (bmarcelly at openoffice dot org) * data/pl_PL.sor: add affix function and portable regexes, fix regex problem reported by Marcin Miłkowski 2009-08-30: Michel Weimerskirch (michel at weimerskirch dot net): * data/lb_LU.sor: new Luxembourgish module 2009-08-29 Marcin Miłkowski (milek_pl at o2 dot pl): * data/pl_PL.sor: patch for Polish https://bugs.launchpad.net/numbertext/+bug/421031 2009-08-28: Goran Rakić (grakic at devbase dot net): * CalcAddIn.xcu, description.xml: add Serbian localizations * data/sh_RS.sor, data/sr_RS: new Serbian modules 2009-08-27: Olivier Ronez: * data/fr_BE.sor, data/fr_CH: patches for new modules * data/fr_FR.aff: other patches: - milliarde -> milliards (reported by Sophie Gautier and Bernand Marcelly, too) - fix for 81 2009-08-27: Joan Montané (jmontane at openoffice dot org): - data/ca_ES.sor: fixes http://wiki.services.openoffice.org/wiki/Talk:NUMBERTEXT/MONEYTEXT_development#Some_fixes_on_Catalan_definition): - "amb" instead of "und" - "cèntim" instead of (euro)cent - "menys" for negative 2009-08-20: László Németh (nemeth numbertext org): * data/ko*, ja*, Hang.sor: Korean, Japanese and Old Hungarian modules. * data/en_US.*, hu_HU.sor: optimized by separator functions. * web/webroot/Hung.ttf: TrueType font with Old Hungarian numbers and some letters for the native name of the script (ROVÁSÍRÁS) * web/*: new section (old number systems) * data/it_IT.sor: Using "virgola" for comma, reported by Attilafdd at launchpad.net. 2009-08-10: László Németh (nemeth numbertext org): * pythonpath/org/Numbertext/__init__.py: add missing Numbertext module * bin/locales.py: fix registration of the first language module * data/af_ZA.py: fix helper functions (space handling) 2009-08-09: László Németh (nemeth numbertext org): * numbertext.py: new namespace (incompatible with previous versions): ORG.NUMBERTEXT.NUMBERTEXT() and ORG.NUMBERTEXT.MONEYTEXT(), suggested by Eike Rathke (er at OOo). * CalcAddIn.xcu: standard resource files for settings and localizations (see Jan Holst Jensen's excellent Add-in example and documentation: http://biochemfusion.com/doc/Calc_addin_howto.html) * CalcAddIn.xcu: add compatibility names: working XLS export-import (XLS portability bug reported by Mushtaque Asghar). * numbertext.py: now NUMBERTEXT() has no default rounding: =NUMBERTEXT(4.12345) -> four dot one two three four five =NUMBERTEXT(4.00) -> four =NUMBERTEXT("4.00") -> four dot zero zero * numbertext.py: MONEYTEXT() supports not integer decimal places: =MONEYTEXT(1.8, "MGA") -> one ariary and *four* iraimbilanja * src/places.py: add MGA, MRO with decimal place 0.7 (eg. one ariary = 5 iraimbilanja, decimal places = 0.7 in places.py) * doc/numbertext.odt: NUMBERTEXT specification 1.1: - remove decimal place argument * doc/sorosspec.odt: - add number to Devanagari number example to the Soros specification; - add Python implementation * data/pt_PT.sor: Portuguese - initial version from Eduardo Moreno (emoreno tokonhu com): "Nombres en portugues de los números, con ayuda de Flavia Viegas". - extension: - simplification - long scale support - syntax of "e" based on Portuguese test data of PERL::Lingua Words2Nums - extended with currency names of Portuguese speaking countries * data/pt_BR.sor: Brazilian Portuguese - based on pt-PT, but Brazilian Portuguese uses short scale numbers and different ortography (number 16, 17, 19). * data/af_ZA.sor: Africaans - the orthography based on Bruce C. Donaldson: A grammar of Africaans, MOUTON DE GRUYTER, 1993 * data/zh_ZH_2.sor: Simplified financial Chinese module. * data/fr_FR.sor, data/en_US*.sor, data/es_ES.sor: - extended currency names for English, French and Spanish modules * data/*: - fixes for language data: - Romanian, Swedish, Slovenian, Czech, etc.: fix decimals (.0n) - Greek: removing unnecessary "de" - Spanish: 21 (veintidós) -> 22, negativa - -> menos, reported by Eduardo Moreno (emoreno tokonhu com). - Italian: unucento -> cento, reported also by Claudio Colombo. - Esperanto: unudek -> dek, unucent -> cent, miliono -> unu miliono. * tests/test0*: test number 1-1000 in all languages (see make check). * web/*: fix for IE, etc. 2009-07-25: László Németh (nemeth numbertext org): * data/*.sor: 11 new languages (see README) - syntax and orthography based mostly on Wikipedia articles - for Greek numerals, see Harry Foundalis' excellent introduction (http://www.foundalis.com/lan/grknum.htm) * numbertext.py: handling language variants (eg. en-US-2 for USD 20.25 -> twenty and 25/100 dollars) * doc/sorosspec.odt: improved Soros language specification. * Soros.js, pythonpath/Soros.py: standard Soros modules in Python and JavaScript * bin/*.py: new conversion utilities and more readable format using standard Python doc string of the numbertext language modules. * numbertext.py: fix for language codes without country ("eo", "Roman") * data/*.sor: add function-like currency handling for language modules * es_ES.sor: fix for Spanish "... y uno mil" -> "... y un mil". The bug reported by Eduardo Moreno (emoreno tokonhu com). * Roman*.sor: handle arbitrary large Roman numbers: 1000000000 -> ((M)) * test/*: testing environment and tests * web/: web pages of http://numbertext.org * bin/shellhtml: preprocessor tool for HTML, XML data libnumbertext-1.0.8/META-INF/000077500000000000000000000000001416364754400155625ustar00rootroot00000000000000libnumbertext-1.0.8/META-INF/manifest.xml000066400000000000000000000011321416364754400201070ustar00rootroot00000000000000 libnumbertext-1.0.8/Makefile.am000066400000000000000000000002231416364754400164530ustar00rootroot00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src data pkgconfdir = $(libdir)/pkgconfig pkgconf_DATA = libnumbertext.pc EXTRA_DIST = README.md data AUTHORS libnumbertext-1.0.8/Makefile.orig000066400000000000000000000010341416364754400170170ustar00rootroot00000000000000all: cd pythonpath; make cat description.xml.in | bin/shellhtml >description.xml cd web; make cp src/Soros.py web/webroot cp src/Soros.js web/webroot cp doc/*.pdf web/webroot distx: cd web; make clean cd test; make clean tar c . | gzip > ../numbertext-`head -1 VERSION`.tar.gz lo: make -f Makefile.orig zip -r numbertext-`head -1 VERSION`.oxt META-INF rdb idl pythonpath pkg-desc *.xcu *py *xml README.md check: cd test; make clean: rm -f *.oxt description.xml cd pythonpath; make clean cd web; make clean rm -f *~ */*~ libnumbertext-1.0.8/NEWS000066400000000000000000000134121416364754400151220ustar00rootroot000000000000002012-12-06: version 0.9.5 release 2 - Python 3 port of the OpenOffice.org/LibreOffice extension for LibreOffice 4.0 2012-10-09: version 0.9.5 - new modules: Latvian, Lithuanian - bug fixes: Spanish, French, Portuguese - Java sources 2010-11-03: version 0.9.4 - data/vi_VN.sor: new Vietnamese module - numbertext.jar: patch to set default UTF-8 encoding by Marcin Stępniak - Russian module: - fix for 2 (subunits of EUR, GBP, USD), - add currency UAH, reports and patch by wasow at extensions ooo 2010-08-03: version 0.9.3 - fix rounding difference of Calc and Numbertext functions - Indonesian module by Eko Prasetiyo - remove "zero subunit" from Moneytext outputs of Greek, English, French, Spanish, Portuguese and Turkish modules. - fix missing zero in Afrikaans, Swedish and Turkish Moneytext descriptions. 2010-06-07: version 0.9.2 - fix Russian module 2010-05-28: version 0.9.1 - new module: English with Indian numbering system (en-IN) (lakh = 100.000, crore = 10.000.000) - other fixes (see Changelog) 2010-05-20: version 0.9 - reference implementation for Swedish: - cardinal and ordinal numbers with gender - ordinal abbreviations with gender - year - gender parameters at currencies - reference implementation for Roman numerals: Roman_2.sor: overlined with bars, also historical forms: $ python soroside.py ../data/Roman_2.sor 38000 X̅X̅X̅V̅I̅I̅I̅ $ python soroside.py ../data/Roman_2.sor 30000000 |C̅C̅C̅| $ python soroside.py ../data/Roman_2.sor -p historical 38000 ↂↂↂↁↀↀↀ 2010-04-26: version 0.8.2 - fixes for Russian - ordinal number support in Hebrew - French translation 2010-04-22: version 0.8.1 - bug fixes in Hebrew, Polish, Russian and Swedish modules - ordinal numbers in French and Thai - extended syntax in src/soroside.py tool (ranges with different steps): $ python src/soroside.py data/en_US.sor 0-10~5 zero five ten 2010-04-19: version 0.8 - new modules: he_HE from Alex Bodnaru, and hu_HU_2 (formal Hungarian) - ordinal number functions in en_US, de_DE and hu_HU modules - module fixes: th_TH, ru_RU - new command line tool "soros.py", features: - convert numbers and ranges: $ python src/soroside.py data/en_US.sor 1 5-7 10 one five six seven ten - prefix (function) support: $ python src/soroside.py -p ord2 data/en_US.sor 1-4 1st 2nd 3rd 4th - file output: $ python src/soroside.py -o nums data/en_US.sor 100-200 $ head -3 nums one hundred one hundred and one one hundred and two - new convention: "help" item in some modules: $ python src/soroside.py -o nums data/en_US.sor help Functions: ord (ordinal numbers, eg. "first") ord2 (ordinal abbreviations, eg. "1st") Extra modules: en_US_2 (subunit as decimal fraction: "USD 20.25" -> twenty and 25/100 dollars) - bug fixes: - default Western language in calls without language parameter in OOo - fix output conversion of \$, \(, \) and \| - fix boundary recognition in $n|$() (only $()|$() was good in the last versions) - etc. (see ChangeLog) 2009-11-13: version 0.7.1 - bug fixes (af_ZA, it_IT, nl_NL, th_TH), see ChangeLog 2009-11-10: version 0.7 - new modules: da-DK Danish from László Németh tr-TR Turkish from Ramdem at OpenOffice.org Wiki - bug fixes (see Changelog) 2009-09-04: version 0.6.1 - fix English decimals 2009-09-03: version 0.6 - new modules: fr-BE Belgian French from Olivier Ronez fr-CH Swiss French from Olivier Ronez lb-LU Luxenbourgish from Michel Weimerskirch sh-RS Serbian (Latin) from Goran Rakić sr-RS Serbian (Cyrillic) from Goran Rakić - short language code (language code without country code) support in language code argument of NUMBERTEXT and MONEYTEXT functions - using short language code (and an available module in the same language) for missing language modules specified by long language codes (language code + country code + optional variant name) - fixes (see ChangeLog) 2009-08-20: version 0.5 - new modules: ja-JP Japanese ja-JP-2 Japanese (formal) ko-KP North-Korean ko-KR South-Korean Hung Old Hungarian Script - web: add new modules and Chinese Suzhou numerals - fixes 2009-08-10: version 0.4 - fixes 2009-08-09: version 0.3 - NUMBERTEXT and MONEYTEXT specification 1.1 - new language modules: - Africaans - financial Chinese (simplified) - Portuguese - Brazilian Portuguese - extended currency support for English, French and Spanish - Improved OpenOffice.org extension: - MS Excel (XLS) export-import support - standard XCU resource file for localization - fixes 2009-07-25: version 0.2 - 11 new languages: Catalan, Czech, Finnish, French, Greek, Polish, Romanian, Russian, Slovenian, Spanish, Swedish. - improved currency handling for all language modules - new home page: http://NUMBERTEXT.org - improved Soros language specification: - left zero deletion, trimming and removing double spaces switched on only by the new __numbertext__ directive - nested recursive calls - escaped metacharacters - optional semicolon, as command separator - in-line comments - new Python and JavaScript Soros interpreters, testing environment - NOTE: the syntax of the NUMBERTEXT and MONEYTEXT will be changed in the next version, according to the new NUMBERTEXT/MONEYTEXT specification (a new second argument, the number of the decimal places will be added). See in OpenOffice.org Issue 103746. libnumbertext-1.0.8/README.md000066400000000000000000000111361416364754400157030ustar00rootroot00000000000000# Soros interpreters for C++11, Java, JavaScript and Python [![Build Status](https://travis-ci.org/Numbertext/libnumbertext.png?branch=master)](https://travis-ci.org/Numbertext/libnumbertext) ``` Language-neutral NUMBERTEXT and MONEYTEXT functions for LibreOffice Calc version 1.0.8 (2021-12-31) Numbertext LibreOffice extension, Soros programming language specification (draft) and IDE*, Soros interpreter in Python: pythonpath/Soros.py, Soros interpreter in JavaScript: Soros.js* Soros interpreter in Java: see NUMBERTEXT.org * Not in LibreOffice Numbertext extension, see http://NUMBERTEXT.org. Copyright: 2009-2021 (C) László Németh (nemeth at numbertext dot org) License: LGPL-3+/Modified BSD dual-license Numbertext language data (Soros programs): License: LGPL-3+/Modified BSD dual-license (except Serbian) Copyright: 2009-2021 (C) László Németh et al. (see AUTHORS) Bulgarian: 2018 (C) Mihail Balabanov (m dot balabanov at gmail dot com) Croatian: 2014 (C) Mihovil Stanić (mihovil dot stanic at gmail dot com) Hebrew module: 2010 (C) Alex Bodnaru (alexbodn at 012 dot net dot il) French (Belgian and Swiss): 2009 (C) Olivier Ronez Galician: 2018 (C) Adrián Chaves (adrian at chaves dot io) Indonesian: 2010 (C) Eko Prasetiyo (ekoprasetiyo at gmail) Latvian: 2012 (C) Asterisks at OOo Wiki Luganda: 2020 (C) Phillip Samuel Luxembourgish: 2009 (C) Michel Weimerskirch (michel at weimerskirch dot net) Marathi: 2020 (C) Ankur Heramb Joshi Portuguese: 2009 (C) Eduardo Moreno (emoreno at tokonhu dot com) Turkish: 2009 (C) Randem Serbian: 2009 (C) Goran Rakić (grakic at devbase dot net) Korean: 2019 (C) DaeHyun Sung (sungdh86+git at gmail dot com) License: CC BY-SA/LGPL-3+/Modified BSD tri-license * Note: for full distribution with specifications, IDE and JavaScript implementation, see http://NUMBERTEXT.org Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. = Supported languages in this version = af Africaans bg Bulgarian ca Catalan cs Czech da Danish de German de-CH Swiss Standard German orthography (dreissig instead of dreißig) de-LI Swiss Standard German orthography (dreissig instead of dreißig) el Greek en English (one hundred one) en-AU English (one hundred and one) en-GB English (one hundred and one) en-IE English (one hundred and one) en-IN English with Indian numbering system (lakh = 100.000, crore = 10^7) en-NZ English (one hundred and one) eo Esperanto es Spanish et Estonian fi Finnish fr French fr-BE Belgian French fr-CH Swiss French ga Irish gl Galician he Hebrew hr Croatian hu Hungarian id Indonesian is Icelandic it Italian ja Japanese ko Korean ko-KR Korean (South) ko-KP Korean (North) lb Luxembourgish lg Luganda lt Lithuanian lv Latvian mr Marathi ms Malaysian mt Maltese nb Norwegian Bokmål nl Dutch nn Norwegian Nynorsk no Norwegian (Bokmål) pl Polish pt Portuguese pt-BR Brazilian Portuguese ro Romanian ru Russian sh Serbian (Latin) sl Slovenian sq Albanian sr Serbian (Cyrillic) sv Swedish th Thai tr Turkish uk Ukrainian vi Vietnamese zh Chinese (simplified) Old number systems: hu-Hung Old Hungarian Script (also word transliteration) Roman Roman numbers Roman-large Roman numbers for very large numbers using parenthesized syntax Suzhou Chinese Suzhou numerals = Build C++11 = autoreconf -i ./configure make # test it src/spellout -l en 123 = Build Java jar = cd java make = Build and using LibreOffice Extension = make -f Makefile.orig lo and install the *.oxt package by Tools->Extension Manager->Add of LibreOffice. After restarting OpenOffice.org/LibreOffice, there are two new Calc functions, NUMBERTEXT() and MONEYTEXT(). Examples: =NUMBERTEXT(25) =NUMBERTEXT(25;"th-TH") =MONEYTEXT(25) =MONEYTEXT(25;"USD") =MONEYTEXT(25;"CNY";"zh-ZH") Module Help (enlarge the row to see all lines), containing available prefix functions of the module: = NUMBERTEXT("help") = NUMBERTEXT("help";"de") = Development = See doc/addnewlocale.txt and doc/sorosspec.odt For general Calc and (portable Excel) Add-In developments, see Jan Holst Jensen's excellent Add-in example and documentation: http://biochemfusion.com/doc/Calc_addin_howto.html == Integrated development environment == There is a JavaScript/HTML IDE in this distribution. Use the online version: http://numbertext.org/Soros.html or build it with make -f Makefile.orig and open web/webroot/Soros.html in a JavaScript capable browser, = Test = make -f Makefile.orig check test/thaicheck.ods is a simple test of the equivalence of the Soros implementation of Thai number to number name conversion and BAHTTEXT function. ``` libnumbertext-1.0.8/THANKS000066400000000000000000000003241416364754400153340ustar00rootroot00000000000000Thanks to NLnet Foundation, Nederland and FSF.hu Foundation, Hungary for their donation and support. Thanks to the contributors (see AUTHORS) and authors of Wikipedia and other articles and books about numerals libnumbertext-1.0.8/VERSION000066400000000000000000000000061416364754400154660ustar00rootroot000000000000001.0.8 libnumbertext-1.0.8/bin/000077500000000000000000000000001416364754400151725ustar00rootroot00000000000000libnumbertext-1.0.8/bin/Convert.py000066400000000000000000000003371416364754400171670ustar00rootroot00000000000000import sys f = open(sys.argv[1],'r') print ("# -*- encoding: UTF-8 -*-") print ("r\"\"\"") sys.stdout.writelines([i.strip() + '\n' for i in f.readlines()]) print ("\"\"\"") print ("from __future__ import unicode_literals") libnumbertext-1.0.8/bin/ConvertTitles.py000066400000000000000000000004261416364754400203530ustar00rootroot00000000000000import sys import re try: unicode except: unicode = lambda i, j: i f = open(sys.argv[1],'r') m = {} r2 = re.compile('"') for i in f.readlines(): a = unicode(i.strip(), "UTF-8").split("|", 1) m[a[0]] = re.sub(r2, "", a[1]) f.close() print ("titles = " + str(m)) libnumbertext-1.0.8/bin/locales.py000066400000000000000000000001631416364754400171660ustar00rootroot00000000000000import sys print ("locales = \"\"\"") for i in sys.argv[1:]: print (i) print ("\"\"\".strip().split(\"\\n\")") libnumbertext-1.0.8/bin/places.sh000077500000000000000000000007721416364754400170060ustar00rootroot00000000000000#!/bin/sh # Extract language data for default decimal places from OpenOffice.org language resources $OODIR=$1 ############# cat `ls $OODIR/i18npool/source/localedata/data/*.xml | sort` | awk '/([^<]*)<",a)){b[a[1]]=a[2];if(a[1]=="DecimalPlaces")print "\"" b["CurrencyID"]"\":" a[2]}}' | sort | uniq | awk 'NR==1{printf "places = { %s", $0; next}{print ","; printf "%s", $0}END{print "}"}'>src/places.py libnumbertext-1.0.8/bin/shellhtml000077500000000000000000000005301416364754400171120ustar00rootroot00000000000000#!/bin/bash # HTML shell preprocessor # syntax: shell code in a HTML comment with leading exclamation mark # (in a new line, without leading and trailing whitespaces) # will be executed by the shell, and the result replaced with it. # For example, insert calendar: # awk '/^ ### एक दशशत सहस्त्र अयुत लक्ष प्रयुत कोट्य: क्रमश: | ### अर्बुदम् अब्जम् खर्व निखर्व महापद्म शंकव: तस्मात्: || 11 || ### जलधिंच अन्त्यम् मध्यम् परार्धम् इति दशगुणोत्तरम् संज्ञा: | ### संख्याया: स्थानानां व्यवहारार्थम् कृता: पूर्वै: || 12 || ### ### Verse is translated as --> ### Positions of the digits from right to left are unit, ten, hundred, thousand, ten thousand, hundred thousand (lakh), million, ten million (Crore), hundred million, billion (abja), Kharva, Nikharva, Mahapadma, Sanku, Jaladhi, Antya, Madhya, Parardha. The value of each digit on the left is ten times that on the right. ### Although for practical purpose this verse goes up to parardha (17th power of 10), there are terms for numbers up to 140th power of 10 in Sanskrit. ### In todays practice wordings अयुत and प्रयुत are not used and if used are replaced by दशसहस्त्र and दशलक्ष / दशलाख respectively (Not used here) ### # ------------------------ # negative number [-−](\d+) उणे |$1 # ------------------------ # decimals 0[.,] शून्य दशांश ([-−]?\d+)[.,] $1| दशांश "([-−]?\d+[.,])([^0]\d)" $1| |$2 # e.g. एकशे वीस दशांश नऊ "([-−]?\d+[.,])(0)(0)(\d)" $1| |$2 |$3 |$4 # e.g. सदुसष्ठ दशांश शून्य शून्य नऊ "([-−]?\d+[.,])(0)(\d\d)" $1| |$2 |$3 # e.g. एकोणनव्वद दशांश शून्य एकोणनव्वद "([-−]?\d+[.,])(\d\d\d)" $1| |$2 # e.g. तेवीस दशांश पाचशे सदुसष्ठ , upto 3 places after decimal, decimals read in hundreds "([-−]?\d+[.,])(\d)(\d)(\d)(\d)" $1| |$2 |$3 |$4 |$5 # e.g. चव्वेचाळीस दशांश पाच सात दोन पाच "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # ------------------------ # currency # unit/subunit singular/plural us:([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*) \2 ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 AED:(\D+) $(\1: अमीराती दिऱ्हाम, अमीराती दिऱ्हाम, फिल्स्, फिल्स्) AUD:(\D+) $(\1: ऑस्ट्रेलिअन डॉलर, ऑस्ट्रेलिअन डॉलर्स, सेंट, सेंटस्) BGN:(\D+) $(\1: lev, leva, stotinka, stotinki) BWP:(\D+) $(\1: pula, pula, thebe, thebe) CAD:(\D+) $(\1: कॅनेडीअन डॉलर, कॅनेडीअन डॉलर्स, सेंट, सेंटस्) CHF:(\D+) $(\1: स्विस् फ्रॅंक, स्विस् फ्रॅंकस्, सेंटीम, सेंटीमस्) CNY:(\D+) $(\1: चायनीज युआन, चायनीज युआन, फेन, फेन) CZK:(\D+) $(\1: Czech koruna, Czech koruny, halér, halére) EEK:(\D+) $(\1: kroon, kroonid, sent, senti) EUR:(\D+) $(\1: युरो, युरो, सेंट, सेंटस्) GBP:(\D+) $(\1: पौंड स्टर्लिंग, पौंडस् स्टर्लिंग, पेनी, पेन्स्) GHS:(\D+) $(\1: Ghana cedi, Ghana cedis, pesewa, pesewas) GMD:(\D+) $(\1: dalasi, dalasi, butut, bututs) HKD:(\D+) $(\1: हॉन्गकॉन्ग डॉलर, हॉन्गकॉन्ग डॉलर्स, सेंट, सेंटस्) HRK:(\D+) $(\1: kuna, kuna, lipa, lipa) HUF:(\D+) $(\1: forint, forint, fillér, fillér) # --- Using Indian Rupee Symbol " ₹ " ------ INR:(\D+) $(\1: ₹ रुपया, ₹ रुपये, पैसा, पैसे) # ------------------------------------------ JMD:(\D+) $(\1: Jamaica dollar, Jamaica dollars, cent, cents) JPY:(\D+) $(\1: जपानी येन, जपानी येन, सेन, सेन) KES:(\D+) $(\1: Kenyan shilling, Kenyan shillings, cent, cents) KRW:(\D+) $(\1: Korean won, Korean won, jeon, jeon) KWD:(\D+) $(\1: कुवेती दिनार, कुवेती दिनार, फिल्स्, फिल्स्) LRD:(\D+) $(\1: Liberian dollar, Liberian dollars, cent, cents) LSL:(\D+) $(\1: loti, maloti, sente, lisente) LTL:(\D+) $(\1: litas, litai, centas, centai) LVL:(\D+) $(\1: lats, lati, santims, santimi) MGA:(\D+) $(\1: ariary, ariaries, iraimbilanja, iraimbilanja) MUR:(\D+) $(\1: Mauritian rupee, Mauritian rupees, cent, cents) MXN:(\D+) $(\1: Mexican peso, Mexican pesos, centavo, centavos) MWK:(\D+) $(\1: Malawian kwacha, Malawian kwacha, tambala, tambala) MYR:(\D+) $(\1: Ringgit, Ringgit, cent, cents) NAD:(\D+) $(\1: Namibian dollar, Namibian dollars, cent, cents) NGN:(\D+) $(\1: naira, naira, kobo, kobo) NZD:(\D+) $(\1: न्यूझीलंड डॉलर, न्यूझीलंड डॉलर्स, सेंट, सेंटस्) PGK:(\D+) $(\1: kina, kina, toea, toea) PHP:(\D+) $(\1: Philippine peso, Philippine pesos, centavo, centavos) PKR:(\D+) $(\1: पाकिस्तानी रुपया, पाकिस्तानी रुपये, पैसा, पैसे) PLN:(\D+) $(\1: zloty, zlotys, grosz, groszy) RON:(\D+) $(\1: Romanian leu, Romanian lei, ban, bani) RSD:(\D+) $(\1: Serbian dinar, Serbian dinars, para, para) RUB:(\D+) $(\1: Russian ruble, Russian rubles, kopek, kopeks) RWF:(\D+) $(\1: Rwandese franc, Rwandese francs, centime, centimes) SAR:(\D+) $(\1: सौदी रियाल, सौदी रियाल, हलाला, हलाला) SDG:(\D+) $(\1: Sudanese pound, Sudanese pounds, piastre, piastres) SGD:(\D+) $(\1: सिंगापुर डॉलर, सिंगापुर डॉलर्स, सेंट, सेंटस्) SLL:(\D+) $(\1: leone, leones, cent, cents) SZL:(\D+) $(\1: lilangeni, emalangeni, cent, cents) THB:(\D+) $(\1: baht, baht, satang, satang) TRY:(\D+) $(\1: Turkish lira, Turkish lira, kurus, kurus) TTD:(\D+) $(\1: Trinidad and Tobago dollar, Trinidad and Tobago dollars, cent, cents) TZS:(\D+) $(\1: Tanzanian shilling, Tanzanian shillings, cent, cents) UAH:(\D+) $(\1: hryvnia, hryvnia, kopiyka, kopiyka) UGX:(\D+) $(\1: Uganda shilling, Uganda shillings, cent, cents) USD:(\D+) $(\1: यु. एस. डॉलर, यु. एस. डॉलर्स, सेंट, सेंटस् ) X[AO]F:(\D+) $(\1: CFA franc, CFA francs, centime, centimes) ZAR:(\D+) $(\1: South African rand, South African rand, cent, cents) ZMK:(\D+) $(\1: Zambian kwacha, Zambian kwacha, ngwee, ngwee) ZWL:(\D+) $(\1: Zimbabwe dollar, Zimbabwe dollars, cent, cents) "(JPY [-−]?\d+)[.,](\d\d)0" $1 "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2 रिन "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 ज्याओ "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 फेन "((MGA|MRO) [-−]?\d+)[.,]0" $1 "((MGA|MRO) [-−]?\d+)[.,]2" $1 आणि |$(1)$(\2:ss) "((MGA|MRO) [-−]?\d+)[.,]4" $1 आणि |$(2)$(\2:sp) "((MGA|MRO) [-−]?\d+)[.,]6" $1 आणि |$(3)$(\2:sp) "((MGA|MRO) [-−]?\d+)[.,]8" $1 आणि |$(4)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 आणि |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 आणि |$(\30)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 आणि |$3$(\2:sp) == money == "(JPY [-−]?\d+)[.,](\d\d)0" $1 "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2 रिन "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 ज्याओ "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 फेन "(MGA|MRO) ([-−]?\d+)[.,]0" $2$(\1:us) "(MGA|MRO) ([-−]?\d+)[.,]2" $2 आणि 1/5$(\1:us) "(MGA|MRO) ([-−]?\d+)[.,]4" $2 आणि 2/5$(\1:up) "(MGA|MRO) ([-−]?\d+)[.,]6" $2 आणि 3/5$(\1:up) "(MGA|MRO) ([-−]?\d+)[.,]8" $2 आणि 4/5$(\1:up) "([A-Z]{3}) ([-−]?1)" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)" $2$(\1:up) "(([A-Z]{3}) ([-−]?\d+))[.,](01)" $3 आणि 1/100$(\2:us) "(([A-Z]{3}) ([-−]?\d+))[.,](\d)" $3 आणि \40/100$(\2:up) "(([A-Z]{3}) ([-−]?\d+))[.,](\d\d)" $3 आणि \4/100$(\2:up) "(([A-Z]{3}) ([-−]?\d+))[.,](\d\d\d)" $3 आणि \4/1000$(\2:up) # ------------------------ # Ordinal ------ # Ordinal no. reading in Marathi are GENDER dependent ( and not as simple in English where anyone at no 1 will be read as FIRST ) # in Marathi there are 3 gender identities Male पुल्लिंगी , Female स्त्रिलिंगी & Neutral नपुसकलिंगी (similar to masculine, feminine, neuter in Swiss ) # ----------------------- # If a sentence refer to MALE subject equivalent of FIRST is पहिला # ordinal masculine --- पुल्लिंगी == ordinal-masculine == ([-−]?\d+) $(ordinal-masculine |$1) (.*)एक \1पहिला (.*)दोन \1दुसरा (.*)तीन \1तिसरा (.*)चार \1चौथा (.*)पाच \1पाचवा (.*)सहा \1सहावा (.*)सात \1सातवा (.*)आठ \1आठवा (.*)नऊ \1नववा (.*)दहा \1दहावा (.*)अकरा \1अकरावा (.*)बारा \1बारावा (.*)तेरा \1तेरावा (.*)चौदा \1चौदावा (.*)पंधरा \1पंधरावा (.*)सोळा \1सोळावा (.*)सतरा \1सतरावा (.*)अठरा \1अठरावा (.*)एकोणऐंशी \1एकोणऐंशीवा (.*)ऐंशी \1ऐंशीवा (.*)एक्याऐंशी \1एक्याऐंशीवा (.*)ब्याऐंशी \1ब्याऐंशीवा (.*)त्र्याऐंशी \1त्र्याऐंशीवा (.*)चौऱ्याऐंशी \1चौऱ्याऐंशीवा (.*)पंचाऐंशी \1पंचाऐंशीवा (.*)शहाऐंशी \1शहाऐंशीवा (.*)सत्त्याऐंशी \1सत्त्याऐंशीवा (.*)अठ्ठ्याऐंशी \1अठ्ठ्याऐंशीवा ([-−]?\d+)[.,](.*) $1 दशांश $(\2)वा # Ordinal of Decimals (.*) \1ावा # General Masculine Ordinal # ----------------------- # If a sentence refer to FEMALE subject equivalent of FIRST is पहिली # ordinal feminine --- स्त्रिलिंगी == ordinal-feminine == ([-−]?\d+) $(ordinal-feminine |$1) (.*)एक \1पहिली (.*)दोन \1दुसरी (.*)तीन \1तिसरी (.*)चार \1चौथी (.*)पाच \1पाचवी (.*)सहा \1सहावी (.*)सात \1सातवी (.*)आठ \1आठवी (.*)नऊ \1नववी (.*)दहा \1दहावी (.*)अकरा \1अकरावी (.*)बारा \1बारावी (.*)तेरा \1तेरावी (.*)चौदा \1चौदावी (.*)पंधरा \1पंधरावी (.*)सोळा \1सोळावी (.*)सतरा \1सतरावी (.*)अठरा \1अठरावी (.*)एकोणऐंशी \1एकोणऐंशीवी (.*)ऐंशी \1ऐंशीवी (.*)एक्याऐंशी \1एक्याऐंशीवी (.*)ब्याऐंशी \1ब्याऐंशीवी (.*)त्र्याऐंशी \1त्र्याऐंशीवी (.*)चौऱ्याऐंशी \1चौऱ्याऐंशीवी (.*)पंचाऐंशी \1पंचाऐंशीवी (.*)शहाऐंशी \1शहाऐंशीवी (.*)सत्त्याऐंशी \1सत्त्याऐंशीवी (.*)अठ्ठ्याऐंशी \1अठ्ठ्याऐंशीवी ([-−]?\d+)[.,](.*) $1 दशांश $(\2)वी # Ordinal of Decimals (.*) \1ावी # General Feminine Ordinal # ----------------------- # If a sentence refer to NEUTRAL subject equivalent of FIRST is पहिले / पहिलं # ordinal neutral --- नपुसकलिंगी == ordinal-neutral == ([-−]?\d+) $(ordinal-neutral |$1) (.*)एक \1पहिले (.*)दोन \1दुसरे (.*)तीन \1तिसरे (.*)चार \1चौथे (.*)पाच \1पाचवे (.*)सहा \1सहावे (.*)सात \1सातवे (.*)आठ \1आठवे (.*)नऊ \1नववे (.*)दहा \1दहावे (.*)अकरा \1अकरावे (.*)बारा \1बारावे (.*)तेरा \1तेरावे (.*)चौदा \1चौदावे (.*)पंधरा \1पंधरावे (.*)सोळा \1सोळावे (.*)सतरा \1सतरावे (.*)अठरा \1अठरावे (.*)एकोणऐंशी \1एकोणऐंशीवे (.*)ऐंशी \1ऐंशीवे (.*)एक्याऐंशी \1एक्याऐंशीवे (.*)ब्याऐंशी \1ब्याऐंशीवे (.*)त्र्याऐंशी \1त्र्याऐंशीवे (.*)चौऱ्याऐंशी \1चौऱ्याऐंशीवे (.*)पंचाऐंशी \1पंचाऐंशीवे (.*)शहाऐंशी \1शहाऐंशीवे (.*)सत्त्याऐंशी \1सत्त्याऐंशीवे (.*)अठ्ठ्याऐंशी \1अठ्ठ्याऐंशीवे ([-−]?\d+)[.,](.*) $1 दशांश $(\2)वे # Ordinal of Decimals (.*) \1ावे # General Neutral Ordinal # ----------------------- # As the SUBJECT in the sentence forming is unknown and is out of scope of this code, default ordinal numbering is set to output all possible GENDERs separated by " / " , and hence may not deliver grammatically correct sentences ( we have hard coded Ordinal numbers from 1-10 with all possible GENDERs separated by " / " .. as in पहिला / पहिली / पहिले # This is done deliberately considering ease of use. # As separate commands for masculine, feminine & neutral eventhough exists, a User may not be aware. So by providing all gender words in default ordinal option, user at least will get some output of relevance. # ordinal default --- ordinal words with all gender options separated by " / " == ordinal == # Default ([-−]?\d+) $(ordinal |$1) (.*)एक \1पहिला / \1 पहिली / \1 पहिले (.*)दोन \1दुसरा / \1 दुसरी / \1 दुसरे (.*)तीन \1तिसरा / \1 तिसरी / \1 तिसरे (.*)चार \1चौथा / \1 चौथी / \1 चौथे (.*)पाच \1पाचवा / \1 पाचवी / \1 पाचवे (.*)सहा \1सहावा / \1 सहावी / \1 सहावे (.*)सात \1सातवा / \1 सातवी / \1 सातवे (.*)आठ \1आठवा / \1 आठवी / \1 आठवे (.*)नऊ \1नववा / \1 नववी / \1 नववे (.*)दहा \1दहावा / \1 दहावी / \1 दहावे (.*)अकरा \1अकरावा / \1 अकरावी / \1 अकरावे (.*)बारा \1बारावा / \1 बारावी / \1 बारावे (.*)तेरा \1तेरावा / \1 तेरावी / \1 तेरावे (.*)चौदा \1चौदावा / \1 चौदावी / \1 चौदावे (.*)पंधरा \1पंधरावा / \1 पंधरावी / \1 पंधरावे (.*)सोळा \1सोळावा / \1 सोळावी / \1 सोळावे (.*)सतरा \1सतरावा / \1 सतरावी / \1 सतरावे (.*)अठरा \1अठरावा / \1 अठरावी / \1 अठरावे (.*)एकोणऐंशी \1एकोणऐंशीवा / \1 एकोणऐंशीवी / \1 एकोणऐंशीवे (.*)ऐंशी \1ऐंशीवा / \1 ऐंशीवी / \1 ऐंशीवे (.*)एक्याऐंशी \1एक्याऐंशीवा / \1 एक्याऐंशीवी / \1 एक्याऐंशीवे (.*)ब्याऐंशी \1ब्याऐंशीवा / \1 ब्याऐंशीवी / \1 ब्याऐंशीवे (.*)त्र्याऐंशी \1त्र्याऐंशीवा / \1 त्र्याऐंशीवी / \1 त्र्याऐंशीवे (.*)चौऱ्याऐंशी \1चौऱ्याऐंशीवा / \1 चौऱ्याऐंशीवी / \1 चौऱ्याऐंशीवे (.*)पंचाऐंशी \1पंचाऐंशीवा / \1 पंचाऐंशीवी / \1 पंचाऐंशीवे (.*)शहाऐंशी \1शहाऐंशीवा / \1 शहाऐंशीवी / \1 शहाऐंशीवे (.*)सत्त्याऐंशी \1सत्त्याऐंशीवा / \1 सत्त्याऐंशीवी / \1 सत्त्याऐंशीवे (.*)अठ्ठ्याऐंशी \1अठ्ठ्याऐंशीवा / \1 अठ्ठ्याऐंशीवी / \1 अठ्ठ्याऐंशीवे ([-−]?\d+)[.,](.*) $1 दशांश $(\2)वा / $1 दशांश $(\2)वी / $1 दशांश $(\2)वे # Ordinal of Decimals (.*) \1ावा / \1ावी / \1ावे # General ALL Gender Ordinals # ----------------------- # Also we have considered to use generalized method where result for "ELEVEN" will be like - क्रमांक अकरा (similar to saying "Rank Eleven" in English in a gender neutral way.) # ordinal Sequential --- ordinal-sq == ordinal-sq == ([-−]?\d+) $(ordinal-sq |$1) (.*) क्रमांक \1 # ------------------------ # ordinal-number # Not relevant in Marathi == ordinal-number == ([-−]?\d+) $(ordinal-number |$2) (.*) \2 # ------------------------ # cardinal # Not relevant in Marathi == cardinal(-)? == ([-−]?\d+) $(cardinal |$2) (.*) \2 # ------------------------ == year == (1[0-9])00 $1शे (1[0-9])([0-9][0-9]) $1शे $2 # e.g. 1857 = अठराशे सत्तावन्न , 1947 = एकोणीसशे सत्तेचाळीस (2[0-9])([0-9][0-9]) $1शे $2 # e.g. 2021 = वीसशे एकवीस (3[0-9])([0-9][0-9]) $1शे $2 (4[0-9])([0-9][0-9]) $1शे $2 (5[0-9])([0-9][0-9]) $1शे $2 (6[0-9])([0-9][0-9]) $1शे $2 (7[0-9])([0-9][0-9]) $1शे $2 (8[0-9])([0-9][0-9]) $1शे $2 (9[0-9])([0-9][0-9]) $1शे $2 (.*) $(year-remove-and $1) # ------------------------ == year-remove-and == "(.*) and (.*)" \1 \2 (.*) \1 == help == "" $(1)|, $(2), $(3)\n$(\0 ordinal)$(\0 ordinal-masculine)$(\0 ordinal-feminine)$(\0 ordinal-neutral)$(\0 ordinal-sq)$(\0 ordinal-number)year: $(year 1999), two thousand, $(year 2001) "" \ncurrency \(for example, INR\): $(INR 2.5)\nmoney INR: $(money INR 2.5) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/ms.sor000066400000000000000000000056631416364754400165110ustar00rootroot00000000000000^0 kosong 1 satu 2 dua 3 tiga 4 empat 5 lima 6 enam 7 tujuh 8 lapan 9 sembilan 10 sepuluh 11 sebelas 1(\d) $1 belas (\d)(\d) $1 puluh[ $2] 1(\d\d) seratus[ $1] (\d)(\d\d) $1 ratus[ $2] 1(\d{3}) seribu[ $1] (\d{1,3})(\d{3}) $1 ribu[ $2] # sejuta or setu juta etc. (\d{1,3})(\d{6}) $1 juta[ $2] (\d{1,3})(\d{9}) $1 bilion[ $2] (\d{1,3})(\d{12}) $1 trilion[ $2] (\d{1,3})(\d{15}) $1 kuadrilion[ $2] (\d{1,3})(\d{18}) $1 kuantilion[ $2] (\d{1,3})(\d{21}) $1 sextilion[ $2] (\d{1,3})(\d{24}) $1 septilion[ $2] # negative numbers [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" $1| koma "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # unit/subunit u:(.*),(.*) \1 s:(.*),(.*) \2 AUD:(.) $(\1: dollar Australia, sen) BGN:(.) $(\1: lev, leva, stotinka, stotinki) BWP:(.) $(\1: pula, pula, thebe, thebe) CAD:(.) $(\1: dollar Kanada, sen) CHF:(.) $(\1: franc Swiss, sen) CNY:(.) $(\1: yuan, fen) CZK:(.) $(\1: koruna Czech, koruna Czech, halér, halére) EEK:(.) $(\1: kroon, kroonid, sen) EUR:(.) $(\1: euro, sen) GBP:(.) $(\1: pound sterling, penny) GHS:(.) $(\1: cedi Ghana, pesewas) GMD:(.) $(\1: dalasi, bututs) HKD:(.) $(\1: dollar Hongkong, sen) IDR:(.) $(\1: rupiah, sen) INR:(.) $(\1: rupee India, paisa) JMD:(.) $(\1: dollar Jamaika, sen) JPY:(.) $(\1: yen, sen) KRW:(.) $(\1: won, chon) KES:(.) $(\1: shilling Kenya, sen) LRD:(.) $(\1: dollar Liberia, sen) LSL:(.) $(\1: loti, sente) LTL:(.) $(\1: litas, sen) LVL:(.) $(\1: lats, sen) MGA:(.) $(\1: ariary, iraimbilanja) MUR:(.) $(\1: rupee Mauritius, sen) MXN:(.) $(\1: peso Meksiko, centavo) MWK:(.) $(\1: kwacha Malawi, tambala) MYR:(.) $(\1: Ringgit, sen) NAD:(.) $(\1: dollar Namibia, sen) NGN:(.) $(\1: naira, kobo) NZD:(.) $(\1: dollar New Zealand, sen) PGK:(.) $(\1: kina, toea) PHP:(.) $(\1: peso Filipina, centavo) PKR:(.) $(\1: rupee Pakistan, paisa) PLN:(.) $(\1: zloty, grosz) RON:(.) $(\1: leu Romania, ban) RSD:(.) $(\1: dinar Serbia, para) RUB:(.) $(\1: ruble Russia, kopek) RWF:(.) $(\1: franc Rwanda, centime) SGD:(.) $(\1: dollar Singapura, sen) SLL:(.) $(\1: leone, sen) SZL:(.) $(\1: lilangeni, sen) THB:(.) $(\1: baht, satang) TRY:(.) $(\1: lira Turki, kurus) TTD:(.) $(\1: dollar Trinidad dan Tobago, sen) TZS:(.) $(\1: shilling Tanzania,sen) UAH:(.) $(\1: hryvnia, kopiyka) UGX:(.) $(\1: shilling Uganda, sen) USD:(.) $(\1: dolar Amerika, sen) ZAR:(.) $(\1: rand Afrika Selatan, sen) ZMK:(.) $(\1: kwacha Zambia, ngwee) ZWL:(.) $(\1: dollar Zimbabwe, sen) "(JPY [-−]?\d+)[.,](\d\d)0" $1 "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2 rin "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:u) "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 yiao "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 dan $(\30)$(\2:s) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 dan $3$(\2:s) == ordinal == 1 pertama (\d+) $(ordinal ke$1) "kesatu (.*)" kese\1 (.*) \1 == ordinal-number == 1 1 (\d+) ke-\1 == help == "" $(1), $(2), $(3)\n$(help ordinal)$(help ordinal-number) (ordinal(-number)?) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/mt.sor000066400000000000000000000030201416364754400164730ustar00rootroot00000000000000^0 xejn # żero 1 wieħed 2 tnejn 3 tlieta 4 erbgħa 5 ħamsa 6 sitta 7 sebgħa 8 tmienja 9 disgħa 10 għaxra 11 ħdax 12 tnax 13 tlettax 14 erbatax 15 ħmistax 16 sittax 17 sbatax 18 tmintax 19 dsatax 2(\d) [$1 u ]għoxrin 3(\d) [$1 u ]tletin 4(\d) [$1 u ]erbgħin 5(\d) [$1 u ]ħamsin 6(\d) [$1 u ]sittin 7(\d) [$1 u ]sebgħin 8(\d) [$1 u ]tmenin 9(\d) [$1 u ]disgħin 1(\d\d) mija[ $1] 2(\d\d) mitejn[ $1] 3(\d\d) tliet mija[ $1] 4(\d\d) erba’ mija[ $1] 5(\d\d) hames mija[ $1] 6(\d\d) sitt mija[ $1] 7(\d\d) seba’ mija[ $1] 8(\d\d) tminn mija[ $1] 9(\d\d) disa’ mija[ $1] 1(\d{1,3}) elf[ $1] 2(\d{1,3}) elfejn[ $1] 3(\d{1,3}) tlitt elef[ $1] 4(\d{1,3}) erbat elef[ $1] 5(\d{1,3}) ħamest elef[ $1] 6(\d{1,3}) sitt elef[ $1] 7(\d{1,3}) sebat elef[ $1] 8(\d{1,3}) tmint elef[ $1] 9(\d{1,3}) disat elef[ $1] (\d{1,3})(\d\d\d) $1 elf[ $2] (\d{1,3})(\d{6}) $1 miljun[ $2] (\d{1,3})(\d{9}) $1 biljun[ $2] (\d{1,3})(\d{12}) $1 triljun[ $2] == cardinal-feminine == 1 waħda (.*) $1 == cardinal-masculine == (.*) $1 == ordinal == 1 l-ewwel 2 it-tieni 3 it-tielet 4 ir-raba’g 5 il-ħames 6 is-sitt 7 is-seba’g 8 it-tmien 9 id-disa’g 10 l-għaxar 11 il-ħdax 12 it-tnax 13 it-tlettax 14 l-erbatax 15 il-ħmistax 16 is-sittax 17 is-sbatax 18 it-tmintax 19 id-dsatax 20 l-għoxrin (.*) \1 == ordinal-number == (.*) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help ordinal)$(help ordinal-number) (cardinal(-feminine|-masculine)?|ordinal(-number)?) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/nl.sor000066400000000000000000000035721416364754400165000ustar00rootroot00000000000000^0$ nul 1$ een 1 eenen 2$ twee 2 tweeën 3$ drie 3 drieën 4$ vier 4 vieren 5$ vijf 5 vijfen 6$ zes 6 zesen 7$ zeven 7 zevenen 8$ acht 8 achten 9$ negen 9 negenen 10 tien 11 elf 12 twaalf 13 dertien 14 veertien 1(\d) $1|tien 2(\d) $1twintig 3(\d) $1dertig 4(\d) $1veertig 8(\d) $1tachtig (\d)(\d) $2$1|tig 1(\d\d) honderd$1 (\d)(\d\d) $1|honderd$2 10(\d{2}) duizend[ $1] (\d)0(\d{2}) $1|duizend[ $2] (1\d)(\d{2}) $1|honderd$2 (\d\d)(\d{2}) $1|honderd$2 (\d{2,3})(\d{3}) $1|duizend[ $2] (\d{1,3})(\d{6}) $1| miljoen[ $2] (\d{1,3})(\d{9}) $1| miljard[ $2] (\d{1,3})(\d{12}) $1| biljoen[ $2] (\d{1,3})(\d{15}) $1| biljard[ $2] (\d{1,3})(\d{18}) $1| triljoen[ $2] (\d{1,3})(\d{21}) $1| triljard[ $2] # negative number [-−](\d+) min |$1 # decimals ([-−]?\d+)[.,] $1| komma ([-−]?\d+[.,]\d*)(\d) $1| |$2 # currencies # unit/subunit u:([^,]*),([^,]*),([^,]*) \1 s:([^,]*),([^,]*),([^,]*) \2 p:([^,]*),([^,]*),([^,]*) \3 CHF:(.) $(\1: Zwitserse franc, centime, centimes) CNY:(.) $(\1: renminbi yuan, fen, fen) EUR:(.) $(\1: euro, cent, cent) GBP:(.) $(\1: pond sterling, penny, pence) JPY:(.) $(\1: yen, sen, sen) USD:(.) $(\1: Amerikaanse dollar, cent, cent) "(JPY [-−]?\d+)[.,](\d\d)0" $1 "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2| rin "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2|$(\1:u) "(CNY [-−]?\d+)[.,](\d)0?" $1 $2| jiao "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2| fen "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 een$(\2:s) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 $(\30)|$(\2:p) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 $3|$(\2:p) == ordinal == ([-−]?([24-79]|\d*1\d|\d+0[24-79])) $1|de ([-−]?\d+) $(ordinal |$1) (.*)een \1eerste (.*)drie \1derde (.*) \1ste == ordinal-number == ([-−]?([2-79]|\d*1\d|\d+0[2-79])) \1de ([-−]?\d+) \1ste == help == "" $(1)|, $(2)|, $(3)|\n$(\0 ordinal)$(\0 ordinal-number)currency \(for example, EUR\): $(EUR 2.5) "(ordinal(-number)?)" \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/no.sor000066400000000000000000000055461416364754400165060ustar00rootroot00000000000000^0 null 1 éin # [:nn:] [:nn-NO:] 1 én 2 to 3 tre 4 fire 5 fem 6 seks 7 sju 8 åtte 9 ni 10 ti 11 elleve 12 tolv 13 tretten 14 fjorten 15 femten 16 seksten 17 sytten 18 atten 19 nitten 2(\d) tjue[$1] 3(\d) tretti[$1] 4(\d) førti[$1] 5(\d) femti[$1] 6(\d) seksti[$1] 7(\d) sytti[$1] 8(\d) åtti[$1] 9(\d) nitti[$1] (\d)(\d\d) $(cardinal-neuter \1) hundre[ og $2] (\d{1,3})(\d{3}) $(cardinal-neuter \1) tusen[ og $2] a:1,0+ a:\d+,0+ er a:1,(\d+) " og $1" a:\d+,(\d+) "er og $1" (\d{1,3})(\d{6}) $1 million$(a:\1,\2) (\d{1,3})(\d{9}) $1 milliard$(a:\1,\2) (\d{1,3})(\d{12}) $1 billion$(a:\1,\2) (\d{1,3})(\d{15}) $1 billiard$(a:\1,\2) (\d{1,3})(\d{18}) $1 trillion$(a:\1,\2) (\d{1,3})(\d{21}) $1 trilliard$(a:\1,\2) (\d{1,3})(\d{24}) $1 kvadrillion$(a:\1,\2) # negative number [-−](\d+) minus |$1 # decimals ([-−]?\d+)[.,] $1| komma "([-−]?\d+[.,]0*)(\d+)" $1 |$2 ([-−]?\d+[.,]\d*)(\d) $1| |$2 # currency # unit/subunit singular/plural us:([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*) \2 ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 CHF:(\D+) $(\1: sveitsisk franc, sveitsisk franc, centime, centimes) CNY:(\D+) $(\1: renminbi yuan, renminbi yuan, fen, fen) DKK:(\D+) $(\1: dansk krone, danske kroner, øre, øre) EUR:(\D+) $(\1: euro, euro, cent, cent) GBP:(\D+) $(\1: britisk pund, britisk pund, penny, pence) ISK:(\D+) $(\1: islandsk krone, islandske kroner, eyrir, aurar) JPY:(\D+) $(\1: yen, yen, sen, sen) NOK:(\D+) $(\1: norsk krone, norske kroner, øre, øre) SEK:(\D+) $(\1: svensk krone, svenske kroner, øre, øre) USD:(\D+) $(\1: amerikansk dollar, amerikansk dollar, cent, cent) "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) "(CNY [-−]?\d+)[.,]10?" $1 $2 jiao "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao "(CNY [-−]?\d+[.,]\d)1" $1 $2 fen "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 |$3$(\2:sp) == cardinal-feminine == 1 éi == cardinal-neuter == 1 eitt # [:nn:] [:nn-NO:] 1 ett == cardinal(-feminine|-masculine|-neuter)? == (.*\d+) $2 == ordinal == ([-−]?\d+) $(ordinal |$1) null nullte # 0 (éi?n) første # 1 "(.*) én" \1 først # 1 (.*)to \1annen # 2 (.*)tre \1tredje # 3 (.*)fire \1fjerde # 4 (.*(fem|ellev|tolv|ard|on))(e|er)? \1te # 5, 11, 12, 10^6, 10^9 etc. (.*)seks \1sjette # 6 (.*)tres \1tressende # 60 (.*(sju|ått|ni|ti|tju|ti))e? \1ende # 7, 8, 9, 10, 20, 30, 40, 50, 70, 80, 90 (.*(en|hundre|tusen)) \1de # 13-19, 100, 1000 == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help cardinal-neuter)$(help ordinal)$(help ordinal-number) (cardinal(-feminine|-masculine|-neuter)?|ordinal(-number)?) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/pl.sor000066400000000000000000000103511416364754400164730ustar00rootroot00000000000000^0 zero 1 jeden 2 dwa 3 trzy 4 cztery 5 pięć 6 sześć 7 siedem 8 osiem 9 dziewięć 10 dziesięć 11 jedenaście 14 czternaście 15 piętnaście 16 szesnaście 19 dziewiętnaście 1(\d) $1naście 2(\d) dwadzieścia[ $1] 3(\d) trzydzieści[ $1] 4(\d) czterdzieści[ $1] (\d)(\d) $1dziesiąt[ $2] 1(\d\d) sto[ $1] 2(\d\d) dwieście[ $1] ([34])(\d\d) $1sta[ $2] (\d)(\d\d) $1set[ $2] 1(\d{3}) tysiąc[ $1] ([234]|[2-9][234]|\d[02-9][234])(\d{3}) $1 tysiące[ $2] (\d{1,3})(\d{3}) $1 tysięcy[ $2] # affix function :1,(.+) \1 :(1[1-9]),(.+) $1 \2ów :([234]|[2-9][234]|\d[02-9][234]),(.+) $1 \2y :(\d+),(.+) $1 \2ów (\d{1,3})(\d{6}) $(:\1,milion)[ $2] (\d{1,3})(\d{9}) $(:\1,miliard)[ $2] (\d{1,3})(\d{12}) $(:\1,bilion)[ $2] (\d{1,3})(\d{15}) $(:\1,biliard)[ $2] (\d{1,3})(\d{18}) $(:\1,trylion)[ $2] (\d{1,3})(\d{21}) $(:\1,tryliard)[ $2] (\d{1,3})(\d{24}) $(:\1,kwadrylion)[ $2] # negative number [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" $1| przecinek "([-−]?\d+[.,])([^0]\d)" $1| |$2 "([-−]?\d+[.,])(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # unit/subunit singular / nominative plural / genitive plural us:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \2 ug:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \3 ss:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \4 sp:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \5 sg:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \6 AUD:(\D+) $(\1: dolar australijski, dolary australijskie, dolarów australijskich, cent, centy, centów) BGN:(\D+) $(\1: lew bułgarski, lewy bułgarskie, lewów bułgarskich, stotinka, stotinki, stotinek) CHF:(\D+) $(\1: frank szwajcarski, franki szwajcarskie, franków szwajcarskich, centym, centymy, centymów) CAD:(\D+) $(\1: dolar kanadyjski, dolary kanadyjskie, dolarów kanadyjskich, cent, centy, centów) CNY:(\D+) $(\1: juan, juany, juanów, fen, feny, fenów) EUR:(\D+) $(\1: euro, euro, euro, cent, centy, centów) GBP:(\D+) $(\1: funt szterling, funty szterlingi, funtów szterlingów, pens, pensy, pensów) HUF:(\D+) $(\1: forint, forinty, forintów, filler, fillery, fillerów) JPY:(\D+) $(\1: jen, jeny, jenów, sen, seny, senów) PLN:(\D+) $(\1: złoty, złote, złotych, grosz, grosze, groszy) RUB:(\D+) $(\1: rubel rosyjski, ruble rosyjskie, rubli rosyjskich, kopiejka, kopiejki, kopiejek) USD:(\D+) $(\1: dolar amerykański, dolary amerykańskie, dolarów amerykańskich, cent, centy, centów) "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) "([A-Z]{3}) ([-−]?[234])([.,]00?)?" $2$(\1:up) "([A-Z]{3}) ([-−]?\d*[02-9][234])([.,]00?)?" $2$(\1:up) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:ug) "(CNY [-−]?\d+)[.,]10?" $1 $2 jiao "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao "(CNY [-−]?\d+[.,]\d)1" $1 $2 fen "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fenów "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,]([02-9][234])" $1 |$3$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sg) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 |$3$(\2:sg) == ordinal(-masculine)? == ([-−]?\d+) $(ordinal |$2) "(.*)siąt (.*)" $(ordinal \2siąty \3) "(.*)eści (.*)" $(ordinal \2esty \3) "(.*)dwadzieścia (.*)" $(ordinal \2dwudziesty \3) (.*)dwadzieścia \2dwudziesty (.*)jeden \2pierwszy (.*)dwa \2drugi (.*)trzy \2trzeci (.*)cztery \2czwarty (.*)pięć \2piąty (.*)sześć \2szósty (.*)siedem \2siódmy (.*)osiem \2ósmy (.*)dziewięć \2dziewiąty (.*)dziesięć \2dziesiąty (.*)jedenaście \2jedenasty (.*)dwanaście \2dwunasty (.*)dwieście \2dwusetny (.*)siąt \2siąty (.*)trzysta \2trzechsetny (.*)czterysta \2czterechsetny (.*)ści[ea] \2sty (.*)eści \2esty (.*)(sto|set) \2setny "(.*)dwa tysiące" \2dwutysięczny "(.*)pięć tysięcy" \2pięciotysięczny "(.*)sto tysięcy" \2stutysięczny "(.*) (tysi[ąę]c[ey]?)" \2tysięczny (.*)tysiąc \2tysięczny (.*(on|ard))(y|ów)? \2owy == ordinal-feminine == ([-−]?\d+) $(ordinal-feminine $(ordinal |$1)) "(.*)[yi] (.*)" $(ordinal-feminine \1a \2) (.*)[yi] \1a == ordinal-neuter == ([-−]?\d+) $(ordinal-neuter $(ordinal |$1)) "(.*)[yi] (.*)" $(ordinal-neuter \1e \2) (.*)[yi] \1e == ordinal-number == (\d+) \1. == help == "" $(1), $(2), $(3)\n$(help ordinal)$(help ordinal-number) (ordinal(-number)?) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/pt.sor000066400000000000000000000116721416364754400165120ustar00rootroot00000000000000^0 zero 1 um 2 dois 3 três 4 quatro 5 cinco 6 seis 7 sete 8 oito 9 nove 10 dez 11 onze 12 doze 13 treze 14 quatorze 15 quinze 16 dezesseis # [:pt-BR:] 16 dezasseis 17 dezessete # [:pt-BR:] 17 dezassete 18 dezoito 19 dezenove # [:pt-BR:] 19 dezanove 20 vinte 30 trinta 40 quarenta 50 cinquenta 60 sessenta 70 setenta 80 oitenta 90 noventa (\d)(\d) $(\10) e $2 100 cem 1(\d\d) cento e $1 2(\d\d) duzentos[ e $1] 3(\d\d) trezentos[ e $1] 5(\d\d) quinhentos[ e $1] (\d)(\d\d) $1centos[ e $2] :0+ :0*\d{1,2}(\d{6}){0,} " e " # mil e um, mil e dez :0*\d00(\d{6}){0,} " e " # mil e quinhentos :0*\d{1,2}000(\d{6}){0,} " e " # um milhão e onze mil :0*\d{1}00000(\d{6}){0,} " e " # um milhão e cem mil :\d+ " " pl:1 ão # milhão pl:.* ões # milhões 1(\d\d\d) mil$(:\1)$1 (\d{1,3})(\d\d\d) $1 mil$(:\2)$2 (\d{1,3})(\d{6}) $1 milh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{9}) $1 bilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{12}) $1 trilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{15}) $1 quatrilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{18}) $1 quintilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{18}) $1 sextilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,3})(\d{24}) $1 septilh$(pl:\1)$(:\2)$2 # [:pt-BR:] (\d{1,6})(\d{6}) $1 milh$(pl:\1)$(:\2)$2 (\d{1,6})(\d{12}) $1 bili$(pl:\1)$(:\2)$2 (\d{1,6})(\d{18}) $1 trili$(pl:\1)$(:\2)$2 (\d{1,6})(\d{24}) $1 quatrili$(pl:\1)$(:\2)$2 # negative number [-−](\d\d*) menos |$1 # decimals ([-−]?\d+)[.] $1| ponto ([-−]?\d+)[,] $1| vírgula ([-−]?\d+[.,])([^0]\d) $1| |$2 "([-−]?\d+[.,])(\d)(\d)(\d)" |$1 |$2| |$3| |$4 ([-−]?\d+[.,]\d*)(\d) $1| |$2 # currency (monedas) # unit/subunit singular/plural us:([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*) \2 ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 AOA:(\D+) $(\1: kwanza, kwanzas, cêntimo, cêntimos) ARG:(\D+) $(\1: peso argentino, pesos argentinos, centavo, centavos) BOB:(\D+) $(\1: boliviano, bolivianos, centavo, centavos) BRL:(\D+) $(\1: real, reais, centavo, centavos) # [:pt-BR:] BRL:(\D+) $(\1: real, réis, centavo, centavos) CHF:(\D+) $(\1: franco suíço, francos suíços, cêntimo, cêntimos) CNY:(\D+) $(\1: yuan renminbi, yuan renminbi, fen, fen) CVE:(\D+) $(\1: escudos cabo-verdianos, escudos cabo-verdianos, centavo, centavos) EUR:(\D+) $(\1: euro, euros, cent, cents) GBP:(\D+) $(\1: libra esterlina, libras esterlinas, penny, pence) JPY:(\D+) $(\1: iene, ienes, sen, sen) MOP:(\D+) $(\1: pataca, patacas, avo, avos) MXN:(\D+) $(\1: peso mexicano, pesos mexicanos, centavo, centavos) MZM:(\D+) $(\1: metical, meticais, centavo, centavos) STD:(\D+) $(\1: dobra, dobras, cêntimo, cêntimos) USD:(\D+) $(\1: dólar americano, dólares americanos, cêntimo, cêntimos) XOF:(\D+) $(\1: franco CFA, francos CFA, cêntimo, cêntimos) # masculine to feminine conversion of "un" after millions, # if "as?$" matches currency name f:(.*il[hi])(.*),(.*) \1$(f:\2,\3) # don't modify millions f:(.*um)([^a].*,|,)(.*as?) $(f:\1a\2\3) # um libra -> uma libra f:(.*d)oi(s.*),(.*as?) $(f:\1ua\2,\3) # dois libra -> duas libra f:(.*ent)o(s.*),(.*as?) $(f:\1a\2,\3) # duzentos libra -> duzentas libra f:(.*),(.*) \1\2 "([A-Z]{3}) ([-−]?1)([.,]00?)?"$(f:|$2,$(\1:us)) "([A-Z]{3}) ([-−]?\d+0{6,})([.,]00?)?" $2 de$(\1:up) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?"$(f:|$2,$(\1:up)) "(CNY [-−]?\d+)[.,]10?" $1 $2 jiao "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao "(CNY [-−]?\d+[.,]\d)1" $1 $2 fen "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 e |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 e |$(\30)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 e |$3$(\2:sp) == feminine == ([-−]?\d+) $(feminine $1) (.*)um \1uma (.*)dois(.*) $(feminine \1duas\2) (.*) \1 == masculine == ([-−]?\d+) $1 == ordinal(-masculine)? == 1 primeiro 2 segundo 3 terceiro 4 quarto 5 quinto 6 sexto 7 sétimo 8 oitavo 9 nono 10 décimo 20 vigésimo 30 trigésimo 40 cuadragésimo 50 quincuagésimo 60 sexagésimo 70 septuagésimo 80 octogésimo 90 nonagésimo (\d)(\d) $(ordinal \20) $(ordinal \3) 100 centésimo 200 ducentésimo 300 trecentésimo 400 quadrigentésimo 500 quingentésimo 600 sexcentésimo 700 septicentésimo 800 octigentésimo 900 nongentésimo (\d)(\d\d) $(ordinal \200) $(ordinal \3) 1(\d{3}) milésimo[ $(ordinal \2)] (\d)(\d{3}) $2 milésimo[ $(ordinal \3)] 1(\d{6}) milionésimo[ $(ordinal \2)] (\d{1,3})(\d{6}) $2 milionésimo[ $(ordinal \3)] 1(\d{9}) bilionésimo[ $(ordinal \2)] (\d{1,3})(\d{9}) $2 bilionésimo[ $(ordinal \3)] == ordinal-feminine == ([-−]?\d+) $(ordinal-feminine $(ordinal-masculine \1)) (.*)o\b(.*) $(ordinal-feminine \1a\2) (.*) \1 == (ordinal)-number(-feminine|-masculine)? == ([-−]?\d+) \3$(ordinal-number $(\1\2 \3)) .*er .ᵉʳ .*a .ª .*o .º == help == "" $(1)|, $(2), $(3)\n$(\0 feminine)$(\0 masculine)$(\0 ordinal-feminine)$(\0 ordinal-masculine)$(\0 ordinal-number-feminine)$(\0 ordinal-number-masculine) (feminine|masculine|ordinal(-number)?(-feminine|-masculine)?) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/ro.sor000066400000000000000000000060131416364754400165000ustar00rootroot00000000000000^0 zero 1 unu 2$ doi 2 două 3 trei 4 patru 5 cinci 6$ șase 6 șai 7 șapte 8 opt 9 nouă 10 zece 11 unsprezece 12 doisprezece 14 paisprezece 1(\d) $1sprezece (\d)(\d) $1zeci[ și $2] 1(\d\d) o sută[ $1] (\d)(\d\d) $1 sute[ $2] 1(\d{3}) o mie[ $1] (1?\d)(\d{3}) $1 mii[ $2] (\d{1,3})(\d{3}) $1 de mii[ $2] 1(\d{6}) un milion[ $1] (1?\d)(\d{6}) $1 milioane[ $2] (\d{1,3})(\d{6}) $1 de milioane[ $2] 1(\d{9}) un miliard[ $1] (1?\d)(\d{9}) $1 miliarde[ $2] (\d{1,3})(\d{9}) $1 de miliarde[ $2] 1(\d{12}) un trilion[ $1] (1?\d)(\d{12}) $1 trilioane[ $2] (\d{1,3})(\d{12}) $1 de trilioane[ $2] 1(\d{15}) un cvadrilion[ $1] (1?\d)(\d{15}) $1 cvadrilioane[ $2] (\d{1,3})(\d{15}) $1 de cvadrilioane[ $2] 1(\d{18}) un cvintilion[ $1] (1?\d)(\d{18}) $1 cvintilioane[ $2] (\d{1,3})(\d{18}) $1 de cvintilioane[ $2] 1(\d{21}) un sextilion[ $1] (1?\d)(\d{21}) $1 sextilioane[ $2] (\d{1,3})(\d{21}) $1 de sextilioane[ $2] 1(\d{24}) un septilion[ $1] (1?\d)(\d{24}) $1 septilioane[ $2] (\d{1,3})(\d{24}) $1 de septilioane[ $2] # negative number [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" $1| virgulă "([-−]?\d+[.,])([^0]\d)" $1| |$2 "([-−]?\d+[.,])(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # feminine/masculine correction for 1 and 2 f:(.*)unu \1 o f:(.*do)i "\1uă " m:(.*un)u \1 .:(.*) \1 # unit/subunit, singular/plural, feminine/masculine unit, feminine/masculine subunit us(.).:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) $(\1:\6) \2 up(.).:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) $(\1:\6) \3 ss.(.):([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) $(\1:\6) \4 sp.(.):([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) $(\1:\6) \5 # "mm" means masculine unit and masculine subunit CHF:(.+),(.+) $(\1mm: franc elvețian, franci elvețieni, cent, cenți, \2) CNY:(.+),(.+) $(\1mm: yuan renminbi, yuani renminbi, fen, fen, \2) EUR:(.+),(.+) $(\1mm: euro, euro, cent, cenți, \2) GBP:(.+),(.+) $(\1fm: liră sterlină, lire sterline, penny, pence, \2) JPY:(.+),(.+) $(\1mm: yen, yeni, sen, sen, \2) RON:(.+),(.+) $(\1mm: leu românesc, lei românești, ban, bani, \2) USD:(.+),(.+) $(\1mm: dolar american, dolari americani, cent, cenți, \2) "([A-Z]{3}) ([-−]?1)([.,]00?)?"$(\1:us,|$2) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?"$(\1:up,|$2) "(CNY [-−]?\d+)[.,]10?" $1| un jiao "(CNY [-−]?\d+)[.,](\d)0?" $1| $2| jiao "(CNY [-−]?\d+[.,]\d)1" $1| $2| fen "(CNY [-−]?\d+[.,]\d)(\d)" $1| $2| fen "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1|$(\2:ss,$(1)) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1|$(\2:sp,$(\30)) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1|$(\2:sp,$3) == ordinal(-masculine)? == 1 primul ([-−]?\d+) al $(ordinal $2) (.*(opt|ilion|ard)) \2ulea (.*) \2lea == ordinal-feminine == 1 prima ([-−]?\d+) a $(ordinal-feminine $1) (.*)doi \1doua (.*)cinci \1cincea (.*)[uă] \1a (.*)sute \1suta (.*)mi[ei] \1mia (.*)ane \1ana (.*) \1a == ordinal-number == (\d+) \1. == help == "" $(1), |$(2)|, $(3)\n$(help ordinal-feminine)$(help ordinal-masculine)$(help ordinal-number) (ordinal(-feminine|-masculine|-number)?) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/ru.sor000066400000000000000000000202411416364754400165050ustar00rootroot00000000000000^0 ноль 1 один 2 два 3 три 4 четыре 5 пять 6 шесть 7 семь 8 восемь 9 девять 10 десять 11 одиннадцать 12 двенадцать 13 тринадцать 14 четырнадцать 15 пятнадцать 16 шестнадцать 17 семнадцать 18 восемнадцать 19 девятнадцать ([23])(\d) $1|дцать[ $2] 4(\d) сорок[ $1] 9(\d) девяносто[ $1] (\d)(\d) $1десят[ $2] 1(\d\d) сто[ $1] 2(\d\d) двести[ $1] ([34])(\d\d) $1ста[ $2] (\d)(\d\d) $1сот[ $2] (1|\d?[02-9]1)(\d{3}) $(f:$1) тысяча[ $2] ([234]|\d?[02-9][234])(\d{3}) $(f:$1) тысячи[ $2] (\d{1,3})(\d{3}) $1 тысяч[ $2] (1|\d?[02-9]1)(\d{6}) $1 миллион[ $2] ([234]|\d?[02-9][234])(\d{6}) $1 миллиона[ $2] (\d{1,3})(\d{6}) $1 миллионов[ $2] (1|\d?[02-9]1)(\d{9}) $1 миллиард[ $2] ([234]|\d?[02-9][234])(\d{9}) $1 миллиарда[ $2] (\d{1,3})(\d{9}) $1 миллиардов[ $2] (1|\d?[02-9]1)(\d{12}) $1 триллион[ $2] ([234]|\d?[02-9][234])(\d{12}) $1 триллиона[ $2] (\d{1,3})(\d{12}) $1 триллионов[ $2] (1|\d?[02-9]1)(\d{15}) $1 квадриллион[ $2] ([234]|\d?[02-9][234])(\d{15}) $1 квадриллиона[ $2] (\d{1,3})(\d{15}) $1 квадриллионов[ $2] (1|\d?[02-9]1)(\d{18}) $1 квинтиллион[ $2] ([234]|\d?[02-9][234])(\d{18}) $1 квинтиллиона[ $2] (\d{1,3})(\d{18}) $1 квинтиллионов[ $2] (1|\d?[02-9]1)(\d{21}) $1 секстилион[ $2] ([234]|\d?[02-9][234])(\d{21}) $1 секстилиона[ $2] (\d{1,3})(\d{21}) $1 секстилионов[ $2] (1|\d?[02-9]1)(\d{24}) $1 септиллион[ $2] ([234]|\d?[02-9][234])(\d{24}) $1 септиллиона[ $2] (\d{1,3})(\d{24}) $1 септиллионов[ $2] # negative numbers [-−]1 минус единица [-−](\d+) минус |$1 # decimals "([-−]?)[.,](\d+)" $(\10.\2) "[-−]1[.,]" минус одна целая "([-−]?\d+[02-9]1|1)[.,]" $(f:|$1) целая "([-−]?\d+)[.,]" $(f:|$1) целых "([-−]?\d+[.,])1" $1| и одна десятая "([-−]?\d+[.,])(\d)" $1| и $(f:|$2) десятых "([-−]?\d+[.,])([02-9]1)" $1| и $(f:|$2) сотая "([-−]?\d+[.,])(\d\d)" $1| и $(f:|$2) сотых "([-−]?\d+[.,])(\d[02-9]1)" $1| и $(f:|$2) тысячная "([-−]?\d+[.,])(\d{3})" $1| и $(f:|$2) тысячных "([-−]?\d+[.,])(\d)(\d)(\d)(\d)" $1| |$2 |$3 |$4 |$5 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # female conversion f:(.*)один \1одна f:(.*)два \1две f:(.*) \1 # neuter conversion n:(.*)один \1одно n:(.*) \1 # possessive (1-999) - used in ordinals "pos:(.* )?од(ин|на) ?" [$(pos:\1)]одно "pos:(.* )?дв[ае] ?" [$(pos:\1)]двух "pos:(.* )?три ?" [$(pos:\1)]трёх "pos:(.* )?четыре ?" [$(pos:\1)]четырёх "pos:(.* )?восемь ?" [$(pos:\1)]восьми "pos:(.* )?([а-я]+)ь ?" [$(pos:\1)]\2и "pos:(.* )?сорок ?" [$(pos:\1)]сорока "pos:(.* )?восемьдесят ?" [$(pos:\1)]восьмидесяти "pos:(.* )?([а-я]+)ьдесят ?" [$(pos:\1)]\2идесяти "pos:(.* )?([а-я]*)сто ?" [$(pos:\1)]\2сто "pos:(.*)двести ?" \1двухсот "pos:(.*)[еи]ста ?" \1ёхсот "pos:(.*)осемьсот ?" \1осьмисот "pos:(.*)ьсот ?" \1исот pos:(.*) \1 # currency # unit/subunit us:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \2 ug:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \3 ss:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \4 sp:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \5 sg:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \6 EUR:(\D+) $(\1: евро, евро, евро, цент, цента, центов) GBP:(\D+) $(\1: фунт стерлингов, фунта стерлингов, фунтов стерлингов, пенни, пенса, пенсов) RUB:(\D+) $(\1: рубль, рубля, рублей, копейка, копейки, копеек) UAH:(\D+) $(\1: гривна, гривны, гривен, копейка, копейки, копеек) USD:(\D+) $(\1: доллар США, доллара США, долларов США, цент, цента, центов) "(UAH) ([-−]?1)([.,]00?)?" $(f:$2)|$(\1:us) "(UAH) ([-−]?\d*[02-9]1)([.,]00?)?" $(f:$2)|$(\1:us) "(UAH) ([-−]?[234])([.,]00?)?" $(f:$2)|$(\1:up) "(UAH) ([-−]?\d*[02-9][234])([.,]00?)?" $(f:$2)|$(\1:up) "(UAH) ([-−]?\d+)([.,]00?)?" $(f:$2)|$(\1:ug) "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2|$(\1:us) "([A-Z]{3}) ([-−]?\d*[02-9]1)([.,]00?)?" $2|$(\1:us) "([A-Z]{3}) ([-−]?[234])([.,]00?)?" $2|$(\1:up) "([A-Z]{3}) ([-−]?\d*[02-9][234])([.,]00?)?" $2|$(\1:up) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2|$(\1:ug) "((RUB) [-−]?\d+)[.,]([02-9])1" $1 [$(\30) ]одна$(\2:ss) "((RUB) [-−]?\d+)[.,]([02-9])2" $1 [$(\30) ]две$(\2:sp) "((UAH) [-−]?\d+)[.,]([02-9])1" $1 [$(\30) ]одна$(\2:ss) "((UAH) [-−]?\d+)[.,]([02-9])2" $1 [$(\30) ]две$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "((EUR|GBP|USD) [-−]?\d+)[.,]([02-9]2)" $1 $3|$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,]([02-9][234])" $1 |$3$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sg) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 |$3$(\2:sg) == cardinal-masculine? == (.*) $(\1) == cardinal-feminine == (.*) $(f:$1) == cardinal-neuter == (.*) $(n:$1) == ordinal-feminine == 0 нулевая ([-−]?\d+) $(ordinal-feminine |$1) (.*)один \1первая (.*)два \1вторая (.*)три \1третья (.*)ыре \1вёртая (.*)осемь \1осьмая (.*)мь \1дьмая (.*)ь \1ая (.*)к \1ковая (.*)осемьдесят \1осьмидесятая (.*)ьдесят \1идесятая (.*)осто \1остая (.*)сто \1сотая (.*)вести \1вухсотая (.*)[еи]ста \1ёхсотая (.*)осемьсот \1осьмисотая (.*)ьсот \1исотая "одна тысяча" тысячная "(.* )тысяч[аи]?" $(pos:\1)тысячная "один (\w+илли\w+)" \1ная "(.* )([а-я]+илли[а-я]+)(а|ов)" $(pos:\1)\2ная "(.* )([а-я]+илли[а-я]+)" $(pos:\1)\2ная (.*) \1ая == ordinal-neuter == 0 нулевое ([-−]?\d+) $(ordinal-neuter |$1) (.*)один \1первое (.*)два \1второе (.*)три \1третье (.*)ыре \1вёртое (.*)осемь \1осьмое (.*)мь \1дьмое (.*)ь \1ое (.*)к \1ковое (.*)осемьдесят \1осьмидесятое (.*)ьдесят \1идесятое (.*)осто \1остое (.*)сто \1сотое (.*)вести \1вухсотое (.*)[еи]ста \1ёхсотое (.*)осемьсот \1осьмисотое (.*)ьсот \1исотое "одна тысяча" тысячное "(.* )тысяч[аи]?" $(pos:\1)тысячное "один ([а-я]+илли[а-я]+)" \1ное "(.* )([а-я]+илли[а-я]+)(а|ов)" $(pos:\1)\2ное "(.* )([а-я]+илли[а-я]+)" $(pos:\1)\2ное (.*) \1ое == ordinal(-masculine)? == 0 нулевой ([-−]?\d+) $(ordinal |$2) (.*)один \2первый (.*)два \2второй (.*)три \2третий (.*)ыре \2вёртый (.*)сть \2стой (.*)осемь \2осьмой (.*)мь \2дьмой (.*)ь \2ый (.*)к \2ковой (.*)осемьдесят \2осьмидесятый (.*)ьдесят \2идесятый (.*)осто \2остый (.*)сто \2сотый (.*)вести \2вухсотый (.*)[еи]ста \2ёхсотый (.*)осемьсот \2осьмисотый (.*)ьсот \2исотый "одна тысяча" тысячный "(.* )тысяч[аи]?" $(pos:\2)тысячный "один ([а-я]+илли[а-я]+)" \2ный "(.* )([а-я]+илли[а-я]+)(а|ов)" $(pos:\2)\3ный "(.* )([а-я]+илли[а-я]+)" $(pos:\2)\3ный (.*) \2ый == ordinal-number-feminine == (\d+) \1-я == ordinal-number-neuter == (\d+) \1-е == ordinal-number(-masculine)? == (\d+) \2-й == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help cardinal-neuter)$(help ordinal-feminine)$(help ordinal-masculine)$(help ordinal-neuter)$(help ordinal-number-feminine)$(help ordinal-number-masculine)$(help ordinal-number-neuter) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/sh.sor000066400000000000000000000053211416364754400164730ustar00rootroot00000000000000# # Regular number to text transducer for Serbian (Cyrillic) written in Soros # Copyright (c) Goran Rakic 2009. # # Released under Creative Commons 3.0 Attribution - Share Alike license # and relicensed under GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Visit http://numbertext.org for more info on Soros language and syntax # (\d{1,3})\.([\d.,]+) $(\1\2) ^0 nula 1 jedan 2 dva 3 tri 4 četiri 5 pet 6 šest 7 sedam 8 osam 9 devet 10 deset 11 jedanaest 14 četrnaest 16 šesnaest 1(\d) $1naest 4(\d) četrdeset[ $1] 5(\d) pedeset[ $1] 6(\d) šezdeset[ $1] 9(\d) devedeset[ $1] (\d)(\d) $1deset[ $2] 1(\d\d) sto[ $1] 2(\d\d) dvesta[ $1] 3(\d\d) trista[ $1] (\d)(\d\d) $1sto[ $2] 1(\d\d\d) hiljadu[ $1] 2(\d\d\d) dve hiljade[ $1] ([34])(\d\d\d) $1 hiljade[ $2] (\d{0,1})1(\d)(\d\d\d) $(\11\2) hiljada[ $3] (\d{1,2})1(\d\d\d) $(\10) jedna hiljada[ $2] (\d{1,2})2(\d\d\d) $(\10) dve hiljade[ $2] (\d{1,2})([34])(\d\d\d) $(\10) $2 hiljade[ $3] (\d{1,3})(\d\d\d) $1 hiljada[ $2] 1(\d{6}) milion[ $1] (\d{0,4})1(\d)(\d{6}) $(\11\2) miliona[ $3] (\d{1,5})1(\d{6}) $(\10) jedan milion[ $2] (\d{1,3})(\d{6}) $1 miliona[ $2] 1(\d{9}) milijarda[ $1] 2(\d{9}) dve milijarde[ $1] ([34])(\d{9}) $1 milijarde[ $2] (\d{1,2})0(\d{9}) $(\10) milijardi[ $2] (\d{0,1})1(\d)(\d{9}) $(\11\2) milijardi[ $3] (\d{1,2})1(\d{9}) $(\10) jedna milijarda[ $2] (\d{1,2})2(\d{9}) $(\10) dve milijarde[ $2] (\d{1,2})([34])(\d{9}) $(\10) $2 milijarde[ $3] (\d{1,3})(\d{9}) $1 milijarde[ $2] 1(\d{12}) bilion[ $1] (\d{0,4})1(\d)(\d{12}) $(\11\2) biliona[ $3] (\d{1,5})1(\d{12}) $(\10) jedan bilion[ $2] (\d{1,6})(\d{12}) $1 biliona[ $2] 1(\d{18}) trilion[ $1] (\d{0,4})1(\d)(\d{18}) $(\11\2) triliona[ $3] (\d{1,5})1(\d{18}) $(\10) jedan trilion[ $2] (\d{1,6})(\d{18}) $1 triliona[ $2] 1(\d{24}) kvadrilion[ $1] (\d{0,4})1(\d)(\d{24}) $(\11\2) kvadriliona[ $3] (\d{1,5})1(\d{24}) $(\10) jedan kvadrilion[ $2] (\d{1,6})(\d{24}) $1 kvadriliona[ $2] 1(\d{30}) kvintilion[ $1] (\d{0,4})1(\d)(\d{30}) $(\11\2) kvintiliona[ $3] (\d{1,5})1(\d{30}) $(\10) jedan kvintilion[ $2] (\d{1,6})(\d{30}) $1 kvintiliona[ $2] 1(\d{36}) sekstilion[ $1] (\d{0,4})1(\d)(\d{36}) $(\11\2) sekstiliona[ $3] (\d{1,5})1(\d{36}) $(\10) jedan sekstilion[ $2] (\d{1,6})(\d{36}) $1 sekstiliona[ $2] [-−](\d+) minus $1 # Decimal code by https://twitter.com/_uranium_ "([-−]?\d+)," $1| koma "([-−]?\d+,)([^0]\d)" $1 $2 "([-−]?\d+,\d*[1-9]?)0+$" $1 "([-−]?\d+,)(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+,\d*)(\d)" $1 |$2 == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/sl.sor000066400000000000000000000070671416364754400165100ustar00rootroot00000000000000^0 nič 1 ena 2$ dve 2 dva 3 tri 4 štiri 5 pet 6 šest 7 sedem 8 osem 9 devet 10 deset 11 enajst 1(\d) $1najst 20 dvajset 2(\d) $1indvajset (\d)0 $1deset (\d)(\d) $2in$1deset 1(\d\d) sto[ $1] 2(\d\d) dvesto[ $1] (\d)(\d\d) $1sto[ $2] 1(\d\d\d) tisoč[ $1] (\d{1,3})(\d\d\d) $1 tisoč[ $2] 1(\d{6}) milijon[ $1] ([234])(\d{6}) $1 milijona[ $2] (\d{1,3})(\d{6}) $1 milijonov[ $2] 1(\d{9}) milijarda[ $1] ([234])(\d{9}) $1| milijardi[ $2] (\d{1,3})(\d{9}) $1 milijardov[ $2] 1(\d{12}) bilijon[ $1] ([234])(\d{12}) $1 bilijona[ $2] (\d{1,3})(\d{12}) $1 bilijonov[ $2] 1(\d{15}) tisoč bilijonov[ $1] (\d{1,3})(\d{15}) $1 tisoč bilijonov[ $2] 1(\d{18}) trilijon[ $1] ([234])(\d{18}) $1 trilijona[ $2] (\d{1,3})(\d{18}) $1 trilijonov[ $2] 1(\d{21}) tisoč trilijonov[ $1] (\d{1,3})(\d{21}) $1 tisoč trilijonov[ $2] 1(\d{24}) kvadrilijon[ $1] ([234])(\d{24}) $1 kvadrilijona[ $2] (\d{1,3})(\d{24}) $1 kvadrilijonov[ $2] # negative number [-−] minus [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" $1| vejica "([-−]?\d+[.,])([^0]\d)" $1| |$2 "([-−]?\d+[.,])(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # unit/subunit affixation u1:([^,]*)(,[^,]*){9} \1 u2:([^,]*,){1}([^,]*)(,[^,]*){8} \2 u3:([^,]*,){2}([^,]*)(,[^,]*){7} \2 u4:([^,]*,){3}([^,]*)(,[^,]*){6} \2 u5:([^,]*,){4}([^,]*)(,[^,]*){5} \2 s1:([^,]*,){5}([^,]*)(,[^,]*){4} \2 s2:([^,]*,){6}([^,]*)(,[^,]*){3} \2 s3:([^,]*,){7}([^,]*)(,[^,]*){2} \2 s4:([^,]*,){8}([^,]*)(,[^,]*){1} \2 s5:([^,]*,){9}([^,]*) \2 CHF:(.+) $(\1: švicarski frank, švicarska franka, švicarski franki, švicarske franke, švicarskih frankov, centim, centima, centimi, centime, centimov) EUR:(.+) $(\1: evro, evra, evri, evre, evrov, cent, centa, centi, cente, centov) GBP:(.+) $(\1: funt šterling, funta šterlinga, funti šterlingi, funte šterlinge, funtov šterlingov, peni, penija, peniji, penije, penijev) JPY:(.+) $(\1: japonski jen, japonska jena, japonski jeni, japonske jene, japonskih jenov, sen, sena, seni, sene, senov) USD:(.+) $(\1: ameriški dolar, ameriška dolarja, ameriški dolarji, ameriške dolarje, ameriških dolarjev, cent, centa, centi, cente, centov) "([A-Z]{3}) ([-−]?)1([.,]00?)?" $2 en$(\1:u1) "([A-Z]{3}) ([-−]?\d*01)([.,]00?)?" $2$(\1:u1) "([A-Z]{3}) ([-−]?(2|\d*02))([.,]00?)?" $2$(\1:u2) "([A-Z]{3}) ([-−]?(3|\d*03))([.,]00?)?" $2$(\1:u3) "([A-Z]{3}) ([-−]?(4|\d*04))([.,]00?)?" $2$(\1:u4) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:u5) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 en$(\2:s1) "(([A-Z]{3}) [-−]?\d+)[.,](02)" $1 $3$(\2:s2) "(([A-Z]{3}) [-−]?\d+)[.,](03)" $1 $3$(\2:s3) "(([A-Z]{3}) [-−]?\d+)[.,](04)" $1 $3$(\2:s4) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 $(\30)$(\2:s5) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 $3$(\2:s5) == cardinal(-feminine|-neuter)? == (\d+) $2 == cardinal-masculine == (\d+) $(cardinal-masculine |$1) (.*)dve \1dva (.*) \1 == cardinal-adverbial == (\d+) $(cardinal-adverbial |$1) (.*)ena \1enkrat (.*)dve \1dvakrat (.*) \1krat == ordinal(-masculine)? == (\d+) $(ordinal |$2) "(.*) (.*)" $(ordinal \2\3) # remove spaces (.*)ena \2prvi (.*)dve \2drugi (.*)tri \2tretji (.*)štiri \2četrti (.*) \2i == ordinal-feminine == (\d+) $(ordinal-feminine $(ordinal \1)) (.*)i \1a == ordinal-neuter == (\d+) $(ordinal-neuter $(ordinal \1)) (.*)i \1o == ordinal-adverbial == (\d+) $(ordinal |$1)č == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help cardinal-neuter)$(help ordinal-feminine)$(help ordinal-masculine)$(help ordinal-neuter)$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/sq.sor000066400000000000000000000035451416364754400165120ustar00rootroot00000000000000^0$ zero 1 një 2 dy 3 tre 4 katër 5 pesë 6 gjashtë 7 shtatë 8 tetë 9 nëntë 1(\d) [$1mbë]dhjetë 2(\d) njëzet[ e $1] 4(\d) dyzet[ e $1] (\d)(\d) $(cardinal-feminine \1)dhjetë[ e $2] (\d)(\d\d) $1qind[ e $2] (\d{1,3})(\d{3}) $1 mijë[ $2] (1)(\d{6}) $(cardinal-feminine \1) milion[ $2] (\d{1,3})(\d{6}) $(cardinal-feminine \1) milionë[ $2] (1)(\d{9}) $(cardinal-feminine \1) miliar[ $2] (\d{1,3})(\d{9}) $(cardinal-feminine \1) miliarë[ $2] (1)(\d{12}) $(cardinal-feminine \1) trilion[ $2] (\d{1,3})(\d{12}) $(cardinal-feminine \1) trilionë[ $2] # negative number [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" "$1| presje" "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # unit/subunit singular/plural us:([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*) \2 ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 ALL:(\D+) $(\1: lek, lekë, qindarka, qindarka) EUR:(\D+) $(\1: euro, euro, cent, cent) GBP:(\D+) $(\1: paund sterlina, paund sterlina, peni, peni) USD:(\D+) $(\1: dollari amerikan, dollarë amerikanë, cent, cent) "([A-Z]{3}) ([-−]?1)" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)" $2$(\1:up) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 |$3$(\2:sp) == cardinal-feminine == 3 tri (\d+) $(cardinal-feminine $1) (.*)tre \1tri (.*) \1 == cardinal(-masculine)? == (\d+) $2 == ordinal-feminine == (\d+) e $(ordinal-feminine $1) (.*)një \1para (.*)të \1ta (.*)ë \1ta (.*) \1ta == ordinal(-masculine)? == (\d+) i $(ordinal $2) (.*)një \2pari (.*)të \2ti (.*)ë \2ti (.*) \2ti == ordinal-number == (.*) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help ordinal-feminine)$(help ordinal-masculine)$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/sr.sor000066400000000000000000000063261416364754400165130ustar00rootroot00000000000000# # Regular number to text transducer for Serbian (Cyrillic) written in Soros # Copyright (c) Goran Rakic 2009. # # Released under Creative Commons 3.0 Attribution - Share Alike license # and relicensed under GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Visit http://numbertext.org for more info on Soros language and syntax # (\d{1,3})\.([\d.,]+) $(\1\2) ^0 нула 1 један 2 два 3 три 4 четири 5 пет 6 шест 7 седам 8 осам 9 девет 10 десет 11 једанаест 14 четрнаест 16 шеснаест 1(\d) $1наест 4(\d) четрдесет[ $1] 5(\d) педесет[ $1] 6(\d) шездесет[ $1] 9(\d) деведесет[ $1] (\d)(\d) $1десет[ $2] 1(\d\d) сто[ $1] 2(\d\d) двеста[ $1] 3(\d\d) триста[ $1] (\d)(\d\d) $1сто[ $2] 1(\d\d\d) хиљаду[ $1] 2(\d\d\d) две хиљаде[ $1] ([34])(\d\d\d) $1 хиљаде[ $2] (\d{0,1})1(\d)(\d\d\d) $(\11\2) хиљада[ $3] (\d{1,2})1(\d\d\d) $(\10) једна хиљада[ $2] (\d{1,2})2(\d\d\d) $(\10) две хиљаде[ $2] (\d{1,2})([34])(\d\d\d) $(\10) $2 хиљаде[ $3] (\d{1,3})(\d\d\d) $1 хиљада[ $2] 1(\d{6}) милион[ $1] (\d{0,4})1(\d)(\d{6}) $(\11\2) милиона[ $3] (\d{1,5})1(\d{6}) $(\10) један милион[ $2] (\d{1,3})(\d{6}) $1 милиона[ $2] 1(\d{9}) милијарда[ $1] 2(\d{9}) две милијарде[ $1] ([34])(\d{9}) $1 милијарде[ $2] (\d{1,2})0(\d{9}) $(\10) милијарди[ $2] (\d{0,1})1(\d)(\d{9}) $(\11\2) милијарди[ $3] (\d{1,2})1(\d{9}) $(\10) једна милијарда[ $2] (\d{1,2})2(\d{9}) $(\10) две милијарде[ $2] (\d{1,2})([34])(\d{9}) $(\10) $2 милијарде[ $3] (\d{1,3})(\d{9}) $1 милијарде[ $2] 1(\d{12}) билион[ $1] (\d{0,4})1(\d)(\d{12}) $(\11\2) билионa[ $3] (\d{1,5})1(\d{12}) $(\10) један билион[ $2] (\d{1,6})(\d{12}) $1 билиона[ $2] 1(\d{18}) трилион[ $1] (\d{0,4})1(\d)(\d{18}) $(\11\2) трилиона[ $3] (\d{1,5})1(\d{18}) $(\10) један трилион[ $2] (\d{1,6})(\d{18}) $1 трилиона[ $2] 1(\d{24}) квадрилион[ $1] (\d{0,4})1(\d)(\d{24}) $(\11\2) квадрилиона[ $3] (\d{1,5})1(\d{24}) $(\10) један квадрилион[ $2] (\d{1,6})(\d{24}) $1 квадрилиона[ $2] 1(\d{30}) квинтилион[ $1] (\d{0,4})1(\d)(\d{30}) $(\11\2) квинтилиона[ $3] (\d{1,5})1(\d{30}) $(\10) један квинтилион[ $2] (\d{1,6})(\d{30}) $1 квинтилиона[ $2] 1(\d{36}) секстилион[ $1] (\d{0,4})1(\d)(\d{36}) $(\11\2) секстилиона[ $3] (\d{1,5})1(\d{36}) $(\10) један секстилион[ $2] (\d{1,6})(\d{36}) $1 секстилиона[ $2] [-−](\d+) минус $1 # Decimal code by https://twitter.com/_uranium_ "([-−]?\d+)," $1| кома "([-−]?\d+,)([^0]\d)" $1 $2 "([-−]?\d+,\d*[1-9]?)0+$" $1 "([-−]?\d+,)(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+,\d*)(\d)" $1 |$2 == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/sv.sor000066400000000000000000000067541416364754400165240ustar00rootroot00000000000000^0 noll ^1$ ett ^1 en 1 ett 2 två 3 tre 4 fyra 5 fem 6 sex 7 sju 8 åtta 9 nio 10 tio 11 elva 12 tolv 13 tretton 14 fjorton 15 femton 16 sexton 17 sjutton 18 arton 19 nitton 2(\d) tjugo$1 3(\d) trettio$1 4(\d) fyrtio$1 7(\d) sjuttio$1 8(\d) åttio$1 9(\d) nittio$1 (\d)(\d) $1tio$2 (\d)(\d\d) $1|hundra$2 # “ettusen” instead of “etttusen” (1|\d?[02-9]1)(\d{3}) $1|usen[ $2] (\d{1,3})(\d{3}) $1tusen[ $2] (\d{1,3})(\d{6}) |$1 miljon$(pl:\1)[ $2] (\d{1,3})(\d{9}) |$1 miljard$(pl:\1)[ $2] (\d{1,3})(\d{12}) |$1 biljon$(pl:\1)[ $2] (\d{1,3})(\d{15}) |$1 biljard$(pl:\1)[ $2] (\d{1,3})(\d{18}) |$1 triljon$(pl:\1)[ $2] (\d{1,3})(\d{21}) |$1 triljard$(pl:\1)[ $2] (\d{1,3})(\d{24}) |$1 kvadriljon$(pl:\1)[ $2] # plural for big numbers pl:1 pl:.* er # negative number [-−](\d+) minus |$1 # decimals "([-−]?\d+)[.,]" $1| komma "([-−]?\d+[.,])([^0]\d)" $1| |$2 "([-−]?\d+[.,])(\d)(\d)(\d)" $1| |$2 |$3 |$4 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # currency # unit/subunit singular/plural "us, (.*): (.*), (.*), (.*), (.*), (.*), (.*)" $(\2 \1) \3 "up, (.*): (.*), (.*), (.*), (.*), (.*), (.*)" $(\2 \1) \4 "ss, (.*): (.*), (.*), (.*), (.*), (.*), (.*)" $(\5 \1) \6 "sp, (.*): (.*), (.*), (.*), (.*), (.*), (.*)" $(\5 \1) \7 CHF:(\D+,.*) $(\1: cardinal, schweizisk franc, schweizisk franc, cardinal, centime, centime) CNY:(\D+,.*) $(\1: cardinal, yuan renminbi, yuan renminbi, cardinal, fen, fen) EUR:(\D+,.*) $(\1: cardinal, euro, euro, cardinal-neuter, cent, cent) GBP:(\D+,.*) $(\1: cardinal-neuter, brittiskt pund, brittiskt pund, cardinal, penny, pence) JPY:(\D+,.*) $(\1: cardinal, yen, yen, cardinal, sen, sen) SEK:(\D+,.*) $(\1: cardinal, svensk krona, svenska kronor, cardinal-neuter, öre, öre) USD:(\D+,.*) $(\1: cardinal, US-dollar, US-dollar, cardinal-neuter, cent, cent) "([A-Z]{3}) ([-−]?1)([.,]00?)?"$(\1:us, \2) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?"$(\1:up, \2) "(CNY [-−]?\d+)[.,]10?" $1 $2 jiao "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao "(CNY [-−]?\d+[.,]\d)1" $1 $2 fen "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 $(\2:ss, 1) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 $(\2:sp, \30) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 $(\2:sp, \3) == cardinal-neuter == 1 ett == cardinal(-feminine|-masculine|-neuter)? == ([-−]?\d+) $(cardinal |$2) "(.*[^ ]e)t(tusen.*)" $(cardinal \2n\3) # 21000, 31000 .. 991000 "(.*e)tt([ ].*|$)" $(cardinal \2n\3) # !etthundra, !ettusen (.*) \2 == ordinal(-masculine)? == ([-−]?\d+) $(ordinal |$2) == ordinal == (.*)ett \1förste # 1 (.*)två \1andre # 2 (.*)tre \1tredje # 3 (.*)fyra \1fjärde # 4 (.*)sex \1sjätte # 6 (.*(sju|io)) \1nde # 7, 9, 10, 20..90 (.*)åtta \1åttonde # 8 (.*)elva \1elfte # 11 (.*)tolv \1tolfte # 12 "(.*(ton|hundra|tusen)) *" \1de # 13, 14..19, 100, 1000 "(.*)er *" \1te # milljoner... "(.*[^ ]) *" \1te # 0, 5, milljon... == ordinal-feminine == ([-−]?\d+) $(ordinal-feminine $(ordinal |$1)) (.*(först|andr))e \1a # 1, 2 (.*) \1 == ordinal-neuter == (.*) $(ordinal-feminine |$1) == ordinal-number(-feminine|-neuter)? == (.*[02-9][12]|[12]) \2:a == ordinal-number(-feminine|-neuter|-masculine)? == (.*) \2:e == year == ([-−]?(1[1-9]|[2-9]\d))(\d\d) $1hundra$3 (.*) $1 == help == "" $(1)|, $(2), $(3)\n$(\0 cardinal-feminine)$(\0 cardinal-masculine)$(\0 cardinal-neuter)$(\0 ordinal-feminine)$(\0 ordinal-masculine)$(\0 ordinal-neuter)$(\0 ordinal-number)$(\0 ordinal-number-feminine)$(\0 ordinal-number-masculine) ((ordinal|cardinal)(-number)?(-feminine|-masculine|-neuter)?) \1: $(\1 1), $(\1 2), $(\1 3)\n libnumbertext-1.0.8/data/th.sor000066400000000000000000000022621416364754400164750ustar00rootroot00000000000000^0 ศูนย์ ^1$ หนึ่ง 1$ เอ็ด 1 หนึ่ง 2 สอง 3 สาม 4 สี่ 5 ห้า 6 หก 7 เจ็ด 8 แปด 9 เก้า 1(\d) สิบ$1 2(\d) ยี่สิบ$1 (\d)(\d) $1สิบ$2 (\d)(\d\d) $1ร้อย$2 (\d)(\d{3}) $1พัน$2 (\d)(\d{4}) $1หมื่น$2 (\d)(\d{5}) $1แสน$2 (\d{1,6})(\d{6}) $1|ล้าน$2 (\d{1,6})(\d{12}) $1|ล้านล้าน$2 (\d{1,6})(\d{18}) $1|ล้านล้านล้าน$2 (\d)(\d{24}) $1|ล้านล้านล้านล้าน$2 # negative numbers [-−](\d+) ลบ|$1 # decimals ([-−]?\d+)[.,] |$1|จุด ([-−]?\d+[.,]\d*)(\d) |$1|$2 # currency "THB ([-−]?\d+)" |$1|บาทถ้วน # currency with decimals "(THB [-−]?\d+)[,.]00" $1 "THB ([-−]?\d+)[.,](\d{1})" |$1|บาท$(\20)สตางค์ "THB ([-−]?\d+)[,.](\d{1,2})" |$1|บาท|$2|สตางค์ # other currencies? [A-Z]{3} "([A-Z]{3}) ([-−]?\d[\d.,]*)" $2$1 == ordinal == ([-−]?\d+([.,]\d+)?) ที่$1 == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help ordinal)$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/tr.sor000066400000000000000000000125501416364754400165100ustar00rootroot00000000000000^0 sıfır 1 bir 2 iki 3 üç 4 dört 5 beş 6 altı 7 yedi 8 sekiz 9 dokuz 1(\d) on[ $1] 2(\d) yirmi[ $1] 3(\d) otuz[ $1] 4(\d) kırk[ $1] 5(\d) elli[ $1] 6(\d) altmış[ $1] 7(\d) yetmiş[ $1] 8(\d) seksen[ $1] 9(\d) doksan[ $1] (1)(\d\d) yüz[ $2] # yüz .. ([2-9])(\d\d) $1 yüz[ $2] # üç yüz ... (1)(\d\d\d) bin[ $2] # bin (\d{1,2})([1-9]\d\d) $1 bin[ $2] # on bin iki yüz (\d{1,3})(\d{3}) $1 bin[ $2] # yüz bin iki yüz (\d{1,3})(\d{6}) $1 milyon[ $2] (\d{1,3})(\d{9}) $1 milyar[ $2] (\d{1,3})(\d{12}) $1 trilyon[ $2] (\d{1,3})(\d{15}) $1 katrilyon[ $2] (\d{1,3})(\d{18}) $1 kentilyon[ $2] (\d{1,3})(\d{21}) $1 sekstilyon[ $2] (\d{1,3})(\d{24}) $1 septilyon[ $2] # negative number [-−](\d+) negatif |$1 # decimals ([-−]?\d+)[.,] $1| virgül "([-−]?\d+[.,]0*)(\d+)" $1 |$2 ([-−]?\d+[.,]\d*)(\d) $1| |$2 # currency # unit/subunit singular/plural us:([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*) \2 ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 AUD:(\D+) $(\1: Avustralya doları, Avustralya doları, sent, sent) BGN:(\D+) $(\1: Bulgar levası, Bulgar levası, stotinka, stotinki) BWP:(\D+) $(\1: Botswana pulası, Botswana pulası, thebe, thebe) CAD:(\D+) $(\1: Kanada doları, Canadian dollars, sent, sent) CHF:(\D+) $(\1: İsviçre frangı, İsviçre frangı, santim, santim) CNY:(\D+) $(\1: Çin yuanı, Çin yuanı, fen, fen) CZK:(\D+) $(\1: Çek korunası, Çek korunası, heller, heller) EEK:(\D+) $(\1: Estonya kronu, Estonya kronu, sent, sent) EUR:(\D+) $(\1: euro, euro, sent, sent) GBP:(\D+) $(\1: sterlin, sterlin, peni, peni) GHS:(\D+) $(\1: Gana sedisi, Gana sedisi, peseva, peseva) GMD:(\D+) $(\1: Gambiya dalası, Gambiya dalası, butut, butut) HKD:(\D+) $(\1: Hong Kong doları, Hong Kong doları, sent, sent) HRK:(\D+) $(\1: Hırvatistan kunası, Hırvatistan kunası, lipa, lipa) HUF:(\D+) $(\1: Macar forinti, Macar forinti, filler, filler) INR:(\D+) $(\1: Hindistan rupisi, Hindistan rupisi, paise, paise) JMD:(\D+) $(\1: Jamaika doları, Jamaika doları, sent, sent) JPY:(\D+) $(\1: Japon yeni, Japon yeni, sen, sen) KES:(\D+) $(\1: Kenya şilini, Kenya şilini, sent, sent) LRD:(\D+) $(\1: Liberya doları, Liberya doları, sent, sent) LSL:(\D+) $(\1: Lesotho loti, maloti, sente, lisente) LTL:(\D+) $(\1: Litvanya litası, Litvanya litası, centas, centai) LVL:(\D+) $(\1: Letonya latı, Letonya latı, santims, santimi) MGA:(\D+) $(\1: ariary, ariaries, iraimbilanja, iraimbilanja) MUR:(\D+) $(\1: Mauritius rupisi, Mauritius rupisi, sent, sent) MXN:(\D+) $(\1: Meksika pezosu, Meksika pezosu, sentavo, sentavo) MWK:(\D+) $(\1: Malawian kwacha, Malawian kwacha, tambala, tambala) NAD:(\D+) $(\1: Namibya doları, Namibya doları, sent, sent) NGN:(\D+) $(\1: Nijerya nairası, Nijerya nairası, kobo, kobo) NZD:(\D+) $(\1: Yeni Zelanda doları, Yeni Zelanda doları, sent, sent) PGK:(\D+) $(\1: Papua Yeni Gine kinası, Papua Yeni Gine kinası, toea, toea) PHP:(\D+) $(\1: Filipinler pezosu, Filipinler pezosu, sentavo, sentavo) PKR:(\D+) $(\1: Pakistan rupisi, Pakistan rupisi, paisa, paisa) PLN:(\D+) $(\1: Polonya zlotisi, Polonya zlotisi, grosz, groszy) RON:(\D+) $(\1: Romen leyi, Romen leyi, ban, ban) RSD:(\D+) $(\1: Sırbistan dinarı, Sırbistan dinarı, para, para) RUB:(\D+) $(\1: Rus rublesi, Rus rublesi, kopek, kopek) RWF:(\D+) $(\1: Ruanda frangı, Ruanda frangı, santim, santim) SDG:(\D+) $(\1: Sudan poundu, Sudan poundu, piastre, piastres) SGD:(\D+) $(\1: Singapur doları, Singapur doları, sent, sent) SLL:(\D+) $(\1: Sierra Leone leonu, Sierra Leone leonu, sent, sent) SZL:(\D+) $(\1: lilangeni, emalangeni, cent, cents) THB:(\D+) $(\1: Tayland bahtı, Tayland bahtı, satang, satang) TRY:(\D+) $(\1: Türk lirası, Türk lirası, kuruş, kuruş) TTD:(\D+) $(\1: Trinidad ve Tobago doları, Trinidad ve Tobago doları, sent, sent) TZS:(\D+) $(\1: Tanzanya şilini, Tanzanya şilini, sent, sent) UAH:(\D+) $(\1: Ukrayna hryvnyası, Ukrayna hryvnyası, kopiyka, kopiyka) UGX:(\D+) $(\1: Uganda şilini, Uganda şilini, sent, sent) USD:(\D+) $(\1: ABD doları, ABD doları, sent, sent) X[AO]F:(\D+) $(\1: CFA franc, CFA francs, centime, centimes) ZAR:(\D+) $(\1: Güney Afrika randı, Güney Afrika randı, sent, sent) ZMK:(\D+) $(\1: Zambiya kıvaçası, Zambiya Kıvaçası, ngwee, ngwee) ZWD:(\D+) $(\1: Zimbabve doları, Zimbabve doları, sent, sent) "(JPY [-−]?\d+)[.,](\d\d)0" $1 "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2 rin # removing spaces from number names before currencies "space:([^ ]+) +([^ ].*)" \1$(space:\2) space:(.*) \1 "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $(space:|$2)$(\1:up) "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen "((MGA|MRO) [-−]?\d+)[.,]0" $1 "((MGA|MRO) [-−]?\d+)[.,]2" $1 |$(1)$(\2:ss) "((MGA|MRO) [-−]?\d+)[.,]4" $1 |$(2)$(\2:sp) "((MGA|MRO) [-−]?\d+)[.,]6" $1 |$(3)$(\2:sp) "((MGA|MRO) [-−]?\d+)[.,]8" $1 |$(4)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 $(space:|$3)$(\2:sp) == ordinal == (\d+) $(ordinal $1) (.*ü[çz]) \1üncü (.*dör)t \1düncü (.*)altı \1altıncı (.*(kırk|doksan|yar|ış)) \1ıncı (.*(uz|on)) \1uncu (.*)i \1inci (.*) \1inci == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help ordinal)$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/uk.sor000066400000000000000000000200201416364754400164710ustar00rootroot00000000000000^0 нуль 1 один 2 два 3 три 4 чотири 5$ пʼять 5 пʼят 6$ шість 6 шіст 7 сім 8 вісім 9$ девʼять 9 девʼят 10 десять 11 одинадцять 12 дванадцять 13 тринадцять 14 чотирнадцять 15 пʼятнадцять 16 шістнадцять 17 сімнадцять 18 вісімнадцять 19 девʼятнадцять ([23])(\d) $1|дцять[ $2] 4(\d) сорок[ $1] 9(\d) девʼяносто[ $1] (\d)(\d) $1десят[ $2] 1(\d\d) сто[ $1] 2(\d\d) двісті[ $1] ([34])(\d\d) $1ста[ $2] (\d)(\d\d) $1сот[ $2] (1|\d?[02-9]1)(\d{3}) $(f:$1) тисяча[ $2] ([234]|\d?[02-9][234])(\d{3}) $(f:$1) тисячі[ $2] (\d{1,3})(\d{3}) $1| тисяч[ $2] (1|\d?[02-9]1)(\d{6}) $1 мільйон[ $2] ([234]|\d?[02-9][234])(\d{6}) $1 мільйона[ $2] (\d{1,3})(\d{6}) $1| мільйонів[ $2] (1|\d?[02-9]1)(\d{9}) $1 мільярд[ $2] ([234]|\d?[02-9][234])(\d{9}) $1 мільярда[ $2] (\d{1,3})(\d{9}) $1| мільярдів[ $2] (1|\d?[02-9]1)(\d{12}) $1 трильйон[ $2] ([234]|\d?[02-9][234])(\d{12}) $1 трильйона[ $2] (\d{1,3})(\d{12}) $1| трильйонів[ $2] (1|\d?[02-9]1)(\d{15}) $1 квадрильйон[ $2] ([234]|\d?[02-9][234])(\d{15}) $1 квадрильйона[ $2] (\d{1,3})(\d{15}) $1| квадрильйонів[ $2] (1|\d?[02-9]1)(\d{18}) $1 квінтильйон[ $2] ([234]|\d?[02-9][234])(\d{18}) $1 квінтильйона[ $2] (\d{1,3})(\d{18}) $1| квінтильйонів[ $2] (1|\d?[02-9]1)(\d{21}) $1 секстильйон[ $2] ([234]|\d?[02-9][234])(\d{21}) $1 секстильйона[ $2] (\d{1,3})(\d{21}) $1| секстильйонів[ $2] (1|\d?[02-9]1)(\d{24}) $1 септильйон[ $2] ([234]|\d?[02-9][234])(\d{24}) $1 септильйона[ $2] (\d{1,3})(\d{24}) $1| септильйонів[ $2] (1|\d?[02-9]1)(\d{27}) $1 октильйон[ $2] ([234]|\d?[02-9][234])(\d{27}) $1 октильйона[ $2] (\d{1,3})(\d{27}) $1| октильйонів[ $2] (1|\d?[02-9]1)(\d{30}) $1 нонільйон[ $2] ([234]|\d?[02-9][234])(\d{30}) $1 нонільйона[ $2] (\d{1,3})(\d{30}) $1| нонільйонів[ $2] (1|\d?[02-9]1)(\d{33}) $1 децильйон[ $2] ([234]|\d?[02-9][234])(\d{33}) $1 децильйона[ $2] (\d{1,3})(\d{33}) $1| децильйонів[ $2] (1|\d?[02-9]1)(\d{36}) $1 ундецильйон[ $2] ([234]|\d?[02-9][234])(\d{36}) $1 ундецильйона[ $2] (\d{1,3})(\d{36}) $1| ундецильйонів[ $2] (1|\d?[02-9]1)(\d{39}) $1 дуодецильйон[ $2] ([234]|\d?[02-9][234])(\d{39}) $1 дуодецильйона[ $2] (\d{1,3})(\d{39}) $1| дуодецильйонів[ $2] (1|\d?[02-9]1)(\d{42}) $1 тредецильйон[ $2] ([234]|\d?[02-9][234])(\d{42}) $1 тредецильйона[ $2] (\d{1,3})(\d{42}) $1| тредецильйонів[ $2] # negative numbers [-−]1 мінус один [-−](\d+) мінус |$1 # decimals "([-−]?)[.,](\d+)" $(\10.\2) "[-−]1[.,]" мінус одна ціла "([-−]?\d+[02-9]1|1)[.,]" $(f:|$1) ціла "([-−]?\d+)[.,]" $(f:|$1) цілих "([-−]?\d+[.,])1" $1| й одна десята "([-−]?\d+[.,])(\d)" $1| й $(f:|$2)| десятих "([-−]?\d+[.,])([02-9]1)" $1| й $(f:|$2) сота "([-−]?\d+[.,])(\d\d)" $1| й $(f:|$2)| сотих "([-−]?\d+[.,])(\d[02-9]1)" $1| й $(f:|$2) тисячна "([-−]?\d+[.,])(\d{3})" $1| й $(f:|$2)| тисячних "([-−]?\d+[.,])(\d)(\d)(\d)(\d)" $1| |$2 |$3 |$4 |$5 "([-−]?\d+[.,]\d*)(\d)" $1| |$2 # female conversion f:(.*)один \1одна f:(.*)два \1дві f:(.*) \1 # neuter conversion n:(.*)один \1одне n:(.*) \1 # possessive (1-999) - used in ordinals "pos:(.* )?од(ин|на) ?" [$(pos:\1)]одного "pos:(.* )?дв[аі] ?" [$(pos:\1)]двох "pos:(.* )?три ?" [$(pos:\1)]трьох "pos:(.* )?чотири ?" [$(pos:\1)]чотирьох "pos:(.* )?вісім ?" [$(pos:\1)]восьми "pos:(.* )?([а-я]+)ь ?" [$(pos:\1)]\2и "pos:(.* )?сорок ?" [$(pos:\1)]сорока "pos:(.* )?([а-я]+)десят ?" [$(pos:\1)]\2десяти "pos:(.* )?([а-я]*)сто ?" [$(pos:\1)]\2ста "pos:(.*)двісті ?" \1двохсот "pos:(.*)иста ?" \1ьохсот "pos:(.*)ісімсот ?" \1осьмисот "pos:(.*[^и])сот ?" \1исот pos:(.*) \1 # currency # unit/subunit us:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \1 up:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \2 ug:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \3 ss:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \4 sp:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \5 sg:([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*) \6 EUR:(\D+) $(\1: євро, євро, євро, цент, цента, центів) GBP:(\D+) $(\1: фунт стерлінгів, фунта стерлінгів, фунтів стерлінгів, пенні, пенса, пенсів) RUB:(\D+) $(\1: рубль, рубля, рублів, копійка, копійки, копійок) UAH:(\D+) $(\1: гривня, гривні, гривень, копійка, копійки, копійок) USD:(\D+) $(\1: долар США, долара США, доларів США, цент, цента, центів) "(UAH) ([-−]?1)([.,]00?)?" $(f:$2)|$(\1:us) "(UAH) ([-−]?\d*[02-9]1)([.,]00?)?" $(f:$2)|$(\1:us) "(UAH) ([-−]?[234])([.,]00?)?" $(f:$2)|$(\1:up) "(UAH) ([-−]?\d*[02-9][234])([.,]00?)?" $(f:$2)|$(\1:up) "(UAH) ([-−]?[0])([.,]0?)?" $2$(\1:ug) "(UAH) ([-−]?\d+)([.,]00?)?" $(f:$2)|$(\1:ug) "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2|$(\1:us) "([A-Z]{3}) ([-−]?\d*[02-9]1)([.,]00?)?" $2|$(\1:us) "([A-Z]{3}) ([-−]?[234])([.,]00?)?" $2|$(\1:up) "([A-Z]{3}) ([-−]?\d*[02-9][234])([.,]00?)?" $2|$(\1:up) "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2|$(\1:ug) "((RUB) [-−]?\d+)[.,]([02-9])1" $1 [$(\30) ]одна$(\2:ss) "((RUB) [-−]?\d+)[.,]([02-9])2" $1 [$(\30) ]двi$(\2:sp) "((UAH) [-−]?\d+)[.,]([02-9])1" $1 [$(\30) ]одна$(\2:ss) "((UAH) [-−]?\d+)[.,]([02-9])2" $1 [$(\30) ]двi$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 |$(1)$(\2:ss) "((EUR|GBP|USD) [-−]?\d+)[.,]([02-9]2)" $1 $3|$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,]([02-9][234])" $1 |$3$(\2:sp) "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 |$(\30)$(\2:sg) "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 |$3$(\2:sg) == cardinal(-masculine)? == ([-−]?[0-9]+) $2 == cardinal-feminine == 0 нуль ([-−]?[0-9]+) $(f:$1) == cardinal-neuter == 0 нуль ([-−]?[0-9]+) $(n:$1) == ordinal-feminine == 0 нульова ([-−]?\d+) $(ordinal-feminine |$1) (.*)один \1перша (.*)два \1друга (.*)три \1третя (.*)чотири \1четверта (.*)шість \1шоста (.*)ть \1та (.*)вісім \1восьма (.*)сім \1сьома (.*)к \1кова (.*)осто \1оста (.*)сто \1сота (.*)двісті \1двохсота (.*)иста \1ьохсота (.*)шістсот \2шестисота (.*)вісімсот \1восьмисота (.*)сімсот \2семисота (.*)сот \1исота "одна тисяча" тисячна "(.* )тисяч[аі]?" $(pos:\1)тисячна "один (\w+ль\w+)" \1на "(.* )([а-я]+ль[а-я]+)(а|ов)" $(pos:\1)\2на "(.* )([а-я]+ль[а-я]+)" $(pos:\1)\2на (.*) \1а == ordinal-neuter == ([-−]?\d+) $(ordinal-neuter |$(ordinal-feminine \1)) (.*)а \1е (.*)я \1є (.*) \1 == ordinal(-masculine)? == ([-−]?\d+) $(ordinal-masculine |$(ordinal-feminine \2)) (.*)а \2ий (.*)я \2ій (.*) \2 == ordinal-number-feminine == (\d+) \1-$(ordinal-number-neuter |$(ordinal-feminine \1)) == ordinal-number-neuter == (\d+) \1-$(ordinal-number-neuter |$(ordinal-neuter \1)) # use last two letters to get a consonant .*(..) \1 == ordinal-number(-masculine)? == (\d+) \2-й == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help cardinal-feminine)$(help cardinal-masculine)$(help cardinal-neuter)$(help ordinal-feminine)$(help ordinal-masculine)$(help ordinal-neuter)$(help ordinal-number-feminine)$(help ordinal-number-masculine)$(help ordinal-number-neuter)currency \(наприклад, UAH\): $(UAH 2.5) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/vi.sor000066400000000000000000000014621416364754400165010ustar00rootroot00000000000000^0$ không 1 một 2 hai 3 ba 4 bốn ^5$ năm 5$ lăm 5 năm 6 sáu 7 bảy 8 tám 9 chín 1(\d) mười[ $1] (\d)0 $1 mươi (\d)1 $1 mươi mốt (\d)(\d) $1 mươi[ $2] (\d)01 $1 trăm linh một (\d)(\d\d) $1 trăm[ $2] (\d{1,3})000 $1 ngàn (\d{1,3})001 $1 ngàn không trăm linh một (\d{1,3})0(\d\d) $1 ngàn không trăm[ $2] (\d{1,3})(\d\d\d) $1 ngàn[ $2] (\d{1,3})0{6} $1 triệu (\d{1,3})0{5}1 $1 triệu không trăm linh một (\d{1,3})0{4}(\d\d) $1 triệu không trăm[ $2] (\d{1,3})(\d{6}) $1 triệu[ $2] (\d{1,10})0{9} $1 tỷ (\d{1,10})0{8}1 $1 tỷ không trăm linh một (\d{1,10})0{7}(\d\d) $1 tỷ không trăm[ $2] (\d{1,10})(\d{9}) $1 tỷ[ $2] == ordinal-number == (\d+) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help ordinal-number) (.*) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/data/zh.sor000066400000000000000000000075761416364754400165200ustar00rootroot00000000000000# Mandarin Chinese number names (simplified) ^0 零 1 一 2 二 3 三 4 四 5 五 6 六 7 七 8 八 9 九 ^1(\d) 十$1 (\d)(\d) $1|十$2 (\d)0{2} $1百 (\d)0(\d) $1百零$2 (\d)(\d\d) $1百$2 (\d)0{3} $1千 (\d)0(\d\d) $1千零$2 (\d)(\d\d\d) $1千$2 (\d{1,4})0{4} $1|万 (\d{1,4})0(\d{3}) $1|万零$2 (\d{1,4})(\d{4}) $1|万$2 (\d{1,4})0{8} $1|亿 (\d{1,4})0(\d{7}) $1|亿零$2 (\d{1,4})(\d{8}) $1|亿$2 (\d{1,4})0{12} $1|兆 (\d{1,4})0(\d{11}) $1|兆零$2 (\d{1,4})(\d{12}) $1|兆$2 (\d{1,4})0{16} $1|京 (\d{1,4})0(\d{15}) $1|京零$2 (\d{1,4})(\d{16}) $1|京$2 (\d{1,4})0{20} $1|垓 (\d{1,4})0(\d{19}) $1|垓零$2 (\d{1,4})(\d{20}) $1|垓$2 (\d{1,4})0{24} $1|秭 (\d{1,4})0(\d{23}) $1|秭零$2 (\d{1,4})(\d{24}) $1|秭$2 (\d{1,4})0{28} $1|穰 (\d{1,4})0(\d{27}) $1|穰零$2 (\d{1,4})(\d{28}) $1|穰$2 (\d{1,4})0{32} $1|沟 (\d{1,4})0(\d{31}) $1|沟零$2 (\d{1,4})(\d{32}) $1|沟$2 (\d{1,4})0{36} $1|涧 (\d{1,4})0(\d{35}) $1|涧零$2 (\d{1,4})(\d{36}) $1|涧$2 (\d{1,4})0{40} $1|正 (\d{1,4})0(\d{39}) $1|正零$2 (\d{1,4})(\d{40}) $1|正$2 (\d{1,4})0{44} $1|载 (\d{1,4})0(\d{43}) $1|载零$2 (\d{1,4})(\d{44}) $1|载$2 # negative numbers [-−](\d+) 负|$1 # decimals "([-−]?\d+)[.,]" "$1|点" "([-−]?\d+[.,]\d*)(\d)" $1||$2 # currency # unit/subunit singular/plural AUD 澳元 CHF 瑞士法郎 CNY 人民币 EUR 欧元 GBP 英镑 HKD 港币 JPY 日圆 MOP 澳门元 USD 美元 # 1/10 角 # 1/100 分 "([A-Z]{3}) ([-−]?\d+([.,]\d+)?)" $2$1 # Mandarin Chinese number names, formal numbers (大写) for legal and financial documents, simplified == formal == ^0 零 1 壹 2$ 贰 2 贰 3 叁 4 肆 5 伍 6 陆 7 柒 8 捌 9 玖 ^1(\d) 拾$(formal \1) (\d)(\d) $(formal \1)|拾$(formal \2) (\d)0{2} $(formal \1)佰 (\d)0(\d) $(formal \1)佰零$(formal \2) (\d)(\d\d) $(formal \1)佰$(formal \2) (\d)0{3} $(formal \1)仟 (\d)0(\d\d) $(formal \1)仟零$(formal \2) (\d)(\d\d\d) $(formal \1)仟$(formal \2) (\d{1,4})0{4} $(formal \1)|万 (\d{1,4})0(\d{3}) $(formal \1)|万零$(formal \2) (\d{1,4})(\d{4}) $(formal \1)|万$(formal \2) (\d{1,4})0{8} $(formal \1)|亿 (\d{1,4})0(\d{7}) $(formal \1)|亿零$(formal \2) (\d{1,4})(\d{8}) $(formal \1)|亿$(formal \2) (\d{1,4})0{12} $(formal \1)|兆 (\d{1,4})0(\d{11}) $(formal \1)|兆零$(formal \2) (\d{1,4})(\d{12}) $(formal \1)|兆$(formal \2) (\d{1,4})0{16} $(formal \1)|京 (\d{1,4})0(\d{15}) $(formal \1)|京零$(formal \2) (\d{1,4})(\d{16}) $(formal \1)|京$(formal \2) (\d{1,4})0{20} $(formal \1)|垓 (\d{1,4})0(\d{19}) $(formal \1)|垓零$(formal \2) (\d{1,4})(\d{20}) $(formal \1)|垓$(formal \2) (\d{1,4})0{24} $(formal \1)|秭 (\d{1,4})0(\d{23}) $(formal \1)|秭零$(formal \2) (\d{1,4})(\d{24}) $(formal \1)|秭$(formal \2) (\d{1,4})0{28} $(formal \1)|穰 (\d{1,4})0(\d{27}) $(formal \1)|穰零$(formal \2) (\d{1,4})(\d{28}) $(formal \1)|穰$(formal \2) (\d{1,4})0{32} $(formal \1)|沟 (\d{1,4})0(\d{31}) $(formal \1)|沟零$(formal \2) (\d{1,4})(\d{32}) $(formal \1)|沟$(formal \2) (\d{1,4})0{36} $(formal \1)|涧 (\d{1,4})0(\d{35}) $(formal \1)|涧零$(formal \2) (\d{1,4})(\d{36}) $(formal \1)|涧$(formal \2) (\d{1,4})0{40} $(formal \1)|正 (\d{1,4})0(\d{39}) $(formal \1)|正零$(formal \2) (\d{1,4})(\d{40}) $(formal \1)|正$(formal \2) (\d{1,4})0{44} $(formal \1)|载 (\d{1,4})0(\d{43}) $(formal \1)|载零$(formal \2) (\d{1,4})(\d{44}) $(formal \1)|载$(formal \2) # negative numbers [-−](\d+) 负|$(formal \1) # decimals "([-−]?\d+)[.,]" "$(formal \1)|点" "([-−]?\d+[.,]\d*)(\d)" $(formal \1)||$(formal \2) # currency # unit/subunit singular/plural AUD 澳元 CHF 瑞士法郎 CNY 人民币 EUR 欧元 GBP 英镑 HKD 港币 JPY 日圆 MOP 澳门元 USD 美元 # 1/10 角 # 1/100 分 "([A-Z]{3}) ([-−]?\d+([.,]\d+)?)" $(formal \2)$(formal \1) == ordinal == ([-−]?\d+) 第$1 == ordinal-number == (.*) \1. == help == "" |$(1)|, |$(2)|, |$(3)|\n$(help formal)$(\0 ordinal)$(\0 ordinal-number) (formal|ordinal(-number)?) \1: |$(\1 1)|, |$(\1 2)|, |$(\1 3)|\n libnumbertext-1.0.8/description.xml.in000066400000000000000000000027701416364754400201020ustar00rootroot00000000000000 NUMBERTEXT() and MONEYTEXT() Calc functions NUMBERTEXT() und MONEYTEXT() Calc Funktions Funciones NUMBERTEXT() y MONEYTEXT() para Calc NUMBERTEXT() és MONEYTEXT() Calc függvények NUMBERTEXT() e MONEYTEXT() Calc funzione Funkcje NUMBERTEXT () i MONEYTEXT () dla programu Calc NUMBERTEXT() и MONEYTEXT() функције за Рачун NUMBERTEXT() i MONEYTEXT() funkcije za Račun NUMBERTEXT() וMONEYTEXT() פונקציות גליון Calc Функции NUMBERTEXT() и MONEYTEXT() за Calc Функції NUMBERTEXT() та MONEYTEXT() для Calc NUMBERTEXT.org libnumbertext-1.0.8/doc/000077500000000000000000000000001416364754400151675ustar00rootroot00000000000000libnumbertext-1.0.8/doc/Tutorial_1.sor000066400000000000000000000047411416364754400177450ustar00rootroot00000000000000# Soros Tutorial – Part One 🔢 Three, Two, One... # # INTRODUCTION # # Soros programming language is for number to # number name conversion. It’s based on regular # expressions, the popular text processing # tool of modern programming languages. So if you # don’t want to convert numbers to number names, # it’s still worth to check this tutorial, because # most parts are about regular expressions, # giving useful information for modern C++, Java, # JavaScript, Python etc. programming, too. # If you know regular expressions well, you can # jump to the last part of the tutorial! # # In this part, we will learn the base syntax of # Soros, writing small programs to convert # input numbers to numbers and colorful (at least # in Mozilla Firefox) emojis! # # # # TASK 1 – HELLO, WORLD! # # A Soros program consists of program lines. # # A program line is an input text and an output text # separated by (the first) space: # # input_text output text # # Following program line replaces the input text “0” # with the output text “Hello, 🌍!”, as you can see # in the right output list window, which shows the # output of the first 120 integer numbers, including # this one: 0 Hello, 🌍! # Replace “Hello, 🌍!” with “zero” in the previous line, # and check the same change in the right output window # list! # # Write here a new program line to convert the input # text “1” to “one”! # TASK 2 – The early bird catches the worm. # # First matching program line gives result. # # Remove the line with the bird COMPLETELY, and # then the line with the worm! During these, check # the results in the right output list window! 2 🐦 2 🐛 2 two # TASK 3 – Three blind mice # # Input text without matching program line, or a # matching program line without output text # results empty output text. # # Remove the character # (sign of comment line) # before 3 in the following line to hide the mice! #3 3 🐁🐁🐁 # TASK 4 – Five little speckled frogs # # Modify the following program lines to get correct # number of frogs for the input number 5 and 4! 5 🐸🐸🐸🐸🐸🐸 4 🐸🐸🐸🐸🐸🐸 SCROLL DOWN FOR SOLUTION ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩ # Solution – TASK 4 # # 5 🐸🐸🐸🐸🐸 # 4 🐸🐸🐸🐸 ###################################################### # CONGRATULATIONS – You have finished Tutorial One! 🙂 ###################################################### libnumbertext-1.0.8/doc/Tutorial_2.sor000066400000000000000000000075151416364754400177500ustar00rootroot00000000000000# Soros Tutorial Two 🍒 Fruitful Expressions # # We learn the basics of regular expressions, # writing a program to convert even input # numbers to apples, and odd numbers to pears. # # INTRODUCTION # # Regular expression (regexp or regex or RE) is # a standard for pattern matching and replacement, # supported by every modern programming languages. # # Why? Because it’s the easiest way to handle # input texts. # # A Soros program line can be a regular # expression pattern and replacement: # # regex_pattern regex replacement # TASK 1 # # The character . (dot) matches arbitrary # characters in a regex pattern. # # Remove the # in the following program to add # bananas to all 1-digit numbers (except one), # and tangerines to all 2-digit numbers, and extend # the third program line to convert all 3-digit # numbers to pineapples (scroll the output # window to the end to see 3-digit numbers)! 1 one #. 🍌 (1-DIGIT) #.. 🍊 (2-DIGIT) 🍍 # NOTE: Solutions are there in the end of this tutorial. # TASK 2 # # Dots can be combined with arbitrary other # characters. # # Extend the previous program with a single # program line to replace 10, 20, 30 ... 90 # with lemons instead of bananas! # (Copy this lemon emoji: 🍋). # # TASK 3 # # We can limit the previous pattern only for # given characters, putting them between brackets. # # For example, [abcd] matches only the letter a, b, c and d. # # Add a *single* program line to the previous program to # to replace every 2-digit *even* number with an apple, ie. # compressing the following 45-line long program: # # 10 🍎 (EVEN) # 12 🍎 (EVEN) # ... # 98 🍎 (EVEN) # TASK 4 # # The .+ (dot plus) matches 1 or more arbitrary characters. # # What will be the effect of the following program line, if # you change the first line “1 one” with it, and remove the # sign of comment? Guess it, and check it! #.+ 🍎🍎🍎 # TASK 5 # # We can combine the different regex patterns, for example, the # dot plus pattern with the bracket one. # # Write a program from scratch (removing the old program lines) # to show apples and pears for every 2-digit or more input # number, using .+ and bracket expressions! # # 10 🍎 (EVEN) # 11 🍐 (ODD) # 12 🍎 (EVEN) # ... # 100 🍎 (EVEN) # 101 🍐 (ODD) # etc. # TASK 6 # # The .* (dot asterisk) matches 0 or more arbitrary characters. # # Replace the first program line “1 one” with a program line to # convert all even input numbers (including the 1-letter ones) # to apples, and insert a new program line to convert all # odd numbers to pears. SCROLL DOWN FOR SOLUTIONS ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩ # SOLUTION – TASK 1 # # 1 one # . 🍌 (1-DIGIT) # .. 🍊 (2-DIGIT) # ... 🍍 (3-DIGIT) # SOLUTION – TASK 2 # # 1 one # . 🍌 (1-DIGIT) # .0 🍋 (10×n) # .. 🍊 (2-DIGIT) # ... 🍍 (3-DIGIT) # SOLUTION – TASK 3 # # 1 one # . 🍌 (1-DIGIT) # .[02468] 🍎 (EVEN 2-DIGIT) # .0 🍋 (10×n) # .. 🍊 (2-DIGIT) # ... 🍍 (3-DIGIT) # SOLUTION – TASK 4 # # All numbers converted to "🍎🍎🍎", because .+ matches # every input text, so the following program lines # will never be executed, so we can remove them: # # .+ 🍎🍎🍎 # SOLUTION – TASK 5 # # 2-digit or bigger numbers are converted to # apples and pears by the following two lines: # # .+[02468] 🍎 (EVEN 2-OR-MORE-DIGIT) # .+[13579] 🍐 (ODD 2-OR-MORE-DIGIT) # # or simply # # .+[02468] 🍎 (EVEN 2-OR-MORE-DIGIT) # .+. 🍐 (ODD 2-OR-MORE-DIGIT) # SOLUTION – TASK 6 # # Change + with * in the previous program to convert # every (1-digit or larger) number to apples and pears: # # .*[02468] 🍎 (EVEN NUMBER) # .* 🍐 (ODD NUMBER) ###################################################### # CONGRATULATIONS – You have finished Tutorial Two! 🙂 ###################################################### libnumbertext-1.0.8/doc/Tutorial_3.sor000066400000000000000000000037331416364754400177470ustar00rootroot00000000000000# Soros Tutorial Three 🛠️ Hello, Real World! # # Using the simplest regex reference # we solve a typical Soros problem, converting # numbers to ordinal abbreviations. # # # INTRODUCTION # # Syntax of a Soros program line: # # regex_pattern regex replacement # # The \0 (backslash zero) in the regex replacement # is a reference for the input number. # # For example, the following program line match every # input number and replace it by ownself, i.e. we get # back the input number without any changes, as you can # see in the right output list window after removing # the # at the beginning of the line: #.* \0 # TASK 1 # # It’s possible to refer the input number multiple times # in the same regex_replacement, combined with arbitrary # text. # # Modify the *previous program line* to greet the input # number double, as follows! # # 1 -> Hello, 1! Hi, 1! # 2 -> Hello, 2! Hi, 2! # TASK 2 # # Complete the program of Tutorial 1 to handle all # English ordinal abbreviations! # # Rules: # # I Every word ending with 1, 2, 3 has got an # abbreviation ending with 1st, 2nd, 3rd, # for example, 1 -> 1st (first), 22 -> 22nd # (twenty-second), 103 -> 103rd (one hundred third). # # Ib Exception: numbers ending with 11, 12 or 13. # Example: 11 -> 11th (eleventh), 112 -> 112th # (one hundred twelfth), 1013 -> 1013th # (one thousand and thirteenth). # # II Other numbers get “th”. Example: 4 -> 4th (fourth). SCROLL DOWN FOR SOLUTIONS ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩ # SOLUTION – TASK 1 # # .* HELLO, \0! HI, \0! # SOLUTION – TASK 2 # # The trick is there in the first line, # a pattern to match all input # ending with 1., for example, 10, 11, .. 19, # 110, 111 etc.: # # .*1. \0th # .*1 \0st # .*2 \0nd # .*3 \0rd # .* \0th ######################################################## # CONGRATULATIONS – You have finished Tutorial Three! 🙂 ######################################################## libnumbertext-1.0.8/doc/Tutorial_4.sor000066400000000000000000000074571416364754400177570ustar00rootroot00000000000000# Soros Tutorial Four 👪 Reference & Group # # We will write a thousand separation program # by referring parts of the input text and # learning more about regular expression syntax. # # # # TASK 1 # # We can create character groups in the regex pattern by # parenthesizing, and refer them using reference \1..\9 # in the regex replacement. # # For example, following program replaces the # characters of arbitry 2-character input (ab -> ba, etc.): # # (.)(.) \2\1 # # Write a program to return with the last two characters of the # input! # TASK 2 # # Character sequences in bracket expression can be abbreviated # using character ranges separated by a hyphen character. # # For example, [a-z] matches every character between “a” and “z”, # [a-cx-z] matches letter a, b, c, x, y and z. # # Using this write a program to return with the first character # of the input, if that is between 1 and 5, or 9! # TASK 3 # # Bracket expression [^...] matches complementers of the # given characters or character ranges. For example, # [^01] matches every character, except 0 or 1. # # Write a program to return with the last two characters # of the input, if they don’t contain zeroes. # TASK 4 # # The pattern \d matches an arbitrary digit. For example # \d\d\d matches every 3-digit numbers. # # Using this, write a program to return with the first # three digits of the input! # TASK 5 # # Repetition sign + and * can be combined with bracket # expressions, \d and groups, too. There are three other # frequently used repetitions: # # ? 0, or 1 times # {n} exactly n times # {n,m} between n and m times # # For example, \d{6}, \d{1,3} # # Using this, write a program to do thousand separation # between 1 and 100,000,000,000. # # Rules: # # I. Separation is only from 5-digit numbers. # For example: 1, 10, 1000, 10,000. # # II. Separate by commas by 3-digit groups from the right side # For example: 100,000, 1000,000, 10,000,000, 100,000,000... # # NOTE: Test your program by typing a single number in the textbox “Input”. # OPTIONAL TASK 1 # # Groups can match different patterns: # # (word1|word2|word3) # # matches word1 OR word2 OR word3. # # For example, ([a-z]|10*) matches a single letter OR # 10 OR 100 OR 1000 etc. # # Groups can contain inner groups, too. # # Guess it, what does the following expression! # # ((Anne|Becky) (Smith|Johnson)) Full name: \1, First name: \2 # OPTIONAL TASK 2 # # References can be used within the regex # pattern (back references). # # Following program matches all 2-digit numbers # with repeating digits (11, 22, 33, 44 .. 99). # # (\d)\1 Cute number! 🙂 # # Extend this pattern for every numbers contain only repeating # digits (11, 22, ... 111... 555)! SCROLL DOWN FOR SOLUTIONS ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩ # SOLUTION – TASK 1 # # .*(..) \1 # # or the less simple # # .*(.)(.) \1\2 # SOLUTION – TASK 2 # # ([1-59]).* \1 # SOLUTION – TASK 3 # # .*([^0][^0]) \1 # SOLUTION – TASK 4 # # (\d\d\d).* \1 # SOLUTION – TASK 5 # # NOTE: Last line will return with smaller and big numbers # without changes: # # (\d{2,3})(\d{3}) \1,\2 # (\d{1,3})(\d{3})(\d{3}) \1,\2,\3 # (\d{1,3})(\d{3})(\d{3})(\d{3}) \1,\2,\3,\4 # .* \0 # SOLUTION – OPTIONAL TASK 1 # ((Anne|Becky) (Smith|Johnson)) Full name: \1, First name: \2 # expression replaces this way: # # Anne Smith -> Full name: Anne Smith, First name: Anne # Becky Smith -> Full name: Becky Smith, First name: Becky # Anne Johnson -> Full name: Anne Johnson, First name: Anne # Becky Johnson -> Full name: Becky Johnson, First name: Becky # SOLUTION – OPTIONAL TASK 2 # # (\d)\1+ Cute number! 🙂 ####################################################### # CONGRATULATIONS – You have finished Tutorial Four! 🙂 ####################################################### libnumbertext-1.0.8/doc/Tutorial_5.sor000066400000000000000000000247541416364754400177570ustar00rootroot00000000000000# Soros Tutorial – Part Five 🚀 ... Go! # # We will complete the following number to English # number name conversion program, learning special # features of Soros programming language. 0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine 10 ten 11 eleven 12 twelve 13 thirteen # TASK 1 – Call me again! # # A Soros program is a single function, named $(). It’s # possible to call this function in the regex replacement # part with arbitrary text as an argument, and its return value # will be inserted in the regex replacement at the place of # the function call. # # In the following program line, the argument is “4”, # and function call “$(4)” is replaced with “four”, the # result of the call of function $ with the argument “4”: 14 $(4)teen # Extend the line 16 this way! 15 fifteen 16 # TASK 2 – Reference and call... # # We can use regex references in function arguments. # For example, we can describe 18 -> eighteen conversion # this way, too: 1(8) $(\1)een # Using the regex pattern \d (matching arbitrary digits), # give a *single* program line for 17 -> seventeen and # 19 -> nineteen conversion! (With this, line 14 and 16 # will be unnecessary, too.) # TASK 3 – Abbreviation of $(\n) is $n # # According to the title of this task, $1 means $(\1), # $2 means $(\2) etc. Rewrite the following program part to # use this abbreviated form! 20 twenty 2(\d) twenty-$(\1) # TASK 4 – Boundaries # # Soros programs have default automatic zero deletion in # its arguments, ie. $(1) or $(01) are equivalents. But # the following program line have a different problem for # the input number 100: after left zero deletion it still # remains a zero, resulting “one hundred zero” instead of # “one hundred”: 1(\d\d) one hundred $1 # The solution is using boundary dependent patterns. # These patterns can always match at the first run of the # Soros program, but at the next recursive calls, # matching depends from the position of the function call: # # ^pattern only matches, if the function call is there at # the beginning of the replacement. Example: # 1(\d) $1teen # # pattern$ only matches, if the function call is there at # the end of the replacement. Example: # 2(\d) twenty-$(\1) # # ^pattern$ only matches, if the function call is there at # the beginning and the end of the replacement. # Example: # 1(\d) $(ordinal |$1) # # NOTE: “|” before or after function calls sets explicite # boundary position. # # Correct the bug “one hundred zero” by using the # correct boundary sign on the program line “0 zero”, also # create a rule for negative numbers, to handle # “-0” -> “minus zero” conversion correctly! # TASK 5 – Deeper in recursion # # A recursive call can result further recursive calls, # allowing to break a complex problem into smaller parts, # or iterate a repeating task, as in the following # example. # # The first line of the following program uses the # boundary indicator $ to handle the originally 4-digit # or less numbers differently. What is the full program # doing with the other numbers? Try to answer, and # check it in a different IDE window! # # ^(\d{1,4})$ \1 # (\d+)(\d{3}) $1,\2 # .* \0 # TASK 6 – Optional text, depending from the return value # # Previously, we had a different program line for 20 and one # for 21–29 , because English uses a hyphen between the # number names. Using brackets around the recursive calls, # we can skip the first program line. The hyphen is only # added to “thirty”, if the return value of the recursive # function calls is not empty. 3(\d) thirty[-$(\1)] # Write a *single* program line to handle “sixty”, # “seventy” (60–79), and “ninety” (90–99)! # TASK 7 – Language-dependent program lines # # Using [:lang-code:] in a comment sets a # language-dependent program line. For example, # German number to number name rules # # 3(\d) [$1und]dreissig # [:de-CH:] # 3(\d) [$1und]dreißig # # result “dreissig” for the input “30”, if the language # of the conversion is de-CH (Swiss Standard German), # otherwise “dreißig”. # # It’s possible to use arbitrary number language codes # in the same program line. # # In Australia, Great Britain, Ireland and New Zealand, # 101 is “one hundred and one”, in other English speaking # countries, like USA and Canada, 101 is “one hundred one”. # Using the language codes en-AU, en-GB, en-IE and en-NZ # and the previous conditional text, describe number 100–999 # in both variants! # TASK 8 – More Functions # # In Soros language, there is only one real function, the $(), # but it’s possible to create function-like structures by using # prefixes. # # Numbertext.org language modules contain functions for # number to money conversion (“USD 2” -> “two U.S. dollars”), # number to ordinal name conversion (“2” -> “second”) and # ordinal-number conversion (“2” -> “2nd”). For example, # we can define ordinal numbers as follows: # # "ordinal 1" first # "ordinal 2" second # "ordinal 3" third # # According to the quotation marks, the regex patterns can # contain spaces, too. # # For the space separated prefixes, there is a default left # zero deletion, i.e. $(ordinal 1) is equivalent of # $(ordinal 001), so program line # # "ordinal 1(\d\d)" one hundred $(ordinal \1) # # works also for the input 101, 102 etc. correctly using # only the previous program lines. # # Other method of ordinal number conversion is to convert the # input to the default cardinal number names, and modifying # their text: # # "ordinal (\d+)" $(ordinal |$1) # "ordinal (.*)one" \1first # "ordinal (.*)two" \1second # # NOTE: As can be seen, it’s possible to embed function # calls within function calls, too. # # What can be the last program line of this function? # TASK 9 – Prefix “macros” # # Prefix macros simplify prefix handling. We can define # the previous ordinal function as follows, too # (see “ordinal” between double equal signs): # # == ordinal == # # ^0 zeroth # 1 first # 2 second # 3 third # # because this will be expanded in the following form: # # "^ordinal 0" zeroth # "ordinal 1" first # "ordinal 2" second # "ordinal 3" third # # With the other method, converting cardinal number names, # and later to ordinal ones: # # == ordinal == # # (\d+) $(ordinal |$1) # (.*)one \1first # (.*)two \1second # ... # (.*) \1th # # How is this expanded? # TASK 10 – Join Numbertext development! # # Your contribution will help LibreOffice and other free # softwares to support chapter numbering with number names, # converting money amounts to text (MONEYTEXT), creating # plural forms of money amounts and support better # title casing. # # Check and fix Soros code of your language on # http://NUMBERTEXT.org, or if there is no such module yet, # create it, based on the currency code of the # English or the more flexible Swedish (sv.sor) # modules! SCROLL DOWN FOR SOLUTIONS ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩ # SOLUTION – TASK 1–7 (for TASK 5, see next SOLUTION) # # Solutions marked as TASK 1–7 in comments: # # ^0 zero # TASK 4 # 1 one # 2 two # 3 three # 4 four # 5 five # 6 six # 7 seven # 8 eight # 9 nine # 10 ten # 11 eleven # 12 twelve # 13 thirteen # # 14 $(4)teen # 15 fifteen # # 16 $(6)teen # TASK 1 # 18 eighteen # 1(\d) $1teen # TASK 2 # 20 twenty # 2(\d) twenty-$1 # TASK 3 # 3(\d) thirty[-$1] # 4(\d) forty[-$1] # 5(\d) fifty[-$1] # 8(\d) eighty[-$1] # (\d)(\d) $1ty[-$2] # TASK 5 # # # separator function # :0+ # one million # :0*\d?\d " and " # one million and twenty-two # :\d+ ", " # one million, one thousand # # (\d)(\d\d) $1 hundred[ and $2] # one hundred and one [:en-AU:] [:en-GB:] [:en-IE:] [:en-NZ:] # TASK 6 # (\d)(\d\d) $1 hundred[ $2] # default: one hundred one # TASK 6 # (\d{1,2})([1-9]\d\d) $1 thousand[ $2] # ten thousand two hundred # (\d{1,3})(\d{3}) $1 thousand$(:\2)$2 # one hundred thousand, two hundred # (\d{1,3})(\d{6}) $1 million$(:\2)$2 # (\d{1,3})(\d{9}) $1 billion$(:\2)$2 # # # negative number # # [-−](\d+) negative |$1 # TASK 4 # # # decimals # # 0[.,] point # ([-−]?\d+)[.,] $1| point # ([-−]?\d+[.,]\d*)(\d) $1| |$2 # # # currency # # # unit/subunit singular/plural # # us:([^,]*),([^,]*),([^,]*),([^,]*) \1 # up:([^,]*),([^,]*),([^,]*),([^,]*) \2 # ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 # sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 # # AUD:(\D+) $(\1: Australian dollar, Australian dollars, cent, cents) # CAD:(\D+) $(\1: Canadian dollar, Canadian dollars, cent, cents) # CHF:(\D+) $(\1: Swiss franc, Swiss francs, centime, centimes) # CNY:(\D+) $(\1: Chinese yuan, Chinese yuan, fen, fen) # EUR:(\D+) $(\1: euro, euro, cent, cents) # GBP:(\D+) $(\1: pound sterling, pounds sterling, penny, pence) # JPY:(\D+) $(\1: Japanese yen, Japanese yen, sen, sen) # USD:(\D+) $(\1: U.S. dollar, U.S. dollars, cent, cents) # # "(JPY [-−]?\d+)[.,](\d\d)0" $1 # "(JPY [-−]?\d+[.,]\d\d)(\d)" $1 $2 rin # # "([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) # "([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) # # "(CNY [-−]?\d+)[.,](\d)0?" $1 $2 jiao # "(CNY [-−]?\d+[.,]\d)(\d)" $1 $2 fen # # "(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 and |$(1)$(\2:ss) # "(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 and |$(\030)$(\2:sp) # "(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 and |$3$(\2:sp) # # == ordinal == # # # convert to text, and recall to convert # # cardinal names to ordinal ones # # ([-−]?\d+) $(ordinal |$1) # # (.*)one \1first # (.*)two \1second # (.*)three \1third # (.*)five \1fifth # (.*)eight \1eighth # (.*)nine \1ninth # (.*)twelve \1twelfth # (.*)y \1ieth # (.*) \1th # TASK 7 # # == ordinal-number == # # (.*1\d) \1th # (.*1) \1st # (.*2) \1nd # (.*3) \1rd # (.*) \1th # SOLUTION – TASK 5 # # This is a thousand separator # program extended for all numbers. # The middle line put a comma before # the last three digits, and do the # same for the remaining digits using # a recursive call, and in that a # next recursive call etc. # # ^(\d{1,4})$ \1 # (\d+)(\d{3}) $1,\2 # .* \0 # # For example, for the input “10000000” # the inner states of the calls: # # First call: $(10000),000 # Second call: $(10),000 # Third call: 10 # # resulting “10,000,000” in the end of # all returns. # SOLUTION – TASK 9 # # As before in TASK 8: # # "ordinal (\d+)" $(ordinal |$1) # "ordinal (.*)one" \1first # "ordinal (.*)two" \1second # ... # "ordinal (.*)" \1th ####################################################### # CONGRATULATIONS – You have finished Tutorial Five! 🙂 ####################################################### libnumbertext-1.0.8/doc/addnewlocale.txt000066400000000000000000000012201416364754400203450ustar00rootroot00000000000000Add/test a new language module 1. Create a new module using Soros tutorial and IDE in https://numbertext.github.io/Soros.html. 2. Put it in the data/ subdirectory under the name of your locale to test it in command line tool src/spellout, see section "Build C++11" in README.md or test as a LibreOffice extension, see Section "Build and using LibreOffice Extension" in README.md. OR test it in LibreOffice by putting the module in the share/numbertext/ subdirectory of an installation of a recent LibreOffice distribution, see http://www.libreoffice.org. 3. Create an issue or pull request in https://github.com/Numbertext/libnumbertext libnumbertext-1.0.8/doc/numbertext.odt000066400000000000000000000745031416364754400201050ustar00rootroot00000000000000PK(M<^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK(M<Configurations2/statusbar/PK(M<'Configurations2/accelerator/current.xmlPK(M<Configurations2/floater/PK(M<Configurations2/popupmenu/PK(M<Configurations2/progressbar/PK(M<Configurations2/menubar/PK(M<Configurations2/toolbar/PK(M<Configurations2/images/Bitmaps/PK(M< layout-cachecd`d(0b``d``c1P%PK6PK(M< content.xml=]oJv]YDDGnulgl`1&Go(CV}+b]}l}i" /!EJ/9ʍ.3s||ӛKX =ltv0 6^_ *g3@#zh;#:`SeRZ&ܮw_' yggggٻsIl9˺eu;gE,; Pgݵwm^q]wv Tc{a4{;%0R7r0o{`#Ճ~[~gwCw ~{5K`60>k7  mA@aTHj 167a nKVgGO >uEUx0ɏڜɃyH=v!)~1(HmJZf2Ot}/s6bFfݶub~|Ns~cάpjx yAL~WOf;rUТj{ND.nK[݀M&i' ֜' - ƈ.0DU%j7@d[aV1*tqkDG@~b9=$b6'#T0Jsk,(E;iL@Bc@ HUq6I;n BڎfSej+hTMZħrUQF{OX@cxO @" ҃aQOZń~scIN=ޞH1ӄ]rI禬ŸCs7yHK)b~=fJlG.480i mO]R@RT&CPКVrĭ 3JP(38ꂀ“O)}2cO@`yb's/ LiG'8!G.>pX@DŽ!F?Lb8Z y/3EI׸!Եr4ڒUt_ ެdMvq.Yf|.Ԧ;J' j~/"]of@3]k'8Q{^2DTKIRGf:(xq"o^ϨrOusRO`sb)&9jE̲dDZgx~w2b&gㄡg\ P^[0iͺ4  8b1fYL{-|yhףK3V٢̺q>{* yz\>ݒv7p1Ő:D/J1ٓrQ#gGwݞlE11vq{dK:ٳ{ ɅIX0Y#>pץ::̍|Ho)T@D> Blp ?.Rx@]8l^zuoNo(ɖz"jr=Ti:٭6!qgcI99bлiX%;K Nc|?J-;?M)ZBehh+ZZ>bhY+e= .d*ژ+{*{пOUl\)Dw»1W{d n12s*?3}w.W ^(%_J41[Ln;8"L-&̅9Y(g3lfќ͜V5X>]DK﷏7hi43 =P5 GiFsBW4#VvpF4Y!kvvM4-Lp"Nj6.6ݦٽŀZet6AVA)=L&ȶM+*ѻq n8nQ]ʭx'rIVjGM% ovNܫq<߉hoZ$B}&olCљƂ>KHVxfM3Ó!.6'KG2K,HPcx0L(6IS ZCV-9[&<>u2wDY 11x F<<=v9HgJvj<#Y@9hџ Zf2NuWhYNmв;-ӲZBvN*kYoN*k -۽Ӳ;-e{+lNв;-Ӳ곲UӲ;=ӳHTS+)D$,ZKKֆf$Y'$ٻf81;NsA7_ _˅GzF%JVn( T~[NUt3:Wr[sO|V74;sy4p IO D 8up_]+= oac*$ [ j~@U\>31T¸`s,7Tb?1RܘT͎qG> ۹b #QI, $Y WU(=ㄅqq$)`^uôө"l9l7o=0Nc=r:g&ʙ0ΜAP9`|(!vx<Aa8ٲUFD$J{Ug5Ux/VL߯}H/6*sa7sK5ZbQڍ6j.,,~-Ytwza F|S'R'LX< VV?!WÀ M]Kn|<?!ۊX~emG&dםlkX/.%$`K(<9qGu'uĝ!# K8<d[&K$6 DGUEx 8rŀ~  Ԅ&"Gk2vvX0X}b ǽ B IWwJc@#1cdHQpŢg!~R<tRQ8 tJp]RPC"BӬVvr&lxFY}+M^SDΝ*3ח=-`PU.ahs_PŲ膡k-6DYE # UK!8bxfeg!f33sQa=Pbfly3pi9Z1?q4WVJ e t|1K' X%@oEr.Kԧu&ɹ)0y`|-4i7Kfss#eKB䗎dK|G\J_r@>vzW$sHjƾqItHb+/Mb* [_ya6>G^<~S7QDo4DXBY=+¶\t*f#,Rs(fI6g"T}3nOQ?{ڼA7u 4k" oFa|@! :ǃW6""/2 `܋. ^by9{zj虶t %*"\.ΤUm2C]hJ?7D?9AnbOEn 7Jt c%-YSԚ#,7ۀX@xxÒLAX:}: %4 7#6عZ>Ojd(OU""ccMBzt@ `aHibUP?b#5% Sz?lI&2;By"v|&N] (uV A:= _? 4#yMzkf , S/m8i~U 7h(ϵ }F1ui#p -εߋ xW9I"Wґ"خ)Y7/!q+k봵դ @U'  WV*OQ/ :d,Ri\$Xu Hٽ줩kR;`N~kCR01r@WEq~~AVUXݙfEwe~ִ$nfr:4a=*ʳ !+4sCIE3.%]S}ITH޷f5z bFqf[kjb-TN ;iP]7m-lUIq$1x.PС?;)ϙtK"YP8q yiqƵ5N~HY ^saԉւڅ@![;*1!9aN0\Wmb%Af\N×q{Vs}8h~b],xQHn (ˍE3 p`zK{>LFFgl?X5۾3m3:ƮaE\9}5k 4pgC7?bm9i8d-É0O%e<d̎gp"g&sj q zXݖ2›\$zϦFH/h ϰev^MBW(iZkC4l'98\X62@H&a\#}ypK5ū0*gc yWMwL,%qJ.wH[˧g?jF>[ꕕ2]_9ސסYrW&W+d+ D'r[hSE}KME["ZPHV? T 9x=(Wx,d#q^v2+% }Xq7(Ϗ?PK׹ePK(M<O manifest.rdfAN0E=i tA5I#OqH{{L  ޟq?={:t%OŎ3 ֝kK>&jSQ#iG*J~ aT<9[H<)H>'0V8JS]oWTj4$PSG -LGM 0ؠf{#S(9-PVT4`]z_=K{YX'Mڇ[.Dg_?z$,-ҾU-`jPK(M< styles.xml]s6~Gvf-u:]r͌fs)Ė!)K_ G]C `b}tl#}<)5Dgn7x7ĠI ;|7ϴX?G"|zpL1r,PuRPQ yV?y%#_'r빞o yiy@RL9ߊ ufk?&)Jd1I`14 {I\cW-b`*7kq<7d͉.[G`Ac7Tlt;^ ,` ?< TX>#Vfw'[(.+0ϟr3v*DMZDz;H8\Zt+:Mk%ݦuLp9icMGuYLĄU^e _JgY5= K ؟@ 3S!Aun((QQFN$ ?N SE4Eh!b_w6;X{BN8h&w( %R_-vJ@jX0ݛsT$$3rwPe:4mfX]9$4UήUrHD1AvW.oR*[{QpXri\ŝmm~ۇI'Fna@rba<oTsM|Qy<ď4C&˙iЫ^zx<_jCvK}Fy2DO&z{QYZXXL -2 jCv*e#%.y7i?Qb " #t%mt\!:s7);Pn|k6u/UVImъ)kGzOY8"WSQAxͅZ,2{OY=fOhJ䮉6=makYfxr`/5% oNy=v6}NcX&O;-SEt1}[F_'h-Ag.zL)Ҝtѫ;A qs`kjJ4Zf-l_75'Ԍ;aۀE54* XдzD(ip|Š{ F2*n!u 1g~|,2W]< ˺@\db"5 u#%5aJaN}jA^Xb'ZgZxMfI ^r.TSN.@H8b^/z|LTkL1bd2k`Ίm?בw cn4BLʼn[۰t=,] K+Z K};/Bu[M)6r}Adg!9MOrnRzw:ZOc@^bnR,[gV-1jH3Jp^Rng-ɊVN)@.R62EE8T dmqo4j"+sypjQ6 iTuDniXX%].=pLt "t\g_G.aK_z 4LW BlT8n3:s!euan*H{IHp;xzta`Sp2DQzrh7"Fbk9ՈbXjNt;#<'[5xsyuA2DzV +Y| hX DTKӍ~je ԪYά #몧 zʳ=(BXdQ&pC(Jw;J/NtQy"1о^$'ӪS5ɝbpd{ߛC JQaOM59,q4*^AyUT#(K~m; Y*$!-j߾Փkl.m֘Ww ُ QaBU^@?߼ˆ&*_""^3*cr~^xL Tz,LsmuЛ5q?;U5nKr8M0YNg\s2xi ]4._C˗1}$D6qbȲ?{UI+8źI/I*Êb,KЦI~${b)^ goɖڤKcZSdGuEBXU3Oa l*E$o=ӫRǏd7x5,=8C.0^68􂻉rvt«1zLfo1Ԥ*ֻL)&ˡGF{]j8{[] 4q;vWj>` q 8|CGҧ4o9Յ:Y.>ƗHG*D / :Le;ii i{'!t>aHd46p 1y_=% h}Ynxyy-&BnC@&Si2pPa-́XE@% Z5?1#OcuŌ<3e0iWsW)v!~[w6Ʀ-f463H;%2gvJ-"j:G>wǓM\34OQA=PO 6猩c.{zeWZ /ϭ՟Ld$">XIJyiK_d\S|'rw|wF;͚`a|ryTo>bvWbbjS#b OpenOffice.org/3.2$Linux OpenOffice.org_project/320m12$Build-94832005-08-25T16:54:402010-05-28T11:41:17en-US25PT10H12M04SNémeth LászlóPK(M<Thumbnails/thumbnail.pngUPѻqCw'8 ܃ww}8݇S>:u=5Coߢh%T$B$T9YI5g#$0 S)')}e$l\>yaaɉ/Wnx^s|-'Ƴt9fiE$n"#HwB`(xuODFNNFL似^j+ ¿m;RhY/{A~WR7w{ŗIk{8-)&2i_>$D1;<2F$E-LyAhA1GOLv:a{<zhOFu!Wfleڠ:Oն熿 %֖Mmt\*0*O\rsH^kby˿؍$ӼȒժ[Kt-ئ+Yl UGXnr 7LXNn6]@k$t 6S&^426}bA/U~Gίܻ`BdfǎΗ4HԌ'|pG1ljk*4fCN@6G>B |NT=uxXH͐gl?g-n?M "i!+(#[,Jfy]mqwٸ(>7zKTQU~;YnmFH S:S,.IJ^Cۈш'l?@?-(j=_z8pN@~5q]xTgs)}3ŗLC Wl)2',Sq5o޾ǝ)1VVfj:hBYF\Thc#sPny3?=|eBAEu2Q g ]od~#1q^y BxcK&aRe}:R̉Aw&>m=aҤs>}qD &='k6=Zk|[4 <|{mKx#K[+sX崡'wD޹f`6YXYb,MT4t[/,Y4nc\X̖_3rf<#!9!I~flE_UZS~D> r1x|paQg>rt0bDalɧlh狼Oɐ{آ}n̒^c 98jc4A+u]땟i܊a8FbtrjUȨ9e+I!(Doo,b [狵^^,IiN>aamv^y&|JqLSE\2T1{~[9Th6q=gFsɆ1/0}|wC˂:PͧA-uY+~Fȫ1t&@l\s߃^jLb!/>>!=+zqыz Emo$ MILE)Ƿ0h}GjBC 3w'a*tI,pSVWdO$o5a`~ .~fBȔzvR~WO$o\HkiV'ϩ&HO\n 9ziz`nOV%gV{NB9}~z({1b+:QsfZduUQi“2=og=I<Ú & #C1Nwz'đy7nX]Mu +mk;`—4 U5 >4H%ZR'2O].AϠ 2¯ӯ&s}'꩜;#)4NI}H\\\j '6E|Ü1B̨U 0{[ )]flFqcC~y Wx (S+.7egKJIgB0 5JwQgMދ@%]mr[m:MeJ culXqcymAF@@0KrC ۽\r.:  cUk[([ݬB;t<}{=C:ZH1~CW_*$q`0W8bJWUBbp,,|?ͪҙB6nLll/g+%zL;WG^)E̙m^n:-PgZW1 xe{cdր{<6{ojkUjcbbQO8RJŰ]6j9\Pܠ,B<#]`CWhm^I q9.OC ӅE_`DMwTwOPfRABFC(XfhS!{ɷWns5 Y=O" oNq IG'qkGہ{.sgj{ -[& ~0)S&!J#L8\kj5_ 2{=:3Tce (bսM 9KxBDI.n݁~Yi'ou C^f+afvO_TD}RF*c]6?(8xx7f eԥ_ɑT.෗vnqmՏ{(7̆ ͪ6Ԛfj2{өT`!d .K@}$hQ(jxE 8"2^gнٱlJ7g5a^ 8Z G H}9B?lcTjU{ cCkn{YJZJ،!v=58}X vĘҰp8J ;6x8 @Xth b`Q gqܡX'D( (/Qd42j0kײK_ !wpw8Za#1qѾ$ HE!29t=3ZKP'cbPEjQF e Hg>$Sɏ)GjNb&LiD60BD;: :DH#CdK&4LSTLhJprK[fI\0;n[U(w(Ï\|\QCY"1J^όT6H =yʜz:tue7E:N;o!:j1E:P8EJ:j>cZ:@5( C"+&ж'Eőc$ZҌdIr29p5ߘt&RXAXFo?Й/xh=(CĒ"= 7LDR;q+y6_&(6V&BRlmwy`q)W M&s9CZ#IVj"XGK %G16@q06*B1`^*yfsa[|,I.hm!r+S@)azc'v:dHkh^1y.:1[j!_~8VvkSoKk*Qԛe#dX#F @G}]W=)bVR3,h(ۊ?lRP"1l<! /HŢd3TrK-p#IFIoW8eJ5FP61?,8Ou"‚(slݖDKޓڙ|b*btttc L Gf:,&&7 Rd1)U䮛 E0;GA6 2 ]J+M0!#n;24!5kհؽGQev儣=NIaR𥾝Pl#Jp|@]3ڒf 16//q<#&IywlyPxv1rOm,>$d<Klubt358YA.,l5˺`;GxkԤ>t'أIk%3 rgc͌DpG"è][ɷ>?gxR:ZcU 4 Q4D)4Bȗ-Cãq-~9Re+Ys6X /Rtv9̳z`pNq[_NuɜQمFJZ???%n\MgM&PA7Y߁"j 9<:BA0!6IA;荔rd:eEt5a4q.fg]\KkX ۔0k削 /Q<̷lM[ǤA}`JXw}r€JUJyMqW;:0,N5$)}f}L/@6#?A8ZDp2{8ØD0\N㽒 ڗvS!D_6s0xみHMδ=-bg Ado&;Jk}uXMAg'af֥*!ky(zP(65008ΰ 6ɟ*Ua,9BO(a[[\f a]M\\xu(Y3rrro}}i w9E*MH_@+EV>ɞk2zڬ_an~{ѮdT.C"y[nH1'{4X3&g&XƝNWA S|;3jl5bL,Hrʀ0Զ(1_^O"k.:| Y!D>6'h*-ET:іy(r$O |;I(wݱZ_EI<ۥpb._-:D.5ٟ4o`nM$TpՈ\[og ;3Q~\55;g\nƁ?z%#HĨ>y^ GJ<(P!Vrőz/A5I[7MzO-g'Svoyd\ WjC9_1qp,Sn4DPEa!mdW9:6Cs`>EZ2wD! ID?4?ؗR.TA3zO,?qm(/DOdeLA㘑ucoff ;b RwUtb^r"foΠD(,5Վ2 q%.L*pN5گ"HF tHRLߗEd yJȘ4c_?#T lΐ ~E<-o {}Ym#<[+/,% =+;$eê|r4~Xk|xlkMx#,+~޵>/b?EYī")K)5p[ mqj8Xo'Q,6=5I/Qn Ԓ\<&!1S~V%'s= c>"4_#?Cv]AQ,ytu*ZqeV=2N9CQ`8tCܟ>mE!3n}z2=Wo~&Lv 7:yikk뮀7J| QA0I-CĢ#M?Y1,S+RIAAQc$JAHBBm._ nsPE߃/}7"FV.!wlhz}FوeGZ.:/AP1Ŀh-Iv(733s8'>n.U3CA~QJox49B`P7!pdF;BjuMbY&bBgؕt2q%ڤO`yR=e5j?.vKc4R^{~)\$%I0vt d6ӋrKc=΄pi#ݜ6LX0kzn " SAB ajWzLEj8!'ap{fȍ)E 0"3wem6'BP Ghޅ 'wwU+vn-mK|(BV [Qݹ[;r=.)ϏsP_z"Otl6-4{4ŋlx1_X;G.36BܑP%AfX`{ep>-T)iJU]jL_UT Lٜ^Pe㙅>(_F5t0JK2EWM܉34 ySKI\#::63hʹ<_z/JdENKVf˦FS LQfYN$^H C <}F8QrLejaYrD:ڝ,Tec_&Y  )G@YTdƹړup}eRxu):dnl32=1ս|#kI:=󗥪* .#4 ;\o90M[|oqlV`͊߼viMpUrIR>"bh`# yэTY"yTyH0KUoQY}CQV^x>KlnM#dU}w[V pzN SPPy{IbnCfCZs{$D###WvCˡe ]PCu%~ Ƣ,˪ng{h.RH~v ȟI3Ut-K !!a*7W:lK2N}u KlK1?븬EeB&fa|OQN}n!Zt?J/6^JO#x=6~ޚu7_"2{i?q۵{:e$?z1 w4/v؝_2V?~hBxLoHz7 \9}mֈJ.xڽtޓuT& ae:/M㝮#|kW4'j.ք{ipJ]g(ǃZjX&իyJ}A] tL/@!y_c#]tU{ 2.S)ne;} 7GOEl!&&S;n>=hD~ 3d QǽH7$>>bUH0"=@xf=d褕jHX{?d2FFFnHz*,r $G/iScb 0.l|rMx"RƓ>92u Ά*qlfmf'v!&D6nP;߹ߘI5Ry2%EǕ],vKu~Y{/ٯMqT}K~}$ύYx̟hH=6&6\zG SYx!g6Ըu"P FwZ;p p幛tn`8fRh6%#%}D+W#w yv}d& 1IŐEY&qɠ~p S&=4 U/.q4gk5F"[\ʛ&3@Hmh` jO}by,Çf-.@)a5lM9C%dЪ|M+9O񸢆^br(i>XEIzc[Y~}PoryBUk)@NGLc"hrJ/LSSʝh~,F|ʖF."ʹk KhkޜV u.ABIJKVaC:S'?hf, ^m`HX@oK/T)1] 8v۞idvwplԙBԴ]^ ėL \TI6\}6L,fЙGҏ2R ̺㥥tLE3E~#pC 8.o/N(}z%GJeG>~'ybInp|K7`KA95i]NdfA; |V3w|9o\MKpag|,.$TϏ<?pIeja'/]YYX&Ҧ`ÓJO|N0πus CUE,{ϥb;p8߅/9˞0KV1=Ny32&Qvl9n܋8Ps&߿tm}(ɀzxc9&l&JJFnTP燼6e0.ٵN'xK´|i[5אJS\j:W(BCC<bRIg w1?MP]xw ?UmZdy=QaX9@Uw  (Wd[}4-pe`TE NyIavg>z(,p (u*-&8}tT(=a,_t]0k=ljaYx 7qՇ\ɸjnTTDwOferZ7yyyL*Z(׷~ȯM;O@L:Q|T?77nTSecJ 1ޟrPqx2D#hfⓘu:j헱٤$C^]͙||V ZHޘſ#_x-Yh8%&^6YyRiy{d@^Ř8L{q`N*E1_ߟ._[dzu vbk*H!.ipDVFՄZv&o=lyt.ՙ xS /v?V cuqyVE^E>ʷ{Z!5&,GF2썏@T! fQ& x4LX581yLs%ky})s>_ >}4ʵyW~ |3U:lgM QMb(}64Ĉj\_z~ _jEAZ4vY7] ]ֵ"٢;yFS^=}Y?j>|TdtGF_m&{wDGŀxD(,g&MG!HCY֫MUyy#)4۝尰i<wvv_>|Tz|yV$԰1v>yc-X 3 zo_,ٱ8^@~ty@IY[_)U0Id %Pa-<&ť7F8nAd \FJD⅕Eit-Ԇk9kp;|t5EEL*s~ SHx,4;k>\?-Ke~p t*K#ciҏ~S*F; 脄~mɡx<@@=KgqIj;hx&{@ouO>3h:ejvթ<<  :33CF p6O6T9@'R#Pr=l@Pē ,bj$Y@FL<1Z8 E\YWtX$>pJzd8fi]_3--sگX,kXN2ׇRO#Mnj 1r"\ܽPE&@ N3c f‡LGiW;>vaߓ񯰕p>zチs-@pr7ю$L lHLz+"""[Ke?2~W_n+"pP/ev![qg*A&n]XAÔsú9>.y0( >` koQ`T$-9Oui)07*uX]c$<~jGj$ ٲh*S1,I6 t[0Oѷ"m9<ic')?,ڛl0$?i 9DwdVz-=~pHHl<k);Ii(V^g sELZv:߇s(Ii.jj|gT"O6w!a3j 2FaV< sX"prsd)6|D[ zU QUa8ю 98G%K'.e'Ӈ˓'$B# #bH.eH Y<|]sLZ:CS+9d>AVoxFA*8}V^AM2Π%h"6bA1 T8]|L/ EmMq8_6|$/xXϲT,XY Զ>nmm՟7d"JC$&|v.ۋC40 D{7{BgwZ0(F*;9}{{N!%)BԿD3yt=^aQ=tl7TMPFFV^՜/KJV4-fQB!o#tzyIl`>Ciލ AU nYTN82H;%irU"qŲHuɢ2JhҟHgW50SvGg*v4y ? ɿL}L HPPńKQ6LXrI{Ω,Wn̠hrflNZCDuB˼iڛӅg1\,8H[,ƷrFKZ-p4 ZϺ?lC^}^rRJ!PKV56PK(M< settings.xmlZ[s:~?"&c 4$yk7d geHNJM 9y%j׻}+qy9H~+~*䎀|zǗϕdPCX8Erʫ\,yY2'!"vv9Uz`ʹ|$OBNROG_OGUfU%xUd6*;)﹣&߸$WyËq!49Z?6[Ρ.Mta?6'dB0mty6ὙH<cP0ʄ0ٔ4yUDp!NaGXsC.?&ت7W1|UJg٥ʔ왢1'J*Fb]9bb/U>;/f(DGI6c0#KkW89^WzU{ԉܱմz@dokˮu>hzKVJ;D^D|\}ac6~d]:L@މ)0"DCo!Dm(_ވ]X$I{CyLm$nam2l(I_F-X3zQ$aEmØHR5%vx30*מLLXrlNY.4BA]MX?kOKZڒo\#vW=ŃZj\*C| U0oAcQ-+nw@_gbUѯSGs5Ǚ'xz[Y$f__7aM8)PFl+]`vdijFcp (>,H; D[Hc12k~iz,)T 4sq8 kD)9v+2N'gLt cf5; jMm3'l ;G4c0{ڌa`7ikUkvFe⌕-US'zp8_`RH3 +5È3$[p}ڇ}&Kzj=1aU ɒa鑘%zn8.H:&㬌Iyg(0Yj1/r|`xV${= d]Xq,i U?MQCV%9n9H]K=Ԏi7ÙEz9R{i[/i?Ęf9w"vo١(Ri7G8 &l_/ҊAyjw#p^>b БĩΖ鹜([T H =5,s\^n:2 INk)2fNzJ0Ϧ&oZ^2l%.\!/:?NK~nCʿPKr L#PK(M<META-INF/manifest.xmlMn 9Ŷi8Z'H0c?ŷ/mӪI7 ^b>HkT=4}o3[-g Fv>τӴaћB61$jдVDHZΊp') @'ߙ:)";d5,wQmeWk:G<P yATs3OLκ͈=|'=Z&N֪lRCHBVƕ_Hf|=U4T [1@>)E_L{q\R].nszc@8-~"QO]oPK\!e(PK(M<^2 ''mimetypePK(M<MConfigurations2/statusbar/PK(M<'Configurations2/accelerator/current.xmlPK(M<Configurations2/floater/PK(M<Configurations2/popupmenu/PK(M<:Configurations2/progressbar/PK(M<tConfigurations2/menubar/PK(M<Configurations2/toolbar/PK(M<Configurations2/images/Bitmaps/PK(M<6 layout-cachePK(M<׹e vcontent.xmlPK(M<O h manifest.rdfPK(M> stream xZI+ϯـd&0 h #$@|knHdXje )BZ=ߝ)^/)E|?d_ k^gWM^M?ޮgK+xEYJ^/?x]҄KK>%o\9~XVSBđGdݓ@ēx_>pY(prq>(mf"\Y,\"'4 ȡ @%DZ_tïȾ!A,C`Pz设r?Cq~4$cƢ]D;A.ҙ1I(Z2/>uX*oL?<3 mGgRՔǛl}DE]zi7wAg-5ܟ6)\۵,}=>Z$cz iM˹QM$kPAd{y"Wi!t#n1]oF !Qj ܄D~e Q8\>{YiWHh.TB,74T=z[rf{!HF.Ճ)7(Q9楏$sJEȶ}gg jW:GA!H  %nwXl0Rޢf_GAޚt8ZMҡv!mKuFYlf2Yibit=UoP؎DujIϳ]=V^#Ipr/8ǥ X?-tI3 VsڒQJ|kK2' _JbS kKoqL-Bq{`\bT|#SKfr1!oN3%+DA Ns1OEwdݥf ڢۜes0Ӹ ɛuɋ_qyĻ( 1oRےQhk䴔 jE$iQnŬ@m>juE8oJZ*1m"{i@a6ء(:5}R wQ@pkث0wP^'87e+ (襴gRi7CRpWA44[1u[˒F򋉔z E0/Ȍ\ɢY ۮ"3}B&=w@RwE=8ʜ>N؟%T1AaZJF{gsg]Qy.*3vD9eRr 컒L2Ɛ[NtsS 'y{3Pt7@dSOReV v]\21Ƃ߆YmM9z'N` 1oIW5<y\uIM5(#c˭g2ϩBn[՘t(,IN]4B Q{Qgً+É# 9pNX[5U}o۬i.Iט'Erξw{FclE}l4i[ifwKԷVE8{h?" )Yn1 AX=(㼴džJ&ECgv퓍! P˜%[y3/}Mr:h${xHyYD^d>FIJv" ]-J`hrKDQ__(gX&lnLjtktT@1E7Im-H2|R"Y[-" J>Ҳ/,iiE@G5MwsI},$8DRV4xg+;޹'~nvOܥOtg~v]8cG,5};|wVeܻwŔȝ-&>ŋM_]w86yuCa.JS{"{v:y cxvwQ ;[6,dq_YZػ,f]'ڏJnk}4^QKnS8!oT9pQdOJ9xfҟ̴cS5統*l`""?Bynj>FVJEX|ˈ")}cfT"m0hGk`;>~`[8c[R-im<; ՉXW8̻-́ЙZɗgw]?kl&}.*w}Kڶ/ {+AR=Bd\{⽌Ϊ=kho;/$ie*mܿ?%2IۚqR]gBf&po5Rzoƈ֔c^n9EMuxS%")ONx/Y%S@s' y[E_=L+;Gd{)(caG,D: N`rr<"a6egMSPB=9&ygSrhio:5[56"=>yIBDXiv 9b& (\fqpK`O} M&"GQ`l c2:t X+/:H1paxCK[+5Gj` endstream endobj 3 0 obj 2944 endobj 5 0 obj <> stream xWKk09f$Y67>X!֦CwNKe=7ۀsm,>4twּ8&Dsf>MhppKGphe}Y`OenG6զ#m<zx*4o\=5a'R;`/1vH FՕ%l.Nn5M6\{ J>jAAelsJ ~:  ݒah y(睓 OTB:D6 WeZ4zN#(+կX$C9Ty棗aaSOΤulTmGvq}Ss xnYo{a\nGoǯ2D;%UJ 2;%W8Bq{VUN lY 7ؽBTXԉm3󡪭G̺"Ysy󸯫Vc[*wm fE(8^5H"u / Zp'}%?Xo\q+AnP˻@JMvBBfc.(#T3 CỦk,@6HdH mظ{Qo ɍl }vRU.--T-[3#wQ!d2d6)B5gWw$3qUM\QPoUFV جb)^isІ}OIu\L HNsѿ;yKޫ6h/%{8RJm ZJ>_Hy4|,}wƼgQZ]"&.'dK~ŒwB+A[G7D+_ endstream endobj 6 0 obj 890 endobj 8 0 obj <> stream x[M8W<$Y2C26CYeVIG"Y=nDűKv\UOe)oo#c:#t46/?~ټ;]wk\l>_|>KxLOjNׯuOJ :T;^@a h<|ZQkSϊƿАaZ03HDm|%!=~HjGq禊>ʄaug~)FjOz QT=1Q~k ﲼKM "yBkˎR %&rxsY R{J djbYRnֿ *V|@o )%D;ݚ+(1HbOĉc-(91=cC/bᏢIQAb~Vd,G7t 5rtOn!NNGP\+vtmStkuKnNcNNisf)2{,E|q<7]Eh z)ZwR*e4*rRLAD=ttNZb!p̷WEyF1~ Q`lfB7t q 0.FQJqQ)L~b-:kФzf>n͚mxA%tthkߙt~}60琞'`-A.X˲?hN~_`5Bz쪼u˔Ӿ-.+k/JH{XÿRĢ,*qf0omՈm| Uy_1=JfNuV+~ !Uj& Q`Rl ]c^`Zp_ \ dGdb$3 Sʁ,ǐ$"6C :]Qk+h]^䵀5׌N"z!H[[HfT+}&SՍ'}4C1JI':hd>h/rxq< 9cdu 9ruyM xKїj)X%y >x/ -o[W^!]:~Ū -3qHNYShx :aTPLpʪ`Fp}mFm\WWmtnu/M;VUuG}NUچ xT k [$, ,r (.l 0`K aIi;>eiP-^w3'|)RtA#tY=娲3Ͽ1;wΘTO'G 'v*z_S%]S1WLU]ywʱ7TUAqի&B4ڿ.%{eL:6| P3xU ;ꩪj-/5=tc]O ktOҲTKB[wok[ #dLs2![.KfDQ,eq襎v$,]Q 1 gzءe6Pbd@;}Vz] R)9^`Ыnx,yQPfN/.+Rء*4{RkRk蛫WeBH]`1,iO)PEɾkYwG|>:vJu8fr%ad{i=[:3ұnzqZ?'K1ޯvbVjiL)%0佩9E̗2݌٪.3R6h`c䢓S؃oBz>h<7.)\K75vU\;?RPT F#:Mg8Atӑ'׼ˀnFוq32iZ&4-YY 4l6=oe]M~mh`'ȓu} k[AvNaq7?UR  ^Z`Zlo _{^nuz*0{۱G^X/MUغ4J/zq}(M) |ƇyYڨUT;Bn,-ŰU8ܯe*a)rwitzFgՅ/ȷ"jxxNǫcM*keA=nyFX*EImʨzҴWai_W 蹭ٴ<ՕP>ǃbShᷝE[}[IQ#,s 5\x&*E*W"H]`t"4ivT`S][P)'J}!rOѓ OMOm&_ڒ*fxC+K>p ubM{U |tzv7!fjcT]ahmPׄY '!&.8; 1J7C RLi%xRQUf| bE endstream endobj 15 0 obj 2892 endobj 17 0 obj <> stream x\K# ϯy;}mrXld/HJ%{6A*EQLJX.o<ٖ=NN߾{wOZ˛WxS?ռ){=?]-]Xg~xFi|}AB xѣ3k=yuoZZ5x\z @'J7ѷH)=y ]L#cpG8߁ >s G\L`&61r[~Њ,5J # 񸠴FʍW"\ᵃGBI^< mq+܇^1gb9{Vm$mh`SV]Ӧc6NHf4/tn%ٮIL~;*V;Y㐰7K-,֍ *b֋`${*k֐.z`Q9`y|سnLՎ0̗ pEUStt|6Fb'%z%tBwɠ*ϫ`6,GT0׶aX[F(6.N#;qWi[e>f*`P>o)T jnI:Da1EV: ObJv ,HGIL Yg3"7T%d ϸtfu&rnĵ4GSGrւ/J$;QH@Z'7X -a>ϡS9-.g<3VoInնSl^E'I‡yd]0A\vUP&}COz͑TU 墥r qq\Z4Qt5o$ڍ 'tԽU2׶N}5͍S£`Rŗ68 l38 &p}_ I):WФzUEG-JښC_pHt$(7&BL;cbXbCttpƱ֮ HBHn4/xA+2H ,I)8( 6{k"/(盒*9A8.$g|RlԬC.P:Xl@BK`BGB}k18-E@ :"a-smvX[L~b%#.V;lx7tGyX- y"]h/'Q+1TxRg7*sWm ` `ax͢BKIIQ%GL׀JÕqBa%Tj)ڪ@'Sahr@YX"?vT1d’ZK"ERΑ}zviֳbem"ku2("kKP-f)R[v1[u%w$KMx\Қ)ŻƳ= neDOKZG&<`Co'< ?x3xh"b1LaaTv{&ש.Nԡذ9>[gTDO}nU(o%d(`Z/#xs3nFۋkϨR>P 2Eҵ.{F>,SRݜ)3(w FWq]K9+pll+A`%jzKSI. fMdfUɧ|.h2-ð[8*>U  .p~~S)r1] [а;ֿRXxVhcSV#W\@1\XZrQ9"Psmk%𾹅,C!]W"5Z) F.0Ia,]ݧG@!'M)cX+eɴҍX!5N d:Mn9lz`˳SUEyD^ >gA`XJ_DӊZGV&H%JQ94(M>9S¹&. MDpƦN*i0Wi5]ZU[!۞'I=; iaK6j(opkT>GEG::<$)`sNh#R+/ "b8N暪\W^lZ =l9ޢtjcLEQ8".uc 4VŻlE_4VdՍ\Hw= 5+N9<ųf0Cֳuk&fizdF{F1!b([A^2HFJ)=o4^՚4ֲ;2.`ؒ%S+G#*qL*WIłXRN4= iCl&Ľ=!l:,d V(F kX qPUAq{fyځOS2ږ yu5w3Ce`zYiuorFrJ%6=lǶ(#N\!Wt)Vg{-} π9`|rv >Zl}\:#AaV']ܐb-S4Η;hfzc+ͣu:LNG<lXEv9W4h!O. g&sIE zǨ0٥+eO5͜j*'=7,;Y %eCG@R4i-o+|2*E9\d%z/f=kֱ Hs)N& J8km'_Se8A3 miŻeg B#{&{Z_Kimq֛^V)}uJSf{+^^=~N !AS3$՛KՑ&Df q#m:SO%olF=N ڥ,tJ7}ċןy?F*ݲ"~>!| endstream endobj 18 0 obj 3943 endobj 20 0 obj <> stream xYK6ϯy;RIl Cn 9,e7C sߏ!p{~ρ l#<dzmx_"AW=`-Xe˲ĸ lNd9@@H4HW{9< }Vb dl~S00{SA[GںF@w% b f2D|1L[ T qp[*92h$cUqZj'u#msh]Eok]5FD"5(l"9L̫=B2IW;Œ#wh*D Qb)RLrx!in/;ODDHB3^27|AH1@[F+ G@rW:4}@HȰ2 ސ DCːz{UJ0! _,l @NDeXxXnBkl1U(_GR@XB+((B#]XKpWmj5ա:/( X^܅Cd{We H`# m] 4f]=_DCl%TV-,(%tI\FP oO`]!\Rw9q8b"Qm7bB)M5Қղ]CgX. YmCEBb)AyPnOphR'[n۾=EUIXWe)%ڝ (EJI}ǣҤA MAVe|֩N_3; 0+ROzӛI I1¯[S֠lqRg h#poY#Ma QI4_(?(*;WkIP z1gEgD@r?-,1uH-P*uWx/"\M@7v[>~*P끸ezLt:[ s+ >g' ;n y%lަ%)`R/KlV=F%SaՆlbyJ#>SLE>m&Q\Bq]!94kXT$mH&U|TA*0v$ȸ*aD\E\y&WLzgOU%-kf~rfX/f1M[s\%f5W zʘQjr5)t@U=sHLlZa!ͫlLRU46 [y}Gd^q̉@ t)/D6 tmj4jK#>Jk}mEXMőTњetjatNCP v>Kz2R#Y!Vc%]XIQB1Dq햳HDgmrTOz^k{mVif4M oEIiJ\~ro=>6ڪG%!f /}}N6+hʈ C joV#2INI&kZ<|Q܋&Id(ZzF:/ES-Dj CaLryb܏ꗙt9"h>N0>ewhfB=|h pT*?X endstream endobj 21 0 obj 1981 endobj 57 0 obj <> stream xy|[Ź0<4:փ|)Hp">m@>)0\PF +8BRk:h0[6ÉH!ػ:g!5&Z䝿&u5A㯥B~t7F>t)=jQ D#H&H=؍ԈXEPA a4,(M3Jxo@b83LBVa5} RG*D@g]0.(yP': )O] uhB8^_V|*F03 :uCG92ŠSulŬ VG_>,-Ie̩ߧR(0y\m`6dIƤ%nic@wq\andvKp#7Dh@;CЋ/}F-_|[z\s@po`4 ׫Jax=n<_ǯ32Ì0d/%Ri F,׋>@zCF/a3W2/30f%Ho?3SR0*[ S̓ճ^6ֲ63]IÒ_HWKc\l~pǩԧ2+¨ Uli+n@7ϡC0y9z8pٷwu/~% W.S0uL#.4*b$\'%H"%p>*{Vq]|0w!Bۅ_ϣywsͩ ߏQ`daI<( ۰! \+j}pƓf| 4^_'z ? MGWaAL)d:f%\W/30`ve1'WYg;~}%jfI+K^/uK}/Ȝ2&5{dGdo>d\ K` >~+G7@/lt/1'm_l?{ml#wvof٬[ZnC>9^b?\gS[Ȩ],EB̿*f>|%>ߐ>3 Zt@2Uu@gp3w>CFcf0X 8 4? E?>2jV ~zX%j#8ƌ[s&Yi61X1@v>h4.&6Oq /??,פ@d TڙQjE4gPs!5{ɠY| **Vm7&l!x`V ;ډyЬS(WBjn4e{dǥ?E؊js~ ;P5=( mz%{IE]~}IԯAۗ%2D@"% p2Jꀣrw2IﰞȇZB C{`V@]IN^*yABa-tS 5Mfrf{Iz1'9:WĖR6x.7LӶi%9r. aR zWlm%'7z;WIS]+dDqt(߫G&V5KQ I}*1nSzDe33+rjߥ(}N_hoƃ3Bs 0Ju{7ÙzSNhNǛv:<^р&ۘa4fg] T(0tȍ e^ / zV@p6uJD PL 2h;(C"=F $B&%!Z?7 $ݥ|8}5SUU AQc3Zc@[C~7 ֎HΜDLcYpϲeˤk?X.w_''ๅ{!lRvY${P&nfQ3_WȌWU|bu'J"w|ڍc~nZ#ꗫؐQU,&qS2,$%2j*Qe5Q'B sAzT[,sH:$ܩSmu"[zA~ M80~W/12xX@6 Fc' Ye] R&[hc(83.^yzuq۸K֎AjKo:!UQ&Ŝ!y9rkLf0aW kWL%{䁽G>v{;kk{>usF/L5ziRo h`{ ڟ7?oe3>nV7k:wlRl XfwDC5IfSpaaLu*+76xH5¼ 3L&}$/ń'MIftG,/\roހ.^8 9: (`ƎiKDJ^0p@RB)/(k^}4׳N}b4|s޶<]y,r h-H62P&S'؍v{'xyW z&[S&MrshyeN]jajaV!Kͫed{{27y] yo\\|)}OwSK04*P:#ԕ+fFf NLrV~\T~=sF}^!?aĝqINd"j amIfO%XBOFTBL$ QIJu;ܒ,xȲrZgdLq|Jߐz %ȓ3rqY%EZAۢeV9-L@LFuFGGB9PDI-lk2F]2;HFj&`27r|&7ʉ$N19S9 ZE iB%6JJ*[~O݃e=={wˉ/~^To.p cce Ư s/?^n:&SgH Yъ}LMo #S'YAQ6e>dfb?Du&1}=KcZcOAmmpa IpBVo;BaQVvZʩJITJ6$-äHļ2̲dk,'3jo$PP[|̰ zSL)qRuaD9<'WoΗLO3|OK;+M)67Q(RmFq`cprߙ];La}517"P^Nva m2#N)y 񺡛k;MZe0,(Yw}Q5k˼6a.b ]7lJx|-rqW5ϻ.p|&ef/r )հusKOpo7;;#G XIIM+4HL~ vGp̴&[2Z>SMS2,"LF+,ѓI]MV5>Hlʆ[l6lMj|9Bs)!MP[s+n@vt") -[WF{q|]]Se9\Z!TT-\7GM80oA{RgS*"l3FcsUQ[Fzk}|R%U;KK'KeY {A^ּ}߼^)ya&>2Ic9ڗ@:F*22염rk0,3|^};}*cH^n.(.x]Vc#ooAyqzn\קQeh4ڂ|6ҿ}~=sDT]A778²܅x} qRPs5+io 4H}O3ꋚ)c97 |5xp4$TB߁}6ry{T A 2wQ 2ZEaQZD&fD{'n^1Q)ıXp/ y#sN頙.50 pN0j` `3p.lRfsg 5Z,gQ?D)OΫ7Ͻ٪x\t5l:?O+5jfM~en`eCR:e5̲(idze%r\&UmڒbrJt*'GOvu4UqVd|[պ~ɟP#k[|r 6z!/UEʸL%dVgNIϓo3wRE^76:N[µxi0e{9=}Y&cs^g!SgfP&"&HIC{Z<)ϡ4 xy4moiů2y=#J,fUp:B=*BDh %)t)Hu`ZxځvNL/eE2A&eםd>+Iq71rapkFx@!ӑb\rYe'YV.YYg1YߊC-z/  29d_q`>ΟeޝyY4Al鰏3uvѴJLkjWLSMi19th2=4+c 7<6iR]}!Q]sm/LF Ò7-.QTp һ6D=Rr5g Sd2Ԍqo` L֪,k;@pͮdv˭bʬgTU Ss>tIR2 Ȼ5)N(Ycȸ *P2*}dDZ+]+kV 52J-ǣոIZ:TQW-^ŧV6Zn0S^ʪ e`'R4'`wIM^ݢf:,OjF+6:lC6жntY\QPT%L~$."zl N tQF.++}"D()D3~5,s6s-p g>sur'\!B .q0PqBpY2啚**+B32O6"( &2tn g{I.T)/qLet]X QEJdO1G=z~V0 OOh%5I*pkyU E\*fUT R evS^5)6=%OvYyOe_~{ˆS/LN_~˨js*psʵn|M]qu}eg J7O+B{_eYN^mwFWuX.TE*3kQ%LE,PxrɈ,9a "l҉`0˷&[Үf8W[U\BޒRf8pRu:jqSrc|X>-E.3Xs[d28LYz\a) vGп~5LⷳVlR#G67=ޢU_fJu;wM2 pF{is [vzr5㝻Fnld:}=xë10ޅxJP7([mWY;A&# WxyG"2Fm{c|^`kv߫쯢+?x qv'lOٟv<ɟXwY܆.}Csv=GhݒrsGE&x]|-f9ȤY|>ԘmWJ5^;fȏ~T7d_6*轆}2x2Nz2Vu5T.+MOy ku:e= 9u0[Y7#5eeԛdJ}uz{,+R5TԇReɭ$@T_$G;DJ`~>e/[9_SSкm\6Hxvse&7 N2Ȟ[U QU }>Ș ,=HBjE(Ñ}P%.7F+}>e}N>t9 S߃Q|qwtw2/~(Sbvb1%i#GQ2C!j+By%ϡ(aHJ\M[  L]f^z˖xdDsj|؜yNy\>VyʬtZ  4̗ * ͣ`pgyi昻֫OHA(D>QHȼ"TPYx~dSP8YȠBK9II1t7ǭ0_X\ܬGhޡBTG?*0u |35M9_Oiq$g!+y=,VrJجj$qZރ=m +TYn锔NJHYl>Zi k4Ii^S)i ! Vt_H?\94fyVlJ m*K9cB2'3zL?%k'3Ebqy뢚e{xO:p͠^<-6n^/D"̻'󟟬bOB_~s U}dBؠ5 {sz/J_S'7K8WUnkFZ1TFˊV͆Ƭ9ksʄqnj~aeܴ~활,TtampʠJڤZR%ɱ"JZ]jSs"evZ3w[pVȻxz/(5 wEpD*vE_m Jj MvUecS2.sa.,,0Jز Hq~~VVR V[ N6>"ؓ3sv ) "D eCl37QU1y~ys yI͊r=5)dץ/VY[ګ%6ctWmvhVxD ۡDO뫵{]/H/rȡ8TGƔ*unFUͦ"j%7~DeTP 5RȐT0Y5RFg@UD hN~^Gȣ3[X$'eҏvE3F11 & XcTE ‚un9dܢhAn*`hP0@0GKHdvQC>+ rYxSAu8}L+;ISA%'>xUڦU9Wiٍ-vp?9s/geLe'(f} WlfdL}0PAɊ| 2t۟-d6}v6y8"2<]*@Pe f\COMIo(U4j{7nT/V\9+7oRXTq2[X\g6mpb`k`AWYT+L)R[ֽe3nj1ȡ7Rmzgu/6Y1N]Ν~dŷ }j=.ekK2H HMy }9zPX-yG㥸ǘWsMG<j2U)q6G]0Qn.lȷ[<5%]v.'㺦MU7[> U|}O3\eBfb޼e_{{@MCB!BUD!D:xZqD(_ *+/ d0P}( 7 7s6Ujs]Vf Hejn5UN&WJʯn]+3W}I{ ڗ/Yg{ =ٌ3%vlح6NaUTe}փ3I4OP( u 0˖ї:?͖"~ 3Y|Al0 v$Y &@Ol' ~Ӂ!bv3W7?3r~O:[=^>n:Ysa$t+}|MF^/Eic;ﵰBq/c8Y{38{sW{WEkyo9x7=2>r;?}J}q>m?~{;MwMo3_XBTw"YH< h0EK9wS v$ Lp5z$(52fHWCe|=Bv`cgC-<'yN_V/{ʻV*Kj`pe4}[ ˟ػP+b( ңBT:pd"11ʢ9bWfQa iXl4,C'iCiXrakVJ7ץaJhBHٓGҰ]ߺȗi#!04,6NR6ܙe`N0$Ӱ4@u4diXo7a ռ/ kQ  K G| sKc/bwQ/  J=>DDž Zqk)=i RJ˜1:nd[z ;)qhIC$6H "IیtQ^$aҮ rTtmD8 dT?ңvSʌµjݔ2%6Cm""z)bo%sSPhR-Ne!P?{Ft\ND (RX`2bEƩӖ(Z7HٟCFb0@UQvPcQ'vQ>_"5WJ(Cr)a0m/(s=tS #ӵsбȈcP[bWZ4iml+HK]c,=o"mF)/-Ѹ4T*E~uwS[7ၴ0@HxZq6h3Ӽ}DZov=t4ړ.4"z!\OIYj+{XfCk..6}hh=~Ô'JP.cо B X*iSHo !Er-jh{dbgI9`/βd#h}#:m D{ Pb)݈4HI};By[0ĢevًOsY7Auan;@VvQ/bTDLX*JlD;wKQf'ۙq./KIqJP,~%]ُד$ +͙{[K)%%ܟQ(~E/%F8K?7))ȧK}B(FÔi+O]2/=~,%bsJ P!~qrE`]l9mEzR߷ҽ=m%EZ5Rg+(?ʹPFFi)W?ăć}qd!w';pa@QqJQ K =G@,~;'>L ԟwSFtM|&F0 C}>~X|pG'\h81DPA8m<dA- pt+b@!2>p9O#ềch|l'c1*+-~sHf ~hv1 w]"b=a2K;>0@<2??6@c}|H&2}Fr54t(Eh{7v}`|TD4` 2C uK$cCYO@lB,O Wܹ`{ :}c _->1FX Y@*Ŏ;DiW7ݸy=ȯ]]װ~C_򊆆u 7j%՝E!p`P cT "714Nzv@Y2i;հ?D~Xbno]`XiiC-l*eA2HEeeWVh$QHriay3ɱ'\ku\n7/G!df'V>yɃɃO|`+yɃO|`+W>XE8F\o>'~}1/K$Œ&JeG/4z3I ^BNx7G) 1So54 h:,3Wso'`pC3'̊iR嗼Qd a;rF{-(9Wވt#7: %!0H`q̗S2<>`J41eBFfO5Ǐi %vat @8AGn! A: !40{|q!!!HFq(c5(ޅ̐`W u@gA I:)b^[ '~ʝM|:!vt&˭͂zB Hwa0Ę3b 5R:f"ްM>{mn0(*z<> t'IOA8M? C$:}53ncQvZ`gS( BM:6NkjR?ShumF } C3Bz]{7--cl j#I#AQ+:ÊIW"hQHAul vRB|ttJuHTRVISӲ3s2q-NٰlR6%;$SUc:UêIW"jQI>T"_eXa иyj ;0#! R頝T:tB'tlfi@@Jɗ@|@@N9 44`eg @PW h:e>bSA$TOP]S["dCd4;܎%C!PÒfo9aI_[[/-|X\Òk}~+k%k^V΄Jh'BW{s47 HB!CZ5(~ 5C ^_#&bwO:zzLUisZ0!0Pm-BGhy39-'#[Q v z0#$V[4f7X`0Z=Yh|Ѹ>AF7hn] Ʀw#j5Ojk5Z fEa4i2<sːzV+rL.3r$ _4 (!z܉UBНmb6Icjڸ"YjRW$+CMIy˕G1 rI3ml%E{fDIֆQS|wCy֤Ի†,;jl5hcDxwm|ݖiCk̶d RmMɕ_mdF0IZO뙑+H9mf& iv ef(f GF/դ Q8ZH͘,c, ALt05::N`.M~hW~6qmr6 6o}+/{?<6!t&%'xh/ -xx}[uLu7y돢GxLL5xcm]t\1&Ցi&RDzDxt zTV_1F}tzVX˩r,nt>-AmBmIwERTג*NR%.]eq4~,]bw ![C !ml ֳ)HWu!)tַߋOZկT3CջVOWAWdHU'?g Mx > tqHdGB㡺l ^/= x!BAO! H- 6oדBؒcEYHctV1mX/յ%6HgjJ:p1zC?BOR-R6FC'1F{l4B/o`Kq@h(6N҅1D endstream endobj 58 0 obj 17820 endobj 59 0 obj <> endobj 60 0 obj <> stream x]Mn0FtMR,CTeȂ3Rg:϶W?fxƛ .pm$0#uQjea8n,(~ k:Q ^j¸9Y$QY ]u1U&,%ŁP4Gk5^!*E]XoM\rgCTh 7'87y[k9Jw!'E~d|?2g'frM&\BfBfϕ쟡d%+ʳFDfE*mu{i7C PkwFU}iu endstream endobj 61 0 obj <> endobj 62 0 obj <> stream xWil~KIE:$R$SeYlZLv[kWFZK#"q3fbϦM/VbZ\FV+8:e*Z7ljRۇs`{XrlݔKZ>oȤo 93oeφnhg@c5xZ]0 ;\ f4kjɭ :,ft]Fψ;bwRkhs8< 6˷3=QP154LƞN^>[޼&s\sU&a4HT"*ʔCAl֓(y=8NCqHn[$NCFPo5]\:HB^ҖT4w!m+|Z  #R ftM`V?o3{-V[4U[n[SrbiusʣoDG,|eӸ WmD6I$O?8}M!ys֭ ZID25DMh>ޕ/)jo=c[ v935e.©y1w;faVn-ylm=\KSpF.ܻy!\ k:>5nCJVV:xXIJvn3wxr>pMXdzLJ 7,N;%p ]ŋn˷땿HN W>qX zg8C༥]ra$;"=.^9m_rU1}t·rV ]TD)[#s 4A$ Vqr0Lʰ`H(D%+ xr6)9ZS~pvX&=s͘omt5+i'&buf{bxے卿cOh3tUM}qk Bkܷ(DuV|r⚭.XՁ*\fPڍ{)bwyz#{f:6b~n'~sd49b(|k ˏwF'̘k Nm&.+ #y7?L[TFWcb;mك{4* knk'g"SKğzb#f4]ʛ= m5{kCE0EVn¹Jjk%TN(qhrgZ!AgrZ]]jVB̕|bXnxjnL]7?8mae*4R ,/fOޝ;{*VO+iEeDzL\ٙꉪtiwjEyNr#5zZR )!Յ*8$Sbϻ7ns(^ypGzMݮ!+s<P%Dy0="osQl';\&^x~3M!r\'䚸5_ȿ#xnk:EuNfjvԸCMmTSمz"jf>Q\fh3pp񜐋uaXL~VWsxVcgWEC1,yfG˜,;+Đ,Vs&+Ӯ y:'XVv62[} |.UV }CK";4$ENB !"M|vA =~?%G`I1 F}ؗKc.;ST J> endobj 65 0 obj <> stream x]Mo0 9v B%B+q؇FhbXnvH8~_hQ6yr0w'ߠ׆+-#[eI6aM79KCnn拣oĒWiGل[SV\A< !ײV! ?u3E9*l+i˥``ԿF˭ R9;3bq@^kyCQDE}9D/> endobj 67 0 obj <> stream xԼy|TE7^UwߺokttX\;Z6APPG\AE #2;Œ(̠3Q! q G<GFa/Ղ:K; v FnM}V̇pZ\ բy<8M@gػP9nEqcjlgгv)ȏ&r"wQA: W>GSS?m ,A'QOE`/^tV:UBCh}2*JhR!3Я[7ϓ^d$Mgf0 kM`wq븍IuMCÀV?B'gAVQvXN [N?o?e`II.,F~E''a9EF~dI:Ձ4 Ԏb/Q5{5@#PUjScа[@tZwxC(*I!{S|h4,|*hFjgMF^FՍ7TQѽkΝ:v(Ǣyp(';+tESYcQqHu}9V"wIp`uCp4BҀ+וFJڕXUšP>P+7l, 5ŬkPP_>f\\dFS>𸽊;{ܡ*PkDŞY!=$jQH;HL)͵:7ޓ#4Mָy m, ͤAC{6mj-quJdʤ cIu8Og9ϻp{?`zgnSPac?ۺ:xKMM@A#B6nl3^ іV75җj"7Ef4ͪ75~P, 5 7W"u:Qe}F34aZ]_zY3/AïQ/ hM@irw 0<zdfԻIA 5D#2GoDOZoǛ(Oo4:/i%|=m'iol5-8llz?n CFx]3g^=E4^=spr ~]bڿUw;ь?4lPߦ m^|k2fGLdj$g)'\U(&SOiDJU7:95ue?ߖ_/>Omb9I9` d x4rl8ԻɌkhw Yoz_Pf2:١]SSu$TT45xK$GcXW5uxczSjlOM-V@{A'9.눼qRe{beM{%~6]:ma[6Lڕs(]\ n]&eWH&$NA0" "˄xKRjzeҨp(0wpg{IG$.VUU+*b=1~.q8E4+x 蚮vr}5AThĬJB8auPJW*?.ԕJbᷮ$×W~f/7B vr*N`1XvȺi#RXX[[+y3F!7kݤ=fZ,$c+rEODå6TV=q%6'a#y vtfcMI^O۽+{H^y^} Nڣ³·x $]SVI2lT+eƳKNкYALk,fUpPO&?soc䃛u\I{0mi5^.gW_օrS@Pxs٢(aid)[A@)K҈X)NxSTBK5]:C\wI&~cf wxwꥤ\#|4xa+l3M[SoByan~gҚ)bp)yc!Tʄieuj=oƪ[T5d:m6ͪJvnW/A\J"Z1;fyO51y q"=wL=qwKـL:pX<-Jȅ!ª{P X@5}6PvX-FBuš5m\wcyGHc  M_5.uA;no/{hސeͦо))_o:EC hq$\d4R+Y?bW&@6IDϊI %~.5%jP(G2mJ8mE) w:0f>VH3Rw^펐=\jKk~(L)eJJm*nn÷)$ J%f{(őlBOSYlee}1\\,nX6 MlMgO߰4*a1; ԰k6á@ۈ0CV0$;!$ői!q*#K4UEb'vy~k/yvKw{r姷aiX/b7Oh6/*oN xYQ.A˛H(˰ u Xi>613;?&} cV$W,$`ߘ1j]} i#v~ڨJn@ p: weTVJih2ހ_lI|dηq>ǁeA]<?q,$xu?ɓcWB`;T\zPz0lOP{ư@"7i?5X,;Yx?CgEAyg8eY^bB; VZϐd&K+* 7F]<`h3|(l0$ރ%c/QTB,Tcqzu jET%=Eܝ:@&oNrBkF(lHõ}o $WXﹲJ oؿrKOf& E,/c*ା9}G0u„1w;,Z,1nHhNB#sYl4T/4˭+y &nz6VVWv4Ϣ)\ܡ >~<1p&6͍:8kq=`f#!;p@?PB\ 4oQsMo3 ӏ`HiD26nGy6 c51uVoN;/6m+0vBa3_=:ugc[=zϘ;=/z7|e㽫-)]'.d}}r&aGwolU9DrBj$kMYC[BbO@@8^`zf>t~a9쳡TazUЫف8+YI]Yw0S{(;%c]6zzV^%E(؎*<3ؗӯ܋ӪqAe~RhD%,jpPaRՑ6:͸pj3ܒ/>hLa6~:yy헙gNZJol.g'YaKv%(IbD ETEbnȁ$ז1a65fULRQw[Eb.[\CXŵO8j7tSϛllGC_Eye~iLAA$4JISQG:I3'%%^fd\/u]":rcԺi z׺E߮]gAY@IAGU6ǷG|Q.u) &I^qKiid[lw5'd]o>!|%Xqһb]v%U]:8gBC}]vjC CLHbmDkB\g8G#Cvsl]w H*l'-ʍhX(pA$q6r, 4gLoL(zj:qbACQNX~G:hiXIZMǪY}Ҳo>2WF|mY]8s,S`ʓLsC:`~ ro>axy$Jz0nHefy!j.Oi-c25<#T0w*L$/kE n2߽NY7q#Wk)G& z [xjk5)q4-MDн厣K^Բxv=ޟxdGܻU?ICH~(;jJ#j2f[VL X\5{T)A+ EBH.4 GS/&w;-4 mu.VZ[IN:-RVb+I\y˜5k8dئ8)2y$@MNص Ȍ`n|5D )kQKZKǛLe_˝W"4Zcw4x]ΚaB~sgHᦁ FYwςoǜ=U6̚YⵞWN,,=;O y*9θH HۥftF HʑKҶ̡RJs;xV(mv=ʞe 6Ğ="^efʹtQVb7=y򲋍AG7=!zH٧:q:?SK2o_}}w7A' p\n4Ek $3#xu3*QeOlAEq晣 hig#A ]pQuK2TO-ll"~͛~NFHpH,N9r86q4ݿo3ɶC֯۷}ā]Sމ{ us;d1f+ͮ} Uߕ04Ưrf-a =gp)q%^":b1xr@x8by[rׇ#sE7y߻#YE[*1TLX&Ct'0<(q*騮z;ӿvRX%wĠ!0,SϪgET4ѯ} O~0b(@en$g03YV1<4s acd~YǴySS״_lGU s@w9%̗kGM_POo04{+yG$v5no6# njP)$R'Wp5HC x$)j9x2 vH]ڈ׊wK?$cPKStJI?2DLDYbĀ4ȓI\\yyE&"k1r,h`,|{gW7cpШ#PyNH@J+֯VfLVx$?Pc"EiHwJJ#BPg)!1>+m]8JB݁~a ]q-^RB8<ԧF/Edz='U"10 Jߧ˧xKt{D=%ņm8qB-N>DJ"Q| aja UC)E[aJZ:G#`4`cBpUu:bNvuC뎮ZP>Ȅe{Le=s&xȾKk3V%hAt6֓ɿʽο*%uHlue}nW+ЃzN]@B,;` qlYyݠ ŠD-[o%j{@vr(fX1Q兞 PUL vL$*’${7L٥x~5E=q / ԏC3H0 pd욐oZ<3+\)'ӏ~|r/SwU9ǿ6Ǜ'?nѲZb׮;V Ld2H><u(CeEFi`qO,ߘ{;סK! 'ݻL)p7*ɧ J4LpxwnI#Vv^{ v0xD [cB9N V$zb!(NAKLۍ zVdy%"&3t; `DV5XNi15(c;,#y;SDYĐqu@89SwFat ˈՁSPi"a@$mP4.q6^x.[FCV/(1c.G۶k ]9yytS1'[6]=|Sr`5j.9sKYb%,T(ݜjha2CI1Rc[ p‘ᑅ3Ʌōŧχ>qV HH$( Z:&VonPݮhzOy1%}'Btt1_j+fS-nH櫶ۃ{#.zɱveܯ=gB| |£}J~߫o j[\gZp1Y.ΐ M~AWD& Y/_UY0,q,҈B±" tXGPp`U'\!es3|+oHHT5Xv5 Z${ed V=*Q-*VnN d('Xm6J[չJ )Rt{~8O%$ʈa{Q3I/hHDp 0afh#CJ~G~bc;>xT,#>dz{6"eг.L`/%gϳB}QuNsk}u6ƶ$ wg9k˜&݁g5 s uVM-7ab:\e-b3@3ϕB;pbh^1i0Mq$-A>p"jg糸߿=h<3гX'E?~=nyp=O,+ [͚Ξ6-󟼑wyY|'ҕ\&tL|ckMk $# 7,5?Y Wt&Tm!Jf!~P+'≄b^ϒii*k.R1k-=|F,MLoG /D哘mY1wnݛLړ[?ߍo=Nuج6:@~C:WR.;tN2N^:4IKCnҹmG͈d)Ag-OS@mkLѓk9p ~;M}C*@Âz1R!gC &6fC%Ȝ%D0\'39.p^MQiG7{M3ƻ$d3Q0AeYMY[;~~~%Rg\g !ǻpZH.ò \A;+VH{<&UfAB+A$%痒T^֋(_0-T"7 WmN@0FWS]LOkSz.Amy[ZZ6NraiҾLnəkF19>;CrQS^q5t2W#H[_ڈLa؃?~ 2ə|vd`ΐ8v0yezIzlՈsq65[ ? ߓ <0<|=:=5Uhbe/%L$Hs*_^ 9 ~oŵF 3`Ӈ1B(Cە6w-0mKC ӵsDXoL+3d/@p'.b e26v)'\icwN^)˫H>;"W$"u`BP (Y<ĸ =Ğ>L?jAJok?@xpla8ݾ_.,/Khk;*&fR;N9:~&g[_v8*$ˢn?h?cl~c@'g' YUũcZ(FNLg4aΊ[4&t;JͷX켤kFZ*y*}OFPg[eGzs4S&}5 o{ZKx:Kz46s~Yj*7:]5ۢ9( jIjA!;uKG 0Q%ff:W3y5D-N:'C=}>[~9ĆP" GG{i]KGYa\0C 'e䫇wU%m+d˫ ;g{{'ȴ˧ɊWNBFA9\4Ǫ3G];*7 `8Ya.:߂+0Wݐ%]m%^8)CVnh)e+M14YNBc#_W_ tХʫ;YdV*40Mvs긡PYYiUT BmPش ut).1&[א'x͖d,sg;KlMs|h) JQBRUHn{ThwęR\$jQ;oHR 6t,E!XBT T&Gx4J42S)-E2qt'똻 bzXO~ =%^ʧ_\,#N"\br<vw)g(Z,bT$#sdI uR+!5J`fB R8WT1I@ɹDFVɱ?y9:s soo#>o!6A1ao|/| g3rR8 ;al9fa! N2G$qN8Q b?ZE#XP%5:9 #`GwgES+Ae1V2fS'ϙf UQs ^6UCeтܐձPRj=gUV{Ə|KpbRxIpAN pAfyJxAw;;d0ASd8"C)0FՀd _HP%k <7D@|DÆLjQC#&f4Ԝ_-Iktjh77r㋻1^?z+8*~5:-TRPV.(R0jy Y"PRy*/ʴ5]/x+=NlKhUw3J3%P(y=92W=ҫff?TC4Ηɣȍ*,px Aif- L O0nZF):>4wOeJ햮':|Dgf?\69/9LCc1lXhVbkΫoHB;ZcRQV߭wt.k|xtuzF./Zֻƿ)kcx}gk-A_5REpJhywFΡA8'øWvgJ2z(ϾݚY0ޅɖEyp"I}e7v̦vI]l>mS[[NNJk_Mߦ?9&0LnRei(- 啗f Sxe N,K#bi}\ 3 [4)Qo6=L7D!z (X1q{b%cn`pcqV$q}Y4ѾY g M ( |辰cܴrn0Tث\'N\6_XtmNg.қ7'L^ow -o_&w_9Kڧ 8@C^4(j$Ax'ԣx31c{LŽ|jH3v'Hl$6}j )fu?=kxSǕ3W+Yd%?.ؖ q 6ƀ Y^%+'ilMJh56m6GZvhͫimc-xϜ; 4ag3gΜ9ܙtusO,9hĹgw޸ZM>$r"ͰJpP$]<>tV}!ľ=e4XmUY,+-'KUx8Gn}I[7@67˗.jF6hRsIz/[P}."v?s+\M+X~;/ul~ǟz{Àz9FcMo#S&~N|XTEaC"14 $~dmn<; le=sxlAc1!Q*zc!q.tdQ+ ~rUn*>>{:;E,[͚p; [' )eg{hyQ,/p8V#jI|=a-n%j96Y۪ Nv:JL7X!-|TBcOG3سJg¦M{Ьg.0C|6S)lfBޮdF* .¾ş,IE!dmȟCh}5Kn z!K,f$!` w$ ͊HAdM"ME<5ͻz?zr%&԰p=0%>Ş x5]{㲤7N6Hl'21_-?`[q,~l'nSO~E:ׂ%g~pO$"\_zt^GRts*OҘX %o_Q"L+{[V>2?t/9x{q?>cWxʽO<;T'v~zQC# ssa G2@2&1ra0ֿMnfb׫JO36/Ѝ;Mx y6n&PQo&zx0YPu(yYle<t><umذm^3жsc z%c(~jAKx{3 %H+va;`NFy<d6uѳBBxZEkFCxl8l7T[ooef?Әsa}gr2ؘsǧy^˿`yW + R4OK.---cYM+e{]Vi?$* +V>[sէk.ܰEGao`TOְe9ׄm$FwSֳCE.Zq=6Noḉ!xaۖm0/@LבzOb_q#&2h"ɳfiA],,Pd=l|sH]NЄխE70݋_A܄IEO!nf>*!G8>r#;8x3G~8>*YqQqQɯ8>r=qd8Hs|Tq WgTq+F<qMy;O#j(p*h#O]C2?ILRgac(7#oeim蚵c"^E|1UkGKtGl-LS jGy~Sm1 + pjƮ~n0xQ@fԜʂ(/# 2g;Ҕ͆jspEx!e#z[[eG'cOz23b# jbs-m U&zc܉ m 8ZzT@OY60ƶ1p VŸLwm&GYfJ\5\/f"Mk}Q2EΙ\FKDyl iVa) Λ)փ\C3lNAX ,RJ%14ץ9o[ÈxlB1O (\wNxu#dgc,8pՓkDh<.LjFNyKǁ?nӛ۴x܏fΖ̑GsJQs"56G\:im>2s,=;)|)阎ylJBf1e(!~d83 LKCث-G-66ɸKͬ(yv"_(|1sͥ2jAJ\1e3Z?.F^Έ̽-Ŵ T\ϓ7߇ޜM͏0j+8Z53|F쯍{~ }T2~Rk/vQ M덶WC z3U\h\]eE:.f̊Ջ2/)z6c[8~F _ޓ'D 4^Kt\-b#RN .ιo^DZ+e`uΘ*zaxDUϧHP8$im8 G?"o!TτI@QTiC-kn^:=G|1UڢJtTje$)-H8eUY u+n7Vñ5 }=*E!%(GIZ*#~5D!bW$$- IrhHR2$ox$*G|3IV]"m ~/LzR AL+ֆC1%tK #!EK]%0*/CQ ݀ W~! Y`tP*Xd$?:)Ҙ?C3!Vv Q-6b~ģuZ: <ȆԌ 1N 8Na*yы0< 8]\;hP3 #jFՔRiS+hF@\U뤭!T/O|%5x0\s hcu!? (ȋ9}R: X8OՂ1Pc,AT\:!džLuu\QJ4{z# C0Fʘ6]]}T`Lq>Z8zc\Ţ |sAЎka [{&PiԴl咥K[tٲFH7IM+.k9rQ]spV5<(g[q 7x ^\M"[ $1qܑܑܑܑܑܑܑܑܑܑܑܑܑ#v\F޺rޙ \Bf#|Ƶ\Lߥ_Z`sl1>KיOLWGtE]iqAZ!#1JFaGW4)c67Ѐvc'^N^5ݛc֢-kukz;,d7<^+$؇/#R)bCtFNC'uzBuM]ODvnCE%~+F+~3pJ'tOQx=E 6C'x( 7:pFv8 .Ix Ri`L ?.cHm«* p"qUq#†)ʼn'ZCKH@^/ `{$<0BP ^&K<D hfJxn½^(pQ | `=i̟33.Ҟ!C^ۓt{pゴ `7pRX01rHsax<cK-![.Y}˝}M%Ľ}7`,qɔ?WVzQ&Jc`1؋|g}ab"څ\4-BiBh&h]4QKe4QN8AW)y'MiB 7MTD%MH3%̟ذN&ٸ 6q>Xt>|'!}`<$-ИY`rQv]nB8ON7SF@t 6O 0 `Lm]#.@\ob\v%x{+tʨO M};+N?dsY[8@#ć\S W{!h3q*W/#e"I5&ʶW݋]iua\M G +ҔN~uTv)(rOQȎKzl3z<0ẁeG],[WVK+͵Žu(tyTyVժq]u-j5t( (G[ϳtcZaj0-67LL|!*ZDQ4zQ4[˾\oo[YG.Tоg"PQ WdK]COzIנ}olޞ4TIG[\Y5eޒlJ6]JjR}):H&k[*eyͭw ghͱ:y],x<|^c 7Е\qϲc-[105E!>Db|D54*|,>T!_ٌ|zG*+ȣI3yTOU&9S`> endobj 70 0 obj <> stream x]ͮ0<xlR)HYGpR!}9sV"̌91cٷihNaN/]N><&pHvWlndKy_*ɾ/L_6pԆˏiY+B?y^m,u>2z=n~.)>cHE׆(ІX7akHVyNWUNBMr4?i 5KhzѢ(-ЎZ j)AQAz4[j=wG{֯]QE\GMC~Cl^_ǐ,C~WBk.K% foы!AhW/?D~x.Koѯj> endobj 72 0 obj <> stream xܼy|E0^U}\=k&L $ !I#%gHr$x@Tt] w@Yuv ]]YEQWV/"*y鄨{?/Cw=U]]s?U,^YQ+>}^C/ vM_8]s>wfyKNBYsW̚\ Bz0DŽ3 0n|y9 p8wChb7K;-B~?5n[7/X]TDh>o^؜>!ͅ2 ?ϱHQbx}@0dGsrcy=Kz.M)[ѯ?Jg.P:BSє5>{)|([*^Ί Y\YZ-o2fm>]8:įF$:T΃qWj\GIj܈ok]x+~?cdi d5YK~EyCN30r?\/n87sX̭VfvssorϹ3@5?/w7+y{XxN8&!\.D b8G|LX>i?r3NDž0pwmA d7(4pPۯP֮iik;9ii{^m#ɱ' Ik瓮Y mc]=dv6/SkEkNmRv=36\1!ƱWwU6>gq۴a{w%Kɳ-\ze[O8/#5lؠY5(  ړӢa-0EvmhRIڪoIzK@-,.O!JJw#78JQPpR @\;_Q9J;W9U][3̅c}1 GA_IN o6OC[֭v^ƒ]vHreKZ\]ï[ou Y%B^W xCM 8_*FUNm' =>95cG8A2;P*B}+ ZFյ:SuW kAuDy>}JȩHawD,-YXi5+qCNNnmg774xF2xGی~ ޺_=M\ VN ۆ}L'i2Fb,+HHtC͙8Y`;bqniFS0j %̭R*3sEuxd6S6ffźZۧOio:hv,u!6,>50&Ó76Nc3ݼfu|lۘߌ^/xp߮È&?`si z>~f1a=$< љC/XQOX/Hltvg}'sdVJ:1z;\ %p :K RiG* TwTi0.`|oq(s,bodCřS3dn3Y9r0)3u#ϜB|OU@t-M[*U0r *togU`[ *iҶOQHUNWEޮS;ޮk#_Wbg)e 8D1΋iX( c'?@/6qky)yWWVb|eCpVo^jРEt5NAj|h~y̷8!'` Rtg8%MZ, |H$F8 XĦi 8ZbV;^ Vl *SR0^9R;QUViJHHęsE/(8ޙsV _n{Y$ƾcV5@ z:g|]݇Dž|X ;kր $iw;fwc";,x%i!UN'}G{U)GcdN׊SَyfwLjg*;#>5 &M(ŝ-#޾XWy.x `u-pUZ@GKT%TD*[|QlЀ6>6fq9/jck>xN50'#,;GSҕ1 iUڔcqkERU(8Q9q8TJDW<IA٤f'N4JJ6q7 u7A~|8Rb];Qv4|7V-֗jp zGF&U+p˄ec]î>JZ\FK : UiA:TE:C0G0XSxK*QR?iR MN)o;GUNRfn\`񲗩r*Tɗاnqյcfz'~_3/|J=nnjA^țEQF9yĨ Q4ehGv Q)"P2P޸0?`ߢs_&  &'j[VqڮM*|mBܦH$^~*,׋eIjSYB է54{Y)s>Ե-T` <+࢖Kfб_8a]wpx;f};7//vl{1l3Ef K5>UaͲ֤TYG[, $ GD5)R4+Z"S]\Oxbc!xAgan|]pdJAρrZPM\M[x{}_tT vp}mvpٷ=64oaQT{2fkQJp))t< j܉]p^p;J}Kjl}5Z;-Vj˳6re?,;3v'3~,T_2T+27-Q*P^rĮ,cJXX`}l*`(UҜ+X2dsR=\u[l4v2 $kݸh4*o*f_,+4ͯ,I4+K TGH[- ǤB5SxVS{mjxIRT P-j^A:JV_Uq>W t8Iku&0D4"s<9X#0u/'ň!DD||ւ)%D Βł@KHt8ڶv8ZLJ-u6rGxiJ jS> =_\3`BSﶮe!R#nwgū;g_#x$J8c(o! nzKFYYێ/+oqoY\%ߚo+K5@PR RPG-ʫ,R{gAORu ԒjO ^+aء{ G;׳]=T}"AJq7oRT"qmVmԵJ0߶AO9N _.7_،_C._ٱt7INۯi^K˯6S>,{OfzQl)$ Јas}Tb3bkbw N{9JUm^2/i$#w/g-GLp f$\!9T@vYFZF[|FFXJgBЄ "4P"J/Ymj<+2.B"jt%WL.PmYVeIJݗF'03(wVZhT?1!ZG˙:Jx*wzgOv@?W?-?SYP_\Joy<>$ˣ^\`5R* r!_^K5h7쑺GN|?\1fAx|M/s'bHf!o"<(WW]7W5CqU;V2a$ /H& _ BP/v@<"èӓW黛.pj =U/ HJ/աF*+| i -B3#v:49%JSŒ¢[#8)FaD#Z;m_)Dt0l(V ^bk] u ̆Hν P%z8TS{}#oHǛ8ʇM;nHz:pˎ5Y 쮉ؽLbW An6?9˹Y1(VJg q&򥓷@(`EiX K]Xi=:N-#,>1<̺ 7Ѧkw_YWV [X'Lffl?z)| /Jĭ)pèS+ .!'`2DqJ}AkG]N񀵭x;*(.+@,C*ȷPRѼ9yi<Ls9)eNvR;Bit([AB\.]hۋP *}`yP5OW%\9yyYyy %`'j!.vIF;RG&u%uoPʭY:lag\ A"kJvlꇯ^p~q:#ol=әU}acw>>~„SLuam6~`JQ:.Ͳ;!j^j}!(r{E<8)*Yƺw\=$@3c~/t ybn(j1a*9b~ogiWilȣyžaȬi+(?D1'yomjY;:ΰukz:ZGFSL\gL η3ZVZ$L*,M7;i9~a!ů|c=g ^KPsH ai\+xnrr8P{Υ>U7RUB+|6%ct;3} jhWy $P*Lf 1Ljk)ǨA;++<މ7őTގhD3p~ag{xpxxF1ܶ8=;Qk:>!6::5+Ҕ?hYƚ+ ~̬M`(16{l|KvK웢{Th-Q!ck]޶!{X[Q-Fj˖ B=N,8BQJi=<FcG}x(&1,zB1ߣP |c'5R^,3+o$(/7yֲbH z*]_QpVqil@${uW-Pe@B ]WiQOi0opxeW$~ ɒq}7 /.^_r{=g|i?Ls݊i'x3y2,"[Oy^\Td0L,Cere̺ uZ{=mm=mKpJR=e}ϟ.H eoJZҞ|Tv>C4'Ž~ E ^'GU+-"!4ҲrjY%Ix,ZUUQZl*ZC$.qؾ?Pj' ttQCFJ xhtTеvGN?TS,Gt`EU|.Ut.UXt+-9JKh"R= wt5)¢-pAk6|v#O:vz>ycȃ-?*<t#QCd؃pa8꤉_rFi]#;LUԏÿWF!ZtQ9Gz[Hjq=c;l9i|X``kkڕ}* 9cgֺzdߒdžՖю}rbֲHYvY,GUD==+Z*Gn%z #jL.)E(3RaG|"i*L(J)k\NdR'qF6hF SYv`SaW 1e|UW,*G>܀_`X= DmZbj_%aڗziݕ/]}.G OW7jVs%~v+'g̀mxz <Q殿Ewsz܁p]x.Ǘ;NJ$29)`LyfqE')>,jLVX@ंP O ({s@o0tErδ3ՉXwah\c/_jt|}Xw^ ^+4 z9%އ<+ 1nc r'1<̘-Cԁ/x7>2F2F/\zT}6g7{$$b2S|Z}N}E9bJ8I^* 3E[Q%g7ۄe5wq>.R\lkUAtYTnxXdITΐP,WdIXjK "Z7q*A|K̹3rwޕ7j/WYX1]Ēs=xq/x yԸzIZc, u{cG)rGq6jܣX%tŞl|ZzL h 1R>};O\}lʢ/`pQҤ>b;"9\7lETWUJGғ0^iEOCB}'e|[wYVvtZ*''te̊~> fGg86M-tTl@w蘤irn҆D7}0:_Gw%e5`c67_U>:yz< #aVnp19fxҪ+ha}f?J&DJynkJ%E|X)Q7*sed9[=Q+?&e.9i9)>e$BnoQnW7ig)եd/ &5`F$OR&R'j]∕E[L`%ü(9q!tiTHZ+i'}A8ҡ"ҡeVڌ Z?PPhh 4Pj J3S &LbK9(B з)?U,g3Ƈ'@oq%[Sm_]2lh¬5R0!${$IdB$Nt8N{S{JnӃe5[Z-d嘅-%@b6JS>n\BcS5ۛQҺ7Ē=l*P켍7b^U ';\pwFwSn{jڮ[A^PLҏKXy`}abd-:(ވ:/:-A5n֙v<$j$Cjǁ{2~4^{3v_װnk]U8x.6bzh;ݭJr`AA+ɒ"i~٧ *$eY}K;{x^جVVu@ܲ1ii\sZk H;ƧaF`IX Rz KJIc[luG0NqŽ񆕭!_rӉJO0gGN7kS\a\xsmVhnB^!?TM78);~EUBJHF=,/[T3   ZrQ%Y"łT.WTmz =?ae1mhj:.-(.7W8;&Is,s]у*ʢ BW۫)Nh}}CK+7Ureypi:e]pM9@N-#^qӲ1~{_Fbti*moL5n߉}p3y}t@R>VASƿ88< J11o`73]Ca/BrN '|1~".-m[3d=蕱4cuƦw2dv&2fud-US>e ~|hV&,kX);݂rãWY2D_pa%݊7VvAdA>4 `Yg^KtVZ ;!uVtmau%Ot2'E63NfbE_.ޯvl<޻0tdq~ Ə`{&Mq響SMxnL4s zủ̚RyVyV4Ei.+-ߙg,W)9uš˶wӚK(QA@?b_zQqjnGZ8 y$+H(]My;TPԒ7["+ӛδѵS*zг%^٩&}e |4;%\64Dϵ˸*~3c/؉Kh}ϟ{fI}7?37<'L**W kVXָuZV mlWv^)*$A$dl)=i ^?U$ACdDԎ'6Xh]]zN⤐"GxUZ6JWUv1¶hB[LyƁ:Lt:w1rWgqy7xdo *c.?(=*I–T m=#,!{ZVdةL}:= śZ U19liF٨a- wn>[5 MLw)83ّ 4N\܁^K6`؜*1gu2qc #5!=ST^&=l-w q g}}r]gu @qNv>c\'6ظ1x;!v :^ݖDZJa_q=?{,X#Z6Z4ZU};NJ'P8/e[=NَN2<.;w~7Bj4 u"enJ΃8&">v&*.9 +Om";Ytʹg0ߴcSlܴv' A(Xk-].qnaAQ1nW];@HϠuKN#ii[V8B"ar\I*ҎG{cL1MtFOe'F[58 KهsdVRG#.v֦ה8T{ִGʱf7̏?fG ƹnŵx=xRgp9I%dU --EXPB-UB'l9B,'A8KU~0d;&*ӑ0s\yEB|7a_ҙ%.!˿obh^% (JaD~NHM2eZDQ,UE"^ɁV~Js˨ LG2c]yBǝqCJp@'/x]]Zv,іzVkR Zjtu>?]ϻ,om#vfYxСL2<~ Hzϭ rY=qOJ{GGݾ@95HKl j$ܡk.[V6 M CuBY?AzOprO~y!Z:@jCɌxQ8fnbg$tha_x[\zx1SG-pqFGy瑙 {={N,{w\κľ2Og:yӾ}۝@9 DKmJw[ |?>8HҊA)%"h0(v)GYSH)nt-pb B)bKu^t"ԴWA]_gw7quXSts?3w~-r͍Wd9n̎c;aXb7m;nmM?m8bOSST a-Iղ/lW<J8&ҭa$p0_PRWw[T[9覻ԗW㼤EH,ZxN @SIҷ&nߕ!Qw{b _'l,"cXho1άt -0/Ig<~QɥPv-S۬xHa< g#5 };GAǐ^KI:M²JTRnNƓIn"\GqI+Iϐ'x(,bC찆CӐLL@߯<#`$=$aGCwr\]%ɥպ~nC6$p|/ᨍ5wS]|!Q iɹ3̫4f@"MguRaѬpٙZTZ%,`A#l|Ǵ^c|c%x_&_l= }xwW!@˥+ߵ'Ȋ D$=zAUUNd Ԧ0a2Nfɐ.-ܓuen>Q]*]ZIv+g_+k򋜜: >~u7w{SsU2r,l-u-]19kQRŗ|pzEsSݟJKKz{*<$}8Lwt MƼ‘%䶎?\}k I&S9or-p(~LH&D ˣaR 51yb[My= I &½>#w u~x.+%7?hMqC\qsղB<۾3<+"Er},h/)>%^'ra$-Yl!=M!Skt9V{Y߳gkM=w=K{(.q7e˓Ϸֽ'?lG}f#\iBBӕE13f2'NY0uͦ0>5l8^1fDkGqׄ#W7u֓gW8b [A4tE8l,Wu.o{ȋ VC{K%2Ɗ[0РKC*/B!FR~2ZHCAH˨_Ih%"(]F@ <{@zEA~=ԻAۡl Ϸ{1^pB4HcP*H5]-sP6{#'v`}ܗ Rn5 q}]rO%GdX~ky/wKkqƜ-N5ȵ=a#>w@GpVPa봻=f,sp]Y׆ბ9كG/cԨB IYpb4!q6__r&HƲ sh2LG<ۄ7=&,&,i6am MX_&lAӤM؊fʃM&w]V90FVapjLCE&#UojMXx KhɄe־1a q &^'7R&lx&lG=M0S[LG! \?g<_e#T}` -IPn MG@J@ }e& Ljfp }L }07˄?07m }A7ao& ͻ*U޿Lp#]sMGq[\0?,MGKv4ao8ބ/3CǓ xO3 l< x L bpկ3aZi 4aASDŽa<j´ Ρ

fb w&Vuam4“Ep̈́ m+Ku{tnO1R̀6A] e{cZFqaIɊYt=Lab;Gz3yLov'}Y?.dk؞L;̓,h@Ynx E]5aTnM?~5\(<J|;͡` o$+llZeɔ{?)9Ia%?b(ө;<=]t9K=-SMo32=إ֚Q^ji](NݹK;5 XlL:b[+0- iL3F=ͤ|G<6b*SQ-|uEO}SOKzv/hhz}n`#jfm2=M^MuK5 nVda7_n|{vwLcwՂZF~h~TsMyKiWwgjSRl%So3INߋڜFCK&MgT3,/yKןCKo uBk2c)l]X6)ǝkw{}ݿwGbI/YV(ْ)QlqfeəR-9щ:II;UN ڊ ޲֧J s  C "cy_Rb%K({{y}x<7]֟Gd8,[(+^ {vǶ {A\)B>zJ!ԎgA:ʎZs̸쭜&2ƨ7_q5Ӧ ?ef3fVfgޥJx̑g? bndO?oXF1&dYp=tXpp==eǡֲb c6Dzzf|b]Y=H6ys%fRl"yK` Hձ)3m)-;-YD|İcü88:Sf㹔F<>g8D84G?g0@#nX w4 sq('qiF q$Zy#m' he'Zȴyo;kv ]09y4"\2S&$#9C쉤6Ty1DZhd͋0#x8LϏ#|Hf%.BAΓHO]:Hc:nI1 J7,NlI^t Y%q PR"sl.N& mS`Yn40MR&)}L%iÎ.& 𑄕Ii#oe BB&LLZ˸mgkm-RT븝Jlz\kzY3FRC@9}TtL9{̩s<*+*+ƑQiN(F`npP!Ә'#d yQ,QF18PDzAQ0F@낡S98256yy\3;aa8 Z 0U's0*LP!k-BZ(0ʅֹ1 ,:O#iQmGFTʬX8+r+L4 8zy3{*G!4XPsɄ5N~` c2X w$qftupz}=gX ֽMF--q31t)a'=̤`du[# k^c^ztc"@/~.Gq8x=rGڎCPyCmmF#ǏSFk-'C\7IVg,{l*u:Qcn^.}豶$SP+?W`;|m 6ol6ؼmy`m 6ol6ؼm I,{^VSHrt}A:ei/C갾ojV(CwI|ޱ}O_~8*joԿ6S'SclΪ)JzhOjھUiOŏEF.mcԣJ>k||f{VW/7_ ^?e=aAgXU~P֢~{$3G9@23?bW@2{`[xo2 R@faG [M^uCF_T$PҬeu S+TW.,BUjXK [Us6)VT+XTŧxݰ)"Ք7 OQ|o]5vB*v +Óѭ9 W[b)i[jwQcO+Oԅ{w;%V /D6Do ocamPHFRE}WnutSsSsQ`eVQlt mLr9x`xNRL!w{ UY}P-l wW, ]]6)Mb( { q˷"us` }eDȀU/jEew"eG'i~OKW%ExA^,6+#>Z|O~*NM\*S n^bw2b?qYqU"@nHoQ$luh#)&'#lnL\'I66`hZ>ͣ~&ۂပgg@uq1Ѹdv)6#Z [JDCzA2l\]]<ؾzMз@y, 2@dD  2s B 1C1C@ ;Đ@D}D}@ D}@ &@h@h@h"D@"$! B@@p@p 8\ 8.~ @ ?~ b % X% XbI XbI(_" " , " ,nd(ˠ+ .  +"#@8@8@81S@L S@L1%Sps B|S#&|8WC_a ~=[lFoi_e g Þ6S}F5XzA/L-W|D;zoyxx.y޲[ewmC_}ѽrXGl?$mhuێuvmoGM{M҃&N&)Z. yJ2bֆ#P$Vw?ܭ GYiif@ӠAP@5A?(58`55xo}O+/*}m<=166mV]How0soq"kWvU66JVJ!@cϻPR Gb}@ LS;Ii2mW 9)摴ߪU??XovY:3(GU7ZA8?̔Cu:p]!lIfp[p᪯YmmzU v}Ryk]<]`W}!0+B|;˕;)C[heoʒOf_dGz8g/R)9{X@sgiq}/f$ Ƭbc]l?NvsLpAV[scmOwm*my5&*Yy{yBr͹eP9A4e endstream endobj 73 0 obj 22518 endobj 74 0 obj <> endobj 75 0 obj <> stream x]O0>n$'ٕ ġT $F*Ido_yn+z20K-L/<}:oN2YiM?tKZwm,mxV,nKxM?,zb~lq}/bl6?s>sz>q{X11{cu]z·vlUkיr:w?eUaU7+hG]Q5+tC-/_7{= JG_ 0Es/` 4q/oW1/Cì3iFwiF~ endstream endobj 76 0 obj <> endobj 77 0 obj <> stream x< x[uttmwd$lII;˶(e#yбZHBڎR^M)RXhy,sЮcn-Ium:eea7;ÖM^m?BHJ:\NBs8j"#:k=/u Xf(5:%pNJn!ܿ.5"l.B.y'/=˫qǹ;F;8,ۃ4%ɬ6pRvu'd Uӯ$'C|?U2W\? 8N>; c-9Hk!rpj\(Gqg7;q y!o"C.L*!?UG<8.w:.//sW+:0Y\];]c |F*=3r!9)ȗeXO:]O0wɖD͘/(EM4+k:UEu篚C.,94t~ѷe^T4~e /zjᒥ7b˫ZOjGݲ%k/]n |Χ˪ek׬tiM2&"/v~LDz>i? ɲ;VG_~G<}7C;_$0RQ"Jm\?w-_Xc!#Ϲ#E2owO#WmO;n9Ɵ C 31.KHE>ɠ%igJra?E] b||Esz|{r8ownN5\5vQk,ek\F(f&s\A1kJqU=FG.5v߷5'Hᚃ 5vuI*[cfk±K伺Z2R[Y R_w5$uZ㪆ֺ_Xy$a5vYjR53M u"^ YENy?ibd9ƂdGhvt?GRk3Tv[119De)9aBrZkWӂV%%4kij\.iq]ϴ67Gq}dIS%fw 0"'8[) T&v7X&D*fu%bY5żYebŦ!44lj y(Lrj9a[)JJfjl*Jl* '4W i݃Xx 5z0]erze`x@Qc T"4EH=zDT9Ge%JW"(5M$dGjd8uYI4 Q`!5W N0̪"D(XbpXW8IG9' =L*a*\K)\j*D{ hx8f54 d ipET 4Gǚv!6M#AELS=LܥDt勩It6.PDMG\0EH`z` iUG3h*J&r2IKkF\$FȲUJPTnJhD,MNz8@r4*$7UT"_I9K9%҂!3VP9H4~GJH@(LNF`cC1(ps*-Fb>dšQ5X}.9m{*CX2`$qh5cL٣c09 0eG|@F:bTE:^(NG-R)lV$ja6n$%yX3rd"0iQ@,tj%fJQ+QoYD̀=ZZk%v- NV3Jk%ZP+oQ9&3U.Q\bU."v{.hZe]23Z2Qdb^2ѩ%;,ɔL4ڻtJK~:#v:-)UGduN:Z(‡X(|;‡§vxFD@iUhbw9dOS&iؔ *ɐ1% 2DD' [j|h!iGh% IxpO߄#/IH0K3<3Q'@u]j) -Wi|x(vhJ"!4~ff&ybo*!G*>g-Up!^UPmA>[eEХ1 SVݲ]G[I3>Q ~N,JY!wPLW6[-[q*> jI%˭qft1ueߺ'@VLT9>4\C3IC)%i3GZ͔4CO(B|\w^P1 n\So _K lyObOTҖ=MkL3#R|Ɗ0XuijS)"m eEī{^R/,Fŷ&ْ(](iEҊy 9 ؅τ8ie6BA;*8NX [ɈQ!o\LFx݊֎ s@9&dTb_3a%,T-,ۧw>-tqS$j*lgNƬŤu'۶̘r xW xMИB=Hc^ȨJDMZ2R"3Y<*“f;וQq UJ@s6Ap,La{~\cXqg+:qS+v~m8Ȁe'ǽW8n&|킆>sܽڃ> q7UI/"v9΋iT 6g8 "M֮q>οGG|45ع8f93: MnB.7e LKuw?WXhS [aG.O8ϩnP&g}8ҥ吐&JXƋmt o*1 = k'qt}qq;%H$6B- Mч܊~!kkOhC-{RY>+i?/iQum~‚rVX (u(#]"~{-r8+֯G6܉M؂Ÿz,C9mtf9z.o܅Uc-;=0pMM˯oK杕)Jaof-oW;QaYjDuLFnNX=SѲ<.Ei%9 Ef}oRcݪL|,_ߔa3 lYJU {gw0',Ybu5`RS>L*p pqT+wt_E[%A, +HO^ ybRشRA_)a+Ѣ+ok-WKtvJt~+Qr}:ɾR>ފJ3ݾ3wsxu().nE@.>69]&2)]272e'eboY lEzG߮;bo[;=lxޑYgQw|)t| 4gCO3:>3[LthiH@>k:s,oQQ555kL7ɕ%70Y oߵkj5o+ [ү 883Vv/^/&?3-ϵq? ?<h{n^8 _3 {kqx xW-}s1<6|݀Uրe2_'? =i'I x'׹bUm61f5 L_̓GnH7C5 2$|ހY̓>qsgt̅Z(tKw-;p xiƫSxSp'IO΃OLo=$}܀[_%znεc `c Q>&#| nA1onUMpS>`쫆p ҍP pv{J7`^(\i0fy0:F( O6 Iz2 H.nv a@|/ $fb@Ԁȭsd.\e{ Ҁ۩cSض`0!\![ Zb| +π@[ 6_R%ݰ 8tl:&x@d{]#޽5qC9 Z ܀JMuni}-[[)sJXS-杖Z xW%nVWAs%45Α8<-pɪ(ZY#j5by Js.2`Rsi (\8 DaI,F .6`$ qЀp.j\ ΀ZP5T DaUsHUE 9T XPnW'Νp1qQ%?f`֟% DH endstream endobj 78 0 obj 6081 endobj 79 0 obj <> endobj 80 0 obj <> stream x]Pn CW Mɇ>Ta ՀBV4ͮ8>,02|pka5;o.&1Aa_3,}b1N5.+:@f~< ć-/X d.D9&Du{Gc#Y{*onUlt&cMuRj].Apf1NjMQ>VVlTf%Ӓ ֛j{Sq er: endstream endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 19 0 obj <>/Contents 20 0 R>> endobj 84 0 obj <> endobj 85 0 obj < /Dest[13 0 R/XYZ 71.6 758.4 0]/Parent 84 0 R/Next 86 0 R>> endobj 86 0 obj < /Dest[13 0 R/XYZ 99.2 653.1 0]/Parent 84 0 R/Prev 85 0 R/Next 87 0 R>> endobj 87 0 obj < /Dest[13 0 R/XYZ 99.2 555.3 0]/Parent 84 0 R/Prev 86 0 R/Next 88 0 R>> endobj 88 0 obj < /Dest[13 0 R/XYZ 99.2 452.3 0]/Parent 84 0 R/Prev 87 0 R/Next 89 0 R>> endobj 89 0 obj < /Dest[13 0 R/XYZ 99.2 360.5 0]/Parent 84 0 R/Prev 88 0 R/Next 92 0 R>> endobj 90 0 obj < /Dest[13 0 R/XYZ 99.2 331 0]/Parent 89 0 R/Next 91 0 R>> endobj 91 0 obj < /Dest[13 0 R/XYZ 99.2 275.2 0]/Parent 89 0 R/Prev 90 0 R>> endobj 92 0 obj < /Dest[13 0 R/XYZ 99.2 196.6 0]/Parent 84 0 R/Prev 89 0 R/Next 93 0 R>> endobj 93 0 obj < /Dest[16 0 R/XYZ 99.2 630.5 0]/Parent 84 0 R/Prev 92 0 R/Next 97 0 R>> endobj 94 0 obj < /Dest[19 0 R/XYZ 99.2 758.4 0]/Parent 93 0 R/Next 95 0 R>> endobj 95 0 obj < /Dest[19 0 R/XYZ 99.2 713.9 0]/Parent 93 0 R/Prev 94 0 R/Next 96 0 R>> endobj 96 0 obj < /Dest[19 0 R/XYZ 99.2 634.7 0]/Parent 93 0 R/Prev 95 0 R>> endobj 97 0 obj < /Dest[19 0 R/XYZ 99.2 567.5 0]/Parent 84 0 R/Prev 93 0 R/Next 98 0 R>> endobj 98 0 obj < /Dest[19 0 R/XYZ 99.2 498.3 0]/Parent 84 0 R/Prev 97 0 R/Next 99 0 R>> endobj 99 0 obj < /Dest[19 0 R/XYZ 99.2 429.2 0]/Parent 84 0 R/Prev 98 0 R>> endobj 56 0 obj <> endobj 22 0 obj <> >> endobj 23 0 obj <> >> endobj 24 0 obj <> >> endobj 25 0 obj <> >> endobj 26 0 obj <> >> endobj 27 0 obj <> >> endobj 28 0 obj <> >> endobj 29 0 obj <> >> endobj 30 0 obj <> >> endobj 31 0 obj <> >> endobj 32 0 obj <> >> endobj 33 0 obj <> >> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> >> endobj 50 0 obj <> >> endobj 51 0 obj <> >> endobj 52 0 obj <> >> endobj 53 0 obj <> >> endobj 54 0 obj <> endobj 55 0 obj <> endobj 100 0 obj <> endobj 101 0 obj < /Producer /CreationDate(D:20100528114122+02'00')>> endobj xref 0 102 0000000000 65535 f 0000093953 00000 n 0000000019 00000 n 0000003034 00000 n 0000094157 00000 n 0000003055 00000 n 0000004016 00000 n 0000094326 00000 n 0000004036 00000 n 0000005365 00000 n 0000094600 00000 n 0000005386 00000 n 0000005473 00000 n 0000094746 00000 n 0000005493 00000 n 0000008458 00000 n 0000094892 00000 n 0000008480 00000 n 0000012496 00000 n 0000095038 00000 n 0000012518 00000 n 0000014572 00000 n 0000098035 00000 n 0000098214 00000 n 0000098393 00000 n 0000098572 00000 n 0000098749 00000 n 0000098909 00000 n 0000099157 00000 n 0000099405 00000 n 0000099563 00000 n 0000099720 00000 n 0000099876 00000 n 0000100023 00000 n 0000100181 00000 n 0000100301 00000 n 0000100421 00000 n 0000100541 00000 n 0000100661 00000 n 0000100781 00000 n 0000100901 00000 n 0000101019 00000 n 0000101139 00000 n 0000101259 00000 n 0000101377 00000 n 0000101495 00000 n 0000101615 00000 n 0000101735 00000 n 0000101855 00000 n 0000101975 00000 n 0000102155 00000 n 0000102333 00000 n 0000102511 00000 n 0000102689 00000 n 0000102867 00000 n 0000102984 00000 n 0000097895 00000 n 0000014594 00000 n 0000032501 00000 n 0000032524 00000 n 0000032724 00000 n 0000033139 00000 n 0000033412 00000 n 0000036458 00000 n 0000036480 00000 n 0000036672 00000 n 0000037040 00000 n 0000037251 00000 n 0000061834 00000 n 0000061857 00000 n 0000062047 00000 n 0000062696 00000 n 0000063180 00000 n 0000085785 00000 n 0000085808 00000 n 0000086003 00000 n 0000086563 00000 n 0000086967 00000 n 0000093135 00000 n 0000093157 00000 n 0000093351 00000 n 0000093656 00000 n 0000093825 00000 n 0000093898 00000 n 0000095251 00000 n 0000095308 00000 n 0000095439 00000 n 0000095598 00000 n 0000095773 00000 n 0000095912 00000 n 0000096173 00000 n 0000096334 00000 n 0000096537 00000 n 0000096736 00000 n 0000096969 00000 n 0000097100 00000 n 0000097291 00000 n 0000097442 00000 n 0000097609 00000 n 0000097748 00000 n 0000103101 00000 n 0000103217 00000 n trailer < ] /DocChecksum /FF86B44E70083A766B783AAED56D3386 >> startxref 103405 %%EOF libnumbertext-1.0.8/doc/sorosspec.odt000066400000000000000000000736221416364754400177310ustar00rootroot00000000000000PKpL^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKpLo*o*Thumbnails/thumbnail.pngPNG  IHDRPLTE!(/>#&&().5+2<3(&1+1<0-98;/:F6;D;DLh}C#'_#-w[/}뿼r{7W 7~֟u毊Z{~Yᖞ?aQoz膮=+/{S?Om)VkŬuԴ goo?Ϫώ}j|3UZnUuYUJKĆ4|;qx7)"чc>0Տ|O:>϶V7Ƿ6Hv>>#6qeeŭ/hq~e̝y:g\\8Wԯ, N5D%\ME5r8B/H&@4Z(,+j0aYIJ)i6$%Z!AVsae*4A o2Scv/j"% JLXN ? t¢A I*KB8 C¦5~h}+90B{[hnň% $} <Ma8FJ>Eh7}7uSZ R,~H>6d+G4͉C3V; I;BnŸ[=ہe!s #E5'F&!KZ[ԁ?ña[O8қNSvn{}}ڸ"lؕEսJC)ZRr-9j\Eߘ6+~:jY-uUk4/m+V&WX^奲JUu Cm B7gTk6@L tdz4<~:Df>'@Ktv4 Yg<&H"z$C&'6uP["QRNMW}qyYr@P˪j( Ӧ*f:(FF[|T1սjuCR]7k_T5QSMh43y"Dvs'CUٜo*_KF˗;=@7O~b3Nq]Q{`$ё7sft$C+T9g]ί.q9סIh2Q @]7ɬ=*6-0> 1#w)7)(Ex:&/XH qB?B^FQg)>"&S qA(@'d̉y& ƙq Hp->&VS~ܪX<'⬽(>ծ쭉VǓ+;UOUkd,jS+h{q}zBoXצ#.REÏ{r\lKG{Հ,N.m;ǻَ>u]VFQ׻ƃrRRᲡISvئ9y+j4Ū*5E7sْͥ3ICƩ9ua(LYKzJU1Ǩ#ڣRꊡ]UTs|PL)cղ=Zy>A=;'A5d&䝎ПrhjlH[wwa`i%{uM48B؍ϱQ:DAbR]SU0z3t lD&Vpiꀊ>@(b 2}2 =50_A6GI0x_hQ:?>FWѠ^J1Ġ#SEL\2QBq J#ZVyETjBkO^6.gWGKiW^캚jTVa3.>si TXFtVsc2rT庨51>GP4d@ w~M $XR 3b̮ g#̙Asٙ yy f!,ž)Fo{nJf->'s삊E=#~(ngA'#󻹍Ïݹ:XM9k;>ǁسU#}ݲC/g&>9 l5YXir=zh֙MLO,p32=Gy鞈36uxyïX襨0qG8߈1wc=K]pp/8sycƽ7`v96 _c@W &fx8G !:n07܎!&=2ͬ;Bc uF;Ⱥp,F??JXy.}MBkx `[wvx۲Oz_!c 8 滠t26AI.FCmj #?\/S*kg$&Tl^ C^V/Ǘ =3ɦl3iSJZ&WLWRCI/C(+KCMm鵙ՖfuhwOut߻qaZ~}ˊ?7964؁N ]7U  n摎Uq*ZYXer *ኲGNLjb3|.TPLEEvrLAQpJ!=ILJE-hV\|Hp(*?/6mDqLel﫾)-5R?|tq:fzu=C6~)ibq%!]ލV)B%" Z RzLIFrtf׋i3;6p z)H3)H3n$wNj;u#/A9=vBCְba4yl=>1]?7q^recrSF (`''NM!.֎/n|']]cO3n }nş͸I 6qop;C5^c7W!qwm{n'cJ1XY<|Z ;(0 RXJKG'/UqV-R̥nVmP򛪮+B4r|Im{~Y-v/9є #U /y2.(U*gs5i+?Åu:R/8ZG?;;".N?A'fIeEO6uF=Gnr= [ QlXozd16.Ě=xpB; sP;ިy6uMoz+b<n~+2fh?#`P\ݯW_uxʪ ?y.\ZxS5$9KF,lT%Je2'@2݁ZRJUNRJ2vF;P$KIj$eR̽KHu7#|s%9fP?~3y g~`xHG8E~Ri0= lf|6XUZ; r"q0Ny>(:ԎҳLhR]~3-1jF|i%H$a.G r2<$芟1!7hfH$#K16;FCFR+o6Z^!U/_U\;¿Ь=ֶ|m6u-ezXc[n|G=3HkjqCa6cÆ5n-$?16ُN?GnnqM>bÇv|!uH*hM$65vw^R'!Ju>9IAP&(OD @lz}Lth,"Gr7"Jˀ,}*)_K;^}! [r.|z1ͭ&3WDFPo>(IwP IK7~(2\KvtlbT,O3â)ndҟ$em+ C}a$arYkec Liq %5%!n@@C(v~ðqԧ^n]hS,=q*ԃwY%vCg_dxz Жxƀ>@y EfiO/>;i뢽^ ;1={ast X~견b\1%]IRU ]2X)KK9%k Z*lO sR֤.V\9z f1C حxMpOziK//-3m1_firznXUkd_Z7E7LZYY/lWWښK],/{fs y~ fcǮ^7+M-D5zT끈@2 @h*L3*zwv(H7:>È1%Աd1#";,{?HK}Wu=u;c֦nSm6uM$y?~Sy;2 U9jr6EJR2R%i^bTHqxgAR R y0L(WD9Y KR2T[E_?]=< ȳ=8dt ":IEd:AdcGv1䥝Y࣏ȍ9>Nd[B|ղ9ik =Z;;6փ)%փlMJq2ƺ?yb_!N rwE>҅dLBQӊܖDCL,փLd++J:[+e/4Jj*zpaa+6Fl6uMN1`,ΉmFPIѮgv qrq@ (~@~I{1vE.c-kUHefa9.rJOa#)VgTn6%ge%jxTUj^blE]PSj9.ܚS5%smn5QCΈr86-YT4WJ$*%%%Uf Z0Z>XUL9sy備^}YIv= EbJWwG %=-Əd- i;êhiU +5R/C$ ąTGq #K al휍dQ0q́0y!X͌q2Iߒbi Na- s8ٱ!H 1"=4=$2h'v鱵\+ӺioVkzqZ7=kUS-e[*uU_R EKџU +T˅Z\1t4k˖3fJa̼iʺjE(eݴVjRkݥh(z6WY\_~Dzu9׾̫׬fu9!p ,:_.UY˙{WZrv$X238 +ao97_p hn%D~70(p0Oq4ql!&XREP ~XxK_|u*voe:l=t{2_^Vn=lN3L0K-RjkTv.-Ն(@|p{찔 7 A<9iB mhX S'LD+$ćp !E%>F+!$CM€H ?d _c bov)p ȋC$7DCpQ隓 0&DeC 숰| | 8ˣ^SPCOJ4_#K_\׫a;~t  V.sJU]~UV:׭0 ~*H8D ʄHE lOӈ"`MNoͨT@$D8!"~[:"vi+!bpH?D(D^n%2b <~$=UC#Ѵ bIXG"ʆ@$d- ǃ8"1$pJSiŏdEޓj*.t AYAX25(7+x:Voj)$D+o:dH`]vr^ٶyi8[U.6MMY^7%V|Z/rR+ִj*dD㼕L쒙r)kӵ4 l=H4StRSun0gwgFSAЅAжɈxIMg}$ÍAg @!Cـq]>dRV6k4!aPF}i #Fij Ƙ:u3̫%5ͫۘO\S|"8Y9EI$zKtcJdr6W 9Yϫ&O۽(jZssD-y0y5Qܬ1]TKRF7Gy>0/R8}y[XHr7,ΖPuY 'jaEu4P̖M5mID6Wp3{㐦m~)ym幩9P1YT˚-wm\kJcR+)sz,Y=%YVe*%E*Vmng~&uJ YIeh(Ir>TL%Ut=dHս ֙9]RRד,+Fl=ou٦>s7Mâ $Ei 9 K.BPHu&{dRDP^E-K{bIAėT!*+m** s(/ (\eX MSk-VGуAC"m2 ROt^I ")E#NHK8)oV8#IO`#Tg< 3 rPK˺@|PKpL content.xml}rȒػFR [$Eԍ:R23}RQ@DQi.:?{^~c~`u 77jM@!3+++oUEn뙎}t7'aοllu擥'5 8Ҙz;ТMoQLGFxh;v32Aq۴=_Cθ8=qq1 FK hgVtǻkML}x[mnD4r8 SaT^wD$Tu`†N sxKcU-HanRKjK`=@`8t>|pr841(&ky 0)nq"}?|TжA'w[˃˄F7Μ t#\gMgp}xGvkj#@xwmB1h] zp\Y㍟ڂalNjԼ*ޚ`1ܑwMY]̠]agp20i3S)]iĽՂI&]Jc ފ6zfR;oSOa'C co*Q(}(L;O.8jUSt!|k"O}9B$Zajx z`=CM vVM-mWȐN#;$UHNՉ!/6̄` GL|xoNa'I Ǵ_$ƝO9/߾Pr,Kwqtf$}導ȋWRJY3ABbK=P6{_OyEO^xsCN h#撙>b\j>L (vN}ub8nq P6&"Tw ' ] aǐV/ǃ{b\h[P f7]?pο~;o'&6[@exdII1-8yy?X?Q4lb4-<̍]M Jolu?289MG׮>9/C}PA=Ҁ}Sb)"5m{&qwG_kCV&e7ȑP}F/\4x0STą0"x3ݲbjc2|c^pʴL!E/QVpp n"(Kvb#3U\w )X:CN0GR׽89PFViRݱ:׼FMh= 6dtd!/N>g RL6%3Ѳ$'bCJot3B.8Y'qZꁼ~ǞysΛ/vs9 9AE3-iz'_M6k2t), ` L0!_*~#[[T }X"*nфin!_ZvAnqر%6gQQB0 Try -|Ot`uf% 4n31.tghLT +# aiaԄ1gjr pR.r=lX>\E?A"I`s)w-`?W A'Kt3=3L X)--ѣX\soC38 EVzhZ0Fqwu͐ wZOJIC̥3疣zK8t@,9D0H"\nv6N`Vr3܆@7/*Nh >7G:rtyyLbD T46Y&+wN^ X-g. 9t9+7N n\a yest=9'/@͈8?e1\FKyҳ̵xUeb yQ c#B*} fuUt!|\f6WqK{g'Fc4 eN&AZa6 )Wۍݴ9Y4Ȥɿ7^r CǸ`U|e2~s$ 2fppֆ~ώk@]KD .s9q$R+7/Fn5ܣCa44 "@/bN A'{b;vC%d} 4OO#!m"')mQM.3>.,+ B;}Z#3 Y&rdLCL;6"X_-E#(,3.&rYƧu 2r_4E+,J=sG#FvٿF|`ZwЕ ?)櫅 >}#<\c KLe#\>ڴfwJuBpcN%j"dƥ|EG eeE]-mW,G=?).͖/FX @;Q~*OOavvUvnne\ ؐg2~L༚SC?Ø ; ҜBfU6\< 6"r<Ɣ-6-ɔGi9Q,< )紆AW`N^ys #d88j~?<\6R'RF 2zG@/=%l)zʂ Q0Yẅ;gL%p^-_]dM!G 4nkYnn}`}0EXr'Vu, [Wa 2Tߜ6Oy$8(a{(3HAM16V#1 YR@7E hVbTEJ#@wtE2`2e .#\\2: o sCs=*T4,9`2@cu*KFiSVn=z86&Ѕl[qY0Ix6Wԅw2/@1T~QA;z)b9q:9Wۼ,ҧ>O9 oEx$^9*BMUc( _bIs֕E\cPm&tCYVgU13u,˹cӣD-yT\s!φfOMsej7O=`D'MQD1ċ;49odr12GYK2BQ%JRq'A.Đ#8SNh&~%T|@FEN#7\#6HxGC)p' WUGF™Xs vkb+@#>B] h*|&2@0j8)EWTg ^5]^e 8`'=,o3*j˒ L]g,B4Xr;".UbRjNĶܮʿcxVts_ Uf,V $ Q-ٶ@`@J+e0u+ܓ4X k3-XNI16'B`d.9@ۍ>Ϛ$%ʡ@ [X5܄jaXd . (b)^вPe!//AiAު96 ;}i$z9[dσAK`X S$=%0y+R;ڸ+VVswƊbt%ѡ<ء/U'+W #}+ˎx,d[ƅR"kР_d?ya'[ )l5wrK  v _ۋ# }uH,# $_d A"CZ'UOʃ5PTˣΈj#%f%amS'BS8H!.0<^5ΐRzp+sv+wqMP 7b|/){;pTKxdic0ۇ !L/OQ煋`6%0-!#O+,t.2gzeL=VSXԸ>K't,2 ٽF]@;np32Ĥ[=xWQ S8k +&ڋfe2%jUz,VIggc#`'!95`:T Tzwx"z9$hz]xnzZMQS C"M/{ yUZXUy 6WT Uvvm tyJ3~v0\Lz֍fjJ.LViմp*GW|eqFe3tJ㰻ޥd3Ӳ!}66 ՙeAb;U ai&)BH\tt{-O͆2. Y.Zlp-.*7|A0CAWP%9ZDvl1k--1lت=NyII=9uiZr/tc=$ׁ@qZ ? ~a}Ilz_"|=BлA' WZJsuH掉%A"D ӄ7yʁ^ئ-/; ۙ[ 7L*6Fߵ.5[ɸ,,櫡^}drpհ1~@7cWUN?fiN<~ۺb] _F™ۓC3g4R )yXFM)(l[%>kaW/>D٦Vϧ.?Ǟ Զ؟ -뿌׎}M?į%5oG9f.COCTd~Sͤ#屽};zobz 4/R T`?D=#AM^kXϾb?aX!qǯԅYY'@ N|,r:uٸ,JV DYpbLx+2tg)8nY:Qh-?\Wz&eb x=ӔovG另^>듊@ReYMݞBjǭF|mU%#|]^PrNޯy`En²Jbg[g| ;w|.+f*;Nعs*ew#D9t AYȍT䮨wNQ.-F@Ny ZdS p\*֑&gE<ǢQ x]fmSEO O5{8hע~B򾼫eNk[cU_̔"1Wf{_a'ȯ 3&X46)(. ^H]9%|xF^*IWry9]{8//q KYWZF@d)WMsϺxRCN*] !,oWjoq߰@C p1"\f<_'1ЅK&1н?6ng5fuKzMv+]n7fih;9f:,#lsG|e/QA6ͨ #<`~ݗ3`W[. i ZHn}ا>s>wgP8>AU:( F- sZP{Fm\ rm?78*|u)@x@K;R?um/|>?>ϭq|n o aĕXT1n7/5MLsq _9׮{e&#zFϓh% X#.gd4\6ηMu,ԣ*Ək ؄t#֧&gwq\^6-Q#jr(׹)ԙVр{eIuE!$Е̼IF6jza;2 VdS5FvpGKkI~* ?l L7ɺx'!Z[ 1rM&8D<_b- PD4`+P'P_6#D[i_pÐ71a.Ikq4.h5͋ght1oųؔ\O{cM^Շ-4J?>sem9ے.#:vBWR޳:.y@#sUgdryx,0R 91N獱ՌǑ7ȣSڄ1FNs64g"ǷǍJgz"@xQEHJ*,S^..gUxDvf 8=xuˊyܭQbPʒ|MSTYL/eF ?k*ze/-rEMWWP*)3 x#Kk̑v$cic 'di",P> U`U4d!rFJz0j*j -Uc$ϵc')Kj]JC+49ar zCfW!U:%A⎗ {[;?GZ#`41V/oȭJtx sݼ ; 櫉^$ck^h;;Sn75牵:HEueIl[b~J6s}½e 9sEQG7s;x^DfwKQ4Sޚ^]/`Wjdf@&ӂs, Q1YͲ L*X)#=(x80O8K%Aif(oPe0IhB8Ij}[7be ~DWkìEQ*Ǯ BօKT+q0JelǠ&"CvwPDꌗJzJsHP6Bר@X rEYr`JTÀx85epoD+~G|lkG42˛o tJH*qUFKfA x+!ϣ6d+S*y$@eҹ>.KjBV56)U"6O> 'F2,(9^z` Lt*n;`ȥAW ²rWj Ȯt{ zӯ`A4OK}G Ȍ1+g?u"8U&|b H܂?8/N$lI( RyVnL^^Dy\ ,wo<☌(6$cxZ7$d KFUSBg Z-O?nI V$5l_dP+H(^ӞTIBgY$u$֠;ؖy XSɖn6fo |;Δ^Od%pQ*hFF*U "|`Y%TxVlS`1JܫBMʠz.TCN~ En-E) 0lXDE_Ae^3 Ѕv-/%!f5fII ܾ4aU4h:A5CX9y9SS,u$qbO|;X*Ih= P5̇ˡZZ4&>&j ~qB :tuv10)kZs=^]$f wBʲ@(|bܲIQeC Wnӣa$+5yP0&ViO~:l=C̝L}49^h *o a%XvԜ!M1LXFO?PKly̕,zPKpL styles.xml]ے}Wr(H+&:.$z)#o|, R E2Ly].@Owq~~^0"<;s8 H%g߻sVQB[07cgdO4y"(mqĂ'DWz2DWD4ֵ`6k3g]+sJ]޳`6kV漠StbwE܀lSĢ8J<;ҧh w!둿X,FZ|iNc#cY6Hn1C]㼦HI]bY5#TugxY7& 6sIIh"id>DJ[ۮ}qފ)BT^A:wyӑmpZw4bA+{8ڔ|8\TsS>Ɩg#SBY!Ȫ{ ڰm^Y4 dDxS,j0t`2Tkqm2uW$O`0U(}iI(՞*-V3TsB%F8Z !6s OFJȲ #NsQcLc烞!Wf  >|##[Q<'S(l#%BfF3JI,t9 .EY:u q5{91%$ &=OIC󇰊G4KV렘- &4"` %[dH AɅ4et1CL&W2YԲxXe%㚢tUSAǕ1J`cYW x ゲX @Z4咔 M*w炴f`k%jD9 )vB_ ;uCc% 6N-m@e)ݧc1K_B9I.yZ ҂D(ޡCv*t+YԴΑFgºfS>EVҟ XJuPp4|pQ4`8$_vg{ԅY?@ p@[G̛lj!zAzF,K"—bU)"^sk}d9 `-%c)ijSekaT/誁6X=o$k7F&`n=Z(xk{9Z"$gbT1~qNX?{$ NT1&P`i /iaWO~[ǒ?iGrg'BGᮨOm+5'RGkHqX(kg,Z\v8=ڦ<ټ?f0k}&fuk~Oеkճf?;+))[!1Ln%؍omPJϲ-+pojNhLJpX{|ɭp48 H#%]g^9E>\yxke=!,!`tED@h!#2y}T884T߇ݼR\Dpa"/ [g=֔ސOlQͥjmbjkKSuL@?Ro!p1XMlWZyLmQɡ 5Eij8 m'V'LJo[m~-ڷG9zĉos/k.zr[ʄmꩬ84ekC֬=dfm![К7tޛiL;t+w Xzݢv{=\`qʌ\`Fȯa 3[qE<*{wUsAI!D7UJ7s,-,`6Aoy}F翛9UK]rgyֲtwYRA ޒe-8Lo{+^fYG[a:4m~zN};ZlL0 B Q~sOmj z.)5EK5={g~|7h4- 7ûxMIhZnw>O%暞3Ma <{ xgj~\4鹤- 7״+UO>5UWIE[Njjr_w֌\}*~{vmUKY.4\xi9DP0|wK~䮘5{o__wvfmڑlbrLgwtv1ׇbfu>ǷpUQpu:j. cg|WޛEvkgWZl`pdsu ~x$HA䗘Lmbicm<8ٌ,Ԓe':6M?5]8 7^]QQ .%uRH~Mj֎jEOW!JZI~ڌWdw:KhĿ PFQĎn7ܰCZWF%8%ʌ7-Gy˃7M|RZuG@ Vs$4BWJCGwG:GeC:gƻ<CA$KyP ;H.)~mG`ڌ_v125 kTvij'0ǃ*q|S WbQ`f[xj*H&J5|p&DHS*rr_OiM-Oc4BjPK_ bPKpLmeta.xmlˎ0} Dg XH]T^N"b;-6ôoe}X-d;> S]y\dT1!6U{A9a56-FauDyJ P1K)¥\hE $KFxGQQ flřa%pejy^IҊ|_>%U+oNO`p⻍[ڮmΩM+*p{6Wu tu+7U<6uDQ QTjsF"|uQ9E)f'+4Ja'Srudz$>&ms T>/Ca6, [xvKPK$aPKpL settings.xmlZQs8~_=%@&LBHiiI`0m&tZ$M| wV:gO4Gy[ 1r~[6_U>ٌЌ0Lc\1t>ǥnfo+Mdd1 >|yw9˾Y .1IZ]VoV7u]_BgGl1Ym5r/Eh6osn 9˿Ks*t[`R^1J֨T_9ffrvyd{ w>__vv`1D2.0EdeT ˎ•{ }%\FuC=CPBޏv6%Wo7[ĕuhi>pz8 Ib)(e`\F8? څ)UlHczd~ ׎M_ 4}q|]+?Q/R ?i#afP'Ism1/$[?p9W2}*']dm)ѸO9;K<|Wf}ə@I@tߜ X`!,PD[Nᦝ$b3bmVZPL!b`(dY 6qz9D=q!FKR媏M#e%s66^w\?Iш&U.'HL=`79il ÏCXtr/'_u< S/$D@$]^EHB rl 30 vo >v/G72;H9K_] JIajlD}v\W kfiҧoI X38'wH,=V@qs5ҞpyPk rRbcNjkxl(P&ga =>|,|qNE>v6 J5grJ4=DKj8j5!`xȄgmSc!Suv(T)VS/ڂsG#qLP Th>ybe?UR+{\ikPHx TiӶ;Id)9}}9ڇ W!\p氍xL^ +X(+`m%)HJT}ċwSUElKLۑ*OG+o`0v|I᳍~fqdDnzs9j얊mcI0ۭ@]hY#Y4*Rbe=P՟[ʝ!{xUОhnnU$ޜhy&ڸ^jj~ *!eI^eYExE%yL,Ƽ FD~TsuИz =itP90;v0 - {B_ !8~c+[P-bV$>KG-> stream x[KW;[ v;@n `o \S/EAX[z|UUI;O:O %|/?ɿ?;~9ټs %9d&;uNv OaNie5ijW`~z>V{5m\$4||~_9Ed^Y}t 3h Z=l tlOBt>zIcfMwsα>Lb~CǢłhqIIY4]=Jf%BdCY<х;ݗםLN{>gqfJWhGw= ,&^Mejݻ1TEή o*GHJ0D 5ȣOij%fY\bd5y%S`2Ko a7[>aXil y70)ED~ýΣɭy+<~(eg?PqY_%m,`-iw.U$/Em}dtNdL[A y{"Ǯ7R5d1"X6(賱UpTh^$z~CXTk1,J8*s V߸ u<@RvbDdP7DP15|TuT?,sNM0 'DbxieuKI3,l\QH 9y Jo-G5`a{62/Zp8nB,`yכZV_\?^ 9gkR$ܒ%9eq<'@12!, VA,aNdEE{R3 {?WEoU>݀RV`tʕigJ.*ETfNl3Qd! ӎz- sE1@Ao'^&Š:+M[y+8vnQ.wT)&:!M;nLe\ }>D=L~Ja s!iuzWdCc&BJvQrZ2YܑKv1dpuD\[_r%)o=%7>nq K:ts4Pp<|L$ȗaŝ5Qۨj*7pV΄"gp^HkwTw e:w&9Ѕ7}NیRJF5p `L$?QC3T*V:$8)sdW3M5ˤrƒr󌡮i-6MqO5 X RO}M?G?y!$71YӴt(GVS#BWز5-g:A်Uv? nu2c[ԱL=/MSˆP\9jLQ4w],UtӥLI oJrpAcg ￞M3_G|E{AL #J )N&.G&tTAMiDǝg" f(sŒ[ő4Dܜ}(r15mu}ab"z$ ~Q=ɹ:*b*C1*D [J]~\&V ]ȃmƯ:Nv$Ct`t&@w[vH11ʄM3XYC4IβDL4 T {Z=mGJUӍH ?d2-7ųM4&yjS0B,vFEl6]LD-'w-lv,_v̽Ii5l#᠅`d ?DCQ`;]<xPjދ`͵pYFF^72 eŶm9§VT@Ko< T[^x v1݃ s"H@2,]*Av;vg~I1J.b|~R M~B7s(/ f#(DPeQ{YmNy.rO3 >moiy>2: M873D?6~C,LXKhn-(O xk?UM GB")+r'odʮmӰk;UmPy.D*~2=w8hͼtU ~f心NeSY TYCIn ^K20_\NPb^q TilpFpoU֤!Rz 7n6JP<-C@:Uo꣗joQYezeCm%dT5 W<_i;r:zn*RZ//.;&?ЇbHHlȝj%YiRn)1n vU2bY(B$HN[Z5(uIH#1ҭlx> w$@%y1xPc]Z;A*>kM2S븊(GPC& y􄻯Dm a~X׀l`_Zd0MB=44 G"gַ_3丹W3ؔ T (SIڬa zSHv/o)$*kgH$#7i8I{U ͤ90ل*!:qR"@|(Q4ev'63/,`WvzҨ&L$&8rk(Q~!WQ+"Ŧ{.;gAͧdC1Z6/֣5z^+&ld塃 ly(r|' ̶MlJAIuB:3LGc77^V֤ߦI;yi3(ꩶgQs$FVwUic]iV$F># a 1YM/0F5}q:2|𣉲]pRi/O>Slt@/|A,lu^:|6R9 endstream endobj 3 0 obj 3428 endobj 5 0 obj <> stream x[Iy;,nÀ>6@9<䖙rwO-XIY -Kdmj9/=oa '{=^?K0)>u=>~q6pgc/G˯pͧ\טx i7{oeOIVv^lk.֝!şWWz3n7uG[z#0d|5Z3HbpLl",32rin roR/w\lwɐΛLoLڂ?kerKf^vZ&"wt7~DxY`HD9@&M "9$Z$ЦlL|)f"iʌӎf1u\@owmbx8F4 `疪^2dbX9nZ? u dԂamdw6r>Ma}2gpM\>;⊍g>8=;AL,-CiS*,ă8ߊi4K“m3įoX a[&ޟ%-g&vB''Pg+W2hqDU`$uI"Lep%bوDŽ'ߘ}F g}33Ǿ0-;ۉ (̑ѱg%/B[JWð>;A{e|b1a+qI7yu6%lc&s&H -58l=M6g3M_=!"BdF!hb8בێltBsWO͖`wH{Y+AE: ja9N vF#l%=0) M .2"ڑ¥r] ;~]+m*O. ۴PH:TWat9dfCjQ8 `lZ5YʷW]o+ ]JvyΊnpv%A2(t[N\QIM3~0vg֐N:RAj ٍ+tn[uВ{g$$@@9jpb)P|M͜ X8ZE-`A1efebDJ&Ɍ78hF>uXu{@E.IBī.iI-u'xҹX{V埚|&aWtбк, \Ӳ0lUƵarp3l%ڕc(: DMd֔Ԣ!Vj}sEQO6 &$ 0փIa 0c/\ݤg0_ _ [loZQViSbMp@-Cleq|FaSsf?lEb' 'S!o'Wq+TP {\QΑzn*KdX',H?C9H8XǓ*GdsK@[ҭKʛiZYCV~p9 sݔFά_ Ws^/e[5>]*|H>Hq)''rIr"VwKꍂWԕƳ5c^v9XMd6aMxqE^>?f)Sax>?yEjNoa!B`;;W\CiىQ&=Ν?9-xn\Zm\kzN+Bw Zٷ2V'@ 7.֮'(%`EmqC1OP2d؉b@hstjJ9I &LI[iY82xԲ;1*7l[YW( ڑ nZWrc}q.gVOq㐳 @w\ ֓Zjwc]SOwNEfiK ´mu" ܎J>ˢu:`CFMR9%h{<: Ct礵_b/Sxa1`CMrA]F պ.wFc͂bK*^;pL=(rQX{H4$+~m2h7Ys3h\`+U]rȗ}k,Z7S#2{훵a"3k :V@ {]k|޲;9vPsP#ӂ'6,Tr'7ERx͎9+[兾%L5@]-r'w5D)-l-`vbz3){φˡH-j tѬӕW endstream endobj 6 0 obj 2941 endobj 8 0 obj <> stream xɎ#ZÀ=%/AH.FUIr<4S IsTGWnu'}\,z/vpf YNyLN+1PsP?A,82hC,ln"AOwC(K'@8 O,mn"ï wz '67 N3F eqx|~,\uw3q@Vcґ>Ysd!: a#X"@uph=QvEA5#(>HKL\HZhh-(_Ѐ,ۋgdx_Xz!F!kIF7> g|E/~vKw// k~!*!uQ <<PXJlemWY")6_|FCꭑQD:A =(/pXm 1OkW 0ڡ3" *u$f% x"qE3V تGJBZYZ>Thc(X;p3]i㢁z3eogmH)PRWhB׳Fȑ%<y{`y=Jɭ5D5q@U""),w_(Z#%Ou5?X/]~PؚttOV`P?Al) KAa_VײRC'| Rx -:e\Jj%}9ɳ됋]R^IyWNx W& \%st$?1M7JKчҗˋNҨzMAQN+>w25#Œ/).OѼ"([RDعZ %TM=>єI dV{ mOz*(FPfB}H1])*@ǦY/F^S$bGj(V !g`"9a0p&kF *32rڨs.K3V r|ުE Sr=1S=y40@SVm2/Tai5I"}tNzHg8sb&T'FiA͕R|Jakt)dnNӭJ˺, jLla)Nmn1n "R]ճtj(?' h 䭙m_ ZMa^Ù-rjyDۓC+%IJY{DW{"6=AfQʨ|gdqL 68,: AVݥkltږ3im)[-~}9_cQӯhuv73$ҝ+ P&9`! `u6F]qSvOk\fbnWE&b]L@]͵/5d>nKqF?V\cy ncNLT~ڸ1-6R_W\3*czU[}9vI/11sk'ms3tV\eՍc:oƫ^Qx3qp nH;uw_)P ̺ Yx"EH0_YmZ  \[T޵#"8XDßn v皮mWc=‹:,ҾLJ !YMrW&\ &hjٯeh:Vq2m.~'\ӧH$X&RHH9DPR˳3mւO{Ŏl-i\!:+f$hc,geTrX^`1b!r7baAYy) Vv{G߹sLjG=ɌORnF o]݉rvRu%:/bϣz]7'_vstuޝ懧xX|NL|F endstream endobj 9 0 obj 2980 endobj 11 0 obj <> stream xZK8Q$ۂ< 4d1. $&?-^24d$U};;9z)i >o?'w-i[[ +9b]K桫]Hzz+ E1 "̃YȠ ] A (s1)&ŘTu`#ٳY̜3TC[GVF.jb`@S fҳL4A p)/eB}N™<V"3etZײ= ""-"[s*~9%0?1T'((? @+{3o~ qhAټLNIr[<4Y*rN8$0 " DMC%A/( k&p7w+%=@?ok!;NPBx"j w:EN:q| 8H\@w`#@qJjQ& > r20Fy#g1ȉ씤ĸTNL@H"PpbVغm 2] ^:aW .-s C%-/)B|T*"t!v/idžK6'ޫ"z+vNLT6ȃEG+A/P0ϧ qopZ;AEqQ|+R )W2դas3@(.1mI{72v))MTe( !~8Z|Gy.>?һ"@!u3t DWp1!ndԸ 5}( %7j߄E67<Ž >cZ?MLYVEgWⓂE`J6;P߀dq /!N5J0#L  !N9B>-$`{EO,i\(h0Q_<,R$eRGbĄ݉d\9K$8iF' nXВ`yf)4q824f>Hhd*3p[R[;F}:S\sf4,ZU# +:GCWZMqvm7EYĶfr,-50%-@ u Wn-VD21w`7l} ڛBM[2%gCS JmAj7`S5DI`^}!)ҤD q5Y(EFbI,{X㷲3;$im^s(~s+XD5E1:.Hc (b%Uجy1{o9@5;as_Ѱ#8zNR!Ef%967upָ6w oKqg(V]#jF.gaVEm>=DW9%ϓ<~>ξŕZ\4Z10jQp漫E/ɚ`Yǖ"wMH7]؝4ub8((p$.HYK |KPy wwMߝiOITE %0A->!:p͍_Jw/+oTcP4%(.pPVI|ejO%Gx {%+8q\c0@BwYnZf;h2CvRF#߹sln9(b/;= z.ջxd5l |7ZGuM tօ1>R7%2DB6(X.vWS9Lal\,UW僅Z|o.Chqtˍl/gVbjӔOFp[, ׇ8,0_<=;kv )f="jT.LTLF`glXw^Yj+~E:Z|1]`q*B-PTF@aCĨ7w<?;; endstream endobj 12 0 obj 2754 endobj 14 0 obj <> stream xX˪$7 Wzv, ~.E.3 !l%[\}[*ؒl:ݿ{W&wh߿~g{69-b휉ٲE`OYx -cűy̘ 0[gaF(PAű3תf)`|Ȯq yrÖ~`\CSl{0kyYx -x kyYx -ek;*<66Rzc^5ǖX'c4TjW8*,fR;#5\xVpkyYx -/kyYx -Zjf˨pW7P0[Jc1 6 YcJt*7ZzqnfZzq-SKZjfK(ɂjtF5<\xVP5Pzq-Ohkrcך( /k 7 Gm `\RS `\CSdMV-&!?= vQӛ>I4~F^=Vu>I*{1'ӑ'b/Q$>wcvlyGs372CF;=NdpGz;LO'1}-]t=Sа70:W}IE8'u} {Z8{n'}YmҿB:A.)@%rjt'q9)1D=<01!tĄrRY>gz: Bcyj1P[XSm ,/:f~%ÏƾS)bX[CNo5o!]0֧Ү<^~\<@p2*vNaRB4\΢M$^Ww fjel="+Gec߲qqh,kW0/7.O`ƝTڶ,)}s dw[yr.YD}hJM|yJmCA+iR`.yx8u.7^KPTΕZElI!92hYQI!Ok9ARgXu-Ot'|$2jdɔ4[L7_Ywf3%NѦ/m8pJU%b%Km%gq=T??C%+u0OIUVJJX z%P[McsmP i#'!8c]TWd7u+$ttkJrE w<ܟZV'W *Dfp^giMOy|f=~$}ky]Zxa:7G 9nm ';Rm,:QYu!)/b*f( Jw18GYٙujM43ՠOpīxʖ|> stream xXˮ6 +E*JdEǾp@;-@e'v\(?gs64_y@ = @6¿|sŝ:y7\‚Zr7sb8:ٲsvG%k,[3뱖C{GOK &%,ݓ7, dǻtW)g zLww518> stream xXˊ6+0UIlh dw@!n&zX/?;0=:SJRsִF~'l{O_ @6¿7;6d?oS7o턂!BB͗OMaN:{&V@yN$+r&9ÉSh1)(QNCr 1&HUdZX啳s҉dA1V`:j:( u*RGI'ukW9D"7\rJ1'HVd֢+RGI' +uĜt"YqpkRGI'>]1ƨ0ul.Pc҈TEυ[Qs҉dE­J1'HV}.(s҉dE`s@yN$ rC QsIdEͅ[:bN:s@yN$+6n W9D" NBʙ:F̅[a bLȄ\5P^91'Hd̅[W9$r@yN$+0n W9D"r@yN$+ +uĜt"Y\5P^#Ɋ ­J1'H}b9YQa"8@.Pc҈TEH[Qs҉dEtJ1'HV].(s҉dEpkBlyPu(Ԝt\g{U*`r}"_YW~tDn߿0g3:"5O]g0`04j0 `1TAo g p3|8;E'THSyp>9p!@i׃Z㾾k;wyeGy70#-AhϯCý{"b%7w7&<_^R,5Bt gWpH~,ڻSEx:VN ]!=ؑPpfzʮQW[,3 {7'A2xVCBd(q؍}t#ܞ^OehOɾ`cMX* t|o^toh8W嚦oStIOE:@#zm eg7MV j2Pއ%nĉ B{yU9=yBdW_u+2nb|ݽU}> stream xZˎ#7+toIU}{l^eQL$j[dVRw:wK8/_߿ɟ=zRuɗx)RvyG5oo_N&:BfTp6`աQ:Y ti`աQO<p$(UpX`t;KOm9#e6Jw9Zq]DzF 3r\b'n1N1%R4=BH.G)$y0 Kx *4X|ӄvӉ+dt ~] wO9>yʵBxG t W|nz;w?="#_GS}/,}.AP7u a.0H*;=*;!m-G{HўBxBC2&P˻k͢WክVJʂ Ϙ^U_qQ:xTzLA2= ]e1=\l5l0W)fW|K7*7P_FWx1kt 0u{8aG}PssB+`? O>0S2 up> Il{A2>T4{JSiԟAI gƿ}}T^USJxAmo)Mwuw@E p6=}ztcB]d֘.%Ɨpn8Mbp(k/CQ;J%8asK4A"Φ2Ak; Տgz4=Kn} -|co7{K|p_Y9=%gWN=Oq#$'$TKI#Fs˟%x?Z6/~;Q͗A6w sƬzPa^gn j`P 8ߡopҍa!{>~ǛP9C`Qɵg7ѩ'kܤ- ,O endstream endobj 24 0 obj 2307 endobj 26 0 obj <> stream xZɎ#7 +|J@}$%.ErR4i_=QE-w\)O_?9}G6r9-eͧxz*%;o_Ƭ:BfTy̳:dV!3J)`!QLvyV̪#dF!pY2jBY2 v`6̳:dV!3Z| mguȬ:Bfk mguȬ:BfJ mguȬ:BfY2oBY2Մ̳:dV!ʵv`6̳:dV!3yV̪#dF)yV̪#dFtyV̪#dF֕0YuL(uYt(/+=`!DAY2ЦBguȬ:Bf䫉OguȬ:Bf6z$N})^vOW8ay_|q?ׇl C Ȟ^} 1,nW@aI|$]C񅛦$:^æC7n@(!+iz,XP|vɽ^]Eav >FnWhDKA 7 FYz8yp=/K$!1@Lb\eߛNU%2\[pu#P _Iu^>ZGJ,Ȋ@=@gwI=fC'ِfiJGu.` 5$G8XAѡs&\`Y1!̵*4=A^˴m|wU5h?P$IHeo-i ?awo'Ui|ZV mĆe('cQb>BaUP|0b}20N.o!>k ] >6XtnVȋ?ƀnP>B ,8Mto3u]A;TVȓawR]'H"WjN]wp\,QN`b7s$ZWxĈsG.qaT(&0#:,O'?,^JrA\SI^3iHi)m<(P]0 cH࣭;T;Ž]3w[)Z{]|loϮn)m>n1m:2:-е_|l󾃴`̍k Tdq&.[r9Ѕ% WDg3_eGAwdpu?a_{ǘ];G܈ޠrc#KwipL{&PC_H‡r9bw[pJc<=Q)kj{גј$[H<(cyhe_B+ ,tT㋳pJ9 rgoyzk^r1EQXjՒm^L;Jݞŧ}]ԛtp&_S*]zwmw Q~a,+%ͰPLDnzZY'WNH7(2Mt< CAǹ.~='w endstream endobj 27 0 obj 2133 endobj 29 0 obj <> stream xZˮ+n:,>E`[rfpY K&` O=D臤hGuxXJn8h[!=N~r6:xJ4;p d/_\u YP$oJO밹 NvN! rkO밹 k%ZLN! 2Y:l:(Bہt\t*Y[h{ .& " ᇗ$~ &;qU8.a+mv cf u&o.&44 nLD;:s^aag,TCD7kIp"bp qfe>4b{ FL*>Kf5WP̾.G67,YR+o-1w/'5rUu&-&aVZ2gngd NSn 8G }5^Gu1~wM+0-蘍4  a#\$ZX7\q! r~#؉ LLe|glg?@W;1Jۈ_Fw6gjUiN?it. ,Eԙ`2 #:_qJ0+:KXpLƞ&DxB .'CɤR W%hfp~U Mv%f&q8(F{lњj F+lc0O`|pNkst`t%m'K)|^jSfh|d}U6ǬнH>s!{+-S8q1h°\{o;먻b?p'lqowV.=U|EZЖfc۳66uhཕI::tls-:}Z`T6 Þyv)rɃj[vj:MwUl7p{r;<#mfx|鱎Ai !phDؽe_dQQ,a250 )S)// :+nq5ɒcT$̳.&*g];Ix2װ,Xɇdtj\v98UCzU/wN[dW.uy$Butrilc}xܣ͘9pU=zAv|Z7o>z5$O3_5KR_"\ɾ5tZBv=k/z~:,蹼\󛇙h͵}z":R}=X'r[nkS!t{5UztkڋSDkJg͑=:}*p-7\) bg~{TT9>-(OKzSS=WI92۞tb>șA4V']UzN"tgϼtm+E\B 6սrM;mzsVJ2&n;+p#7* m8^ޑ3'zC=k0ӛzQ3/H&}F_^%Mlo# rʟiZah҃c7o_`s`b,1ݵ^?PywH[oǂߔtS8_?7 endstream endobj 30 0 obj 2283 endobj 32 0 obj <> stream xZˮ#5+fnK\J,;$Ïr;$'u.eg9u4GB '8ޞ?-r)N!4e1@7e:,Sv@xZU9JO밹 %; 0 Xsj;ލ5猵ޭv*9v(W;7{ ?%g@i0w M5.9]nCO'Β*Z ! ($s .O  M0鵟vyE/Rl |e=G2|GMHG$ J9;l&@[d؋Rg1MOwG;vfLf^36x53YYNnze>yOu$~ԓΏ1*ԟウ -8vdOA>OnYj(8cb~+-)-loo,K(|]̋pE-lG Cse҆]vy"Mz]q1F BR<.ah͔wjwM[y9g ԅ?dUdC9 F7>M>'6? s 6%/o/CGM⇙V .S,{l3*-lӆs=g]إqi}&IIMǩW{#A3>?HrhJsĿݽɾ Zh\9a-ɟá_2K>7Cn2CeJ1lmQ4Yd/aLHt2DV7.Mbskl%< "\TOGӼrJ4p.HV簵C:3Knr_~2{ x=XLm |9F<1qoКr̭ɲ04W޷r&DP62փdqoT?B s9~WRV\5)u4;xDf{ 34汊7S;,CDjQ]e`׭S7ga+B i {ڄ鐏QT`|vǕH~F:NQ˅*nG=I yϬ[(d5O%89 JI_Τ3{CH0m"k BnNONwd&a^F@2lq~]b^ |> w/寮iÁyD6 \R~rQ\cR-o(h'5n .Hpi7T)':rvnn:WEww7>мő1Kfq[>;d > stream xXM6W܃ `,C[E[w8#gdY&q8H;3XM%sw';Y9Oij:E_iFN3N>wadB!#7UxRìɄ|8WnY *Y幩3OP0P  'u0:L(aē:fN&+U 0t2O`u:YI N'rVXY "UxRìɈbMZfСpa2⇵O`u:.[Y 2ՀxRìɄBj@+@p5x/afz:l\Wsi vAr\bo6n(Yע-%濕;|C'L&_ueQA ػD7\5ZCS7 N7cF|u7c <0>9p 49穉ZS:+ > mƺDzlVTb=}#Us&XǏLe97*x3&(/ה VIN9]>-7<`~"%@MP].r@/.C{dܻ ̀}\{Jba>6 䟥rm;s/&)tx@}/↑ޅ !V&=׉{E͖@uN֦vQkjK[P5ࣶU zok|4Aĵ-LJhߓ7)ѯtc5ku y[yNsLr (sk m-JվojYm uiwC1ғKzb:w H[J0D.|LƪhplOh93ŢEK6xUf+Xt4Ge*hU\7;)%uwOѪ}!mֺԡ#:>=UON2>mi={[0 une>On+n4{(?}|`*eg>}ǟ*s*+, G_pIb?X>7Í?]ڪ#RLi㖙'v2! y<v~TAg}8Zڱ@gWw|TQ}ǫfǍ p:3qS%,1퉫"+;u}v KSβs<+LBzv#)ߔ+LَtComoW{:58&.*85?m_{?n49_C%71jz!Ӛڏeam{/Z 6<kv`j{ ިcOB?ݧ\ endstream endobj 36 0 obj 1889 endobj 49 0 obj <> stream x|yx\W}΢e4}ѝ]}4ֱŖݒlHK!vą$Q'/-B @4$WC]禴m^Wx~33,~_%=o;#o":82Y}hSC]CQ͜J ̫8:4䡿CA}f!b?ffx=Pj's?qxw/m1_Wf2ƹCս/eY}_,eBYoԢ˷Wײcn} # 0r"\V!W(UjV7MfV.[]p$Z'Ʀֶή޽  3{Q&OȞ |N/L `vrqDd0 : 2 p gpbhŖIw^|qpf$0 g),P"22q|M?/9ϝ?o>tm ^B xDy97H9f\;d]72 'Q֑}V^)HAs6_MHOpKO^̛@ hM~#)JuJ)>J9Xe0qQԹsE-s?ņovș3&Mvn?"PC!+( $*BIXH}Cxj_Eyƫ,FgU[>O"t䐧k=ܪ56U[#bLպNЫ]:SE=ꖠQ֮[i[#0 ϦT|D:A٩v8F bt~u%1p)_..H{J7g0TOumJ8TL +LK s>PC2K32kbofZk:&psv1v͛ca6~0y<3<L@: P*@(q}ntjVޓ>jtcFO?O>tδl3x_8*wu?YY`%wTUlB$Nصcg: ֤((z1yMqJ RvoA\b0AI)Y6/9-F]N82= NEq?=$Giܗ=ָbiѽоӿ}c^p@bk *O՟ok"˱ s{HVV^?َ~C+; Xf`!Wa瀅 uL$QG{>xO>xAd˪p#KvK_#LmoU5^Dr^0OhDѭ8O. |"(P[µDrHd2/f)1mл#ҟ/ښߊldFS]A>H]B#+Ac%_ ctAJVӭ _lN*AA\TONo_"8U#N?7Mw7@tkFמQYʙ6v1tYΠ۰W#kv_G4^=5{Vf(=si`šyrA{ Kh=P`OA"#À2f}4ϯ)^{ۀueWAUwc\6B lO\?ױj@bhm*:9ҵ 2H\Y4P$҆u2H&K27s7-NgɘrbSSװm2A`rhרr3%b<" A s[(莝XXDavtNF#6VB_nsMuRIe͍GڜјT62b& yεo/dl9СC<Rt Z 2N(BN:, lNeXxrC*Lԏ ǛtnGIdrb:.46z;zA{E?[.1V ^ur9a邚5DνeQc-ʟWU*̲'wնeY+'j _~kg*nJMcbjP툐`1E((#2ױ<$`k[4HQ3.e3&vʙI̹GsFF:ܡ*\+|))^!Y$YsH69lQZ]Z/SXC9\+ӰʠFStL_I ul퐽aHf3<;k4| 4j- <,XLCr%C!9|l9{v1OZ_b/]Om=-qy !+{[K8s,!dVL/5U;.G DTt&89+#)F'-#D饛{CrTj:7:f7֊6\ujKUΐZMYSt#_ M.<#D|H"m^ox$t'}G9?o:{>ZӇ & fbK?eaؤӯbF}>S;jZ=5,}քɖiJs{rO2|~Ķn TViyoB $'IOX0}hު|t!O~ `g!&ھ 琓 s}틙\̓u|Z]|-sV%!b:vKOw8;ў`u[Qyj9 awW)j%ޗv{X=JK)o!mIŤz[pK˕꯰V䖊+DvRh~kUUh {aK(y?[B~9կ "_=$P)T/~ѷ ŧJ#R|bwϊBO?L{A w' ;`E/_^U!#1;?x:dOo}75+s6;ܶQ[A*RĵM 7>ٞ-Ʒ_<L.Z@{n wݕG~ :/A jݱ)e, b`ZaS)蘖 8@=/+ՅqO\&^I9?VayPXir22l2?JEhl4dpey@C }RL9X6!+/q-u2d{&Z$x#)D=pgHWӅ:ÏLC1i`)OE tCSFVnils)ݣDة0Fk'rg̙@0n߃DG0N~%%q87(74+. N}7nhbql~QʞVCy+0@R@s$–*x@*I>1=Ij>{>6T]Vhóh5F裐Cl9OJ!_H,}߮Rt\T-TRW,ѹ+aת[dmMAr F_p =my i>pm?H* p+XDQιЯm/4M-pfK|;- ?8pD8'vwtsz kIb)%Z!*{\I1%Xk0=0ʨFGsr?gԷVD8XbӸvi~1mqpP$XRbqS þ.n[}A[0Y/gniHlz̠mШUVh:`wGˉYi/i5$lDd!Jx!c8] ض{U5UkjCf[sa ji9pJ_zJi)ՑHYM-/n H!RЂvzNuA;DQ#v)v(=l'Nyؐ%X_٤~zKeV?оx&w+?+(Q!+ZzSB=sv^3j=:=97ubD o&SIۛx-_5ؚ@k!+b@pV#})cO=r]]nu>,|@qGewA"ՠ;e;cpRS9r?YhЁf@ruLvO|(gg#w:<kaXByVJ'Ժc GjYfLW:SGrmxl҇Xu2%*&c_B aT7ebNv]Ztbߙ j.w4c=uYȽ$ܡFmLViR&fLIj&LnSVu?Pñ#'î._פ7B'$o6w`o&wm.OWxD oui<1Y k͖~O0۪qCY:eɋ4ىF!R\ rN?|sp;;ywiFACw9΄P'l ot :bwύ"?Ga!Np L]p%L`|,Sr[n S*X oZx V7|V?#t .oqm:=cfe:{dg QL]xwߴ|?e7 ]ݕ!&<RMMxh.^)ch&vRVML;zC-CXўZt}>71֘pz껴v-Md`;2L2Kun  FUi&vĬaऄ.wyz^ϟ ` KycòGOƙQl.#%5ITJY nӎe3jF3W]J`0c(uy7s<*35w469yO&ƇG d֘{iN_KE]<}GL-Ir}v YP1Sç5R(h^ Y<2L/7F0eY^&utBu\cA߾!f+jrb zǭE)ŲŻx3_CM?f YX)尚rS?̋rb˹4@%I8@]{ {Zr9=mjc( ;ș_wzqνdd6_b$xcH/[[[]ܑMHx3rR$7UL3#L~կtܥK3\";}~TozMr(vVf9yF-k쪽SĦ߿u.oRW*3Sr_DE}c5-'L\BrDgs<"̫<ٸ鞲cxZl9^~ړL0mTdE>p O)SNZ{cE7Iͧd,#Cfȑܧ y[LM~eH)5 D nO hZ1S@P0r+} ӄn+bCbzo-];^G=ߍм?;p%^4۴J'EWn:JƠr?x]@+'XW{tI0^l|]BtG7?/M C *eDulF*R u5P. O|T>U_hyer}ӭ9&6߽K9N!&dIoc_Ĭgk {sď-5>UՔзƏ+ZUa;=uU Și!9^'^Ù^34p&v[}t<Фլ`uV2Wn1ff9 GV.=Iɦ[}yHŻ9ȃbqzbz }+8HK-iqT*1DZ[JŜ}87u8=pT曚| Sbkܿ roʦP9.}_(m ،(%:Hqc b@i4fP1ߟoj NG+(%::Qf=@BkhB%mz7MA99Y3P5kP '`^Eu0Zaa.CSz$)[#Q L;E2e^dnqY "OtNt]&G;_J$_ '/yWJ^*NFK_/k+{,K6 {@ yjŷ_~SUR**bU j#tkjNi>5i3ڏi_9ut_֛L3D O^2-*ituqzX f40;GaC sG2!QR|2!PX${)\,(@')D.ɷ(6uHUƷC#=@aJ|f+ɷAOPXNHa &),E/p .x娶 0_!wP,2( |/%.A.E "^ M H%prTWy*_5)V"b/UȡQXj_$hW)nR_("(!bRX͑SEp)V~@_)\*eNSTPETߤrV")Fu\B~ _E |/R!A _MA AAa 5 |5OP&A) jSAW( _ _]mٵ 6w-:2Gήod噕ՕFvXmϜ9fpM?1g׳kY?3rjm&ݐWfpvbf6E[;:=][_XY΃#|4DW6fVOd(JD2'+C ӵD(8 ~akRf$rog6}y6Ư@?rjycm!}̩E#@?]GO,-,gw~`5,4eﴎ#ZGzGxh(?:<ܺsw쇷.u$wG.fY]ˮ入Ņlfw'?"c}5;p|a_,ϝ+VkK Dt$y[9][^Xςv`$P;H *bv.K,9X% DZ~q$w.ٍ͜Lċ/ #ٵ`t"H^˞ή/fa{k+̿23y`ʡ (Io*{veV0]SEh j/ZʮeAYPt8F0CƢ /|yRl{.q/rq l|{ೈxOgwSx=ϯpOq o" 5Os_瞇v_ ퟆsW`/kPrf}^/q}f?~M9/B \//q!ae2g iܥ W_gsR^_Q{ƂYERrJvѵ m^"\\~)_N 7J-rmusߕt7IR/ \A-6shm@M-H2 @Ͳ@uh\w{2+0*ΐY&cn@y BՐ&Ћ7 gat.hLp#,a\x`NA0ަwh)% Q~FXB@a >@ajqBB+=@(Y0 /|%R26gz\ZIgI:043A%Ʋ{Jb@䚁,5nwV`_W#X¸-FZ /Ci <uf L?2 w(.~"yXQ#𳨿#q,2:)x񗷌ܷeLvz%1:oQ@4d[gۊqgZ2,u2V`6L~5fS4'=uXkUh%kMa}4 %ﭰ{?;Lv ؏&jpk]k^&󵈢P |Iڈhj&4{^ dja*:?-1:6*رAJT S'-p*v#oQ'MQHiKw;~wh;s.tY٭/9/$?iUr߄3W%/Yߜ PŸN"Ꮷk O\dy0ig endstream endobj 50 0 obj 11245 endobj 51 0 obj <> endobj 52 0 obj <> stream x]n@=O2]D%˒cǒQ>Td/V"\ƓcٷihNqN/]N>|LMLIҶkfͭl==s˰^'}ӶS}8u5};-קqo3z>n~6I|i~2X湓͒CK/4-r1+䊹B~\i튵{-ksWWx_k}cc%9C{d 2sWXWAgal~0`./u~+R:wz~xGLg~ٙG? _j6?4t %̯2?w蕣,`W_֛xk􋎡_ |;O`-~{/:+Q_c~x~ ~w mcb~|S?,DlWb~Vl`]lKǻ`_|${u$ﰮ`J;Mp> endobj 54 0 obj <> stream xZ{P\yv%β "@BB+}e}uwA;i=SO?uPbTqۑ;jxܦmGǓ:%9,YJMW;w};IN:G ōTp{6"J-gYh*Vħ;="U,]0EӘVZ_?Ўk1}xXLAiގ%m~é֠.,aM[wjѶH%3v5"O;z%觓Q| hmUC2{tɩONcw DG.PyEyjhxE'[.HtxUy &/FWݣf|lͯQh̯l+[Ll4gg{aGvtage`#(5aZ3kVgk^6zejfpwvZ O|4Z)}g[òYYٕ[YYA}$Pf nQ=rA97%5\svs7 όSl Q*/`# %TNS12~[k.]R@\u?{tR_"JqɾKT-Ly.G(-(,64`woZRY{J)һ?Wz[GG]E|=V)?]X;wN 5<.{PUp^v*N@.B(B׼H;ҀA{+ؾ̭yXjgGfoۖ2Ok=?Q|ic]g~刯c= ;DQfk=CԱ~]݃xGgs:x4 r%q PuBA!4*rU VwvI jn]Hjyٶoh:dt-K^xcKUts~'B˳޻֪7m Qd.|R-cDx=X_[ {}{TWj>#CnڻkOd폔O9KU卍k8*7zi\6}r\i4]|{m_*-T mG|wlTժˊ'XUⵕ( hrN-#P`nZX4iӑdKmHcu vxrWM ! *aY}ܗD7D"C+ei悱 TX%Y~o@ӠݧŽO>YX ]q]pumťk3-_WSD 1+YH&F>A&,'mI{dԇoms~ٵ6Mފ꒝;9^7VP*_R߄gtYIC(ܮ,l%ZS[Gk7 m6{/[Y;ަCbCKX jQ[*.7jX< Z|nn/S]jiE:ww>lPq< -ZemUVj[^Y]ykFzP2rښe䆄a:p+轪:> eX변OYp໓]PƜf=׬=暕倒2oуyZg؇45дk8<;/g?p[ebQW|hOP.ߟ_;ŹRժ8ݵS Y>oTk ~BПrHcp/B*|Vb Yu$Σ>6IlO#V Qʧ%.*$v)O+/H]Zqsh$Vo X#:yIG۴?FةB]|~*q9 %iFEznC`I<>UIyԤ6үKl&7/!q9(q!;HثdBo<+7*FCv:5ۧ$Σeg$Xb;]qH7%Χ|ąԞ+Kc1t .F\$N̵KMKls۩E$. \&<]8OI >=13O$%oO$ō{%9;=gϒt4e큶@3|g3Y3acd:LYs5.f3g K[43";ff2F,0&{;\Jϙ[Ov 9otr,kĢsm@g/4<4gne!ik3dYç}\2ں]ζqLfv=p4rh,6͸>͒ heMvO"[,oMY=i6\JdQ3㿽)c)ƆTٴdKx4a&nqlʜ^pr!{H A<殅dLXB3τ19VĿlDcƩi`eҝ\:fh̟LGZ'Gǥy4 SKLg$ۡ0  cfv|l=xرHMc&'Ǧ&'eYvdlbQAp*mf2 ,GXԜi>`Ȥ̹BtŌDdɈG3 :"I.D4agQl PُmZcfĈ?p_Mfg$lģl$9uT\631#1Q''a$IE(,M-"-[**͜f'NF'c1#2w4bPIXb)nam[2n;v^]%F 87Ĕ% E%}ڛ[>K'`vkQZ1 н[^hF*tk%ȿ$ՄQ+2laV>/ y1ƒ]y辄yyH^ɅbOt3MQEO;mռہB4Sd1"]x2NIXI!(lf!V|ψ9k~12=b3$Q7+M(4 Xs_X%IdUwCK9I@H$?B/:Aak-@8L~ ̳ATy96OCLwZ Q3,wZэ`)+gO@*3ߢ` Kxrmy3oZpʟK.&O^Yxdc,>76,8b,tqB<ɒ`;Z9)'XbGrzknzu/㊢@l1ѳ. 1o8 FMd`g(QFD?7y9O+Ozx $V0ѐ`-,94lOE;]h=&$bĘVߨX4pn۔X3aD5>EqHcvEa 2QrKudĘ9h-M&KxFdUqe66WUq fhYM5;xZ>Y;Dd+UbD8PfWSı̆Ldzd3ĽY1aeQ#"d!I2QR"9Ί7q!t91!K tbyʜX{ZoƴV ks̍_}PC遛%^˔ ÷G?wހ>  `<ڹ:л!Zޥ@1]O=_ Ûs= -u-vhwcL?f~poG7ZW/ p9f;o:z '[|.K^9eAP+_.(pYQ,\ͬ**V? endstream endobj 55 0 obj 4374 endobj 56 0 obj <> endobj 57 0 obj <> stream x]n0E /Ed I$"Cjؖ1 8m.@g<׬nVI^8:J%,,zT$ͨ+7yo-V, {ٍB@؋`|ݭ| фT09Oyg`ڷ·'x 4µl& eT*Jy #쭗^$!iG._"__s9uԁ9-5B?PZLBR{m o੉ endstream endobj 58 0 obj <> endobj 59 0 obj <> stream xl[u{(K(e?LY$~PR%GmJlYE:D1毒d'mj[:ki ÐСm&'1* %ng?ڡ{{ߥ~Zl {ǽrJ"Nmn)s]4mT:}D l4~a_n%RJOzn;JTЮN{?@O㼝ϧ,5A%}cT6J\wx:c_|]F whmX񏓲%ڨDg*z׳~3H>HEТr) #Iq3 ,(gѰ!hn6p<̳6G=c>(8}|v/TF( ; ;!XxLZxLXT>щ 5 }PMm-_1:p#PS A˺)_UI ᳵ`3'j(4?o\ kl/ҍ5 =QuU[ZW- 0wXpֆ gy;U(Jzm7$*`K>W!Z-mee{uve)sYK{'y%}c#?>>9==uEbZ얛jS(m{B|Q͟oQ,ǎEXmƩw|ʼn9aQez#?VJ(FRvx`!˿|/ǖt2 UEN%`&ي 鬒3ڨZ%\L۔Kެ<,NujɸI XXhB%_\I"g6ߖl#zYr9Է$o-%SڪɸʹMlZRڢ \F%U$;a:?+4% ~!Yd^$ݒ.ɅT^l_ Br1uܒ\BEKidZTrY$:I@]pB~pLB;m-d$4`>s hvUꊼ FѸdorJ.\L y6,NG6>! XW;$#Q?'}a(K:K y?\LR?)9k-HSWiN)՗/AeT\N+x\Z ;ޓ&قw%,c5.k\lOK.Sm-{Ar+)bj/\B]yv:PR)AG?\F+%U|Nrulx^2[dԷ5ɨoŏ$IF}+~&+u:$ݒQ_d蜒::ߔ:!A}+O2[yQ2[dԷ%n?J_Ģ9m#I/dsF"T&9#Mr湹9r({Nl,d kxޞT.JβOғܔ'l<Vi,Y.G9RSX p2[42, fLz663YÎ@ƍI%bI#y.i)rLMp< ,1^UF- 0܃D:+'5 KaOb"n^Y>abK}AiΞYg"i=&,ψ+|*oFA3|ߡ܏H|Xo׃HC21f>mP0< y2'3" f#~rUx$k_a-"eVϻ\Y\1-.z. 9dN6yҐe-A#?ƓߞxD~nj~n "kASqT{o\8epF{Pg1G ;)1pnې1+fyDk4+|̈8ڍ SU!GU#+Ƅ5%4_3*WEZx̯]gv? cbOD! ZM"U|,b:q9>.qnG;g%߻A)暑Gk%$7E26f?H˷i\-^a~sZz;?"a.2 uuyfD%?A;"qQ&bJtNV<=hF{3"6.ZKٕU-5Y[i_k+[gvִZ֫CzJ( ꄖ_iպA.tQQAvlسaM1_ֲ<Svj#F1_ ;ݰ|:.߫ sct{5=Z݉1f;aC?:jb^[Ww|"D\Wly3_oXu#֭OkSfwN맯tE&*_Ҥ\% {h'UQ5uxD`U0E> endobj 62 0 obj <> stream x]j >YN&sA()YB>ѓThTYeBsn;}V`Fy\%€6Ain*r%ܙ6 o1A} 6>>~u g4ΓpbF]NŰ>Z7Pg]QU8! 3!i\QbF)|̬b&cG3ć—1}sKs:lr>nOku%W~y endstream endobj 63 0 obj <> endobj 64 0 obj <> stream xZ}P\ubX]Xea`(bXگ.H8qwUXv'₮o B`ĸy!U8?dfN[rj6ev>Ke*c:4o 'S =Wl>ӳ{^0GeؔLl,+jl_O%ɓ?ݶ$6_M'pΘZ#7FS3$蚴52\XkDQ:^@A課7JWJ8BG[U;&h]%~gWD붠Q(,<$,<-ϠTJ̉ uGutdhZ-OqD MJdfH*#oꅕ!kM,8"`YTIocx3:7ܷW]ioCoZ&;o%bxrL@,Ԏ@]vt9T-\ *V9P G6Z,@{y!"eA;5zZC~mT=uժt,#G53碽ކ pK{p{Џ #ԻL?B#^.V`Hl$%a޲QIzSSm6yj=SQG]O >]O >]_|Z`[,0, >|?&0,/?|MOw$0tOdsB>CC̬N#pz.frZAѶB!{ܹs~2>z.QX'[h&]ZJoE29mq21N2G3 db NJL*L'\ёߧLv"  \&DvVl~bDjbzJ˝GK"M :7`HB,OǺ29LeӅ\Bw73-&鰟AG ^̤i=}K Y}z~r#9-)z:O1\ɬ6 >]rcb-IK$٤ndWT+\.-DҟŻ&G #(#EFP#oӣH8⣧cNS'C:t d9-";ݹCrYzLqu,Lj9Oġ|FKB%ZŔӒHNOwSTcl/rII(nqOg"TGYW^SF4BrIMh!gf_T.w6֔ʫUEz)W}0&_⚝h^U^%^/ڱXy]-V^y.[ؼB/p;rQ?#i$H,fzo7. tgk;9,`-tqR>y"gZ}O||ɭꮛǻ}+Y %!r7M,d,Gyns$ɓ_Qߍςbѱa#OTD/؉ q"S@$oCD';qpI~'!+sL(a:̶.12>k4}8R&yx 2LQfGu9hsM㋸EUd)e6OQ) |hM3lYVOF(|oDuZjOxy;q\EVaRT>N̛%Q>ɭ,zG)o2:J:2y'jO8Ogo&;;usFydqa=QEYtp?7[KqzzDRCQAYB|~H=d=5AnI8c\uu;c݉]z <Rj/VpK]ÃX3]]( j69:D!dǸ.}5B::!WRC*X:UI װ?I2Ws1F<9*X  endstream endobj 65 0 obj 4350 endobj 66 0 obj <> endobj 67 0 obj <> stream x]n0E /EdCCJ)"C%cR-c}ԅљ;\k#V&=[A*XH*~ ">.Q.KD>|orv< fXngc0rzf^$m閭n:Kp-`2ejTRZᲮ+Jekޚy+Zy#I~ \D.?>$}JS4aܰϟ5`>[Wn-&F2 endstream endobj 68 0 obj <> endobj 69 0 obj <> stream x< x[gu|twڎZڔ?.*vphK,۲Ķ\Ik+K+t.PBiy 0-]]X֕62{d1v AaPnvsÖ]Ѵ|o,9'iBQgص Xo"|>?_gךD9/k'n19g23~+@JW|+p _aV0SYkҷ P3>Ǐ+p.rjV/~01vcyô^t^/S|¤pLj}iw1;nv.%qrGݽ +}nۄkwy={36WR~勳e6e+?]7{o |H١܅Z؋>?-ľnRA{#CNv535uWEq1v >{:(u[GQ:]~.q0ϔG}ur&slR)v R;ԷH;:x=|w쐣![oe{ݴnR"y_]%Jwewn@N:vl6G +Ԍp1ۋ'ٽl̲C䭿TyO e>{g ,ꚵ16+?X@4k{%vMySѼBfcgđvSvV? +;.|l6'4b ..zh$J 9,)qcجlB=O*wb6Z^ػ;V;J:?#O5?#On^ݲc} 슦P"n|OWh%7sQRTy^W:B5}n&uS]s"_ȤB3j:Ԝg*zL9ݹbg i䐪B,+եT44 zgN L ( .6.&1S,N1ɧL捂k"Y0"XЧ\V<J2dpX+oZ/4Ȳm)QN\VAZ'|,l$M :Қ,9=Xx 5zjnF`xPciT*4GH+{zJ$l%Be=gI%&T4iqHzR-O2A#m逈Ik߾8`hńNh4 (ZW&9N[)h!3ٴKHR(8DE8եԜL*h$. LidiKE[QNc-8 ͐,rHP!L# ^=a)_ȠIFNKK9N0t"b9B3ΪJΞ0Sj&'tWkFZ%C(Qk-TPTnVhZ:f,t= RUHrGu2@Ų. iN!jǏ9Dɑ)LF(cCrps.)&X90"]6 )Kq.i{]m; -3˄$R'SFʈj>NdtȎ倗R-RMĨt"ݚ(42s$\ʪQMfFREFf0&(aUO̩HaBLR25$#q w!hdGx 4 ڃ1p|kd<."A-G"k,x$*#cG£CύFb8<#x¡D6oi/<p|q"sQchX$Bv4<:E* #cᡭbǣH0= YE D.퐇c[â/ţ`d|t GFE_E P`x$ #!)GD9偡h(X?,p4'H=jb폌BWy$|@8#GQ\'K Bc"+$G}J㍺JɵށP+@(8c \U] =oIvIF uPY!^KYt8٭|a8^Jx9W12nd26) Ν'L5"\fYb*w i<2]H[LZB 5\p)@%TῠySzfa .#N9ղ褾 $aq:TqrZAܩA\:M dzwF\SW+G;|G,TT\X|/ :\uMҘAwS.7뜱~f3eYW,8 >EKL)/%%q4d >ВϜs;X!6N$@,9#M#RWio>a1#}^A vqtm I:j[yGs .4:-ܝC3<=xXhq'u}tԒVZXbI4o)5P$֩yZ/GهU>4Z;6SqT٦Sx"em{eNE+˲}f)\D%Z=ݱC1ǟėAaZ]/P iⴈ 8vvxw|Yxu|KrF&3+(Hf E;~8ʸc+ ~IѐBN{h$E6:4n4'"aqt2M>cZD *t-֑,ӱ5 &,"G$geAxpp]V[i=9Km_e+K4M. I9WBFF&"D90gY(A58rCwSAl\TLCxˍ ֋*s@9A29\k6D]žrµ}c9&7JYJ̸wC]l/==m2'f/FE7L4NL҉,vb0 㢸g:@v Ҏoh܉c1 #n\l;".y6vb!gK#:!NǕqUCoO)v9ɋiT EEVw7ÄOHG]>E ԑ,q#G4=p1gdv%qߑ%D8p81-!8iARgK ,ZYX:]]:|H(Q?+qM{x=" oN'Q#8EE+Ov i$VS[ujy/Q"BaC.8&Y]];8w|bB$H5TtW-N,c_G]zĉrVvR,*Hbdw|a0gY~8;\j ? Jp x{-A9V)oWܕUc;pfW%*Tnްcrn睨ը>wj@TTdvwzUyJwD˻ʸRjAR3khs/x3}PV&R +0m,iOZC d.& z[`{YY'RN_-;ezd3G'irW^:īA+gke+DO^j JbA__T0~x xC_+%:3}%D8;ѾRoNg_o}nŻKSI<ߺKUwjw7Lw/]Qw-f|?L|^{&LLu tije⤃uqh;gwk#r-yueaLJDǧKs:;>:> N+:>KNGZ; Y).>"4:~Zu59f~Hݵg\W~3 O7m l_Sm,,<9>?'=o}cx<<1 #11~`_{6||( FoGR= :Oy؆oߴ6 oñYC(_ k6|`kK6|ц/yƆ6|ֆm8jgZoP>mÑ*GlxTrU^:>j/m8l_I >CݪwǐGm wp PnPw 6U6|pvmzKrpK3|6Qy >h>gkdC㪵J zZh7Y6D6hz GX 6n;w{XgK8 endstream endobj 70 0 obj 5764 endobj 71 0 obj <> endobj 72 0 obj <> stream x]AO 96О&f&=?´؁L)VM<@x7kQ13.qe0HU5fߖsGcl_[2opzqwȁ&8_{'Hj[8=O6=u.;"_mKuw=.:dKƘۭUHw>,K1)t~ڀ[ITߓbک}Ymu endstream endobj 73 0 obj <> endobj 74 0 obj <> stream xWmlS~Ͻ" CRj{ Mf$@wvh&6Ml6a"Im)-6ZRJMab%:mV]KW2_$VZ'nsy?{εe)P ':&k @EstCOˇ#c @Q?2z`؝|L9vM(O@Λ(='Xi4AXØ;QIyL١#{м'bzyOgL(Ob}9qF@ \?.?fHq% +}f*Lsx;Ck6 w2Lhg/1.+x?VI5b05.P0wp pi`4مs8cs3nB'q?_a?pV`|ZatX7/`O_㜻4v{_ Lp1* ;tom[lM7ox%:IBy0Ug8αn `ƽT%S/xv])ktBa9"^JHP\U:S}!j]j*h!UCj!iGi9j{"yї?V9ɫ6gNS,jw\[)H4p:兌1:u`Џ#yyrvbD-RPQOoZUSadjuΐ*i\FJV{Ud&~t{PP'BEYaU0TIsWi&J9=ʫՉ=,j'V_VE7ܖbU]Uk-5w s[PI6ckMaq|/k1mtTGWhr%Jxn)Hms%BEsSkUD5/ԗx%XR_<4NSfXa/3^ގj/ 5O0 Y' BJm4P4>BB NW[F Yap˩: V1$ւj3ǂ ,۪m-4DP2SճYf`"iPMabM,:&@N0be{$E Kqz!67eZ .5 vTLo9sy=g%- `]*-XeO?{%1>y<,cbyi ­ ˵ I`[ 9W#C3Ľogf6T ҽ.[ur6IN{uݹ ,pIx;l:؊g7| &h7}9geA ^xL'_5Z ,xܰ ؕ䡹8-#i `֡ͳC%aYU  \԰ j& /J]Xι)_ )3 W~ 2 P)Ӱ f\zX)аVg5loi5V.k6MK}i WcLb$iWbS9iW2ꢭdiF*q%=]m4W.#ǔ19(M /IQ2r.J%WFʙlTIƔ m-),ֺ6.6BD6dL$i59$sTNcp"p2dr2rq,uL"KDYknL:S]l*қd8hje܁S$ύ`A,gjw͟Jm4(ba%3J4JeF&xVER  e[G(Co~P N‰ hBFF~+BK s_fك^mh0v 2~rh-c2GKԗA=<$>$Зy[(؊$y Z6&UNo}|)~{ADZ&.)%Sm):4zkjzi ඙/.s#/K)ib>m;>-vc٦O\=!XZcrgOLlͰDO&=iVM*9 7*tcǠnu@HVc< L SXml6`q8ڕ-(%,dt"Y|zfkw:p endstream endobj 75 0 obj 3181 endobj 76 0 obj <> endobj 77 0 obj <> stream x]n {bKq,E"?! Zo5q)HKQ13.qe0HU5fߖsGcl[2opq;_#qEkJ8#e0m(> endobj 79 0 obj <> stream xZil[u>6HmKR2m"eZ(/,ZZlEz itTEI"t-} Mt4A4AHI1hjLit=j=IڠJ{|g'T(PwA 㫙XPgwz[*D~-c?PßL~55I1wZm(?DGFuZ{qܞέ[8qk&|kZ8fXFϼ~KX|z b>Tox~INoUꋪ`tn<! Kp&`mp p!c ih!nC^ t~=*kUy"{1ʾ- M>IJ>I[L>IM2i|>ƣ}˗:\DnԎrE.Dz&Qԧ6\'1>v]TV52x-fI5^"77IY4GK0b#v#jߢт<ket&Ɂ[N%zsp5phms[kmȜ+Q i\\c$Kw[;0YD`sXv.[;$!Bf][.5~L< mp[ݹ}ɋNlkK/)8cރqa|rR V\x9¯  wM&&1 m`0:-0o[#U[6\ ^xjzfX]7lqh`X㑘[:;]@⯴io[j=-5A:NN|,x*6}ft tH:LF#xv\rfv- IfIl>?!X5< u9u6Wph Ьfav \ GgGsX޵_V}*wD_{&O7O&w՟尺 Tp n ?:hYz9y %M vdȥQ h!uGR2~yt0Cfԍ3|etjVo?޹3gçLQkJhlckl7 ,Ƴc6hoVRQ GTb&;h;yt `H:3l3;86dYWuussv⩴pI8y$G^uw`τȣ/ ?Epj(;V 8.Զ0ĢkCj*36*8b:Hؚ<ըҷGN}E]yoY,fQuile=:j|Po|.4|VX¿ ^/۵I5Ј_%9BَcW lfOn'=јIKJ y&dDzG=X'*Uߩn긿GO At%0$24}6ط1147vm'.U&:O[rh#H}hNvMcM]}w wj[9p݀Zſ&SnSŃ t=(ޏE[xf˽Fn,u$=+`u )fV">p͔_V7unپ1˱wءt"7Tm9uuv婙cd}FBkMͅ0 X-`[;J (4+Q(4ɾ6*v|Ú6VmmE(i߆ ?xPih IvvJKB [r+!P,-wOKѳV6k2 <6O2oeDM#7_ü[5&{99 ݃4zX`sWwi_NPCffI5 C۸j̖M9x/R߁Ҏ~Mz]|Rh;!:tizw=hX]6!J=z?>oWw8#S#:g[3s5V;]gggѴ]9y}Qíہɋ 5::A; JQl3fjHv?oPr 0ϵV)ϵg.TIkil } 0tDPCvZl?.]f\KvoWcj 𭁛Op[p{^Տu*u*X`$❊ Rd?ʬOZUBTXMjmF=4Wc}G{S+r_yAħnH6?[yv\{RS4U:V7d\Gzd1Lk;rclV+vOW_-zWU'IKʑ̕k_GPܳuqϮZzXVh5u̺֠Bk^Rh_WhxC WOA`#ZtKDk u'DO]Z?S+&[ OZ A_(4>~Z=Rh.6N?upER膚B0cv]SDq2h#џ$ڄtYلD[Iω!}e}[mGD۹].ci!h/vn2GQGv#mD"lG/"Sf!,@˯t]Czv2 D1˖*^ r)W(8w1-.ktcrL,=J:+beYD d/z,%}kٲ/WX ;jO((KTdX` Xr=aIsF \Ʋ SE#J,sSM(gh~>6ΉYKJ:.VlQd1D9Ťg+$E: Pk21Dfj@eXX.G ߚjk)&P;g,)LCUWt\崗$:4syyM\ 'Qᬸ.zR|:jѓB,[/N/L͠٥(]4—XXZ0//NcbE2AR,.Q\!,[1bjŰ"Lҹ9Jx$X6W"ªeWiYE_[;QDżB b^Nh*!WAHfA@;۟)|\.\>KB]rN*:KdS^+OydrN EDEFShW?ȳYUsƗPv||Wq8%BhĹxGE\%EN~LrPµ u,ukq&qtiMfNs&4CVy~*%v"u|Ռe|B:'8eoyx-L-z8SLՌԜXL0GIaN2G*JgdI$F;$z$ Ԟ IǦڗSQ=gY endstream endobj 80 0 obj 4922 endobj 81 0 obj <> endobj 82 0 obj <> stream x]n ;Oq{ؠ]cbn? A<f&=`̘`mwуbV'0)MJ%5J_1sKXTao!x]#78 N>>j̠=H]S c| i}h+x,"9"r He5.ry-(> y(á.[)]Fߣ!nOst~n8u8bßթX kNM߷Ʈt7 endstream endobj 83 0 obj <> endobj 84 0 obj <> stream x|y|[y {x$APH$%َnQZGM$u6ؒmxUMn.'כ_[quıfAr]{3f{HۛgHC6:Bsו<{fcqu!Fm[+wnEHrBGs %a|| 3/H^'Wn( xfV}EH5AԑZ<(A~OF"DRk*:h2[*6{9`(\Ʀdk[{GgWwOo_ؑѩioG:@'VE T $\u kc^F1~p2{eeHrr6pa?v/wS$=;i~^_Ks ;zřR91TL##%H<g`[n3aPݑ8ǦLU5Sqlγc;vUr330Jw/D倳 @0Kjzr\(<}/V^: lhdFIMe|*I9k+n Tfꘇ U =Z$螆P&9#60AEə+HW_)6vfBpp5!̗am+櫰ܥr ~1SWcڎ:"{=0]_ixϞ??z5|D||4n{i(pgpzX Wed.]={?.)eI%3B;%D.t[v 2iRVU"`(G !p" JMUQH PpX2+^ûx5vE:D3|ȃP\vunK1[RQcD161zV`| v[ lܻƴJJzSJ !JJ p$aI'3KxM-Ͼc&*ѓ2x4S"W(v%@gv%u$TA <TofyuUn%}IWp2٠[꼕@iKXX?ˋF_eYcLkZ5fmYq ;1U||<uEbP,%K@-EDµ qz ZW=3|?ND{W+rؠ3g?+gR) TQ G-x]vXM$vG#3D6HZfpYH&y$WjtXxW9O6p8:N4lwtUvyݑHU[);{ע7wQ.-i%iP *'5̢STk1+/qv w?J%ѣ?J̥[c8u}b,y_-k_+AG,}6$ [!9j=D1'k'[kZFZ f2zJ;` 9R>|g'bfq&cU_-( C?<i*#NrvGJuOhUA ׼Ke*OO)UdEzFDZ(uƬs8xCv_Z q>+=||{[3oOtt3kcG]L" PZD \FDzpW tiE4hVG# ~Kq(9ntF )C$2$D i*DX-Xn733R3J S8@Q%`۽ YxE0b}~~S'@<$6h"*El"TdHX4;^1qHV3ʄ>a L|RW=cmqaŦ!N~8x}S n O91p:mnwk4 6/x Nox̺(VYܨe#ְWAoBC;BЈ4&Zс2 {٠^M@T؎AթY|3ː;Ld ؘdtgRHifr ?4 %BI! PZNERjQ j9` 18YcF?pk[Q4+7,9轨ݤYX.Ix O0==ןtu0k>-dKsXFa-THrآ}9lVa!|dOcsga*1hZ~US.kZ_8kMa3o)=%Vw-d Tm\4`bʓvuEm ~?:oۼU9i(/H @L@䖸I*K;HFYP/@raIu.>Qks.#Ο8Tn ut:fUk5į[s]2Y,zK/5' Xd HwIHwxm{8~%caFf2ک./8b_O *! ]KԎ>[A& )Hb"{rE 8 sb&Yi j4;U v[iQ]dGݒzz}92V#.O >ŭwY*2bJQTe3Q F(PJHDp-m$aߺ~#TZ;: ^pg]3ɢ 9ō_9x;i=Vq*춢G*W'Zxgd(eC6m49GƸ֔]m#3xi *C5H2i!FrڨWMP$9qS?jXH ˽MUX(⽒] AlDj騫7TDM}j\186KŽ#nGQ֒.?N6 P]55|-GtR01sD "&[y" (S& q0(eT(*v ѻ`8ge9T(q0}v' zEl]BH/>e, r_ X*\kص;nč/ojҠXg9~fAqv"[åUׄ>xGf@p_08d Uh||چKpR(zzM>/ /7,j3[r66keU,~Bm{/Dm 4-;g#xzv XRhQj1UU^SxʔM+`KYڙ@5a{\K: >򯙋rp6zMH@"AL; x r <{m HCWuw53 ޞ-f8\ÐVָ5h`POq@'Wz✷+d&v/؂@u5o xv_A F)B=Z ;;VUK؊:K3XXmhXM,t^L̽_W :$YB GQwɷʱae=?rjz~@*7?C\* \F<-xMI~眂 g95 k@ǞP@uljķNoNΞd.U8[|eRHW/lw4F|_D_D <'[J"Dd6%Ѡ+d&| g柱|]㣙<)jGM95s7mC)lJvUAUl%6Z$6d%R'xHrgX *J+=R,JJ pt;ς?y O|Ⱦ ͻ.#6w~ 7Tj.ٞ|T8X%emŒ-]ȁ*njHpAOn4aL?0ݺ@l,][%].8aL" VPs@3L%C8y#~o=\Gnim>n X: ؠ*8u=ӡZ6nutnI8]|,ƦC~0M d=݉,b䰽:˳I%$:Nǥ&_g(pCW+<]xKGð~RT\Gğ!a$rњ Y'f- jZI-"9U&]le{%\sЊcԼ= 59]S`e&ʶs%cmqwz>8;O?rل:8yxuHG5@k2冷9\xAgp1Z^xWg{*{dޙpw>r2.N^)|y+b3jf;K dChcKJe(=21 &JdԄocZgθO6XW2 })W'usMtك:tC'*!l\"'[)Uת@yZPP!Bi{:[p=E Э}_7ZKN~r(V@˗RL1>5bQ!0 #\XB'>_pO֨m'@ z/cWU7LU84;\ǀNk޿RMX؀ %~x8\=PP2oܩSWQ WѭzG}GjO, =|/ =?b\Cx03Y<R\S1; ӫ( =6C"<7J}n,zJjz LZL8og 'X=3qk52Jkao 4-D5J"^quBt0RE:5XsbW,Î8xf!$^RBFƼ1$U( ߾(I3m|L|%%]` 3oDwĆ`Ҹ3zJ. yArhKvjN<,W5UU:WFen &̽+,OX&hxC|J$"ߤ͖1)I!nEύ~hnix^]]׽h-WmV- λ |]lBV-{]| LwE>_>NVEe'I+BLzCY#)ҳv͑bC)393$_~$Bxbd/ZG=j?K>\9ŕ5+ʴ&C~h7CXHJ6'Uu(RhB*MCU&TQQ=¼XZ)R<\әcpp;/sJX'ı| {sm:l"o9B/sۃ NEIΉ`lQX}-qo}R.QmeqKu6WO9p O3O ǩ  ѣ^Dϔ!gZWrdZRa89{oH&a W\fW߀÷2Ok@;z.UN^.jىgNLٍv.c\7O]zN4DAqH!V4"HL$D:2*BΨDbB  )vUq~[%gxMgf]-^VIe16a洚vx$b$uvgc1fKuF— | |e3pG惗*;Y+J÷CHٻJ$ Z' :`g4_AoP\d&dşGUh3v$(~䒴q #<(<2h;_v[N0ɘ1 /~Q'!\H|pyheyBY` ~? .ʘ}ٙ&e䁱~y\ .3#0qxhi:"Fa*6aC+9$ dT # ~AI4 p poeڀ>OC;~1?1OI,I~->$}HVXod'RS~gq}t7kXJ,yQW.)w:SRKZNeֲceO/\Ư T1RV=]Ҿ}T}D%Cn ۆ 656n|ySij E@Dԛb-?ӧn3}",1pj#Cz;S\gT/dQ.?(jdt0|$'D;ɒlEX PJj/KT1Koaa ~R0EW$a/rl"\b dVDT┽.j+ 0 k*at%s" CY\߸csyqik~1}atMݱ^b777 {i{{1:|p ί<~;Joa=kjunΧ]AΦֶرٕHojn~5}ݣͭ5Vxy,44-oϯck`iuH.m]I\cyc7ҫsgގkR\[&OmhB:lg׶7[O36wv }0Pn߱X([SgmRTWk[ٵX bG7k!a?Ǣ`m'N>72wz%-Hri?m7"F[hg(|, 8ƺSlvS~votrjoNlHWD<#3`HM/SNoLomՍBM7=.pdk#=|fy][[<;Ho.oPy#VAzyq\zsmymT= 3l@jIm-w7SLVWab8;S30ҥupw@HF,0˟#p vFiSFpgQ?ZCл 9ڷ=n:67A-H\>]<` o[pmB #(#0*ج0j]0_3u!XA:uW} 7]uT8C}F{oQJPGh`<ٛh^ л o1gu?M߭+ +hO2am**u2Vh[5PXTY&i9חH)!>K)]bgNm&6cYf>Y߹nJ2#xsYl@+HS .H4p)'sxS`w)ʗ)&@i~>?Kx<pM=z@ 1dAnit;PIqIX @?H,h}lwa:[V=nlP W)//A#V)-DEwר.B :+$w 3)J`{'hMlBu`,8ED9gnCO`'$iIWPiif42}j'$ѩL Bh endstream endobj 85 0 obj 9177 endobj 86 0 obj <> endobj 87 0 obj <> stream x]͎@ yg#v'a$_$e iHKB8rJ{U:+<g?[}cznfcCz KM[ɾOfSyuߝoE293}Y5S̾Mãk4K˴ cx 3z7v|N)ޟ}HŞQ[ñdetQU$t”ӹ}P7f,'-wZM Wй ӕŔ%5ߠWBs {-;4]5]ˑDGB#ȏ:bu_T/Jh s9_ E~%a@vN B~A$򣾐ߣDnf#PZ=Gj_BzCs3O҇} 9VFA(=(sPzPNXA-z@u<=G~y#G~9.O~E=uf1sz'X̊1'8Y151< roѷ\xXU+&0[hWQ.|#>,- endstream endobj 88 0 obj <> endobj 89 0 obj <> stream xZ{l[y?^E!RDC%QDizKEٖAKĘ"UdL/knA]Z 0PaHtMiA,bj9d9"|=~wsLj5h {n9x&0BGᒹs"4YXY\]ES/㊿C_C[Fs㛗;<mrޯޯELɹHɗch/G]'A{ $Y6ezBꑕd:e+#|wCT>msD*+"uFӗ&sYZQi'Fԏ4:z;Mdt O)C*w.cC4V*s_9+7xŋ'E኷5'o rr// J,h6 m١E9eS-, *I0}HeEMT%k-pS`%Wjpr?.;9?2t:-Hsq&ZG7q`u-nE lI9T!>Ut$'(Eʼ̢Lf XlQf(@U1Y[;S&w*nn1kM~':4\WLlmJd%<*b \|該5j}>c>Tj]UiJ%nŨ{ (CQLłRZ,$dP'n1}-I$zͻ߸F\a7.ZÀ]܅14n[.5q2=X¿+zNCﻳKTWSvD~ԡ2lb: 5PQ:&D (D$f']$RoP+:;&`?Y.Q* O @%l-)LM\̮f<P" yϋ>:#% wj0}Njk{+]Cwo{QʸϹfrF*MD]2(=ֆO=CS͎!PY3W Q9z΁=+&'N>U V6V/5 wPao)^:@.* 5H8L*u[ bU^űd/lsmF&$rޯΧ6)|I[bНBcE+}c%d1*X_8t8y㍝Xﴭ6&+5Ua16ZOr@:f |>ˮB[ZX- I툡`_ V6ʰ =6.sJ౱[͏p#e&+ (w%/ܿhjpTKVڈÜDc]) lsǜ}.\)Pz=#Ձ(G!ߡ$#f[M)z/KguI!vv?0]+.C3\*?O^xψvZpwT~*ҫsu#g|:pdo;HN˨:z?=],73;hUMa_y6P$ʴ_[ fS~ObѰbRp ^c`uĊ,a__l ]m_K{~MV%P P],^<pA^K<jHwt7@2hŰA[2we@1;o':2H>/'EQTóo%rS$;+ɋXM?P~tLЧ=7j׼Mwޏ{Y1Crr6&?m-e}Tʪ&f 'VrJ!I-+l6q?S;VC{';[fm,k66yO }};iPKM5vQ7l' |c>>"B2@%D~]Ocwe_.gƥ7Wpk+ʚSڎd:wm݀{s"f-|y?eE. Tv'?3`cΕ#/׀js,~jOӡV <y`5Z rrh?뾆;~ {r%mk&K)W\&/?&KT)%~2|Tȁ! ^--#pZn"Ѫ@lrQyXHKQ7GA1HiiH+?*E?!wDZ,|@Kψ4F*~^9T'DHC&J(^D1,4Ԓ/4z%O$?i)ZJErko5ʢ"Det ʾ+żGHkPJ) lHcdTiT1恾(pQ}/r![\ʐ`}CHzg$|!.pb.ZI"<9ɬ Ο?arG2Kd*d"C#Q 'WSsQ_%H"M&SL$k77 z33ӎESX2AacK\2qv[Zۗ#ĝ?;7B{wIdRr$u$>,ED`| "IIj"E/3Y~?6sa%:1 Ma#gQ2sD2(Qz.[ɤXܟL-&GdciP* IoO '<CG񞩩0"}$=ddxG1f+h:Mx,:'h:`Jt.#Hbq5Xcij/0r ڋsT"X$dVdnQ{˄h_4 X{XM .{.ǁNҦY2?f1Lm<>$ J } h~GkGE~{ACcɘbz,7P:B~&`.ٜ9FX|~El0 -s)ėe mslnE".YbVIULfSic%YH1N8x)0B%bjw G$}@ Z|Pu)j_)>=1Q&7sS ]*H+#Pe_BA|= endstream endobj 90 0 obj 5238 endobj 91 0 obj <> endobj 92 0 obj <> stream x]n0 srqt3%??Gx\,~d센?%1J}? ?#;3jn1ŢdwN> endobj 94 0 obj <> stream x:ipy-$@"O>1 "KWb?: 3l6pGB]@(xW  '%}F$HerRTiujdXmZu9Ooh #**R_"5#<" S3OcUhq )㡫Yv03O@ (p%%v]Lͯҗf#JdqlGL}.;Cw n$Ip]yf̬]Yqf^q,&?chF.əޚ54{\k/]|ݎ ~*8E.r\  P !$ASO' EȄ*g\{fC ^Cbo^G2"}u;L]-^]ʐa2 PSһ#b^aOe)o]qoR?\tɓλ_/= }q7%sEHv;!վvJ;P tjkہv5:ksXsk%DpXoabf,9dt2u؉M*{l5Cg:dԛ=bQ ikwr%4}5-=`1n6 :\a"ug1}j}FnwGFxJOI2OR‚vIE%h!zFsY-uUzD&V׫n/YȈm59ՠzA]q;I:r`?׫j\G-ھj: y Qmͭm*-߸ۼV7e:O*!cS[Zىg5BZnl< ͽUt}Olru]MT/Cfi`TuCug//64Ɔ*gD"A| lw7YRK|P9L,P/5XӬv6B#r`P!hzͫU"vD}qRzow}%ݠ7 u{$* ^WfJa˔2f$&xu^b:LGxk{ qq?ӕxzČEk5kwƖp3omQB t~a&31cH$"P*萔 I7Y$.dn8j[frb⇎_h_s 9g՟y[~|#j<}{=5?žCP]CtCp.gF.P0YRjq- AOY{GUCAP-pAQMHZg^7{>pP8`{P۔cy8 lOKՈ7?38_"CMcTt|] 6_+fr ]:ײϽttRos9#`+b|uyVڙd fġ{w~-Ahw,K#f^'umeӏ)I)xy9ǶBn~3<wpVt\>X}F#Q{OtwZǾt|?׍_0P@ۙIN^7|CLbضjG܉MHCS#jqG|NRb}Ȩ;'c?LE>FvS٩6(׷*rߦTOTjv/,NL'Jtjjy_)êjXWt=T/{$ψ=;C0*2R9VAsUpL[ s}Xl4 \OT!-/6m!Of|aLԯlPiRrO|MjZ0*|W0)S6) ؽqX@2A o,Gq/Nx4Oud-]NЀ6Ru`3V֡[oan&)IgĨsbp 6Dh}-vNۜv-6=6<&E\NKy,֍#r`…/\❛苷0)XabVN]4^w ~U#ӘWi8ĵ8PhsNsQ)ʅ'K"q؁c-bT*~ySG[7OwvXhf|%0f @m)M;UYJ<Ԭ-؇w D"N)0GPO fPuF7m5ULVgGçq۞FްFz7:0}΄[\NGD4S*KwZ&cUBfTs.ri(rrf[)JQq2N/ Ã~X]X;оCl0.6:;< (=uz< zQjm$M'-hD /S)ҢJW^|Lݙ{7&'ȃ23ܪo9&'-*<)3'[*45WvS ?Зk8TBi ½?ϡ*Z hI['5=?f Ґ,L\aUxfcWG|Zs)J?Pz/9]s,`; ajHͻH }Q{/ 8llpj24WbGjsVqke(y;Xrimr;?LzF[6cuN>m 3$WC:ؼoě-R&h֓M65O{λ&lm3`;Ͽ:qp0[|aُ t%Tvnf%\izDmT%q|ݡzG.{@?)M'φ<vR~EOZxk#$|ܰ D?./m 1Ϡ)&8&<1ρ~ &:QѢF ff.FAgth8v2 fTf-}@ay :d`BcLܘD0Oyf x qc;> %&ϼ ʋZ\+~LcNrRߤjE#+ʞ)GEM\eUUOR5iͽ4/Q h奤5(}ڦ2`yA  bXKzKeV LB6IU\F-`HyfJ`*CC1䯊`ef\q!_,`/?`zAyiZ*Piֈҟ pjQ*x*#3Ȭ?/dlsS)Hfڶ4P( Hv.ϭyֿX,;"s΅SdZx.i2E`^9 ӆr";ZNd\l2-S+|sNL vdBd}bJ!˲$ѹ+gh)ܶs9u:+ /eN6h{γS26WRi6w$ɲ4{(!d<;ɭ9YargŕL}ԙ%v ;x!^ʨHSsJRf.-gp!&92NY~?!)h8(5J2}6YJ\JZLCl V2b!\,s+ ɡ03Q| ʲDIؾDr$dL<4I<Lɉ Yvtdb Ȧ3Tth3Lz>&yfOx̩.I-4L Blz%.$3XAVûK&*,WrI0&bK"l gSp!^ɜ# T^@+("*5(]ft$rŞ|Pe84$sNv ֟kvd()xTT)O._PɺCl%ggY"Kw>CmX1~_LtgAah w-IyL^f+MR9a-[EDKDYj߄3Sd@'m;m!;!~SnoM')pT|1EOO.\dT=.#(нT 0> Ǩ/o^'AJe;yLt%KP%\4 zKDN@0Ah=0BG̏ Q[@2-+ 2`SߗYQn9ud 3^l#O)\,[HſxXV:Kf.%4~_6<(DŽ{)E9+V͖hiqNr7nBg ` gD j$|] u::dZ#E>#k念Wщ3k5AFC endstream endobj 95 0 obj 6341 endobj 96 0 obj <> endobj 97 0 obj <> stream x]n0E|"Z)BjFʢ5HAY뙛RAz| r~J_ny2wO9lv|}bt};]Gl͘qra>Oҷ4y&K8`n>8ޞ'%um::O9UM_e/#ұJ;t|C̳6Nw9%}ل1eE^G&r-+W$))._ W`+|~WS/0ļ\a^z ed!˾NfY,+?.n% Rwr. RÿP'ʬELrF<ԧ?$; \< N/?ZB:?-is>=~#0*} endstream endobj 98 0 obj <> endobj 99 0 obj <> stream x:kp[Wܫ-˒~_ʒ%+#ǎXc7iVb7ZrڔM[ N)( 4,Lΰw?:so=p;GJzK"!X'pĆM~pb6 nmJ:3Qn=9왱L#!H:3m `k0H6Y ͞ l0>B=3deJHhP7{lhfcCh  Cl_D/\zDI8my79{+C=FHOO1O*Q-Ctb`^Q7mjFD0 )EhG2*.DںKH[ʐ D(֤sn܍yE1_~Mw+SzcQ/k}y"~2Ebkx ~|YQ{ZBr--`! yd0 xP@+֔L->#S87jF{njlMͱOv853b" Mc[ǎ%qu>{'r4q[85ҷ]Wo r:]Ky!,zr|o*P !ʛ\*QZUq2)LXm!mk=)p2̱m0#5Hj BMj%H % >q'Cx b9 hiH'6:uC- úƾh}_T*pd6uDl.C25uQ'YlͫjD lD[WUGxRPڟxH$R;۩<FA0x槆?B [ll.<k z=z:96.}]Bu8n&6l] 2:ω}Ba7}rBW%Z`t $gyڢ0xpPO!@>C?vc5ȶdXnLdNJdßrX݇$<j֐˘>]5/qs~?:0-EsnO?c1: ~*ںX@z|I ²bOVÀ_ebԒH% !Al@9dkאCpmz88CC'.5c\1g`i7z5Votn>̈́QM/Xq6-Fm$j 熾 xq}D%HCO1N.AZJh9YZ&1ҥpKZ܌x'mMU@*);Yi\`15q=y}\$5c\_kJ)ddPe ^'ݞި&K2=!сr5^os3 ($5^Us3k/)Ud2G̿@V_ܠ"u Rքx rD|@Ҁlno5Lۭqk<c`lAng3AwL"hߖz.$V#mۥ9XMST.s>~F)Q+%IQk%{R4@hQ4h#+dmqS֤ĘS*ZiTn?v$xIj3L\Gzg0j?/P#!xHXb,{r' @?K!BB191aYS<kN:C@y!q5\:xQtj^S_ʦ7ͦQ+hqtV^UW[4$" bb/rW$1kiEZm$gJ˙KF1A,[og}~K]89h6;U=/u':ᑹ֑iqZm7Ֆc~chy į$@2{8%bhH+0BI 1Y(c$aYˁAՃKz{ڙ`w%i-m̵=r㭷~ 5kKmuvS~j!h" Яu9E>Y*/8Ln]1ˀyڻ/5 &G_8)@ '|}U|C4`pT׻ i:jCCq+CP?*@3hk/Vd2gBF@ 3\,QWBRW :y jk]Mtz,}&ǣݭ?X]CO82֠*+@ |):][eRJy!\h%'$=e pnDn`M<LNm8e*ƪJ<≇]r\5 hݷBFcxL:( >'8NDYQj @=OKe}=YϘͭ Y|nU:6\̗]>k\v|z' ~s/ 66t] + 1L.֫BU'+:$%V|79PIE I`~(n(DʬPj׸4/eeweFIO*™ ;U.2I ZHE'ɓJƨ@4dl`Lªy)wk2*GlT+ ZQJBH|o_5UD$T@e>=Nmu Lvۂ|6\w۝/4;cgEFjgX51e$֓?h4\P ܬWM%^tD#3_!V%:E$_eI7);ɁlOcۮ;u8!I^xҧN{} KV=yG!^w̕\$j"GT^>[wՓL9XV3K[IĹ_ғ$hYE{n- 4vP@c aŽK5Q#W Ck=]jYK6ko_}W 豾r <-Ԁn? |unbkQm)>)EUzYS_Λ [OZ= W2jew?Xct:onI.8Mx5@u[st_D<Ud@daѱTty6^Jd Y>t-Tg.~})_+Ǔw+0:dBTIPf[,DL(EzzDJFSu#q?_XSHdOn vkI.|A8*'8*YJF#ѵzVM'h9*J^MR}Q UhO&cz #)w?[[aknH, W?inh39^AP}%CG: UeQrË|mTμh0XT.\mJy4aZ;Çϴ6t[;8֣>:oNR/>0{7Z t~+jENØj!D)Sf+!r3>_6g?b^InWR,B?uLJOIfm댹PĐWa Xׂ&-w`SĒTvS öpVP4[Z-h]~T\ Nscxwo; }G8%A3"ȶ%oH:YT( /[EICF3+z`KR?V.IM[FIŻ \ߢz:fwDSP;67#[jmǏl9Kotwϭ4Vg-U LuLLT_bw ΂ WVwo!R [3&z+&E[{?~T߃ Cv vʠf L q'Pb;dKI;E.+f7=^c}nT3 wOM^ |uUs6T;TKݾ@ԢowM%@܊>!FU& ]޸pWcņ!4J@C~=_]2XeђHY:PmqjAD%fUkETm~qkEi?bHS+}; ޷Y4͸f)Ǥ:ߤTX;\vzXﭵ]BJ ".O[lY-EUJaދ;~Y2@|m _C: vd< vBeXN_3Dm`I+L֛8PjzOC@ ƍ ꂱ0#;<=O-ZPCVTRU<[u7RE_Tc΃Fd;f9oJP:<8vt;;1;:94&cCCczGg]޹9Bv.¥̝ ɯdgN/r3k3 B ڣ3s3y0 n V+(b5rcɤ3yj. Dnw ƹL<ή.Ch?A穤8bdt}Q3HG}P\I#Ȭbi*%rHU,ՄT$4P=1GvÆL6v^9x7.Ҟf :aMmZ*3?G/_A˧@J%;xзJS&^Ker9$u ,m{!L{Cԫ'` CB Q4a!cYQ>޲N~ZcҸJX"932<3 Nӑ2H| gDX.QY,_E,Q^n+g:G.S=b 6+$Ă_4)O9&E)XJmAKFł.žhO| 6 0A c}EBspc$ BDŸ_D''71M(B ܏ endstream endobj 100 0 obj 6529 endobj 101 0 obj <> endobj 102 0 obj <> stream x]n0E /%~E$} T guI9}CsYtk=L7 p]"hf+natf]7Eiwضŷ{w֧8~,,E ]8+4 b aϜ#^XfĆW5?GOvABL$[eMu7[$XWDAOz?ޥbw)MW쯩-b``D0?; : ;/ÈS$D endstream endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 19 0 obj <>/Contents 20 0 R>> endobj 22 0 obj <>/Contents 23 0 R>> endobj 25 0 obj <>/Contents 26 0 R>> endobj 28 0 obj <>/Contents 29 0 R>> endobj 31 0 obj <>/Contents 32 0 R>> endobj 34 0 obj <>/Contents 35 0 R>> endobj 48 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 106 0 obj <> endobj 107 0 obj < /Producer /CreationDate(D:20180419160056+02'00')>> endobj xref 0 108 0000000000 65535 f 0000106174 00000 n 0000000019 00000 n 0000003518 00000 n 0000106372 00000 n 0000003539 00000 n 0000006551 00000 n 0000106542 00000 n 0000006572 00000 n 0000009623 00000 n 0000106687 00000 n 0000009644 00000 n 0000012471 00000 n 0000106852 00000 n 0000012493 00000 n 0000014567 00000 n 0000106999 00000 n 0000014589 00000 n 0000016403 00000 n 0000107146 00000 n 0000016425 00000 n 0000018253 00000 n 0000107311 00000 n 0000018275 00000 n 0000020655 00000 n 0000107458 00000 n 0000020677 00000 n 0000022883 00000 n 0000107605 00000 n 0000022905 00000 n 0000025261 00000 n 0000107770 00000 n 0000025283 00000 n 0000027568 00000 n 0000107917 00000 n 0000027590 00000 n 0000029552 00000 n 0000108241 00000 n 0000108361 00000 n 0000108479 00000 n 0000108596 00000 n 0000108711 00000 n 0000108830 00000 n 0000108945 00000 n 0000109062 00000 n 0000109181 00000 n 0000109300 00000 n 0000109419 00000 n 0000108064 00000 n 0000029574 00000 n 0000040906 00000 n 0000040929 00000 n 0000041133 00000 n 0000041816 00000 n 0000042349 00000 n 0000046809 00000 n 0000046831 00000 n 0000047033 00000 n 0000047386 00000 n 0000047602 00000 n 0000051758 00000 n 0000051780 00000 n 0000051981 00000 n 0000052300 00000 n 0000052489 00000 n 0000056925 00000 n 0000056947 00000 n 0000057153 00000 n 0000057497 00000 n 0000057709 00000 n 0000063560 00000 n 0000063582 00000 n 0000063777 00000 n 0000064068 00000 n 0000064229 00000 n 0000067496 00000 n 0000067518 00000 n 0000067715 00000 n 0000068006 00000 n 0000068172 00000 n 0000073180 00000 n 0000073202 00000 n 0000073395 00000 n 0000073731 00000 n 0000073927 00000 n 0000083191 00000 n 0000083213 00000 n 0000083416 00000 n 0000084075 00000 n 0000084572 00000 n 0000089896 00000 n 0000089918 00000 n 0000090119 00000 n 0000090546 00000 n 0000090830 00000 n 0000097258 00000 n 0000097280 00000 n 0000097482 00000 n 0000097972 00000 n 0000098314 00000 n 0000104931 00000 n 0000104954 00000 n 0000105162 00000 n 0000105640 00000 n 0000105979 00000 n 0000106117 00000 n 0000109538 00000 n 0000109637 00000 n trailer < ] /DocChecksum /912E0DCBB788FFC271BA6869E0D7714F >> startxref 109813 %%EOF libnumbertext-1.0.8/idl/000077500000000000000000000000001416364754400151725ustar00rootroot00000000000000libnumbertext-1.0.8/idl/XNumberText.idl000066400000000000000000000011121416364754400201040ustar00rootroot00000000000000#ifndef org_openoffice_addin_sample_XNumberText #define org_openoffice_addin_sample_XNumberText #include #include module org { module numbertext { interface XNumberText : com::sun::star::uno::XInterface { string numbertext( [in] com::sun::star::beans::XPropertySet prop, [in] string num, [in] any lang ); string moneytext( [in] com::sun::star::beans::XPropertySet prop, [in] string num, [in] any currency, [in] any lang ); }; }; }; #endif libnumbertext-1.0.8/idl/XNumberText.urd000066400000000000000000000200001416364754400201230ustar00rootroot00000000000000CSMH|hCSMH|h"XL1s#yF7{0ε c0 lNq):ryF7{):ry NDyF7{ b Ϳy 2< b6a3J"NDy org2< bCjF7{0@$VL_valueee3.4Vx. org bv =-ε c0 numbertext2< b nT 1@OuF7{):ry@$VL_value[ȗ>94Vx9 org/numbertext bw>xlNq):ry XNumberText2< bUu[F7{@$VL_valuezI4Vx! org/numbertext/XNumberText" com/sun/star/uno/XInѧterface numbertext string& com/sun/star/beans/XPropertySet prop string num any lang moneytext string& com/sun/star/beans/XPropertySet prop string num any currency any lang   &  libnumbertext-1.0.8/idl/buildrdb.sh000077500000000000000000000004471416364754400173250ustar00rootroot00000000000000# use this on linux with ooo build env idlc -I $SOLARVER/$INPATH/idl XNumberText.idl regmerge ../rdb/sample.rdb /UCR XNumberText.urd rem use this on windows with ooo build env rem guw.pl idlc -I $SOLARVER/$INPATH/idl XNumberText.idl rem guw.pl regmerge ../rdb/sample.rdb /UCR XNumberText.urd libnumbertext-1.0.8/java/000077500000000000000000000000001416364754400153435ustar00rootroot00000000000000libnumbertext-1.0.8/java/.gitignore000066400000000000000000000000601416364754400173270ustar00rootroot00000000000000.classpath .project .settings/ *.class /target/ libnumbertext-1.0.8/java/Makefile000066400000000000000000000006131416364754400170030ustar00rootroot00000000000000all: mkdir -p org/numbertext/data cp ../data/*.sor org/numbertext/data cp -r src/main/org/numbertext/*.java org/numbertext CLASSPATH=. javac -encoding utf8 org/numbertext/Numbertext.java jar cfm numbertext.jar Manifest.txt org java -jar numbertext.jar check: java -jar numbertext.jar -l en 99-101 java -jar numbertext.jar -l en-GB 99-101 java -jar numbertext.jar -p ordinal -l en 1-10 libnumbertext-1.0.8/java/Manifest.txt000066400000000000000000000001441416364754400176510ustar00rootroot00000000000000Main-Class: org.numbertext.Numbertext Implementation-Version: 1.0.8 Implementation-Date: 2021-12-31 libnumbertext-1.0.8/java/pom.xml000066400000000000000000000044201416364754400166600ustar00rootroot00000000000000 4.0.0 org.numbertext numbertext jar 1.0.8 numbertext http://numbertext.org 1.8 1.8 UTF-8 UTF-8 3.1.2 3.1.0 target/data data maven-resources-plugin ${version.maven-resources-plugin} copy-resources validate copy-resources ${basedir}/target/data ${basedir}/../data true org.apache.maven.plugins maven-jar-plugin ${version.maven-jar-plugin} numbertext org.numbertext.Numbertext true true 2018-10-09 GNU LGPL/BSD dual-license libnumbertext-1.0.8/java/src/000077500000000000000000000000001416364754400161325ustar00rootroot00000000000000libnumbertext-1.0.8/java/src/main/000077500000000000000000000000001416364754400170565ustar00rootroot00000000000000libnumbertext-1.0.8/java/src/main/org/000077500000000000000000000000001416364754400176455ustar00rootroot00000000000000libnumbertext-1.0.8/java/src/main/org/numbertext/000077500000000000000000000000001416364754400220425ustar00rootroot00000000000000libnumbertext-1.0.8/java/src/main/org/numbertext/MenuState.java000066400000000000000000000001151416364754400246070ustar00rootroot00000000000000package org.numbertext; public enum MenuState { PARAM, LANGUAGE, PREFIX; } libnumbertext-1.0.8/java/src/main/org/numbertext/Numbertext.java000066400000000000000000000077271416364754400250570ustar00rootroot00000000000000/* See numbertext.org * 2009-2010 (c) László Németh * License: LGPL/BSD dual license */ package org.numbertext; import static org.numbertext.MenuState.LANGUAGE; import static org.numbertext.MenuState.PARAM; import static org.numbertext.MenuState.PREFIX; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Numbertext { private static final Pattern LANG_PATTERN_NO = Pattern.compile("n[bn]([-_]NO)?"); private static Map modules = new HashMap(); private static Soros load(String langfile, String langcode) { final Soros s; try (InputStream input = Numbertext.class.getResourceAsStream("data/" + langfile + ".sor"); BufferedReader f = new BufferedReader(new InputStreamReader(input, "UTF-8"));) { final StringBuilder builder = new StringBuilder(); String line = null; while ((line = f.readLine()) != null) { builder.append(line); builder.append("\n"); } s = new Soros(builder.toString(), langcode); if (modules != null && langfile != null) { modules.put(langcode, s); } } catch (Exception e) { return null; } return s; } public static String numbertext(String input, String lang) { Soros s = (Soros) modules.get(lang); if (s == null) { s = load(lang.replace('-', '_'), lang); } if (s == null) { s = load(lang.replaceFirst("[-_].*", ""), lang); } if (s == null) { // some exceptional language codes // Norwegian.... Matcher m = LANG_PATTERN_NO.matcher(lang); if (m.find()) { s = load(m.replaceAll("no"), lang); } } if (s == null) { System.out.println("Missing language module: " + lang); return null; } return s.run(input); } public static String moneytext(String input, String money, String lang) { return numbertext(money + " " + input, lang); } private static void printHelp() { System.out.println("Usage: java soros [-l lang] [-p prefix_function] [par1 [par2...]]"); System.out.println("Parameter: n: number; n-m: range; n-m~s: range with step"); System.out.println("Example: java -jar numbertext.jar -l en_US 99 # spell out number 99 in English"); System.out.println(" # spell out different ordinal numbers and number ranges"); System.out.println(" java -jar numbertext.jar -l en_US -p ordinal 1-10 500 1000-10000~1000"); System.out.println(" java -jar numbertext.jar -l en_US # print prefix functions of the language module"); System.out.println("License: GNU LGPL/BSD dual-license"); } public static void main(String[] args) { String lang = "en_US"; if (args.length == 0) { printHelp(); return; } MenuState state = PARAM; boolean missingNumbers = true; String prefix = ""; for (int i = 0; i < args.length; i++) { switch (state) { case PARAM: if (args[i].equals("-l")) { state = LANGUAGE; break; } else if (args[i].equals("-p")) { state = PREFIX; break; } else { missingNumbers = false; int idx = args[i].indexOf('-', 1); if (idx > -1) { int b = Integer.parseInt(args[i].substring(0, idx)); String e = args[i].substring(idx + 1); int step = e.indexOf('~', idx); int end; if (step > -1) { end = Integer.parseInt(e.substring(0, step)); step = Integer.parseInt(e.substring(step + 1)); } else { step = 1; end = Integer.parseInt(e); } for (int j = b; j <= end; j = j + step) { System.out.println(numbertext(prefix + j, lang)); } } else { System.out.println(numbertext(prefix + args[i], lang)); } } break; case LANGUAGE: lang = args[i]; if (numbertext("1", lang) == null) { System.exit(1); } state= PARAM; break; case PREFIX: prefix = args[i] + " "; state = PARAM; break; } } if (missingNumbers) { System.out.println(numbertext("help", lang)); } } } libnumbertext-1.0.8/java/src/main/org/numbertext/Soros.java000066400000000000000000000125131416364754400240140ustar00rootroot00000000000000/* Soros interpreter (see numbertext.org) * 2009-2010 (c) László Németh * License: LGPL/BSD dual license */ package org.numbertext; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.ArrayList; import java.util.List; public class Soros { private List patterns = new ArrayList(); private List values = new ArrayList(); private List begins = new ArrayList(); private List ends = new ArrayList(); private static String m = "\\\";#"; private static String m2 = "$()|[]"; private static String c = "\uE000\uE001\uE002\uE003"; private static String c2 = "\uE004\uE005\uE006\uE007\uE008\uE009"; private static String slash = "\uE000"; private static String pipe = "\uE003"; // pattern to recognize function calls in the replacement string private static Pattern func = Pattern.compile(translate("(?:\\|?(?:\\$\\()+)?" + // optional nested calls "(\\|?\\$\\(([^\\(\\)]*)\\)\\|?)" + // inner call (2 subgroups) "(?:\\)+\\|?)?", // optional nested calls m2.substring(0, c.length()), c, "\\")); // \$, \(, \), \| -> \uE000..\uE003 public Soros(String source, String lang) { source = translate(source, m, c, "\\"); // \\, \", \;, \# -> \uE000..\uE003 // switch off all country-dependent lines, and switch on the requested ones source = source.replaceAll("(^|[\n;])([^\n;#]*#[^\n]*\\[:[^\n:\\]]*:][^\n]*)", "$1#$2") .replaceAll("(^|[\n;])#([^\n;#]*#[^\n]*\\[:" + lang.replace('_', '-') + ":][^\n]*)", "$1$2") .replaceAll("(#[^\n]*)?(\n|$)", ";"); // remove comments if (source.indexOf("__numbertext__") == -1) { source = "__numbertext__;" + source; } String replacement = "\"([a-z][-a-z]* )?0+(0|[1-9]\\d*)\" $(\\1\\2);"; // default left zero deletion replacement += "\"\uE00A(.*)\uE00A(.+)\uE00A(.*)\" \\1\\2\\3;"; // separator function replacement += "\"\\\"\\uE00A.*\\uE00A\\uE00A.*\\\"\");"; // no separation, if subcall returns with empty string source = source.replace("__numbertext__", replacement); final Pattern p = Pattern.compile("^\\s*(\"[^\"]*\"|[^\\s]*)\\s*(.*[^\\s])?\\s*$"); final Pattern macro = Pattern.compile("== *(.*[^ ]?) =="); String prefix = ""; for (String s : source.split(";")) { Matcher matchmacro = macro.matcher(s); if (matchmacro.matches()) { prefix = matchmacro.group(1); continue; } Matcher sp = p.matcher(s); if (!prefix.isEmpty() && !s.isEmpty() && sp.matches()) { s = sp.group(1).replaceFirst("^\"", "").replaceFirst("\"$", ""); s = "\"" + (s.startsWith("^") ? "^" : "") + prefix + (s.isEmpty() ? "" : " ") + s.replaceFirst("^\\^", "") + "\" " + sp.group(2); sp = p.matcher(s); } if (!s.isEmpty() && sp.matches()) { s = translate(sp.group(1).replaceFirst("^\"", "").replaceFirst("\"$", ""), c.substring(1), m.substring(1), ""); s = s.replace(slash, "\\\\"); // -> \\, ", ;, # String s2 = ""; if (sp.group(2) != null) { s2 = sp.group(2).replaceFirst("^\"", "").replaceFirst("\"$", ""); } s2 = translate(s2, m2, c2, "\\"); // \$, \(, \), \|, \[, \] -> \uE004..\uE009 // call inner separator: [ ... $1 ... ] -> $(\uE00A ... \uE00A$1\uE00A ... ) s2 = s2.replaceAll("^\\[[$](\\d\\d?|\\([^\\)]+\\))", "\\$(\uE00A\uE00A|\\$$1\uE00A"); // add "|" s2 = s2.replaceAll("\\[([^$\\[\\\\]*)[$](\\d\\d?|\\([^\\)]+\\))", "\\$(\uE00A$1\uE00A\\$$2\uE00A"); s2 = s2.replaceAll("\uE00A\\]$", "|\uE00A)"); // add "|" in terminating position s2 = s2.replaceAll("\\]", ")"); s2 = s2.replaceAll("(\\$\\d|\\))\\|\\$", "$1||\\$"); // $()|$() -> $()||$() s2 = translate(s2, c, m, ""); // \uE000..\uE003-> \, ", ;, # s2 = translate(s2, m2.substring(0, c.length()), c, ""); // $, (, ), | -> \uE000..\uE003 s2 = translate(s2, c2, m2, ""); // \uE004..\uE009 -> $, (, ), |, [, ] s2 = s2.replaceAll("[$]", "\\$"); // $ -> \$ s2 = s2.replaceAll("\uE000(\\d)", "\uE000\uE001\\$$1\uE002"); // $n -> $(\n) s2 = s2.replaceAll("\\\\(\\d)", "\\$$1"); // \[n] -> $[n] s2 = s2.replace("\\n", "\n"); // \n -> [new line] patterns.add(Pattern.compile("^" + s.replaceFirst("^\\^", "").replaceFirst("\\$$", "") + "$")); begins.add(s.startsWith("^")); ends.add(s.endsWith("$")); values.add(s2); } } } public String run(String input) { return run(input, true, true); } private String run(String input, boolean begin, boolean end) { for (int i = 0; i < patterns.size(); i++) { if ((!begin && begins.get(i)) || (!end && ends.get(i))) { continue; } Matcher m = patterns.get(i).matcher(input); if (!m.matches()) { continue; } String s = m.replaceAll(values.get(i)); Matcher n = func.matcher(s); while (n.find()) { boolean b = false; boolean e = false; if (n.group(1).startsWith(pipe) || n.group().startsWith(pipe)) { b = true; } else if (n.start() == 0) { b = begin; } if (n.group(1).endsWith(pipe) || n.group().endsWith(pipe)) { e = true; } else if (n.end() == s.length()) { e = end; } s = s.substring(0, n.start(1)) + run(n.group(2), b, e) + s.substring(n.end(1)); n = func.matcher(s); } return s; } return ""; } private static String translate(String s, String chars, String chars2, String delim) { for (int i = 0; i < chars.length(); i++) { s = s.replace(delim + chars.charAt(i), "" + chars2.charAt(i)); } return s; } } libnumbertext-1.0.8/libnumbertext.pc.in000066400000000000000000000005621416364754400202420ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ datarootdir=@datarootdir@ datadir=@datadir@ pkgdatadir=${datarootdir}/libnumbertext Name: libnumbertext Description: Library implementing Soros based Number to Number Name conversion Version: @VERSION@ Requires: Libs: -L${libdir} -lnumbertext-1.0 Cflags: -I${includedir}/libnumbertext/ libnumbertext-1.0.8/m4/000077500000000000000000000000001416364754400147425ustar00rootroot00000000000000libnumbertext-1.0.8/m4/ax_boost_base.m4000066400000000000000000000325661416364754400200300ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Test for the Boost C++ libraries of a particular version (or newer) # # If no path to the installed boost library is given the macro searchs # under /usr, /usr/local, /opt and /opt/local and evaluates the # $BOOST_ROOT environment variable. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) # # And sets: # # HAVE_BOOST # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2009 Peter Adolphs # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 43 # example boost program (need to pass version) m4_define([_AX_BOOST_BASE_PROGRAM], [AC_LANG_PROGRAM([[ #include ]],[[ (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); ]])]) AC_DEFUN([AX_BOOST_BASE], [ AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], [use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ AS_CASE([$withval], [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], [AS_HELP_STRING([--with-boost-libdir=LIB_DIR], [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.])], [ AS_IF([test -d "$withval"], [_AX_BOOST_BASE_boost_lib_path="$withval"], [AC_MSG_ERROR([--with-boost-libdir expected directory name])]) ], [_AX_BOOST_BASE_boost_lib_path=""]) BOOST_LDFLAGS="" BOOST_CPPFLAGS="" AS_IF([test "x$want_boost" = "xyes"], [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) AC_SUBST(BOOST_CPPFLAGS) AC_SUBST(BOOST_LDFLAGS) ]) # convert a version string in $2 to numeric and affect to polymorphic var $1 AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], [AC_MSG_ERROR([You should at least specify libboost major version])]) _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) ]) dnl Run the detection of boost should be run only if $want_boost AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) succeeded=no AC_REQUIRE([AC_CANONICAL_HOST]) dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! AS_CASE([${host_cpu}], [x86_64],[libsubdirs="lib64 libx32 lib lib64"], [ppc64|s390x|sparc64|aarch64|ppc64le],[libsubdirs="lib64 lib lib64"], [libsubdirs="lib"] ) dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. AS_CASE([${host_cpu}], [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] ) dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ AC_MSG_RESULT([yes]) BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ AC_MSG_RESULT([yes]) BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; break; ], [AC_MSG_RESULT([no])]) done],[ AC_MSG_RESULT([no])]) ],[ if test X"$cross_compiling" = Xyes; then search_libsubdirs=$multiarch_libsubdir else search_libsubdirs="$multiarch_libsubdir $libsubdirs" fi for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then for libsubdir in $search_libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done ]) dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"], [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"]) AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes" ; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then BOOST_LDFLAGS= fi _version=0 if test -n "$_AX_BOOST_BASE_boost_path" ; then if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done dnl if nothing found search for layout used in Windows distributions if test -z "$BOOST_CPPFLAGS"; then if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" fi fi dnl if we found something and BOOST_LDFLAGS was unset before dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here. if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then for libsubdir in $libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" fi fi else if test "x$cross_compiling" != "xyes" ; then for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp best_path=$_AX_BOOST_BASE_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test -n "$BOOST_ROOT" ; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) fi if test "x$succeeded" != "xyes" ; then if test "x$_version" = "x0" ; then AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" ]) libnumbertext-1.0.8/m4/ax_boost_regex.m4000066400000000000000000000101651416364754400202170ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_boost_regex.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_REGEX # # DESCRIPTION # # Test for Regex library from the Boost C++ libraries. The macro requires # a preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_REGEX_LIB) # # And sets: # # HAVE_BOOST_REGEX # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2008 Michael Tindal # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 23 AC_DEFUN([AX_BOOST_REGEX], [ AC_ARG_WITH([boost-regex], AS_HELP_STRING([--with-boost-regex@<:@=special-lib@:>@], [use the Regex library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-regex=boost_regex-gcc-mt-d-1_33_1 ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_regex_lib="" else want_boost="yes" ax_boost_user_regex_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::Regex library is available, ax_cv_boost_regex, [AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[boost::regex r(); return 0;]])], ax_cv_boost_regex=yes, ax_cv_boost_regex=no) AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_regex" = "xyes"; then AC_DEFINE(HAVE_BOOST_REGEX,,[define if the Boost::Regex library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_regex_lib" = "x"; then for libextension in `ls $BOOSTLIBDIR/libboost_regex*.so* $BOOSTLIBDIR/libboost_regex*.dylib* $BOOSTLIBDIR/libboost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_regex.*\)\.so.*$;\1;' -e 's;^lib\(boost_regex.*\)\.dylib.*;\1;' -e 's;^lib\(boost_regex.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], [link_regex="no"]) done if test "x$link_regex" != "xyes"; then for libextension in `ls $BOOSTLIBDIR/boost_regex*.dll* $BOOSTLIBDIR/boost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_regex.*\)\.dll.*$;\1;' -e 's;^\(boost_regex.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], [link_regex="no"]) done fi else for ax_lib in $ax_boost_user_regex_lib boost_regex-$ax_boost_user_regex_lib; do AC_CHECK_LIB($ax_lib, main, [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], [link_regex="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the Boost::Regex library!) fi if test "x$link_regex" != "xyes"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) libnumbertext-1.0.8/pkg-desc/000077500000000000000000000000001416364754400161175ustar00rootroot00000000000000libnumbertext-1.0.8/pkg-desc/pkg-description.txt000066400000000000000000000006221416364754400217620ustar00rootroot00000000000000Usage =numbertext(5) -> "five" =numbertext(5;"de") -> "fünf" =moneytext(5;"USD") -> "five dollars" =moneytext(5;"HUF";"hu") -> "öt forint" Help for extra functions and modules of the default language: =numbertext("help") Examples for using extra functions: =moneytext(1; "ord"; "en") (English ordinal numbers) -> "first" =moneytext(999; "ord2"; "en") (English ordinal abbreviations) -> "1st" libnumbertext-1.0.8/pythonpath/000077500000000000000000000000001416364754400166205ustar00rootroot00000000000000libnumbertext-1.0.8/pythonpath/Makefile000066400000000000000000000020331416364754400202560ustar00rootroot00000000000000# convert all ../data/*.sor files to name_*.py Python modules BIN=../bin all: org/Numbertext/Soros.py org/Numbertext/places.py org/Numbertext/locales.py \ $(addprefix numbertext_, $(addsuffix .py, $(basename $(notdir $(wildcard ../data/*.sor))))) org/Numbertext/Soros.py: ../src/Soros.py cp ../src/Soros.py org/Numbertext/ org/Numbertext/places.py: ../src/places.py cp ../src/places.py org/Numbertext/ #org/Numbertext/%.py: ../data/%.sor $(BIN)/Convert.py numbertext_%.py: ../data/%.sor $(BIN)/Convert.py python $(BIN)/Convert.py $< >$@ org/Numbertext/locales.py: $(addprefix numbertext_, $(addsuffix .py, $(basename $(notdir $(wildcard ../data/*.sor))))) python $(BIN)/locales.py $(basename $(notdir $(wildcard ../data/*.sor))) $(shell cat ../data/*.sor | grep -Eo '\[:.....:]' | tr '-' '_' | tr -d '[]:' | sort | uniq) >org/Numbertext/locales.py clean: rm -f $(addprefix numbertext_, $(addsuffix .py, $(basename $(notdir $(wildcard ../data/*.sor))))) rm -f org/Numbertext/places.py* org/Numbertext/locales.py* org/Numbertext/Soros.py* libnumbertext-1.0.8/pythonpath/org/000077500000000000000000000000001416364754400174075ustar00rootroot00000000000000libnumbertext-1.0.8/pythonpath/org/Numbertext/000077500000000000000000000000001416364754400215445ustar00rootroot00000000000000libnumbertext-1.0.8/pythonpath/org/Numbertext/__init__.py000066400000000000000000000127041416364754400236610ustar00rootroot00000000000000import uno import unohelper import re from org.numbertext import XNumberText from com.sun.star.lang import Locale from org.Numbertext import Soros from org.Numbertext.locales import locales from org.Numbertext.places import places # constant MINUS = "[-\u2212]" # ASCII hyphen/minus or Unicode minus sign langname = {} # loaded patterns patterns = {} class NUMBERTEXT( unohelper.Base, XNumberText): def __init__(self, ctx): sLocaleData = "com.sun.star.i18n.LocaleData" self.LocaleData = ctx.ServiceManager.createInstance(sLocaleData) sProvider = "com.sun.star.configuration.ConfigurationProvider" sAccess = "com.sun.star.configuration.ConfigurationAccess" aConfigProvider = ctx.ServiceManager.createInstance(sProvider) prop = uno.createUnoStruct('com.sun.star.beans.PropertyValue') prop.Name = "nodepath" prop.Value = "/org.openoffice.Setup/L10N" self.aSettings = aConfigProvider.createInstanceWithArguments(sAccess,(prop,)) self.uilocale = self.aSettings.getByName("ooLocale") self.locale = Locale("en", "US", "") self.func = ctx.ServiceManager.createInstance('com.sun.star.sheet.FunctionAccess') for i in locales: langname[i.split("_")[0]] = i def queryLocale(self, prop, loc): if loc != None: a = loc.split("-") if len(a) == 1: return Locale(a[0], "", "") if len(a) == 2: return Locale(a[0], a[1], "") else: return Locale(a[0], a[1], a[2]) locale = prop.getPropertyValue("CharLocale") if locale != None and locale.Language != "zxx": return locale return Locale("en", "US", "") # set module name for importing locale data def getModule(self, Language, Country, Variant): global patterns if Country == "": module = Language if Variant == "": module = Language + "_" + Country else: module = Language + "_" + Country + "_" + Variant if not module in locales: module = Language + "_" + Country if not module in locales: module = Language if not module in locales: try: module = langname[Language] except: module = "en_US" if not module in patterns: try: d = __import__("numbertext_" + module) except: try: d = __import__("numbertext_" + Language) except: return "Error: missing language data (" + module + ")" patterns[module] = Soros.compile(d.__doc__, module.replace("_", "-")) return module def getCurrency(self, locale): allcurr = self.LocaleData.getAllCurrencies(locale) if allcurr != None: struct = uno.createUnoStruct("com.sun.star.i18n.Currency") for struct in allcurr: if struct.Default: return struct return None # XNumberText method implementations def moneytext(self, prop, num, curr, loc): global patterns num = num.strip() # query document language locale = self.queryLocale(prop, loc) mod = self.getModule(locale.Language, locale.Country, locale.Variant) decimalplaces = 2; if curr == None: currency = self.getCurrency(locale) decimalplaces = currency.DecimalPlaces outcurr = currency.ID + " " else: outcurr = curr + " " if curr in places: decimalplaces = places[curr] if num.rfind(".") > -1 or num.rfind(",") > -1: num = float(num.replace(",",".")) if (type(decimalplaces) == type(0.1)): pl = 10**decimalplaces; num = str(round(num * pl) / pl) else: num = str(self.func.callFunction("round", (num, decimalplaces))) return get_numbertext(outcurr + num, patterns[mod]) def numbertext(self, prop, num, loc): global patterns # query document language loc = self.queryLocale(prop, loc) mod = self.getModule(loc.Language, loc.Country, loc.Variant) return get_numbertext(num.strip(), patterns[mod]) def get_numbertext(num, conv): try: n = conv.run(num) n = n[0].upper() + n[1:] except: return "Conversion error" if n == "": return num return n libnumbertext-1.0.8/pythonpath/org/__init__.py000066400000000000000000000000001416364754400215060ustar00rootroot00000000000000libnumbertext-1.0.8/rdb/000077500000000000000000000000001416364754400151715ustar00rootroot00000000000000libnumbertext-1.0.8/rdb/sample.rdb000066400000000000000000000200001416364754400171330ustar00rootroot00000000000000CSMH 'CSMH '"X- AyNDN(lNqQRF7{QR F7{Adε cAd yF7{miѩ b Ϳy 2< b6a3 y UCR2< bCi NDN( org2< bv 6)ε cAd numbertext2< b nT $*F7{QR@$VL_value[ȗ>94Vx9 org/numbertext bw'lNqQR XNumberText2< bUzF7{miѩ@$VL_valuezI4Vx! org/numbertext/XNumberText" com/sun/star/uno/XInѧterface numbertext string& com/sun/star/beans/XPropertySet prop string num any lang moneytext string& com/sun/star/beans/XPropertySet prop string num any currency any lang   &   b蕅"F7{Ad@$VL_valueee3.4Vx. orglibnumbertext-1.0.8/reg.uno.py000066400000000000000000000007741416364754400163610ustar00rootroot00000000000000import uno import unohelper def createInstance( ctx ): # NumberText uses a new type, importing it at the top of this file # leads to a failure during adding the extension to OOo import org.Numbertext return org.Numbertext.NUMBERTEXT( ctx ) # pythonloader looks for a static g_ImplementationHelper variable g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation( \ createInstance,"org.numbertext", ("com.sun.star.sheet.AddIn",),) libnumbertext-1.0.8/src/000077500000000000000000000000001416364754400152115ustar00rootroot00000000000000libnumbertext-1.0.8/src/Makefile.am000066400000000000000000000011001416364754400172350ustar00rootroot00000000000000AM_CXXFLAGS = -D_THREAD_SAFE -D_GNU_SOURCE -DVERBOSE -DDATADIR='"$(datadir)"' LIBS += $(BOOST_REGEX_LIB) libnumbertext_1_0_includedir = $(includedir)/libnumbertext libnumbertext_1_0_include_HEADERS = \ Soros.hxx Numbertext.hxx \ $(builddir)/numbertext-version.h lib_LTLIBRARIES = libnumbertext-1.0.la libnumbertext_1_0_la_SOURCES = \ Soros.cxx Numbertext.cxx libnumbertext_1_0_la_LDFLAGS = -no-undefined bin_PROGRAMS = spellout spellout_SOURCES = spellout.cxx spellout_LDADD = libnumbertext-1.0.la EXTRA_DIST = numbertext-version.h \ numbertext-version.h.in libnumbertext-1.0.8/src/Numbertext.cxx000066400000000000000000000061751416364754400201030ustar00rootroot00000000000000/* Soros interpreter (see numbertext.org) * 2018 (c) László Németh * License: LGPL/BSD dual license */ #include #include #include #include #include "Numbertext.hxx" #ifdef NUMBERTEXT_BOOST #include using namespace boost; #else using namespace std; #endif #define MODULE_DIR "" #define SOROS_EXT ".sor" #define LANG_PATTERN_NO "n[bn]([-_]NO)\?" bool readfile(const std::string& filename, std::wstring& result) { std::wifstream wif(filename); if (wif.fail()) return false; wif.imbue(std::locale(std::locale(), new std::codecvt_utf8)); std::wstringstream wss; wss << wif.rdbuf(); result = wss.str(); return true; } Numbertext::Numbertext(): prefix(MODULE_DIR), modules(0) { } bool Numbertext::load(std::string lang, std::string filename) { std::wstring module; if (filename.length() == 0) filename = prefix + regex_replace(lang, regex("-"), "_") + SOROS_EXT; if (!readfile(filename, module)) { // try to load without the country code filename = regex_replace(filename, regex("[-_].." SOROS_EXT "$"), SOROS_EXT); if (!readfile(filename, module)) { // some exceptional language codes // Norwegian.... if (regex_match(lang, regex(LANG_PATTERN_NO))) { if (!readfile(regex_replace(filename, regex(LANG_PATTERN_NO SOROS_EXT "$"), "no" SOROS_EXT), module)) return false; } else { return false; } } } modules.insert(std::make_pair(lang, Soros(module, string2wstring(lang)))); return true; } bool Numbertext::numbertext(std::wstring& number, const std::string& lang) { auto module = modules.find(lang); if (module == modules.end()) { if (!load(lang)) return false; module = modules.find(lang); } module->second.run(number); return true; } bool Numbertext::numbertext(std::string& number, const std::string& lang) { std::wstring wnumber = string2wstring(number); bool result = numbertext(wnumber, lang); number = wstring2string(wnumber); return result; } std::string Numbertext::numbertext(int number, const std::string& lang) { std::wstring wnumber = std::to_wstring(number); numbertext(wnumber, lang); return wstring2string(wnumber); } std::wstring Numbertext::string2wstring(const std::string& s) { #ifndef NUMBERTEXT_BOOST typedef std::codecvt_utf8 convert_type; std::wstring_convert converter; return converter.from_bytes( s ); #else return ::locale::conv::utf_to_utf(s.c_str(), s.c_str() + s.size()); #endif } std::string Numbertext::wstring2string(const std::wstring& s) { #ifndef NUMBERTEXT_BOOST typedef std::codecvt_utf8 convert_type; std::wstring_convert converter; return converter.to_bytes( s ); #else return ::locale::conv::utf_to_utf(s.c_str(), s.c_str() + s.size()); #endif } libnumbertext-1.0.8/src/Numbertext.hxx000066400000000000000000000014611416364754400201010ustar00rootroot00000000000000/* Soros interpreter (see numbertext.org) * 2018 (c) László Németh * License: LGPL/BSD dual license */ #ifndef NUMBERTEXT_HXX #define NUMBERTEXT_HXX #include "Soros.hxx" #include class Numbertext { public: Numbertext(); void set_prefix(const std::string& st) { prefix = st; }; bool load(std::string lang, std::string filename = ""); bool numbertext(std::wstring& number, const std::string& lang); // UTF-8 encoded input bool numbertext(std::string& number, const std::string& lang); std::string numbertext(int number, const std::string& lang); static std::wstring string2wstring(const std::string& s); static std::string wstring2string(const std::wstring& s); private: std::string prefix; std::unordered_map modules; }; #endif libnumbertext-1.0.8/src/Soros.cxx000066400000000000000000000200361416364754400170430ustar00rootroot00000000000000/* Soros interpreter (see numbertext.org) * 2018 (c) László Németh * License: LGPL/BSD dual license */ #include "Soros.hxx" #ifdef NUMBERTEXT_BOOST using namespace boost; #else using namespace std; #endif #define ITERATION_LIMIT 250 #define SEP L"\uE00A" #ifdef NUMBERTEXT_BOOST #define FIX L"\\" #else #define FIX L"" #endif const std::wstring Soros::m = L"\\\";#"; const std::wstring Soros::m2 = L"$()|[]"; const std::wstring Soros::c = L"\uE000\uE001\uE002\uE003"; const std::wstring Soros::c2 = L"\uE004\uE005\uE006\uE007\uE008\uE009"; const std::wstring Soros::slash = L"\uE000"; const std::wstring Soros::pipe = L"\uE003"; // pattern to recognize function calls in the replacement string const wregex Soros::func ( Soros::translate ( L"(?:\\|?(?:\\$\\()+)?" // optional nested calls "(\\|?\\$\\(([^\\(\\)]*)\\)\\|?)" // inner call (2 subgroups) "(?:\\)+\\|?)?", // optional nested calls Soros::m2.substr(0, 4), Soros::c, L"\\")); // \$, \(, \), \| -> \uE000..\uE003 void Soros::replace(std::wstring& s, const std::wstring& search, const std::wstring& replace) { size_t pos = 0; while ((pos = s.find(search, pos)) != std::wstring::npos) { s.replace(pos, search.length(), replace); pos += replace.length(); } } Soros::Soros(std::wstring program, std::wstring filtered_lang): begins(0), ends(0) { program = translate(program, m, c, L"\\"); // \\, \", \;, \# -> \uE000..\uE003 // switch off all country-dependent lines, and switch on the requested ones program = regex_replace(program, wregex(L"(^|[\n;])([^\n;#]*#[^\n]*\\[:[^\n:\\]]*:\\][^\n]*)"), L"$1#$2"); replace(filtered_lang, L"_", L"-"); program = regex_replace(program, wregex(L"(^|[\n;])#([^\n;#]*#[^\n]*\\[:" + filtered_lang + L":\\][^\n]*)"), L"$1$2"); program = regex_replace(program, wregex(L"(#[^\n]*)?(\n|$)"), L";"); // remove comments // __numbertext__ sets the place of left zero deletion rule if (program.find(L"__numbertext__") == std::wstring::npos) program.insert(0, L"__numbertext__;"); program = regex_replace(program, wregex(L"__numbertext__"), // default left zero deletion L"\"([a-z][-a-z]* )?0+(0|[1-9]" FIX L"\\d*)\" $$(" FIX L"\\1" FIX L"\\2);" // separator function SEP L"(.*)" SEP L"(.+)" SEP L"(.*) " FIX L"\\1" FIX L"\\2" FIX L"\\3;" // no separation, if subcall returns with empty string SEP L".*" SEP SEP L".*"); wregex p(L"^\\s*(\"[^\"]*\"|[^\\s]*)\\s*(.*[^\\s])?\\s*$"); wregex macro(L"== *([^ ]*) *=="); size_t pos = 0; size_t old_pos = 0; wregex quoteStart(L"^\""); wregex quoteEnd(L"\"$"); std::wstring smacro; while ((pos = program.find(L";", pos)) != std::wstring::npos) { wsmatch sp; std::wstring linOrig = program.substr(old_pos, pos - old_pos); // pattern extension after == macro ==: // foo bar -> "macro foo" bar // "foo bar" baz -> "macro foo bar" baz // "^foo bar" baz -> "^macro foo bar" baz std::wstring lin = linOrig; if (smacro.length() > 0 && linOrig.length() > 0 && regex_search(linOrig, sp, p)) { std::wstring s = regex_replace(sp[1].str(), quoteStart, L""); s = regex_replace(s, quoteEnd, L""); std::wstring sEmpty = (s.length() == 0) ? L"" : L" "; if (s[0] == L'^') { s = regex_replace(s, wregex(L"^\\^"), L""); lin = L"\"^" + smacro + sEmpty + s + L"\" " + sp[2].str(); } else lin = L"\"" + smacro + sEmpty + s + L"\" " + sp[2].str(); } if (linOrig.length() > 0 && regex_match(linOrig, sp, macro)) { smacro = sp[1].str(); } else if (lin.length() > 0 && regex_search(lin, sp, p)) { std::wstring s = regex_replace(sp[1].str(), quoteStart, L""); s = regex_replace(s, quoteEnd, L""); s = translate(s, c.substr(1), m.substr(1), L""); replace(s, slash, L"\\\\"); // -> \\, ", ;, # begins.push_back(s[0] == L'^'); ends.push_back(s[s.length()-1] == L'$'); s = L"^" + regex_replace(s, wregex(L"^\\^"), L""); s = regex_replace(s, wregex(L"\\$$"), L"") + L"$"; try { patterns.emplace_back(s); } catch (...) { std::wcout << L"Soros: bad regex in \"" << sp[1].str() << "\"" << std::endl; break; } std::wstring s2; if (sp.size() > 1) { s2 = regex_replace(sp[2].str(), quoteStart, L""); s2 = regex_replace(s2, quoteEnd, L""); } s2 = translate(s2, m2, c2, L"\\"); // \$, \(, \), \|, \[, \] -> \uE004..\uE009 // call inner separator: "[ ... $1 ... ]" -> "$(" SEP " ... " SEP "$1" SEP "... )" s2 = regex_replace(s2, wregex(L"^\\[[$](\\d\\d?|\\([^\\)]+\\))"), L"$$(" SEP SEP L"|$$$1" SEP); // add "|" in terminating position s2 = regex_replace(s2, wregex(L"\\[([^$\\[\\\\]*)[$](\\d\\d?|\\([^\\)]+\\))"), L"$$(" SEP L"$1" SEP L"$$$2" SEP); s2 = regex_replace(s2, wregex(SEP L"\\]$"), L"|" SEP L")"); // add "|" in terminating position s2 = translate(s2, L"]", L")", L""); s2 = regex_replace(s2, wregex(L"([$]\\d|\\))\\|[$]"), L"$1||$$"); // $()|$() -> $()||$() s2 = translate(s2, c, m, L""); // \uE000..\uE003-> \, ", ;, # s2 = translate(s2, m2.substr(0, 4), c, L""); // $, (, ), | -> \uE000..\uE003 s2 = translate(s2, c2, m2, L""); // \uE004..\uE007 -> $, (, ), | s2 = regex_replace(s2, wregex(L"[$]"), L"\\$$"); // $ -> \$ s2 = regex_replace(s2, wregex(L"\uE000(\\d)"), L"\uE000\uE001$$$1\uE002"); // $n -> $(\n) s2 = regex_replace(s2, wregex(L"\\\\([1-9])"), L"$$0$1"); // \[n] -> $[n] s2 = regex_replace(s2, wregex(L"\\\\0"), L"$$0"); // \0 -> $0 s2 = regex_replace(s2, wregex(L"\\\\n"), L"\n"); // \n -> [new line] values.push_back(s2); } pos++; old_pos = pos; } } int Soros::run(std::wstring& input) { int level = 0; run(input, level); return level; } void Soros::run(std::wstring& input, int& level, bool begin, bool end) { if (level == -1) return; if (++level > ITERATION_LIMIT) { std::wcout << "Soros: iteration limit exceeded at the input \"" << input << "\"" << std::endl; input = L""; level = -1; return; } for (size_t i = 0; i < patterns.size(); i++) { if ((!begin && begins[i]) || (!end && ends[i])) continue; if (!regex_match(input, patterns[i])) continue; input = regex_replace(input, patterns[i], values[i]); wsmatch n; while (regex_search(input, n, func)) { bool b = false; bool e = false; if (n[1].str()[0] == pipe[0] || n[0].str()[0] == pipe[0]) { b = true; } else if (n.position() == 0) { b = begin; } if (n[1].str().back() == pipe[0] || n[0].str().back() == pipe[0]) { e = true; } else if (n.position() + n[0].length() == (signed) input.length()) { e = end; } std::wstring piece = n[2].str(); run(piece, level, b, e); input.replace(n.position(1), n[1].length(), piece); } level--; return; } level--; input = L""; } std::wstring Soros::translate( std::wstring s, const std::wstring chars, const std::wstring& chars2, const std::wstring& delim) { int i = 0; for(const wchar_t& ch : chars) replace(s, delim + ch, chars2.substr(i++, 1)); return s; } libnumbertext-1.0.8/src/Soros.hxx000066400000000000000000000021741416364754400170530ustar00rootroot00000000000000/* Soros interpreter (see numbertext.org) * 2018 (c) László Németh * License: LGPL/BSD dual license */ #ifndef SOROS_HXX_ #define SOROS_HXX_ #include #include #include #include "numbertext-version.h" #ifdef NUMBERTEXT_BOOST #include #else #include #endif class Soros { public: Soros(std::wstring program, std::wstring filtered_lang); int run(std::wstring& input); static std::wstring translate(std::wstring s, std::wstring chars, const std::wstring& chars2, const std::wstring& delim); private: void run(std::wstring& input, int& level, bool begin = true, bool end = true); static void replace(std::wstring& s, const std::wstring& search, const std::wstring& replace); #ifdef NUMBERTEXT_BOOST std::vector patterns; static const boost::wregex func; #else std::vector patterns; static const std::wregex func; #endif std::vector values; std::vector begins; std::vector ends; static const std::wstring m, m2, c, c2, slash, pipe; }; #endif libnumbertext-1.0.8/src/Soros.js000066400000000000000000000125201416364754400166540ustar00rootroot00000000000000function Soros(program, lang) { this.funcpat = /(\|?(\uE008\()+)?(\|?\uE008\(([^\(\)]*)\)\|?)(\)+\|?)?/ this.meta = "\\\"$()|#;[]" this.enc = "\uE000\uE001\uE002\uE003\uE004\uE005\uE006\uE007\uE008\uE009" this.lines = [] if (!/__numbertext__/.test(program)) program = "__numbertext__;" + program program = program.replace("__numbertext__", // default left zero deletion "\"([a-z][-a-z]* )?0+(0|[1-9]\\d*)\" $(\\1\\2);" + // separator function "\"\uE00A(.*)\uE00A(.+)\uE00A(.*)\" \\1\\2\\3;" + // no separation, if subcall returns with empty string "\"\uE00A.*\uE00A\uE00A.*\"") // subclass for line data this.linetype = function (regex, repl, begin, end) { this.pat = regex this.repl = repl this.begin = begin this.end = end }; // strip function this.strip = function (st, ch) { if (st == undefined) return "" return st.replace(new RegExp("^" + ch + "+"), "") .replace(new RegExp(ch + "+$"), "") }; // character translation function this.tr = function (text, chars, chars2, delim) { for (var i = 0; i < chars.length; i++) { var s = delim + chars[i] while (text.indexOf(s) >= 0) { text = text.replace(s, chars2[i]); } } return text }; // private run function this._run = function (data, begin, end) { for (var i in this.lines) { var l = this.lines[i] if (! ((!begin && l.begin) || (!end && l.end))) { var m = l.pat.exec(data) if (m != null) { var s = data.replace(l.pat, l.repl) var n = this.funcpat.exec(s) while (n != null) { var b = false var e = false if (n[3][0] == "|" || n[0][0] == "|") { b = true } else if (n.index == 0) { b = begin } if (n[3][n[0].length - 1] == "|" || n[3][n[0].length - 1] == "|") { e = true } else if (n.index + n[0].length == s.length) { e = end } s = s.substring(0, n.index + (n[1] == undefined ? 0 : n[1].length)) + this._run(n[4], b, e) + s.substring(n.index + (n[1] == undefined ? 0 : n[1].length) + n[3].length) n = this.funcpat.exec(s) } return s } } } return "" }; // run with the string input parameter this.run = function (data) { data = this._run(this.tr(data, this.meta, this.enc, ""), true, true) return this.tr(data, this.enc, this.meta, "") }; // constructor // program = program.replace(/\\\\/g, "\uE000") // program = program.replace(/\\[(]/g, "\uE003") // program = program.replace(/\\[)]/g, "\uE004") // program = program.replace(/\\[|]/g, "\uE005") program = this.tr(program, this.meta, this.enc, "\\") // switch off all country-dependent lines, and switch on the requested ones program = program.replace(/(^|[\n;])([^\n;#]*#[^\n]*[[]:[^\n:\]]*:][^\n]*)/g, "$1#$2") .replace(new RegExp("(^|[\n;])#([^\n;#]*#[^\n]*[[]:" + lang.replace("_", "-") + ":][^\n]*)", "g"), "$1$2") var l = program.replace(/(#[^\n]*)?(\n|$)/g, ";").split(";") var matchline = new RegExp(/^\s*(\"[^\"]*\"|[^\s]*)\s*(.*[^\s])?\s*$/) var prefix = "" for (var i in l) { var macro = /== *(.*[^ ]?) ==/.exec(l[i]) if (macro != null) { prefix = macro[1] continue } var s = matchline.exec(l[i]) if (prefix != "" && l[i] != "" && s != null) { s1 = this.strip(s[1], "\"") var empty = (s1 == "") var start = (!empty && s1[0] == '^') if (s[2] == undefined) s[2] = "" l2 = "\"" + (start ? "^" : "") + prefix + (empty ? "" : " ") + s1.replace("^\^", "") + "\" " + s[2] s = matchline.exec(l2) } if (s != null) { s[1] = this.strip(s[1], "\"") if (s[2] == undefined) s[2] = ""; else s[2] = this.strip(s[2], "\"") var line = new this.linetype( new RegExp("^" + s[1].replace("^\^", "").replace("\$$", "") + "$"), s[2].replace(/\\n/g, "\n") // call inner separator: [ ... $1 ... ] -> $(\uE00A ... \uE00A$1\uE00A ... ) .replace(/^[[]\$(\d\d?|\([^\)]+\))/g,"$(\uE00A\uE00A|$$$1\uE00A") .replace(/[[]([^\$[\\]*)\$(\d\d?|\([^\)]+\))/g,"$(\uE00A$1\uE00A$$$2\uE00A") .replace(/\uE00A]$/, "|\uE00A)") // add "|" in terminating position .replace(/]/g, ")") .replace(/(\$\d|\))\|\$/g,"$1||$$") // $(..)|$(..) -> $(..)||$(..) .replace(/\$/g, "\uE008") .replace(/\\0/g, "$$&") .replace(/\\(\d)/g, "$$$1") .replace(/\uE008(\d)/g, "\uE008($$$1)"), /^\^/.test(s[1]), /\$$/.test(s[1]) ) this.lines = this.lines.concat(line) } } }; libnumbertext-1.0.8/src/Soros.py000066400000000000000000000125051416364754400166730ustar00rootroot00000000000000"Soros interpreter (see http://numbertext.org)" from __future__ import unicode_literals from __future__ import print_function import re, sys def run(program, data, lang): return compile(program, lang).run(data) def compile(program, lang): return _Soros(program, lang) # conversion function def _tr(text, chars, chars2, delim): for i in range(0, len(chars)): text = text.replace(delim + chars[i], chars2[i]) return text # string literals for metacharacter encoding _m = "\\\";#$()|[]" _c = u"\uE000\uE001\uE002\uE003\uE004\uE005\uE006\uE007\uE008\uE009" # Unicode private area _pipe = u"\uE003" # separator prefix = \uE00A # pattern to recognize function calls in the replacement string _func = re.compile(_tr(r"""(?:\|?(?:\$\()+)? # optional nested calls (\|?\$\(([^\(\)]*)\)\|?) # inner call (2 subgroups) (?:\)+\|?)?""", # optional nested calls _m[4:8], _c[:4], "\\"), re.X) # \$, \(, \), \| -> \uE000..\uE003 class _Soros: def __init__(self, prg, lang): self.lines = [] if prg.find("__numbertext__") == -1: prg = "__numbertext__;" + prg # default left zero deletion # and separator function (no separation, if subcall returns with empty string) prg = prg.replace("__numbertext__", u"""0+(0|[1-9]\\d*) $1 \"([a-z][-a-z]* )0+(0|[1-9]\\d*)\" $(\\1\\2) \"\uE00A(.*)\uE00A(.+)\uE00A(.*)\" \\1\\2\\3 \"\uE00A.*\uE00A\uE00A.*\" """) prg = _tr(prg, _m[:4], _c[:4], "\\") # \\, \", \;, \# -> \uE000..\uE003 # switch off all country-dependent lines, and switch on the requested ones prg = re.sub(r"(^|[\n;])([^\n;#]*#[^\n]*[\[]:[^\n:\]]*:][^\n]*)", r"\1#\2", prg) prg = re.sub(r"(^|[\n;])#([^\n;#]*#[^\n]*[\[]:" + lang.replace("_", "-") + r":][^\n]*)", r"\1\2", prg) matchline = re.compile("^\s*(\"[^\"]*\"|[^\s]*)\s*(.*[^\s])?\s*$") prefix = "" for s in re.sub("(#[^\n]*)?(\n|$)", ";", prg).split(";"): macro = re.match("== *(.*[^ ]?) ==", s) if macro != None: prefix = macro.group(1) continue m = matchline.match(s) if prefix != "" and s != "" and m != None: s = m.group(1).strip("\"") space = " " if s != "" else "" caret = "" if s[0:1] == "^": s = s[1:] caret = "^" s2 = m.group(2) if m.group(2) != None else "" s = "\"" + caret + prefix + space + s + "\" " + s2 m = matchline.match(s) if m != None: s = _tr(m.group(1).strip("\""), _c[1:4], _m[1:4], "") \ .replace(_c[_m.find("\\")], "\\\\") # -> \\, ", ;, # if m.group(2) != None: s2 = m.group(2).strip("\"") else: s2 = "" s2 = _tr(s2, _m[4:], _c[4:], "\\") # \$, \(, \), \|, \[, \] -> \uE004..\uE009 # call inner separator: [ ... $1 ... ] -> $(\uE00A ... \uE00A$1\uE00A ... ) s2 = re.sub(r"[\[]\$(\d\d?|\([^\)]+\))",u"$(\uE00A\uE00A|$\\1\uE00A", s2) s2 = re.sub(r"[\[]([^\$[\\]*)\$(\d\d?|\([^\)]+\))",u"$(\uE00A\\1\uE00A$\\2\uE00A", s2) s2 = re.sub(r"\uE00A]$","|\uE00A)", s2) # add "|" in terminating position s2 = re.sub(r"]",")", s2) s2 = re.sub(r"(\$\d|\))\|\$", r"\1||$", s2) # $()|$() -> $()||$() s2 = _tr(s2, _c[:4], _m[:4], "") # \uE000..\uE003-> \, ", ;, # s2 = _tr(s2, _m[4:8], _c[:4], "") # $, (, ), | -> \uE000..\uE003 s2 = _tr(s2, _c[4:], _m[4:], "") # \uE004..\uE009 -> $, (, ), |, [, ] s2 = re.sub(r"\\(\d)", r"\\g<\1>", re.sub(r"\uE000(\d)", "\uE000\uE001\\\\g<\\1>\uE002", s2)) try: self.lines = self.lines + [[ re.compile("^" + s.lstrip("^").rstrip("$") + "$"), s2, s[:1] == "^", s[-1:] == "$"]] except: print("Error in following regex line: " + s, file=sys.stderr) raise def run(self, data): return self._run(data, True, True) def _run(self, data, begin, end): for i in self.lines: if not ((begin == False and i[2]) or (end == False and i[3])): m = i[0].match(data) if m: try: s = m.expand(i[1]) except: print("Error for the following input: " + data, file=sys.stderr) raise n = _func.search(s) while n: b = False e = False if n.group(1)[0:1] == _pipe or n.group()[0:1] == _pipe: b = True elif n.start() == 0: b = begin if n.group(1)[-1:] == _pipe or n.group()[-1:] == _pipe: e = True elif n.end() == len(s): e = end s = s[:n.start(1)] + self._run(n.group(2), b, e) + s[n.end(1):] n = _func.search(s) return s return "" libnumbertext-1.0.8/src/numbertext-version.h.in000066400000000000000000000004751416364754400216550ustar00rootroot00000000000000#ifndef NUMBERTEXT_VERSION_H #define NUMBERTEXT_VERSION_H #define NUMBERTEXT_VERSION "@NUMBERTEXT_VERSION@" #define NUMBERTEXT_VERSION_MAJOR @NUMBERTEXT_MAJOR_VERSION@ #define NUMBERTEXT_VERSION_MINOR @NUMBERTEXT_MINOR_VERSION@ #define NUMBERTEXT_VERSION_MICRO @NUMBERTEXT_MICRO_VERSION@ @NUMBERTEXT_BOOST@ #endif libnumbertext-1.0.8/src/places.py000066400000000000000000000021201416364754400170250ustar00rootroot00000000000000places = { "AMD":2, "ARS":2, "ATS":2, "AUD":2, "AZM":2, "AZN":2, "BAM":2, "BDT":2, "BEF":2, "BGL":2, "BGN":2, "BOB":2, "BOP":0, "BRL":2, "BTN":2, "BYR":2, "BZD":2, "CAD":2, "CDF":2, "CHF":2, "CLP":0, "CNY":2, "COP":2, "CRC":2, "CZK":2, "CSD":2, "DEM":2, "DKK":2, "DOP":2, "ECS":2, "EEK":2, "EGP":2, "ERN":2, "ESP":0, "ETB":2, "EUR":2, "FIM":2, "FRF":2, "GBP":2, "GEL":2, "GHC":2, "GHS":2, "GRD":2, "GTQ":2, "HKD":2, "HNL":2, "HRK":2, "HUF":2, "IDR":2, "IEP":2, "ILS":2, "INR":2, "IRR":0, "ISK":2, "ITL":0, "JMD":2, "JPY":0, "KGS":2, "KHR":0, "KRW":0, "KZT":2, "LAK":2, "LBP":2, "LTL":2, "LUF":2, "LVL":2, "MGA":0.7, "MKD":2, "MMK":2, "MNT":2, "MOP":2, "MRO":0.7, "MXN":2, "MYR":2, "NAD":2, "NIO":2, "NLG":2, "NOK":2, "NPR":2, "NZD":2, "PAB":2, "PEN":2, "PGK":2, "PHP":2, "PLN":2, "PLZ":2, "PTE":2, "PYG":2, "ROL":2, "RON":2, "RSD":2, "RUB":2, "RUR":2, "RWF":2, "SAR":2, "SEK":2, "SGD":2, "SIT":2, "SKK":2, "SOS":2, "SVC":0, "THB":2, "TJS":2, "TMM":2, "TND":3, "TRL":2, "TRY":2, "TTD":2, "TWD":2, "TZS":2, "UAH":2, "UGX":2, "USD":2, "UYU":2, "UZS":2, "VEB":2, "VEF":2, "VND":2, "XAF":2, "ZAR":2, "ZWD":2} libnumbertext-1.0.8/src/soroside.py000066400000000000000000000024001416364754400174060ustar00rootroot00000000000000import Soros import sys import codecs out = sys.stdout state = "" output = "" prefix = "" params = [] for i in sys.argv: if state != "": if state == "prefix": prefix = i + " " elif state == "output": output = i state = "" continue if i == "-p": state = "prefix" elif i == "-o": state = "output" else: params += [i] if output != "": out = codecs.open(output, "wb", encoding="UTF-8") if len(params) < 2: print ("Usage: soros [-o file_output] [-p prefix] soros_file number(s)") print ("numbers may be ranges (1-100) or ranges with steps (1-100~10)") sys.exit() fil = codecs.open(params[1], encoding="UTF-8") s = Soros.compile(fil.read()) for i in params[2:]: b = i[1:].split("-", 1) b[0] = i[0] + b[0] if len(b) > 1: step = 1 c = b[1].split("~", 1) if len(c) > 1: b[1] = c[0] step = int(c[1]) for j in range(int(b[0]), int(b[1]) + 1, step): try: print (s.run(prefix + str(j))) except: print >>out, s.run(prefix + str(j)) else: try: print (s.run(prefix + i)) except: print >>out, s.run(prefix + i) libnumbertext-1.0.8/src/spellout.cxx000066400000000000000000000073031416364754400176070ustar00rootroot00000000000000#include "Numbertext.hxx" #include "numbertext-version.h" #include #ifdef HAVE_BOOST_REGEX using namespace boost; #else using namespace std; #endif #define LANG "LANG" #define PATH "NUMBERTEXTPATH" #define DEFPATH DATADIR "/libnumbertext/" #define DEFPATH2 "data/" enum State { base, loaded, flag_lang, flag_prefix}; void error() { std::cerr << "spellout: missing language module" << std::endl; std::exit(EXIT_FAILURE); } int main(int argc, char* argv[]) { if (argc == 1) { std::cout << "spellout " NUMBERTEXT_VERSION ": convert numbers to number names and money amounts" << std::endl; std::cout << "Usage: spellout [-l lang] [-p prefix] par1 [par2...]" << std::endl; std::cout << "Parameter: n: number; n-m: range; n-m~s: range with step" << std::endl; std::cout << "Examples: spellout 1-10 500 1000-10000~1000" << std::endl; std::cout << " spellout -l en-GB -p ordinal 1-100" << std::endl; std::cout << " spellout -l en -p ordinal-number 1-100" << std::endl; std::cout << " spellout -l en -p USD 100.45" << std::endl; std::cout << " spellout -l en -p \"money USD\" 100.45" << std::endl; std::cout << "Help of language module: spellout -l es help" << std::endl; std::cout << "License: GNU LGPL/BSD dual-license\n"; return 0; } std::vector paths; paths.emplace_back(""); paths.emplace_back(DEFPATH); paths.emplace_back(DEFPATH2); if (getenv(PATH)) paths.insert(paths.begin() + 1, std::string(getenv(PATH)) + "/"); std::string lang; Numbertext nt; State state = State::base; std::string prefix; for (int i = 1; i < argc; i++) { if (state == State::flag_lang || state == State::flag_prefix) { if (state == State::flag_lang) { lang = argv[i]; } else { prefix = argv[i]; prefix += " "; } state = State::base; continue; } if (strcmp(argv[i], "-l") == 0) { state = State::flag_lang; } else if (strcmp(argv[i], "-p") == 0) { state = State::flag_prefix; } else { if (lang.empty()) { if (getenv(LANG)) { lang = std::string(getenv(LANG)); lang = lang.substr(0, lang.find(".")); } if (lang.empty()) lang = "en"; } if (state != State::loaded) { for(auto const& path: paths) { nt.set_prefix(path); if (nt.load(lang)) break; } state = State::loaded; } std::string arg = argv[i]; smatch n; if (regex_match(arg, n, regex("([0-9]+)-([0-9]+)~?([0-9]+)?"))) { long long b = std::stoll(n[1].str()); long long end = std::stoll(n[2].str()); long long step = (n[3].length() == 0) ? 1 : std::stoll(n[3].str()); for (int j = b; j <= end; j = j + step) { std::string result = prefix + std::to_string(j); if (!nt.numbertext(result, lang)) error(); std::cout << result << std::endl; } } else { std::string result = prefix + arg; if (!nt.numbertext(result, lang)) error(); std::cout << result << std::endl; } } } } libnumbertext-1.0.8/test/000077500000000000000000000000001416364754400154015ustar00rootroot00000000000000libnumbertext-1.0.8/test/Makefile000066400000000000000000000001351416364754400170400ustar00rootroot00000000000000all: for i in *.test; do echo -n "$$i ";./$$i && echo done; done clean: rm -rf testSubDir libnumbertext-1.0.8/test/hu_Hung.in000066400000000000000000000016141416364754400173300ustar00rootroot00000000000000123 1823 2021-ben 24-én í 0 Í 0 NY Händel 0 Molière 0 IQ 0 Apáthy Apáthyval Apponyi Apponyival Babits Babitscsal Báthory Báthoryval Batsányi Batsányival Batthyány Batthyányval Bay 0 Bessenyei Bessenyeivel Czuczor Czuczorral Csathó Csathóval Damjanichcsal Des​sewffy Des​sewffyvel Dsida Dsidával Eördögh Eördöghgel Eöry Eöryvel Eötvös Eötvössel Ga​ál Ga​ál​lal Háy Háyval Joó Jo​óval Kass 0 Kazinczy Kazinczyval Kéthly Kéthlyvel Konko​ly-Thege Konko​ly-Thegét Koós Koóssal Kossuth Kossuthtal Madách Madáchcsal Mikszáth Mikszáthtal Móricz Móriczcal Pais Paiszsal Rákóczi Rákóczival Széchenyi Széchenyivel Széll 0 Tarr 0 Thewrewk Thewrewkkel Thököly Thökölyvel Ve​ér Ve​érrel Verseghy Verseghyvel Vörösmarty 0 Vörösmartyt 0 Wass Wassal 0 Weöres Weöressel Wesselényi Wesselényivel yard 0 Ybl 0 Zichy Zichyvel Zigány Zigánnyal libnumbertext-1.0.8/test/hu_Hung.out000066400000000000000000000046171416364754400175370ustar00rootroot00000000000000𐳾𐳼𐳼𐳺𐳺𐳺 𐳿𐳻𐳺𐳺𐳺𐳾𐳼𐳼𐳺𐳺𐳺 𐳺𐳺𐳿𐳼𐳼𐳺-𐳂𐳉𐳙 𐳼𐳼𐳺𐳺𐳺𐳺-𐳋𐳙 𐳑 𐲑 𐲚 𐲏𐳋𐳙𐳇𐳉𐳖 Molière IQ 𐲀𐳠𐳁𐳦𐳐 𐲀𐳠𐳁𐳦𐳐𐳮𐳀𐳖 𐲀𐳠𐳛𐳚𐳐 𐲀𐳠𐳛𐳚𐳐𐳮𐳀𐳖 𐲂𐳀𐳂𐳐𐳆 𐲂𐳀𐳂𐳐𐳆𐳆𐳀𐳖 𐲂𐳁𐳦𐳛𐳢𐳐 𐲂𐳁𐳦𐳛𐳢𐳐𐳮𐳀𐳖 𐲂𐳀𐳆𐳁𐳚𐳐 𐲂𐳀𐳆𐳁𐳚𐳐 𐲂𐳀𐳨𐳨𐳁𐳚𐳐 𐲂𐳀𐳨𐳨𐳁𐳚𐳐𐳮𐳀𐳖 𐲂𐳀𐳒𐳐 𐲂𐳉𐳤𐳉𐳚𐳉𐳐 𐲂𐳉𐳤𐳉𐳚𐳉𐳐𐳮𐳉𐳖 𐲄𐳪𐳄𐳛𐳢 𐲄𐳪𐳄𐳛𐳢𐳢𐳀𐳖 𐲆𐳀𐳦𐳜 𐲆𐳀𐳦𐳜𐳮𐳀𐳖 𐲇𐳀𐳘𐳒𐳀𐳙𐳐𐳆𐳆𐳀𐳖 𐲇𐳉𐳰𐳟𐳌𐳐 𐲇𐳉𐳰𐳟𐳌𐳐𐳮𐳉𐳖 𐲇𐳤𐳐𐳇𐳀 𐲇𐳤𐳐𐳇𐳁𐳮𐳀𐳖 𐲞𐳢𐳇𐳞𐳍 𐲞𐳢𐳇𐳞𐳍𐳍𐳉𐳖 𐲟𐳢𐳐 𐲟𐳢𐳐𐳮𐳉𐳖 𐲞𐳦𐳮𐳞𐳤 𐲞𐳦𐳮𐳞𐳤𐳤𐳉𐳖 𐲍𐳁𐳖 𐲍𐳁𐳖𐳖𐳀𐳖 𐲏𐳁𐳒𐳐 𐲏𐳁𐳒𐳐𐳮𐳀𐳖 𐲒𐳜 𐲒𐳜𐳮𐳀𐳖 𐲓𐳀𐳤 𐲓𐳀𐳯𐳐𐳙𐳄𐳐 𐲓𐳀𐳯𐳐𐳙𐳄𐳐𐳮𐳀𐳖 𐲓𐳋𐳦𐳖𐳐 𐲓𐳋𐳦𐳖𐳐𐳮𐳉𐳖 𐲓𐳛𐳙𐳓𐳛𐳖𐳐-𐲦𐳉𐳍𐳉 𐲓𐳛𐳙𐳓𐳛𐳖𐳐-𐲦𐳉𐳍𐳋𐳦 𐲓𐳜𐳤 𐲓𐳜𐳤𐳤𐳀𐳖 𐲓𐳛𐳤𐳪𐳦 𐲓𐳛𐳤𐳪𐳦𐳦𐳀𐳖 𐲘𐳀𐳇𐳁𐳆 𐲘𐳀𐳇𐳁𐳆𐳆𐳀𐳖 𐲘𐳐𐳓𐳥𐳁𐳦 𐲘𐳐𐳓𐳥𐳁𐳦𐳦𐳀𐳖 𐲘𐳜𐳢𐳐𐳄 𐲘𐳜𐳢𐳐𐳄𐳄𐳀𐳖 𐲠𐳀𐳒𐳰 𐲠𐳀𐳒𐳰𐳰𐳀𐳖 𐲢𐳁𐳓𐳜𐳄𐳐 𐲢𐳁𐳓𐳜𐳄𐳐𐳮𐳀𐳖 𐲥𐳋𐳆𐳋𐳚𐳐 𐲥𐳋𐳆𐳋𐳚𐳐𐳮𐳉𐳖 𐲥𐳋𐳖 𐲦𐳀𐳢 𐲦𐳞𐳢𐳞𐳓 𐲦𐳞𐳢𐳞𐳓𐳓𐳉𐳖 𐲦𐳞𐳓𐳞𐳖𐳐 𐲦𐳞𐳓𐳞𐳖𐳐𐳮𐳉𐳖 𐲮𐳋𐳢 𐲮𐳋𐳢𐳢𐳉𐳖 𐲮𐳉𐳢𐳤𐳉𐳍𐳐 𐲮𐳉𐳢𐳤𐳉𐳍𐳐𐳮𐳉𐳖 𐲮𐳞𐳢𐳞𐳤𐳘𐳀𐳢𐳦𐳐 𐲮𐳞𐳢𐳞𐳤𐳘𐳀𐳢𐳦𐳐𐳦 𐲮𐳀𐳤 𐲮𐳀𐳤𐳤𐳀𐳖 𐲮𐳞𐳢𐳞𐳤 𐲮𐳞𐳢𐳞𐳤𐳤𐳉𐳖 𐲮𐳉𐳤𐳉𐳖𐳋𐳚𐳐 𐲮𐳉𐳤𐳉𐳖𐳋𐳚𐳐𐳮𐳉𐳖 𐳒𐳀𐳢𐳇 𐲑𐳂𐳖 𐲯𐳐𐳆𐳐 𐲯𐳐𐳆𐳐𐳮𐳉𐳖 𐲄𐳐𐳍𐳁𐳚 𐲄𐳐𐳍𐳁𐳚𐳚𐳀𐳖 libnumbertext-1.0.8/test/hu_Hung.test000077500000000000000000000001421416364754400176770ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test.py000066400000000000000000000013761416364754400167410ustar00rootroot00000000000000from __future__ import print_function import sys import Soros import codecs from os import path # # test input_file input_stream output_stream [conditional_language_codes...] # program_file = sys.argv[1] if not path.exists(program_file): # search in data program_file = '../data/' + program_file prg = codecs.open(program_file, encoding="UTF-8").read() inp = codecs.open(sys.argv[2], encoding="UTF-8").readlines() out = codecs.open(sys.argv[3], "wb", encoding="UTF-8") s = {} langs = ["default"] + sys.argv[4:] for l in langs: s[l] = Soros.compile(prg, l) ll = len(langs) for l in langs: print("Language: " + l, file=sys.stderr) if ll > 1: print("Language: " + l, file=out) for i in inp: print(s[l].run(i.strip()), file=out) libnumbertext-1.0.8/test/test.sh000077500000000000000000000003431416364754400167170ustar00rootroot00000000000000#!/bin/bash TESTDIR="." TEMPDIR="./testSubDir" if [ ! -d $TEMPDIR ]; then mkdir $TEMPDIR fi PYTHONPATH=../src/ python3 test.py $TESTDIR/$1 $TESTDIR/$2 $TEMPDIR/test.out$$ diff -u $TEMPDIR/test.out$$ $TESTDIR/$3 || exit 1 libnumbertext-1.0.8/test/test0.test000077500000000000000000000012361416364754400173460ustar00rootroot00000000000000#!/bin/bash export LC_COLLATE=C # case-sensitive file glob for i in ../data/[a-zHR]*.sor # skip Suzhou.sor (multiline regex support needs for conditional text, yet) do echo === $i === # check first 1000 numbers in all languages, checking also the conditional lines PYTHONPATH=../src python test.py $i <(seq 0 2000) /dev/stdout $(grep -Eo '\[:.....:]' $i | tr -d '[]:' | sort | uniq) | awk -v fil="$i" ' /Language:/{delete a; lang=$2} /^$/{print "Missing output: " fil " (input number: " NR%2000", language: " lang ")";next} a[$0]==1{print "Duplicate: $0 (input number: " NR%2000 ", language: " lang ")"} {a[$0]=1}' done libnumbertext-1.0.8/test/test1.in000066400000000000000000000000751416364754400167730ustar00rootroot000000000000001 2 3 4 5 15 0 10 8 18 6 7 9 14 16 17 19 51 20 21 30 38 40 45libnumbertext-1.0.8/test/test1.out000066400000000000000000000002611416364754400171710ustar00rootroot00000000000000one two three four five fifteen zero ten eight eighteen six seven nine fourteen sixteen seventeen nineteen fifty-one twenty twenty-one thirty thirty-eight fierzig fifundfierzig libnumbertext-1.0.8/test/test1.sor000066400000000000000000000011121416364754400171610ustar00rootroot00000000000000# line separators 1 one; 2 two 3 three # comments 4 four # ;5 foo # boundary ^5$ five ^5 fif 1(5) $1teen # fifteen ^0$ zero 1(0) ten$1 # ten 8$ eight 8 eigh 1(8) $1teen # eighteen # back-references 6 six 7 seven 9 nine 1(4) $(4)teen # recall with fix argument 1(6) $(006)teen # left-zero deletion 1(7) $(\1)teen # reference 1(9) $1teen # abbreviated form: $1 = $(\1) 50 fifty (5)(\d) $(\10)-$2 # $(\10) expanded to $(50) # conditional text 2(\d) twenty[-$1] # twenty, twenty-one 3([08]) thirty[-$(\1)] # thirty, thirty-eight 4([05]) [$1und]fierzig # fierzig, fifundfierzig libnumbertext-1.0.8/test/test1.test000077500000000000000000000001421416364754400173420ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test2.in000066400000000000000000000000171416364754400167700ustar00rootroot00000000000000ABC smart rats libnumbertext-1.0.8/test/test2.out000066400000000000000000000000171416364754400171710ustar00rootroot00000000000000CBA star trams libnumbertext-1.0.8/test/test2.sor000066400000000000000000000000401416364754400171610ustar00rootroot00000000000000# reverse function (.*)(.) \2$1 libnumbertext-1.0.8/test/test2.test000077500000000000000000000001421416364754400173430ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test3.in000066400000000000000000000000261416364754400167710ustar00rootroot000000000000000 3 13 23 33 303 3003 libnumbertext-1.0.8/test/test3.out000066400000000000000000000000771416364754400172000ustar00rootroot00000000000000zero tre tredici ventitré trentatré trecentotré tremilatré libnumbertext-1.0.8/test/test3.sor000066400000000000000000000011031416364754400171630ustar00rootroot00000000000000__numbertext__ ^0 zero 1 uno 2 due ^3$ tre 3$ tré 3 tre 4 quattro 5 cinque 6 sei 7 sette 8 otto 9 nove 10 dieci 11 undici 12 dodici 13 tredici 14 quattordici 15 quindici 16 sedici 17 diciassette 18 diciotto 19 diciannove 2([18]) vent$1 2(\d) venti$1 3([18]) trent$1 3(\d) trenta$1 4([18]) quarant$1 4(\d) quaranta$1 5([18]) cinquant$1 5(\d) cinquanta$1 6([18]) sessant$1 6(\d) sessanta$1 7([18]) settant$1 7(\d) settanta$1 8([18]) ottant$1 8(\d) ottanta$1 9([18]) novant$1 9(\d) novanta$1 (\d)(\d\d) $1cento$2 1(\d{3}) mille$1 (\d{1,2})(\d{3}) $1mila$2 (\d{3})(\d{3}) $1mila $2 libnumbertext-1.0.8/test/test3.test000077500000000000000000000001421416364754400173440ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test4.in000066400000000000000000000000171416364754400167720ustar00rootroot000000000000001000 2000 3000 libnumbertext-1.0.8/test/test4.out000066400000000000000000000000331416364754400171710ustar00rootroot00000000000000ettusen tvåtusen tretusen libnumbertext-1.0.8/test/test4.sor000066400000000000000000000002261416364754400171710ustar00rootroot00000000000000__numbertext__ ^0 noll 1 ett 2 två 3 tre (\d)000 $($1tusen) # postprocessing # convert triple consonant "ttt" to "tt" (\D+t)t(t\D+) \1\2 (\D+) \1 libnumbertext-1.0.8/test/test4.test000077500000000000000000000001421416364754400173450ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test5.in000066400000000000000000000000201416364754400167650ustar00rootroot000000000000001000000 1000001 libnumbertext-1.0.8/test/test5.out000066400000000000000000000000321416364754400171710ustar00rootroot00000000000000un million un million uno libnumbertext-1.0.8/test/test5.sor000066400000000000000000000002231416364754400171670ustar00rootroot00000000000000# check boundary detection in nested calls __numbertext__ ^1$ uno ^1 un (1)000000 $($($1)) million (1)(000001) $($($1)) million $(|$($2)) (\D+) \1 libnumbertext-1.0.8/test/test5.test000077500000000000000000000001421416364754400173460ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test6.in000066400000000000000000000000021416364754400167660ustar00rootroot00000000000000b libnumbertext-1.0.8/test/test6.out000066400000000000000000000000041416364754400171710ustar00rootroot00000000000000a a libnumbertext-1.0.8/test/test6.sor000066400000000000000000000000641416364754400171730ustar00rootroot00000000000000# check quoted space in return value a " " b a$(a)a libnumbertext-1.0.8/test/test6.test000077500000000000000000000001421416364754400173470ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/test7.in000066400000000000000000000000411416364754400167720ustar00rootroot00000000000000ordinal 2 ordinal 1002 ordinal 2 libnumbertext-1.0.8/test/test7.out000066400000000000000000000000641416364754400172000ustar00rootroot00000000000000secondA one thousand secondB Ordinal example... two libnumbertext-1.0.8/test/test7.sor000066400000000000000000000002331416364754400171720ustar00rootroot00000000000000# check prefix macro 1 one == ordinal == 1 first ^2 secondA 2 secondB 3 third (\d)(\d{3}) $1 thousand $(ordinal \2) "" Ordinal example... == == 2 two libnumbertext-1.0.8/test/test7.test000077500000000000000000000001421416364754400173500ustar00rootroot00000000000000#!/bin/sh DIR="`dirname $0`" NAME="`basename $0 .test`" $DIR/test.sh $NAME.sor $NAME.in $NAME.out libnumbertext-1.0.8/test/thaicheck.ods000066400000000000000000001541241416364754400200420ustar00rootroot00000000000000PK!f>|ǿY\]}/_|է^Y.ޯ>g4߬?*7ٷ_b/ӹzvuVջտ̇z[/|_^'+ۥ>zgwwn}ͼM8+^|w~jܾ}x:)||Oy]]~=j^]/w~%o³vKw_֍;7|{87^fn/.]_=&/߃~yϴOOUzw ?}O|7_|_^|{~ūg\z?}h-g_}\\sggGz}O.|c|Glq7_]?AG~qs}?~g'ow;{'_]}saͻˇ| 3ǻnznC|qhgwxzwv=z{G.^{7g.,,~O~޿={uOM~6uw~pO>Ǭ~SӋc_4x{sj~nj}vx$gv|{uۛ/_=w?5LWѠ~^ë?t>5zyZZ|>~K|~~Vzy[}r۫oѧoLvg}]ӫ}GB޾Z󾽨?oݹ|go/>=E_ÿ{~sݛ?ݿY>{o?u—|yw_泟C߆~v^aO?x<~/}wEi.wۋk|G7|À{~|7onƳ.a[SITwFr3$cbcWot_ϱW>_w؋̖n_4Wu{_>.ym{1PG7-5]^~?d]~.߽G:Zx_oC}+y5{C?<{៱UTf?y%u0sw;w~滗}śnw|J;Mf}W?_ů:?۳oY~_w|wysox}ЋoI ]|5N'>O_< ӻWV7G6O1e֊߈__Ng}sw__?o5]wߟ~wy돯w?g7.o{g7>|xy66t.7Ͽk|ctu\i״o߷u<?>J_/"}ssqxE?YU?oO7mzᄅϾ˟2>GϚ'__o{?-}ӏO???ǟ~r#??w?"ٹ9'1koƟ_՟˿}z_ߊص/Ϳ/'_x謟}7oCg~5~*Y5UvT?/~QhwYiY>CHO-O, 6L?O?kw9898=40pu~0?ݟa: jԿЧ>qЧ/?]Ч/)Й_I&ޤzt8w_]~{{W )+bru^ثbg~~]{w͚oF-/:spk/z^8 |7aoӏSŞW_{W~Ꮯ~]&Hmϓyˀ/=ǫqاOI}w:oSK>Oخ m6UޮoG8_w徧uU:;uچɽ{uȴv$U!y ҷwfWBsax'HžUaI HWzfLZ/Nf==B@8_< gjL|w2'ޛ:; UF^+V=/ I:d ; V6#B=bOc13@a/m.&_V?/ 7 ޒ {eX2d0J\x[0d xJ$-b+}Xos9 }a[iV?/ ޒ {XXdDb/moɕ׫ު!0z {Xjd'Z_5ۨN{KEs,am|C>B/ԗ6q*=/:t$;DG:FG.U0I0^P!( 6kFP.UV0Iwh2Mi/ gʲ eQlQ=/K&$&;DbFb.01ȴ*H^k65٩ Zך6ZskEb7KX$ǝCtBDg/:mD8iOGTny2$eh2"C}lv#xcRɯ MPvB mehٝ ?&s­ OG'0^!C 2їf_L{_PT~+yxW ՏKE^NJ tW6t~ȴ'e#ӓ {I:$egHQ_NHҥBE&qSvV|h` o7*V%;a`oq;BjwBtY;LK.h{U`~T\mxjreLq<)\&16P،46n pT#f&C x*<1?0 (6Oz)3 $qҘJ@Wx#fF10P\hJ[#\+1ax}rQ U^^~ peerM\p [B #Dpe + )ti-{mbK*F4q!+M\[hKoٳEUP q̏Ǖ8qꕹY#$o *FTr*!+\kwyG)>1< P\Z[.\+1a-sY nC7Dusekmݜ|/{{R]G @@:`qS$n- tJ*@IJ]5at![CR#D%um kuI=;B7y8·m]Gj@[z,ӆ:̕.v*ul~Ȯ Dv.: u*y]1TPPQ]F]m/u.4N/T.vdw**kݨYiCJzg &7?TTQKgǖ&:L/p'Mq~ x./sJތm(&9?ZTQW.ӆ:̕+/v*MHs~4 y._Xt\o ΎVC5zc;ۖxY-%l# Ώ荁Fo,~|.N0N]1ZћhQhe:&g h&4:?TT7|~N0T^1TћPQhY:aP*^!T-h64:?TT7g\0a6y=c@1]䳳ξD{Dv6qކFljj@/\;mPmryhFoCE5zc[;5 Cj[3 4z*Z{>];m\mrzhFoCRhBj8mK*F4z![ZhMnN0NhކFGj@]sF/s*mht~Fo 4zkN0Th2ކF燊j@w]Bm3ޅF燊j@w]CF/s*]ht~Fo 4zgхoN0Qh6qޅFljj@w}ۺ: &mc@wѢ5蝅F;m\m3 4z*[YhMnN0WhޅFgG3蝺F UI^Uh.4:?BTwS#.䣓:F/|-]ht~F 4zJ:m\kbޅF燊j@w}stPC 蝁F5Y*鴡Bkb A3轺Fu%6a5z{PFCCE5zg{utyV:aDk7qއFljj@}"?J:m\kbއF燊j@}uYG'u+y^1ZhT7wAO r-轁@ :=b :e ma 3 y*{uG/"zD›aH>9?NTҼ7ϟWOt-yq8.CDuyo]~xyDqpm4(BDEyo Q蠋0i K^܆1NȇP8QE(@t.p^7ar|9㽁 >"9e8ma 3 Z*{->hGg]00Q[86q!>lj @BX, u-lx{P BC5P>A[?We^=aąxY BD`m-xe,shGE>"*@ڊ|e/:L(/}-Cr~. tˏwN0ZҼmc@Ѣ|0P磶:?zܙ2:}hmCFcht~F 4ї;_Lu-q^1ZPhQ>(Q[;,O8az{P^CCE`Gm~&0Z=v(`PQ>Q[/xN0]½mc@Ѣ}0v?2ͷYK\  *@ _Y% *F!*G>"sI޼mh1;?ZT}Te|6a{{PpCCEh Guxֹ:mPb>j燊@O}suP={{PM ٧PQ>HI]ϺN0T=c@Oz}4듺^_:YɎ[U&j;- d2$*'>Y>;r'vMdc@OJ}2Pŝi[:L&wm):?ZTOb}} 6a6mc@OѢz}ŝ]u"Zw9hQ>KNq%Nξ+ NŷdO0Z;ǀ5Q>kN%NŗiG;L&w1`,<7`9Q16 9O}}ar2=m #C$B#QH|tS(tiCp'<=8-EnjG}Z_?j1i;:9OϮϾa._?38PgWo߽|{y}{q{us-,5 lϷ_kAuӗiKn܅6燤!6ؙ^vL7^0$$8?$- *xTAH*PUl~H:]m|ka%; I.aoUHi~Hz)]m#}iÄdrz@/Wc9; IC.g{Ub~TFQ\m#ZȚÜd![d!1P6ZVÜdzrQy[eG2]{#rs"iqOloйU\~Hέ tnsn,f rI[>1<`wb+[ش8L=Mbl@V!gr2M'8[$tmk+][ڴ}M-mO{n*p+[+ {y8=Mbl@֡tJ2PMU7sH!$o*y+[IGozpPAc#h{K'oڗ}+[iOWMqA{؀CcCEpe k=Ŕ[WrA#\>1;6܋&: en: ͏ٍnu>8+9̒-إ: ٍnuŞr/tN0K7ea6t6;N-٭nuuϫ8>Mbl@g:5٭9y 27q݆lj@g:[~q$K- tv:$[l9 .m$ml~n tv%wN/H.mtv:$[l9 .m$]l~n tvnyN0E:b@gw:5ٝ9y 27q݅lj@gw:[~q$K- tv:$[lᛝ':̒.s']lv:;)l)0B:7݅dž@gw:{vv8yIb7q݅lj@gw:{ifIRg[ .t6?HTgw:Sً<_s$I]n1H Q^Qg/|A6_zI]n!H=>t6?HTgw:WSiIRg[ >t6?HTgw:WK<'r"I]V1BQ^Qg/còIRga>t6?NTgw:WifIRg[ >t6?HTgw:Wً,;au8BaD`G=}g4 r7 qAgq:{0٣^>M>av8CmD`G=}gZq$(K- 4$=iopqPqݥC{ UރY%(0 '=/5a%x{P CC5R>QQ/00E7 >džJ@|v<9yIb7q=lj@{˂ifI}[ 17?HT|{Tߋ<#s$I]n1HP Q=(IQy/|6_&I]n!H)d7?HTv{RSBiIt[ h)47?HTs{RK<'r"I]V1B Q=IQp/cbIna)6?NTmj{RTifIk[ H)6?HTjR{Rڋ,>1< P=HIK:y ]1TPPQ=I 1 'Ot(;0 '*'=ٽxY7JMt';0 4''}ݜٽxY7JMt߀ذTy'r#Nq{җ͹νQ:m8 ]1N)7?NTyOʻ9׽{3N0Kwv[ R A ߓnu^|Ç{tPq=cUo~ws{gsoN0QwvaS q Ώou^|!%V=03Ķ!!h$wsDDxyaKݿJ90Ni1QV/}LڎNS볫볯=AH*Uh~H:]m$<0$ 4$L2/~rMxaB} o  ȕ@a;D 5y!ɷąlB !̏Hb ̈́X'Pմ$0$yмL4$L.>&$= *-;*-W3߉pvOgs"iqOloйU\~Hέ tnsWT8Lw v*2PM7s;$lr*g+9[y38=Mbl@Vk2еMa7s7 A!p2"8=Mbl@֡tJ2P%;>=af$  $7=8(u ڷվ8L=Mbl@!"2~b9L.ePuavxjk5\+ ,jH:$dq*kY\+f#$i0 q'k}\++/ Ϧs%I\n1H  Q\ZQ(/|`6a$r bC1DsmEżxn8Aj$]s 5 Q\HFQ:O9 ꦍs$I\n1H Q ]hFQC/\қ0a$}tQ[nBL#Dtm E1 &Ot$IC]1NP8QU]FQU: s%Ig]n1H Qy]FQ^/pDYn: ͎SCuvc;~eWMq![O{Ml~ln tv{-qaqD c@g7q:1ٍ,A6ao.m$Ml~n tv{ q$|ti nBgDuvc[;秜uEr8Ajo.mtv:$C}pʹ('s$ᛩK- tv:$U=; r"۫*Ftv:!g=dž{sDA c@gq:1٭%9̒-إ: ٍnuŞr/tN0K7ea6t6;N-٭nuuϫ8>Mbl@g:5٭9y 27q݆lj@g:[~q$K- tv:$[l9 .m$ml~n tv%wN/H.mtv:$[l9 .m$]l~n tvnyN0E:b@gw:5ٝ9y 27q݅lj@gw:[~q$K- tv:$[lᛝ':̒.s']lv:;)l)0B:7݅dž@gw:{vv8yIb7q݅lj@gw:{ifIRg[ .t6?HTgw:Sً<_s$I]n1H Q^Qg/|A6_zI]n!H=>t6?HTgw:WSiIRg[ >t6?HTgw:WK<'r"I]V1BQ^Qg/còIRga>t6?NTgw:WifIRg[ >t6?HTgw:Wً,;au8BaD`G=}g4 r7 qAgq:{0٣^>M>av8CmD`G=}gZq$(K- 4$=iopqPqݥC{ UރY%(0 '=/5a%x{P CC5R>QQ/00E7 >džJ@|v<9yIb7q=lj@{˂ifI}[ 17?HT|{Tߋ<#s$I]n1HP Q=(IQy/|6_&I]n!H)d7?HTv{RSBiIt[ h)47?HTs{RK<'r"I]V1B Q=IQp/cbIna)6?NTmj{RTifIk[ H)6?HTjR{Rڋ,>1< P=HIK:y ]1TPPQ=I 1 'Ot(;0 '*'=ٽxqDq c@sOq{݋utDwq Knq":'*'}ݞ=?&:enTAByDs;:^q$|gwi  Q=\7|wI'u';K3P懊I_wv: )'Ot(;0Ʃ8ljJI_wv/sN0Qwvg U  U{NTo B xo_q|}b[HHT4=Lpώr""N~a<]<%|raҢc>^|5gWg_{w/y~\`kP__QN{a s7BBqCА+|3Žxrⴇ$f0$$5?$- 6׋gz-M{_H|G}{Tt4$:LG/}ka;%i; Iy>aH@2W!!iH $sd^*XÄq@WwkCo FpBF@W Ni;I=aH@Vy!hH 4o]|}L;I-d{U[vT**o+y[)[gD0$sйP[JO>pA#u 'n%CUleb+]|ovI *,?6TVrҕ7fNqaK{ڛ؀BcCumekk]]|niobSCcCne pkEEJWMqI{؀ҭCcCnetkEKw.>}zH!$o*y+[IGozpPAc#h{K'oڗ}+[iOWMqA{؀CcCEpe k=Ŕ[WrA#\>10B:7݆dž@g:[f#$0 tv:'[l9̒.m$ml~n tv%wN0H:b@gA:5ٝΖ9m u:B:]l~n tv%wN0H:b@gwA:5ٝ9a r݅G@gw:[f$0 tv:'[l9̒.m$]l~n tvovN0K: c@gwq tv{,SjI$tv:;)f#$0 tv:';)+/Ks%I]n1H QNQg/|A6a$uv BgDuvg{Exq8A%uv Q^QgO9Ks$I]n1H Q^Qg/\G0a$uvQ[Cg#Duvg{E 'Ot$I]1N8Q^Qg:Ks%I]n1H Q^Qg/pDYn:͎SOuvo{U} &(~jȺ!Dv"*{ݫlzp8ᑵ UؽUZ&^=aduA[C^#Duo {Uy}x94x,5m#ںm͏ֽTpճEhum"4BX#Duo Ua3 Y#$k *FT!{U=# rYO]>1< PIHAURD)FHP[ !4?HTOzzPӏN90Enb@L!b7Ӄ>|ebޔqS$k- J*@IzJ9w ӥzz=Ӄ:߬$(K3 T*U=bN0Qº c@[qz0փ>zгupDqn {͏U؃у'((0i=lj@gz:{s4qDqnj{ ͏Uۃi9̒.q$chn~ 4qYCIPvg (17?TTy{Sg':L.w'co~ srPC*| HUhGE/,¼jIz$$*G >*Jf#$i0 'G=*+/ &s%I]n1H  Q=QQ|/|6a$w CyDh'Exr8A$}w M Q=IQvO9 s$I]n1H Q=hIQs/\n0a$wQ[Bp#Dh 'E 'Ot$I]1NP8Q=IQm: s%I]n1H Q=HIQj/pDY4n:{ ͎Dud';XXAS$|gw ԞBjCd ';g[.$|gw{PڞBmCEd';/,\>03!!h$ww^:)8ytً!/wnjc s=iǤ??>>/^~y@]}͵t[42;F/~%;L_.aorD_qw(cgz'N~aH2mv {ÐL4$F\;ӫoBRe:!@GW!hH tt>u$?0$湄aH@2W!!iH $sd>=ʧamړO{cPUc~<u\mC<0$aT@W!QiT p^1<}оP[hZOP?aroc"̏ Dp]A#hK'pj@ ׊j097Y\,dž@׊xv$6yIZb7q}\>lj@׊x³ifI#[ :2?HT(BVʋ<ئs$I\n1HP Q\(FQ1/|6_I\n!H H&3?HT:ҹQS΂iI>[ h&44?HTCQK<&r"I]V1B Q1]FQL/câIPa&T5?NTUQTBifIY[ &5?HT^Q׋,2Mbl@g7:1ٍϏąiFH&27q݄lj@g7wCr6N0K·E[ &t6?HTg7:ѽ?z~q8AQb@g7A:1٭Sκ"9a ·N[R : ٍnu>8k9 ԥ: ٍnu爵rƅkg9Ll#: ͏ٍnuﳞcý9m p]1N8QV냃ν9a, ߂]n1H QV^+/B紉$|Sv8nCgRVWg j $tv:[lᛝ':.s'ml~n tv%wN0K:b@gA:5٭Ζ9m vA݆@gw:[~q v A@gwA:5ٝΖ9m vA݅@gw:[YS$*Ftv:![lᛝ': .s']l~n tv%wN0K:b@gwA:5ٝ9y, 27q݅fǩ:3ٝdUSFHRg&16PNQg7'Ot!I]1N8QNQg_yY8m,IwA݅@gw:{ q$ - tv:$;+S/ R/ -݇@g:{~Y8m IwA݇@g:{:YS$*Ftv:!;+wlXv8y Ib7q݇lj@g:{~Y8m,IwA݇@g:{e':̒.v'}lvz{ݫM0AS#Ge10 P^Udӓ-S9 .n$P}(l~ v2YS$ *Fu!*{yݫ#Ρg9.h!}hk~ 8/B.hš!*{a= GGIWr!Y[]V1BPQUAUU|nz"I=懇J@R-&M0Bb@OAz7Ӄ~tʙw,)um#bz1͏ӽTK-s"Y+]n1HP TIJzSҏq9.eCi~x 7f u$AI]1TPPQU=AOU/spDnzm͏փу':.w'PC(l~ l5>_FA]!N#1t6?NTg:{':.w'Pcm~ Lk8aw CsD5`G=} ;0N=c@y{0Pޣ^>>aw8CD`G=}㔳:L/}*PcpvFG>*p|eUSH҃&16 ǐP >HQQ7''Ot!I^1N8Q=QQ_yY09m,IwA=@|{cq$i - ʛ$G=)*S $ -i=@vO{~Y8m IwA=j@sO{rYS$鸋*F!*G=) wlX8y Ib7q=lj@mOj{~Y8m,IzwA=J@jOR{Ň':̒.v'Slv&'=ٍǚ{AS$|gw ԞBjCd ';g[.$|gw{PڞBmCEd';/&:Len{ ͏ܓt^<8y8 ]1N8Q=k\ŃκQ:m8Ćt8sqʎݓutiI27q Nq{WKqt8YbjRo~w{g>ܻ:%C@BCEs;g{tD cZSHp~%x{g 1.%|gw{PuPPD T[oUNJ&[y~0 =!6?  ϷR8M '>0 #ӏ} hL8'DVG}_?j1i;:9OϮϾa._?38JgWo߽|{y}{q{us-,z5Ϸ_|rʓs-OycBC_h[  <07 !hi< u^8+oʓQeSģ\pǣ0Vy=ou<0b7\@ǣ0Vyk4f#[0 ` 4BJ/^&>0![d!1VLw)O:LH=a<@V!lh< m]xA\/<vl1{{ÐBCRQ[JK7I 31(*,?TVJRRNq17[&16`hS+Z)rF8̌W=b`@V!X2`M6kH!kʕ\+Z+*kkF L-^Ox$l*a+ [kI،gF8 =b`@֡eZ2вMD6yi󳧺= :D-?*TVVNq)c[&16nPPu[ZI\5af2 ̭dn%SfFI :.;65ջޭo|j̈y!o—*|k[k q#f~- p $k\k)Km>eM0Eb.b@ !R6µ^<5mҶM\&Gj@7ZxgشY"ԈҶ j@7!6Ǎ8|66a ri[JnB%#DUrm-tijm sr ˵\n[.6yY2wA܄n@77Zy~n,)Υm# ͏еnKm>M0Eb&b@I7Ajn tx[{0<10PP%(F'}o8ᑼb@I7AJ1Pҍ]/ f9LEm#J %͏UҍnSKf9 Em#J %͏Uҍn\fP+y sQ[PQ%(V^#κ\8aI\V1BPQ%(VϽx ͹}bx@IJ1Pҭ\Xs! - tJ$%*}p=o,)b@IJ1Pҭ=Z5iHwA%݆fJ5PҭރjH*!tJ[%**i9 .p$Pm(i~n tn=N0EJb@IJ5Pҭ8mI*颶%݆G*@IwJZY"I*颶 @IwJ5Pҝ8mI*颶%݅G*@IwJZA# 'tJ[%)*i9.p$P](i~n tn=N0EJb@IwJ5Pҝ8yI*wA%݅fJ3Pҝox U#GLI10PP%(NKIN6O&s1%]n1HP Q%(NKI_j=o,)Sҥm#J %͏UҝiFHLIU(.4?BTIwJRҋG<^LIUPJ%͏Uҝ{޴Y#$K*FtJ!;%k)#z9̏.gP}(i~x trɗFHLI[ (>4?HTIwJRSyf9L.m!P}(i~ t_j%o8)SeJ%ROto{=%}##Os{}h~T dt'ݔYc#h*F4t!{ iGz:R݇懇 @@z|gCՃG>O >3?1ʛ&:̒.z'clvFG=jl|ūF8̏>b`@d!"{4٣ȞlN01< PI=HIKR/咏|9.s$Si~ 1< vP[J]&0<[凇@76_ SCCoe k]zk/o[\懇@׺:8^§I :1?6TWV9g9 ).h!Pu(c~2 qo rYw\>1< P\HZU"ܧ˞0?6b@+סV r pA#K'Ds*k\@CI8g :3?TT=Ub.M0Q c@F!q26ѵ^<,қ6at8CODtm]=xY7m85ž CMk~ u+K&:.s'PM(l~® v:'s%a]n1H Q]HFWj/CIng h&47?TTsei&Jwa&7?NT|ߋ/\x!9aDߎ]1N›P8QFA^0ao.p'PMp~ o Tx~s/N/N-nԂ oCDUxc[{ I&7qކ lj@ws:jfIvAކ @wr:m8]1TPPQV.p9uD c@q*1P=bӆ:LC* UKUxk[u.sA$O~Pmp~x o TxN0H*=c@*5P᭺ :mDɫ7qކ lj@*\&봉$ 0 Tx*'[ީp᛬&S' 0ĩޅ lj@w*\&봉$ 0 Tx*'[ީp9̒ /j$P]p~ o TxN0N*=c@w*5P᝺ :mDɫ7qޅ lj@w*\%‹3 Tx*@w*U̫9 /aP]p~x Txg[B+'u$a^1T»PPQNW_f9mD 27qޅ lj@w*|rDqVen* ΏUᝁ uUAg崉 27 qAq*3PὮ tYN0N* c@q*3PὮ _: 0aUxi CDUxg{]W+'u'a^1TPPQ^W:,Mt(a^1NP8Q^W/srPV%C*UOUxo{m~- >a~j{S$$x*{ kKpzexrD7%n͏߽W^>L^=awY C|Dwo {m}xʙy8AeʻU޽)gie4BvDewo mq$n- 4${=hkSf9L.e!Cn~ -߱┉$nK0 j'{=hGWs%q]n1H QHA[jpDY7%n:{͎@u`UǙx,Am#j{͏UۃTYsIVpǶ?E 4-=je;N0W=c@y{0Pރ>z99}PɊ=懊@Y8B5J A*|0Pᣪ _>L>adx{PCCE`GU-~ĉ%+ 0 'E>*1s\O]>.G@|3tPEC| uU烁:UeΚ0W=)ZhT}ZEӫ9̒C/act~x@ +g[D'u$a{^1TPPQu>QW_:mD {27qi>4ljJ@|sDq6en| ]Ώ壁.tuAg紉4 27 q@O!q|4哮(t.sN0N– c@Oq|4P䓮"_: 0axi BDh ']92'u'a3^1TŧPQ->hIW:0Mt(a'^1N ħ8Q!>IW/srP%C*| DUd';d ܦj,Q^V1B ħQ!>I9sI·->Gj@Ow_N0Wwg )8?TTOr|R|sN0Twg ()9?TTO|TGCEE/s;g]촡C%Gy{PUPQ]>\λA;aDQ^1N5)9?NTO| \e[:̕oABs5hm5D>06!h$x_:)N9yߋ!/wx2sqZH鞏‡~xcvtsŸ_]]}/]^gpή޾{sZ:Yk@}y>o#/S7 ICC/md3J&'?0$һaH&Im~HZ]m#Ur8a!2%v {T t4$FVº7KvL)]0$ 4$F>6I ɔ̧1*d2?L!ZkbswLi\0* 4*rF/r5a9ɔ% C DCb {mdǵ4y9ɔl yˎJEme o+EyD0$sйP[JOf]'00^}bxVq3?=ariocr 9ˏ t,n}z[$tmk+][Z<,.iobSCcCne pkE|n4'I (:.?6TVJVTifpI{;CC%oe yk=ɛu-kR[凇j@z7)#Ou`~l Dp'e rA#\>1Mbl@gw:3ٝΞnN0B: c@gwq:3ٝΞq8Y: ٝu)iIRg[ .t6?HTgw:Wً<_^Rg[R:ٝuq8A:ٝu)u HRgU>t6?BTgw:WًذpDAn:͏ٝuq8Y:ٝu+/'Ot%I]1N8Tg:Wwߛ`F8̏>b`@d!"7ٽȦ'[ sY]n1HP Q(^Ua?ze2ճH_U>5?BT^WׇGCWr!Ys]V1BQmhAU[q^=_Yg]V!B!5?BTXzP֏80Bb@U7PՃ>8w EzIԽT%[.L2ad uq BODtoU=3yYS$ *Fb!*{1=×Z&M0EVb@IA a|Wr!A1]>1w5aew{PCyCE`G=|9*9}D r7q=lj@z 1)g u(A ^1TPPT*|TT,¼jIz$$*G >*Jf#$i0 'G=*+/ &s%I]n1H  Q=QQ|/|6a$w CyDh'Exr8A$}w M Q=IQvO9 s$I]n1H Q=hIQs/\n0a$wQ[Bp#Dh 'E 'Ot$I]1NP8Q=IQm: s%I]n1H Qs7uIǯ"x?-G}mhLhl9JozYͦ(D!2YE"^DE̐JZ!f0JO^0KF!NEg/qZjf7N^5r{{.JMTa8}Swq:Zv/{ٽ}؋}Ɖf CB+o|j+fCGܕ0K7K\|T_|/w7wჽ%=Taov[3*PƇ ^xovo: )wOT(67 q%N.q%/;ޛݻ[C&f=C*WP-w @\=29)ouW57>^_x=!9)_*^~ﵿMOT2c-~_wv ~?ӻO_Ͽ:*{~YRg^aTN*n;ۃ,%*.QuTv~Yg^_TI}mg{%*ב/ ıozQ9lRDtpXGE@DWZm srR;[Hdב̯|騧=9BaTN*ek;\ 3ׁ:}TÞzi9lRpp9RGE@W>.Փ# CL/:0A@^{\Wb|{ۃ\R  >ur;KalB~Z5nQa 7OO.>< b7ݾA Coxo~z^|xjTodW}ǀQ';ߛg O,7ŇA@F^}5Hax-}BxupW=?EarmobSqtAM- i^,5ņ *82GVA@GVe|5Ha~hݱ}BxD.%rȑU":0?6V!BE+GZ+Gy?O ! )9hƇQ@4G^Ѽy{ g{P]=CU(#z~cnD"v67 q*2:ǩQ@FG^Qo8[i8=]OT(}(7Q_TuraS-Nzб4o8k8\aT+({D1Na]BN.AvډWj~*ݶgU57>T;j[2侉 EmnTwrS-N{*LgUQU8:TVI@'߾!MpA D )*< LJVI@';&:7Ta/_3*Z'oa? &81Qac0ĩ*Z'eo:,MT' 7 q**< ǩVI@gۇ=1Q_2m.qEgW8*< ~wC'81Qa/q0ĩ*Z'oso:q Dn!HEgW *< ~{ }CƉ=C ϮUxPNpcD_6aSQU8>N O*<~0QBUTxvUUxP]ܶ>4HaUSTxvO³ *uPAWf **< LJVY@gvN|ɺoDѫp8]T,3 'd7QaU C ϮqUxP 'd7Q_znp%NCQძp|jT‰/YMT'znpW8*< ]S޳0K*n!HEAUxP a=TaU=C \CU,vN|ɺoDѫp8> ǩVY@*uPWf **|pPA@*Z R$bnaW*|P ߼o =TaU=C \CUA@*|A5}&X0ĩU8>N Tw:,MT'bnsW8*|P# }(7Q_Fbns%NcQᣫp|j>Wo:,MT'bnsGW8*|P# {1NaUB ]TA@*|>X=TaU=C ]CUA@*|ֱfoDp8> ǩVჀ yU1V+wU(bnyGWP Tȭ¿05Ea=-obS$Z|=F܀[0ĩ7>NȭO^Hĭr$@>H-pDY"77 q*:{rTI@gO:HY|x JmC[=GVۓڞX'ŧ*m*{r͍V'=je;0W!TEyO񡪕$'V[x CE+MBUZO{f/uS/T37U8>T T̪:/U*Z!nzgPZ|3魟͝&V0ĩ(9>N"̪_~R:0TܷFu9>Z.t̪;AU+ZinzgWP|P3:s)OU+Z^U4賀Fy5:|cA D-SZ}M* =gUQ糫s|ju> Wo?oD{s8i>4ǩ泀4yCG羉 DlmnTtZ|E&Bmni)|qQS-gQC2羉 DlmnTZ|U{;)[Rq|j9> W~ *gUkq|j-> hWo:0MT(b'ns"8B|  Ƃ El-BUT*Vዀ _oÏ\>4Kao*DŅ8>B_~|) D!ZE/Ѫ"e}CF=C_\CUE@/7w:6wU*f *|qEU~E؏>v쾡JMRZU?sXժ|W?ECNp@oX_*75VbZ/~|NiwLԘ)kW*B\U__~v\Xn|k:>\B_Oh1YW.zUXJǪV J).x&8=Wc/_J߱Xk_I"]W_~]/?~TzLcx]֚ᮜ ,W/=|vƜ/vُSc3AlxcxΣZΜ -I 4W毽#kL9Anh}kZHp&-6<\ņS_0-6>HKqeh"!U$+1q1^cZlC[:&HؤE]MrNSXܚ04AN&'J:\EIBi9g-q ࢙ 3s b_|UsRִ? Ҳ4i*O΃9-q hZh >xtk iQ\ABVQ|d2zc;k]S8i57HH.y!i\ѾABvu7Hc~/t" ?"8ŸA /A GWipPÑW " ҘbGlak~@GidqőWwFLbk|۫\8>&HN>̡`,ȆֺrtLF( Yr` 5&stLF1 YcY#D uMHH(!#tg 1BB h(#rC5&^]+僋r\5HWo?ܹoPr+^|pQNF|廯ŝ&jL(5Q jD !G^QQܹoDĢ!Q#E9AQ>HWo_;;MԘ(bQnsk@. ՈAB|#s8q"֖f D袜 K($D+w'C5&X[^+壋r\5|#(>x,w1TĢD(]$僄(yEg2:w*bQnyk@.Q>J[ ~~k [[^P+r4|P#"_8l1E~D]$㣄x!7͇i5KG,ᷟ{ޟ"ǜ˿~Ge}<~凿\^3Ͽ?5>va~?~~tӿ-_~_g?O_~PK%PPK!f< styles.xmlYn6}Wr$@Nxy qNK % $|Y+IQJVsiڀw9s!9u yb+oޥ{% 2fQ\zB((bi+!A2GK-YslڕƦkpS[⽜-]t7ݳ7cvS8m'l^P/a^IJI҉bOIan,f. _K뀣WjTbL,-6MOa!evdjD tU]N3i6\]th:vKcU)ŮÝo(|ljļFQ8N-IZ~s\0.@3Fftx*7/P8,__@j49xavuwb1gqkI>Ъ,D"J"kO:HJrl1Q@v$VQTJ6M;:&.ZP q@YCi/Mh,//1Ro¾LbF/M!$&=W HAn#E&,K (?](Ez-|TM/t*Y1~6S(̼`R/~~UqoB{X)[s)=nz0O]V.垼;d;vk1H_'ajwTIfOwqSQ(A{WR.  71{Y){Jrx^2;gш?@KTcEi NqTzsj{ewJ!QI*Kc-Ls-L+? z}}}}wCB'*&C3ߨT*lӼC1 j>>jVG1п$yhpHڄG="ZZCz uC3*j{o0 /bΫ(pرCb uЧʧ7)omhX4f+՞zkPKrPK!f<,ٔPPmeta.xml 2009-03-23T15:40:432010-04-12T14:49:02PT07H11M57S8OpenOffice.org/3.2$Linux OpenOffice.org_project/320m12$Build-9483Németh LászlóPK!f<Thumbnails/thumbnail.pngexw<_?-R22DʺlG$k+"ەו+{93^zNADGb>^z5US<0=q.=z|OP][iEZ NRc[ Ƽ3E<֥<̪Z_ZWڼ-B?(#R t|3}oĺClroUY>ؚ\l .5op|L|.>UOayɝxߓfdfqn :FW0 wy8j5m( ɕ uwHHLϼ{w3_ea4e%dcc<`~sVZZ8T_$t#~&uh!M)iɕ%850447X` 9)`=Kuv7#xՒbX"8N+-̷|@D2(_CaU6Aƌ ( P>+xݴ,aXND+}yy!z2שr?01qOw9>R!*Ÿ$݋d(K1RV H 2DɼF"6e>+1noƫC Jh;ʌ|n" >flKѐ}gZ{"˜0-&jӭOEq*)Yws’mITBy}Qy99r܁ӮȮ:ѥ!oSsTV˦V~SY8GN`ɫ0H#J۴[פ3kxZᅯ 6gK*bp}}Snןzc=b^)l`\< I &~% IN[R)ϚO1+U10w]VcQnEcAq&ԑ)PJabdfek]<(IyN2Dj63Y١v6VTl2KI=F̬'z‘OmfX6 ;Ldݴ=PhM79WQ"m]|MX&;8}h uduŋOv&CuL-WWݧ%$]kjУ='%ł4Ķo0(^a{KII9Y_ˎeZ9 3]v^ļnb0ޫ}p`)iCxD444\4"*Q5B̓$ 4? < 7Y8’.UdDCKkٷy+,{*g?:233O |[39/Qeq\gj-,^tѺJJPf1Ko9ML&| !corA1O0w;6Y._D`\|5ޟ/O>z-w?\~q2 QߓXۈBfRJzOY3 ${/zWŊͮaJbΏSɟo|I9Rq4VzbmlL՗9bsGFFk%e@Y''$D:rQ@)Te.0oϡhD1#tکc {Y #PEܾf˧75Ж۶8.^*# |?_7i8smLi~~#2-4PeY{K+>؇ަ8ǵ6F?э>&IzA Ԗ(oN$T"a (9[lrӧggM 7U(8<c]DDȋ0ԖnJtڕo?~#W}ZwcL!ITUk7#a9Hl> +@z4p ͞j1'Z+$$Ff&N, խK`7Xf ?`Aq {eQRNg7W$lkÔ`t-b~g{&R4sڿXz k&'##bc8gkXi1Š*Dg Dva/庬 _$o}:As(z}Ybg WDȷCLU\k,S6*/9kz̥&s+kknn3mlڌG SnGu?Bsd޾1 LS)ݧjA@ H}(2/t= }/ɋ%@_4i/zew=yqA'/je6dVn4MBNݨJժgMY](K3zk3lalJY-|Q,pB쀃H`oll|IdPnqSDfr\ M3{6ey"k ԁ)6cw SVCO)\d#H kܯTl'V./;Eö2H'$}ׁC䋺M/v X- nXܽL]R^xM1grlWE~j,ϝ^ջS ܐOwҵ)*WY03xqt_5 rl[JV71H#尐j#:F~eoՋ_iuUԆ5G˱#Y'+4Dh[p\9^#7M<6A,޽KJJGK޹{`񀧃AC~2ר?]*_0+b em beKHVv[?Om!L˷2Ԅ!,*5z.1zzg#Asq~ªe(e7ľ\rUi,u{zh#xh.z|X{'H8 Quʪq}\fZu}(8ӣj׳w/+˸ tɒOPfnj S^uO% jjv@~YݽX\&ӋdN/j *U4&2E]#P㐖63E{-2655vB޽{zK+bxJ1 H|陬6ox~o\e&g̎^vWu B~{ƻe)ΧLBp-gn29,8-͚.B u\.OݑFcԝW`a$%Ƴ%䎂^ GgQu՟R;AЪfsʯymMY.&KN_K~k,rۊA &Z֪K׆\?L*ٗM]X3ԍmWgyugoMKd@{jF%ƖvւER!}Qp@ԍi$f6&m5ßFigʨTA U`ȥ1Xgh4Mٝ;4o/ (n]'M՗ R3Nn t\E0fV(,^㾞'+M7l$ o+RUiO%1t 0xyH^iY2 We(` TW´`‹,zr0iӒbh1thEKmSj=o+d6t%XA;}v&9~W6r0V?mmIf(@emڜ۳&7XE綵EDDLOO QQU |}5[zB@ע]JWJɏG;^)88P俦E7ӆ$l xJ ꚉW6q)ǸE?G\Կ|d`JA1Yc;H7c>S["%[FHW t\Sg.R```||<8}⩸beb%3֭Ar!LDI K\^9gSљu8)E5 BqxO) Sko09NsęD,,,n㎉g& B&TURk ([&u\IsОS.>3Hnd*d\)*okF~,.)i5ʴEUR6=|[{_ $Py伻B6enkc8s՗ >K!Fn*w=>lrBYcgk\/S j,A6at<9q˗/CN~/KmF=S HOz(7vG˴;Vd ܷȺ9`[pz:isIoqx:%[2EF&VqnE9S^+F]6O԰ȹ߻yW%M2E3z\*DSWȴ7DkdaL4߼q R{r'/ڊx*$ˆ2Vq+rcfP+SB#Ji@nFV2Ϗu SE5my|5mJDOOs&)HPt#|uϱ Dx~*̸ޡ) FE)ʒ"SǏfW>8F#(JYTmt ;2>?6n ![}me,%+LkfN\[]님T pD&J}*x[_W$+ H- :[R[|Cϕ":򥩯%n)i 'ZZiM=8>T3NgF-1Nҏ!YEl <Qy-:v$>hޙPg~~J?%3,K,DC^1A)"aF_ >9;;{\8%t X6z{YqQ _8H"ȴ:Yp KT5KwM!p"M=\5},#;ر{5k5UtnC/Tw9=td{U rBJV@+tO_Q9p7ɺ,,^y-uD%Tw$#ߍL)"®rW#\KKKnd4{I B. Lo[lD"1|F7 ;{3nf]HCO֚/YzԯܠF DI^g_δ\ qf&15\`5rreT=l_SZ9Btf '01w>xwz"0|d<ԵpVMX(%R/-|RU/-`@{~)Fۯ'}YT[ P_WO;aB$Īd&Qi]~]kM۳&~z% it $?!+: 8Z-XP[@6xţ>1=oQl,.''w1&yzqϤKʊ]0AƖ!_Rd^2޹?39 )a)c=jڨ@X[_L!:Ś<tl@ul2'&";7 ѓK+pr+d)Aq*bsblȠBsQױ8GwφEmtӮJJ>|~o'`{@(|i;9yiG|,Ɋm#f"?Sr8%`yY NrA.RSGAaz*i}]/~? k=T7ǐW|%β.q ILY…Lnmq `"藖DMAU  M):؏, @"W6EsX*<91Ѳ]Y]%dဵ b*-&-LmT$v4`X/,͓']B3}dOsFkw Uq(zw!lFzUݐ댌`mbjƸt,4 |ҏ\) xTUUzPKb$%PK!f< settings.xmlZ[o:~?QK- ) H//+'1[ǎl~.UB!YuuNߌgƟg.O||0#JJHU qȨ s{ :"V\>$C!~ ^Y W  >ThjY\#\UC,Ps89L !<%޶?RnprSLYKgǥY~*mO !pem9HB!9hN}bn䕛O L::eMr[ێ _ oƈzw 6Aܜcs]?C}a"d vgz~8G`MEggMy.0h;ޑZ.1yЁZd'~P[āoc/ǜsn|I;Prl,oA-_Vn]Zi_WzY5U ̋u>$kڍ^+~hjԧT}z1h4ۆu~4=mt,ǭЕ}9ZC=Vuv0vfD㻁 mMz=/5~dv;=[V>*w}멯F:& s[AI^'wS~ɋא%x[֑ӽsgkʡ8d@?=_|Hi]uZ Authors and contributors of NUMBERTEXT/MONEYTEXT development




libnumbertext-1.0.8/web/Makefile000066400000000000000000000004701416364754400166400ustar00rootroot00000000000000all: cat index.html.in | ../bin/shellhtml >webroot/index.html cat Soros.html.in | ../bin/shellhtml >webroot/Soros.html cat AUTHORS.html.in | ../bin/shellhtml >webroot/AUTHORS.html clean: rm -f webroot/index.html webroot/Soros.html webroot/AUTHORS.html webroot/*.pdf rm -f webroot/Soros.py webroot/Soros.js libnumbertext-1.0.8/web/Soros.html.in000066400000000000000000000146011416364754400176010ustar00rootroot00000000000000 Soros IDE 1.0 – Integrated developing environment of the Soros programming language
••• NUMBERTEXT.org ••• IDE of Soros programming language (specification) Back
   Output:
libnumbertext-1.0.8/web/index.html.in000066400000000000000000000512271416364754400176100ustar00rootroot00000000000000 Numbertext.org

Numbertext.org

Home of Soros Programming Language

Learn More Spell Out Numbers

1, 2, 3 → One, Two, Three


New chapter numberings in LibreOffice 6.1 (see also NatNum12 modifier and NUMBERTEXT() spreadsheet extension).

Write Out Numbers Using Words

We provide easy to configure, lightweight open source C++, Java, JavaScript, Python libraries and a LibreOffice Spreadsheet extension for writing out numbers (including cardinal and ordinal numbers, ordinal indicators and money amounts with currencies) in words in more than 50 languages and numeral systems.

Join the Numbertext/LibreOffice development: check the Soros language tutorial in the integrated language module development environment, fix bugs or missing parts of the language modules, or create new modules based on the existing ones.

Background

Origin of the “spell out” component of LibreOffice 6.1, NUMBERTEXT/MONEYTEXT functions and Soros programming language was developed in 2009 for generalization of BAHTTEXT spreadsheet function, a function of Microsoft Excel to write out numbers and Thai money amounts using Thai words, standardized by ECMA–376 and ISO/IEC 29 500:2008 Office Open XML format.

Soros programming language is based on regular expressions, just like its small interpreters (in Python: less, than 120 lines). Despite its simplicity, it can handle language variants, complex spelling functions and rules in a concise manner.

Download


LibreOffice

Extension with NUMBERTEXT and MONEYTEXT spreadsheet functions: numbertext-1.0.8.oxt (description)

C++

Source distribution (1.0.8): libnumbertext-1.0.8.tar.xz (installation)

Java

JAR package: numbertext.jar (1.0.8). Usage: java -jar numbertext.jar

Python & JavaScript

Interpreters: Soros.py and Soros.js. For usage, see source distribution (zip or tar.gz).

Sources

Repository on GitHub: Numbertext/libnumbertext

Add a new language

module or fix an old one in the integrated development environment.

Soros language

Specification and Tutorial.

Feedback

Please, use GitHub Issues to report problems in code and language data.

Donors

FSF.hu Foundation, Hungary • NLNet Foundation, Netherlands

Spell out number     as  

libnumbertext-1.0.8/web/webroot/000077500000000000000000000000001416364754400166605ustar00rootroot00000000000000libnumbertext-1.0.8/web/webroot/css/000077500000000000000000000000001416364754400174505ustar00rootroot00000000000000libnumbertext-1.0.8/web/webroot/css/numbertext.css000066400000000000000000000031441416364754400223610ustar00rootroot00000000000000body { margin: 0pt; background-color: white; font-family: "Verdana", "Tahoma", "Helvetica"; } div#result { border-style: solid; border-width: 1px; border-color: black; } div#header { border-style: solid; border-width: 0px 0px 1px 0px; background-color: rgb(80%,60%,60%); } .hidden { visibility:hidden; } .nowrap { white-space: nowrap; padding: 0; border: 0; } .baseline { vertical-align: baseline; } .title { padding: 1pt; padding-left: 5pt; padding-right: 5pt; background-color: white; } .big { font-size: 24pt; font-weight: bold; padding-right: 5pt; } .menu { padding-right: 5pt; } .menu2 { padding-left: 5pt; } .row { padding: 1pt; padding-left: 5pt; white-space: nowrap; } .lang { width: 75pt; display: inline-block; text-align: left; } .input { padding: 1pt; padding-left: 5pt; background-color: rgb(83%,65%,65%); } img { border-width: 0px; /* border-style: solid; */ } a:hover img { border-color: black; } a:visited img { border-color: white; } table.logos td { padding-left: 5px; padding-right: 5px; text-align: center; } tr.text td { padding: 5pt; } @font-face { font-family: Hung; src: url("../fonts/fonts/Hung.ttf") format("truetype"); } .rovas { font-family: Hung; width: 100%; } table#conv { width: 100%; border-spacing: 0px; border-collapse: collapse; } table#conv tr { margin: 0px; } table#conv td { margin: 0px; padding: 2pt; padding-left: 5pt; padding-right: 5pt; border-width: 0px; border-style: solid; white-space: nowrap; } table#conv td.sep { border-width: 1px 0px 0px 0px; border-color: black; border-style: solid; } libnumbertext-1.0.8/web/webroot/favicon.ico000066400000000000000000000025761416364754400210130ustar00rootroot00000000000000h(     !"'')44F==O@@XAAYBBZCCWCCXIIdRRkRRoYYz[[}\\}]]z__|ccffkknnnnooppssuuvvuu??*??332??00??%=? ??>=??exFx~Fot,D, D d              !y***~6X"ft!*./<2<2/<2<23!'3#! f!X^!4&'.7623267>54&'.'&67>7676&%#!  U-8!+ " $,l0+h2+#='1 )R#6aATv< "=./ 4; r(_Z7>&'&676/76?$$  >">  ,  0.. M 3#* 3MM %%\@,/@ !/1 +Bcd&'  VU6F 6Iu& F"&5467>7>76'&'/]H'0*  *1;K+ 1J6%G")L hC-06+2JJ  4j"Q)m^=&7>'&6767>76'.'&676/.'.  <?@`-     5  >  *D -qh<* :&__;*"?kyj/ .F/#5-{%" &Ja3/ EMFT./.54&'&5467>7>.'.6&"32 Q- ^=&G/ : (& 4`PFpz@)   V)=%  8'. %,%7  +   &!g Hn'!+O>$.76'&'.3267>#" %0$  Y/7B4  /4  Q  ?3$*.)$mBx#&547654'&54632#"/% H-2 2'hu% ' F; .54'.7>>'&672! \/"8 W$. <8G7! 4< !VSB?>j شx`9&6?'&'.7>67>546#.'.#""{ QH122/ (7+3)" (  E³IZFB(&'.7>'&'&67>546&6L) ." =1 #   /3)(1&8!++U`pH>* Jc oXŤo_N&67>54.7676'&632>7676'&&&767>.z &6dM` "#/   73 4 +@'&>:YIl0  > &Op = )N#S**VE++ Qm!+AcNOicCB x$ '1$L/tw]&676?&?'&'.7632&'&676>76&7676/'./'.7>'&&y"8));; BC?3 $! a  3 *1  ) \@8$CC&x9 !7S A 3Fs??##<<_N> *3)   :U(- 5(%A2 ?W >=)\'h Z     8.    Created by Nmeth Lszl, with FontForge 2.0 (http://fontforge.sf.net) and Inkspace/potrace vectorizer based on the typeface used in the ISO/IEC JTC1/SC2/WG2 N3531 proposal.Created by Nmeth Lszl, with FontForge 2.0 (http://fontforge.sf.net) and Inkspace/potrace vectorizer based on the typeface used in the ISO/IEC JTC1/SC2/WG2 N3531 proposal.HungHungMediumMediumFontForge : Hung : 21-8-2009FontForge : Hung : 21-8-2009HungHungVersion 001.000 Version 001.000 HungHung2     u10CA8u10CADu10CAFu10CB9u10CBDu10CBFu10CFAu10CFBu10CFCu10CFDu10CFEu10CFFZƲ8ƴ1