From a33e39c4d3cd3341f409eb472a2bbf6483664997 Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Sat, 2 Dec 2017 14:31:04 +0100 Subject: [PATCH] Update Faker & make length of lipsum (Paragraphs) configurable - Many new locales - Update Alfred-Workflow - Number of sentences per paragraph now configurable - Add useful links to `fakeconf` - Make keyword configurable via configuration sheet --- .gitignore | 2 + Fakeum-1.2.alfredworkflow | Bin 422251 -> 0 bytes Fakeum-2.0.alfredworkflow | Bin 0 -> 1199814 bytes README.md | 117 +- bin/example-data | 37 + bin/icons | 137 + bin/locale-list | 104 + extra/example_data.py | 38 - extra/locale_list.py | 69 - icon.png | 1 + icons.txt | 24 + src/active.png | Bin 5800 -> 0 bytes src/common.py | 197 ++ src/config.py | 223 +- src/faker/__init__.py | 58 - src/faker/providers/bg_BG/__init__.py | 1 - src/faker/providers/bg_BG/internet.py | 70 - src/faker/providers/color.py | 83 - src/faker/providers/company.py | 24 - src/faker/providers/credit_card.py | 187 -- src/faker/providers/cs_CZ/__init__.py | 0 src/faker/providers/cs_CZ/address.py | 190 -- src/faker/providers/de_DE/__init__.py | 1 - src/faker/providers/de_DE/internet.py | 42 - src/faker/providers/de_DE/person.py | 496 ---- src/faker/providers/dk_DK/__init__.py | 0 src/faker/providers/el_GR/__init__.py | 38 - src/faker/providers/en_CA/__init__.py | 0 src/faker/providers/en_CA/address.py | 169 -- src/faker/providers/en_CA/ssn.py | 38 - src/faker/providers/en_GB/__init__.py | 1 - src/faker/providers/en_US/__init__.py | 1 - src/faker/providers/en_US/address.py | 219 -- src/faker/providers/en_US/ssn.py | 10 - src/faker/providers/es_ES/__init__.py | 0 src/faker/providers/es_ES/address.py | 105 - src/faker/providers/es_MX/__init__.py | 1 - src/faker/providers/es_MX/address.py | 168 -- src/faker/providers/fa_IR/__init__.py | 1 - src/faker/providers/fa_IR/address.py | 47 - src/faker/providers/fa_IR/person.py | 39 - src/faker/providers/fa_IR/phone_number.py | 25 - src/faker/providers/fi_FI/__init__.py | 0 src/faker/providers/fr_FR/__init__.py | 1 - src/faker/providers/hi_IN/__init__.py | 1 - src/faker/providers/hi_IN/address.py | 55 - src/faker/providers/internet.py | 140 - src/faker/providers/it_IT/__init__.py | 1 - src/faker/providers/it_IT/address.py | 121 - src/faker/providers/it_IT/phone_number.py | 14 - src/faker/providers/job.py | 634 ----- src/faker/providers/ko_KR/__init__.py | 1 - src/faker/providers/ko_KR/address.py | 70 - src/faker/providers/lorem.py | 169 -- src/faker/providers/lt_LT/__init__.py | 0 src/faker/providers/lv_LV/__init__.py | 0 src/faker/providers/misc.py | 91 - src/faker/providers/miscelleneous.py | 4 - src/faker/providers/nl_NL/__init__.py | 1 - src/faker/providers/no_NO/__init__.py | 0 src/faker/providers/no_NO/internet.py | 37 - src/faker/providers/person.py | 27 - src/faker/providers/phone_number.py | 12 - src/faker/providers/pl_PL/__init__.py | 0 src/faker/providers/pl_PL/address.py | 621 ----- src/faker/providers/pl_PL/phone_number.py | 12 - src/faker/providers/profile.py | 52 - src/faker/providers/pt_BR/__init__.py | 1 - src/faker/providers/pt_BR/person.py | 70 - src/faker/providers/ru_RU/__init__.py | 1 - src/faker/providers/ru_RU/lorem.py | 46 - src/faker/providers/ru_RU/person.py | 132 - src/faker/providers/sl_SI/__init__.py | 0 src/faker/providers/ssn.py | 12 - src/faker/providers/user_agent.py | 175 -- src/faker/providers/zh_CN/__init__.py | 0 src/faker/providers/zh_CN/address.py | 69 - src/faker/providers/zh_CN/person.py | 52 - src/faker/providers/zh_TW/__init__.py | 0 src/faker/providers/zh_TW/address.py | 94 - src/faker/providers/zh_TW/phone_number.py | 13 - src/faker/providers/zh_TW/ssn.py | 11 - src/faker/shims/__init__.py | 4 - src/faker/shims/counter.py | 187 -- src/faker/utils/distribution.py | 27 - src/faker/utils/text.py | 27 - src/fakeum.py | 149 +- src/icons/docs.png | Bin 0 -> 7511 bytes src/icons/help.png | Bin 0 -> 7660 bytes src/icons/icon.png | Bin 0 -> 6119 bytes src/icons/issue.png | Bin 0 -> 4817 bytes src/icons/issues.png | Bin 0 -> 4817 bytes src/icons/locales.png | Bin 0 -> 5325 bytes src/{inactive.png => icons/off.png} | Bin src/icons/on.png | Bin 0 -> 7137 bytes src/icons/update-available.png | Bin 0 -> 3856 bytes src/icons/update-check.png | Bin 0 -> 3841 bytes src/info.plist | 937 ++++++- src/libs/dateutil/__init__.py | 2 + src/libs/dateutil/_common.py | 34 + src/libs/dateutil/_version.py | 10 + src/libs/dateutil/easter.py | 89 + src/libs/dateutil/parser.py | 1374 ++++++++++ src/libs/dateutil/relativedelta.py | 549 ++++ src/libs/dateutil/rrule.py | 1610 +++++++++++ src/libs/dateutil/tz/__init__.py | 5 + src/libs/dateutil/tz/_common.py | 394 +++ src/libs/dateutil/tz/tz.py | 1511 ++++++++++ src/libs/dateutil/tz/win.py | 332 +++ src/libs/dateutil/tzwin.py | 2 + src/libs/dateutil/zoneinfo/__init__.py | 183 ++ .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 138881 bytes src/libs/dateutil/zoneinfo/rebuild.py | 52 + src/{ => libs}/docopt.py | 0 src/libs/faker/__init__.py | 6 + src/{ => libs}/faker/__main__.py | 0 src/{ => libs}/faker/build_docs.py | 28 +- src/{ => libs}/faker/cli.py | 104 +- src/libs/faker/compat.py | 27 + src/libs/faker/config.py | 13 + src/{ => libs}/faker/documentor.py | 16 +- src/{ => libs}/faker/factory.py | 45 +- src/{ => libs}/faker/generator.py | 28 +- src/{ => libs}/faker/providers/__init__.py | 119 +- .../faker/providers/address/__init__.py} | 61 +- .../faker/providers/address/cs_CZ/__init__.py | 758 ++++++ .../providers/address/de_DE/__init__.py} | 25 +- .../providers/address/el_GR/__init__.py} | 55 +- .../faker/providers/address/en/__init__.py} | 70 +- .../faker/providers/address/en_AU/__init__.py | 136 + .../faker/providers/address/en_CA/__init__.py | 114 + .../faker/providers/address/en_GB/__init__.py | 118 + .../faker/providers/address/en_US/__init__.py | 156 ++ .../faker/providers/address/es/__init__.py | 51 + .../faker/providers/address/es_ES/__init__.py | 54 + .../faker/providers/address/es_MX/__init__.py | 127 + .../faker/providers/address/fa_IR/__init__.py | 87 + .../providers/address/fi_FI/__init__.py} | 223 +- .../faker/providers/address/fr_CH/__init__.py | 140 + .../providers/address/fr_FR/__init__.py} | 39 +- .../faker/providers/address/he_IL/__init__.py | 624 +++++ .../faker/providers/address/hi_IN/__init__.py | 53 + .../faker/providers/address/hr_HR/__init__.py | 176 ++ .../faker/providers/address/hu_HU/__init__.py | 133 + .../faker/providers/address/id_ID/__init__.py | 162 ++ .../faker/providers/address/it_IT/__init__.py | 131 + .../faker/providers/address/ja_JP/__init__.py | 133 + .../faker/providers/address/ka_GE/__init__.py | 307 +++ .../faker/providers/address/ko_KR/__init__.py | 388 +++ .../faker/providers/address/ne_NP/__init__.py | 99 + .../faker/providers/address/nl_BE/__init__.py | 799 ++++++ .../providers/address/nl_NL/__init__.py} | 12 +- .../providers/address/no_NO/__init__.py} | 33 +- .../faker/providers/address/pl_PL/__init__.py | 189 ++ .../providers/address/pt_BR/__init__.py} | 115 +- .../faker/providers/address/pt_PT/__init__.py | 130 + .../faker/providers/address/ru_RU/__init__.py | 264 ++ .../faker/providers/address/sk_SK/__init__.py | 1157 ++++++++ .../providers/address/sl_SI/__init__.py} | 925 ++++--- .../faker/providers/address/sv_SE/__init__.py | 110 + .../faker/providers/address/uk_UA/__init__.py | 69 + .../faker/providers/address/zh_CN/__init__.py | 84 + .../faker/providers/address/zh_TW/__init__.py | 110 + .../faker/providers/automotive/__init__.py | 16 + .../providers/automotive/ar_JO/__init__.py | 42 + .../providers/automotive/ar_PS/__init__.py | 62 + .../providers/automotive/ar_SA/__init__.py | 81 + .../providers/automotive/en_CA/__init__.py | 42 + .../providers/automotive/en_GB/__init__.py | 12 + .../providers/automotive/en_US/__init__.py | 164 ++ .../providers/automotive/hu_HU/__init__.py | 11 + .../providers/automotive/id_ID/__init__.py | 17 + .../providers/automotive/pt_BR/__init__.py | 11 + src/libs/faker/providers/barcode/__init__.py | 30 + .../faker/providers/barcode/en_US/__init__.py | 5 + src/libs/faker/providers/color/__init__.py | 177 ++ .../faker/providers/color/ar_PS/__init__.py | 157 ++ .../faker/providers/color/en_US/__init__.py | 5 + .../faker/providers/color/fr_FR/__init__.py | 156 ++ .../faker/providers/color/hr_HR/__init__.py | 160 ++ .../faker/providers/color/hu_HU/__init__.py | 14 + .../faker/providers/color/pt_BR/__init__.py | 247 ++ .../faker/providers/color/ru_RU/__init__.py | 74 + .../faker/providers/color/uk_UA/__init__.py | 218 ++ .../faker/providers/company/__init__.py} | 72 +- .../providers/company/bg_BG/__init__.py} | 20 +- .../providers/company/cs_CZ/__init__.py} | 2 +- .../providers/company/de_DE/__init__.py} | 2 +- .../faker/providers/company/en_US/__init__.py | 6 + .../providers/company/es_MX/__init__.py} | 52 +- .../faker/providers/company/fa_IR/__init__.py | 1117 ++++++++ .../faker/providers/company/fi_FI/__init__.py | 53 + .../faker/providers/company/fr_CH/__init__.py | 40 + .../providers/company/fr_FR/__init__.py} | 39 +- .../providers/company/hr_HR/__init__.py} | 7 +- .../faker/providers/company/hu_HU/__init__.py | 18 + .../faker/providers/company/id_ID/__init__.py | 26 + .../providers/company/it_IT/__init__.py} | 4 +- .../faker/providers/company/ja_JP/__init__.py | 14 + .../providers/company/ko_KR/__init__.py} | 2 +- .../providers/company/no_NO/__init__.py} | 3 +- .../faker/providers/company/pl_PL/__init__.py | 114 + .../faker/providers/company/pt_BR/__init__.py | 88 + .../providers/company/pt_PT/__init__.py} | 22 +- .../faker/providers/company/ru_RU/__init__.py | 20 + .../faker/providers/company/sk_SK/__init__.py | 14 + .../providers/company/sl_SI/__init__.py} | 2 +- .../faker/providers/company/sv_SE/__init__.py | 16 + .../providers/company/zh_CN/__init__.py} | 7 +- .../providers/company/zh_TW/__init__.py} | 7 +- .../faker/providers/credit_card/__init__.py | 116 + .../providers/credit_card/en_US/__init__.py | 5 + src/libs/faker/providers/currency/__init__.py | 185 ++ .../providers/currency/en_US/__init__.py | 5 + .../faker/providers/date_time/__init__.py} | 556 +++- .../providers/date_time/ar_AA/__init__.py | 253 ++ .../providers/date_time/ar_EG/__init__.py | 22 + .../providers/date_time/en_US/__init__.py | 5 + .../providers/date_time/fr_FR/__init__.py | 38 + .../providers/date_time/hr_HR/__init__.py | 38 + .../providers/date_time/hu_HU/__init__.py | 39 + .../providers/date_time/id_ID/__init__.py | 39 + .../providers/date_time/ko_KR/__init__.py | 38 + .../providers/date_time/pl_PL/__init__.py | 41 + .../providers/date_time/ru_RU/__init__.py | 38 + .../providers/date_time/sl_SI/__init__.py | 38 + .../faker/providers/file/__init__.py} | 114 +- .../faker/providers/file/en_US/__init__.py | 5 + src/libs/faker/providers/internet/__init__.py | 221 ++ .../providers/internet/ar_AA/__init__.py | 57 + .../providers/internet/bg_BG/__init__.py | 43 + .../providers/internet/bs_BA/__init__.py | 21 + .../providers/internet/cs_CZ/__init__.py} | 2 +- .../providers/internet/de_AT/__init__.py | 19 + .../providers/internet/de_DE/__init__.py | 21 + .../providers/internet/el_GR/__init__.py} | 2 +- .../providers/internet/en_AU/__init__.py | 12 + .../providers/internet/en_US/__init__.py | 7 + .../providers/internet/fa_IR/__init__.py | 9 + .../providers/internet/fi_FI/__init__.py} | 2 +- .../providers/internet/fr_CH/__init__.py | 21 + .../providers/internet/fr_FR/__init__.py} | 10 +- .../providers/internet/hr_HR/__init__.py | 22 + .../providers/internet/hu_HU/__init__.py | 33 + .../providers/internet/id_ID/__init__.py | 14 + .../providers/internet/it_IT/__init__.py | 30 + .../providers/internet/ja_JP/__init__.py | 18 + .../providers/internet/ko_KR/__init__.py | 11 + .../providers/internet/no_NO/__init__.py | 19 + .../providers/internet/pl_PL/__init__.py | 30 + .../providers/internet/pt_BR/__init__.py} | 2 +- .../providers/internet/pt_PT/__init__.py | 9 + .../providers/internet/ru_RU/__init__.py | 41 + .../providers/internet/sk_SK/__init__.py | 27 + .../providers/internet/sl_SI/__init__.py} | 2 +- .../providers/internet/sv_SE/__init__.py | 19 + .../providers/internet/uk_UA/__init__.py | 27 + .../providers/internet/zh_CN/__init__.py | 18 + .../providers/internet/zh_TW/__init__.py | 18 + src/libs/faker/providers/isbn/__init__.py | 72 + .../faker/providers/isbn/en_US/__init__.py | 5 + src/libs/faker/providers/isbn/isbn.py | 62 + src/libs/faker/providers/isbn/rules.py | 45 + src/libs/faker/providers/job/__init__.py | 651 +++++ .../faker/providers/job/ar_AA/__init__.py | 151 + .../faker/providers/job/en_US/__init__.py | 5 + .../faker/providers/job/fa_IR/__init__.py | 103 + .../faker/providers/job/fr_CH/__init__.py | 838 ++++++ .../faker/providers/job/fr_FR/__init__.py | 672 +++++ .../faker/providers/job/hr_HR/__init__.py | 292 ++ .../faker/providers/job/hu_HU/__init__.py | 9 + .../faker/providers/job/ko_KR/__init__.py | 436 +++ .../faker/providers/job/pl_PL/__init__.py | 226 ++ .../faker/providers/job/ru_RU/__init__.py} | 7 +- .../faker/providers/job/uk_UA/__init__.py | 65 + .../faker/providers/job/zh_TW/__init__.py | 483 ++++ src/libs/faker/providers/lorem/__init__.py | 184 ++ .../faker/providers/lorem/ar_AA/__init__.py | 119 + .../faker/providers/lorem/el_GR/__init__.py} | 2 +- .../faker/providers/lorem/he_IL/__init__.py | 27 + .../faker/providers/lorem/ja_JP/__init__.py | 230 ++ src/libs/faker/providers/lorem/la/__init__.py | 37 + .../faker/providers/lorem/ru_RU/__init__.py | 91 + .../faker/providers/lorem/zh_CN/__init__.py | 355 +++ .../faker/providers/lorem/zh_TW/__init__.py | 355 +++ src/libs/faker/providers/misc/__init__.py | 179 ++ .../faker/providers/misc/en_US/__init__.py | 5 + src/libs/faker/providers/person/__init__.py | 96 + .../faker/providers/person/ar_AA/__init__.py | 198 ++ .../faker/providers/person/ar_PS/__init__.py | 15 + .../faker/providers/person/ar_SA/__init__.py | 17 + .../faker/providers/person/bg_BG/__init__.py} | 34 +- .../faker/providers/person/cs_CZ/__init__.py} | 46 +- .../faker/providers/person/de_AT/__init__.py | 61 + .../faker/providers/person/de_DE/__init__.py | 422 +++ .../faker/providers/person/dk_DK/__init__.py} | 33 +- .../faker/providers/person/el_GR/__init__.py} | 34 +- .../faker/providers/person/en/__init__.py} | 59 +- .../faker/providers/person/en_GB/__init__.py | 593 ++++ .../faker/providers/person/en_TH/__init__.py | 82 + .../faker/providers/person/en_US/__init__.py | 1780 ++++++++++++ .../faker/providers/person/es_ES/__init__.py} | 119 +- .../faker/providers/person/es_MX/__init__.py} | 7 +- .../faker/providers/person/et_EE/__init__.py | 182 ++ .../faker/providers/person/fa_IR/__init__.py | 96 + .../faker/providers/person/fi_FI/__init__.py} | 9 +- .../faker/providers/person/fr_CH/__init__.py | 87 + .../faker/providers/person/fr_FR/__init__.py} | 52 +- .../faker/providers/person/he_IL/__init__.py | 1278 +++++++++ .../faker/providers/person/hi_IN/__init__.py} | 2 +- .../faker/providers/person/hr_HR/__init__.py | 180 ++ .../faker/providers/person/hu_HU/__init__.py | 158 ++ .../faker/providers/person/id_ID/__init__.py | 203 ++ .../faker/providers/person/it_IT/__init__.py} | 10 +- .../faker/providers/person/ja_JP/__init__.py | 175 ++ .../faker/providers/person/ka_GE/__init__.py | 159 ++ .../faker/providers/person/ko_KR/__init__.py} | 8 +- .../faker/providers/person/lt_LT/__init__.py} | 2 +- .../faker/providers/person/lv_LV/__init__.py} | 2 +- .../faker/providers/person/ne_NP/__init__.py | 254 ++ .../faker/providers/person/nl_NL/__init__.py} | 17 +- .../faker/providers/person/no_NO/__init__.py} | 25 +- .../faker/providers/person/pl_PL/__init__.py} | 67 +- .../faker/providers/person/pt_BR/__init__.py | 104 + .../faker/providers/person/pt_PT/__init__.py | 74 + .../faker/providers/person/ru_RU/__init__.py | 273 ++ .../faker/providers/person/sl_SI/__init__.py} | 18 +- .../faker/providers/person/sv_SE/__init__.py | 640 +++++ .../faker/providers/person/th_TH/__init__.py | 176 ++ .../faker/providers/person/tr_TR/__init__.py | 278 ++ .../faker/providers/person/tw_GH/__init__.py | 594 ++++ .../faker/providers/person/uk_UA/__init__.py | 156 ++ .../faker/providers/person/zh_CN/__init__.py | 102 + .../faker/providers/person/zh_TW/__init__.py} | 48 +- .../faker/providers/phone_number/__init__.py | 18 + .../providers/phone_number/ar_JO/__init__.py | 64 + .../providers/phone_number/ar_PS/__init__.py | 143 + .../providers/phone_number/bg_BG/__init__.py} | 2 +- .../providers/phone_number/bs_BA/__init__.py | 40 + .../providers/phone_number/cs_CZ/__init__.py} | 2 +- .../providers/phone_number/de_DE/__init__.py} | 2 +- .../providers/phone_number/dk_DK/__init__.py} | 14 +- .../providers/phone_number/el_GR/__init__.py} | 2 +- .../providers/phone_number/en_AU/__init__.py | 45 + .../providers/phone_number/en_CA/__init__.py} | 2 +- .../providers/phone_number/en_GB/__init__.py | 30 + .../providers/phone_number/en_US/__init__.py} | 2 +- .../providers/phone_number/es_ES/__init__.py} | 2 +- .../providers/phone_number/es_MX/__init__.py} | 4 +- .../providers/phone_number/fa_IR/__init__.py | 81 + .../providers/phone_number/fi_FI/__init__.py} | 2 +- .../providers/phone_number/fr_CH/__init__.py | 37 + .../providers/phone_number/fr_FR/__init__.py} | 2 +- .../providers/phone_number/he_IL/__init__.py | 23 + .../providers/phone_number/hi_IN/__init__.py} | 2 +- .../providers/phone_number/hr_HR/__init__.py | 37 + .../providers/phone_number/hu_HU/__init__.py | 14 + .../providers/phone_number/id_ID/__init__.py | 34 + .../providers/phone_number/it_IT/__init__.py | 14 + .../providers/phone_number/ja_JP/__init__.py | 12 + .../providers/phone_number/ko_KR/__init__.py} | 4 +- .../providers/phone_number/lt_LT/__init__.py} | 2 +- .../providers/phone_number/lv_LV/__init__.py} | 2 +- .../providers/phone_number/ne_NP/__init__.py | 12 + .../providers/phone_number/nl_BE/__init__.py | 25 + .../providers/phone_number/nl_NL/__init__.py} | 2 +- .../providers/phone_number/no_NO/__init__.py} | 2 +- .../providers/phone_number/pl_PL/__init__.py | 39 + .../providers/phone_number/pt_BR/__init__.py} | 14 +- .../providers/phone_number/pt_PT/__init__.py | 42 + .../providers/phone_number/ru_RU/__init__.py} | 2 +- .../providers/phone_number/sk_SK/__init__.py | 17 + .../providers/phone_number/sl_SI/__init__.py} | 2 +- .../providers/phone_number/sv_SE/__init__.py | 19 + .../providers/phone_number/tr_TR/__init__.py | 16 + .../providers/phone_number/tw_GH/__init__.py | 27 + .../providers/phone_number/uk_UA/__init__.py | 16 + .../providers/phone_number/zh_CN/__init__.py} | 8 +- .../providers/phone_number/zh_TW/__init__.py | 14 + src/libs/faker/providers/profile/__init__.py | 59 + .../faker/providers/profile/en_US/__init__.py | 5 + .../faker/providers/python/__init__.py} | 91 +- .../faker/providers/python/en_US/__init__.py | 5 + src/libs/faker/providers/ssn/__init__.py | 12 + .../faker/providers/ssn/en_CA/__init__.py | 36 + .../faker/providers/ssn/en_US/__init__.py | 19 + .../faker/providers/ssn/et_EE/__init__.py | 65 + .../faker/providers/ssn/fi_FI/__init__.py | 44 + .../faker/providers/ssn/fr_CH/__init__.py | 33 + .../faker/providers/ssn/he_IL/__init__.py | 33 + .../faker/providers/ssn/hr_HR/__init__.py | 41 + .../faker/providers/ssn/hu_HU/__init__.py | 126 + .../faker/providers/ssn/it_IT/__init__.py} | 7 +- .../faker/providers/ssn/ko_KR/__init__.py | 8 + .../faker/providers/ssn/nl_BE/__init__.py | 57 + .../faker/providers/ssn/nl_NL/__init__.py} | 8 +- .../faker/providers/ssn/pl_PL/__init__.py | 64 + .../faker/providers/ssn/pt_BR/__init__.py | 40 + .../faker/providers/ssn/ru_RU/__init__.py | 6 + .../faker/providers/ssn/sv_SE/__init__.py | 45 + .../faker/providers/ssn/uk_UA/__init__.py | 32 + .../faker/providers/ssn/zh_CN/__init__.py | 372 +++ .../faker/providers/ssn/zh_TW/__init__.py | 10 + .../faker/providers/user_agent/__init__.py | 163 ++ .../providers/user_agent/en_US/__init__.py | 5 + src/{ => libs}/faker/utils/__init__.py | 0 src/{ => libs}/faker/utils/datasets.py | 2 +- src/{ => libs}/faker/utils/datetime_safe.py | 0 src/{ => libs}/faker/utils/decorators.py | 14 + src/libs/faker/utils/distribution.py | 34 + src/libs/faker/utils/loading.py | 31 + src/libs/faker/utils/text.py | 89 + src/libs/ipaddress.py | 2425 +++++++++++++++++ src/libs/six.py | 891 ++++++ src/libs/text_unidecode/__init__.py | 24 + src/libs/text_unidecode/data.bin | Bin 0 -> 311077 bytes src/update-available.png | Bin 11504 -> 0 bytes src/version | 1 - src/workflow/Notify.tgz | Bin 0 -> 35556 bytes src/workflow/__init__.py | 22 +- src/workflow/background.py | 211 +- src/workflow/notify.py | 345 +++ src/workflow/update.py | 253 +- src/workflow/version | 2 +- src/workflow/web.py | 186 +- src/workflow/workflow.py | 769 +++--- src/workflow/workflow3.py | 684 +++++ 427 files changed, 43249 insertions(+), 7560 deletions(-) delete mode 100644 Fakeum-1.2.alfredworkflow create mode 100644 Fakeum-2.0.alfredworkflow create mode 100755 bin/example-data create mode 100755 bin/icons create mode 100755 bin/locale-list delete mode 100755 extra/example_data.py delete mode 100755 extra/locale_list.py create mode 120000 icon.png create mode 100644 icons.txt delete mode 100644 src/active.png create mode 100644 src/common.py delete mode 100644 src/faker/__init__.py delete mode 100644 src/faker/providers/bg_BG/__init__.py delete mode 100644 src/faker/providers/bg_BG/internet.py delete mode 100644 src/faker/providers/color.py delete mode 100644 src/faker/providers/company.py delete mode 100644 src/faker/providers/credit_card.py delete mode 100644 src/faker/providers/cs_CZ/__init__.py delete mode 100644 src/faker/providers/cs_CZ/address.py delete mode 100644 src/faker/providers/de_DE/__init__.py delete mode 100644 src/faker/providers/de_DE/internet.py delete mode 100644 src/faker/providers/de_DE/person.py delete mode 100644 src/faker/providers/dk_DK/__init__.py delete mode 100644 src/faker/providers/el_GR/__init__.py delete mode 100644 src/faker/providers/en_CA/__init__.py delete mode 100644 src/faker/providers/en_CA/address.py delete mode 100644 src/faker/providers/en_CA/ssn.py delete mode 100644 src/faker/providers/en_GB/__init__.py delete mode 100644 src/faker/providers/en_US/__init__.py delete mode 100644 src/faker/providers/en_US/address.py delete mode 100644 src/faker/providers/en_US/ssn.py delete mode 100644 src/faker/providers/es_ES/__init__.py delete mode 100644 src/faker/providers/es_ES/address.py delete mode 100644 src/faker/providers/es_MX/__init__.py delete mode 100644 src/faker/providers/es_MX/address.py delete mode 100644 src/faker/providers/fa_IR/__init__.py delete mode 100644 src/faker/providers/fa_IR/address.py delete mode 100644 src/faker/providers/fa_IR/person.py delete mode 100644 src/faker/providers/fa_IR/phone_number.py delete mode 100644 src/faker/providers/fi_FI/__init__.py delete mode 100644 src/faker/providers/fr_FR/__init__.py delete mode 100644 src/faker/providers/hi_IN/__init__.py delete mode 100644 src/faker/providers/hi_IN/address.py delete mode 100644 src/faker/providers/internet.py delete mode 100644 src/faker/providers/it_IT/__init__.py delete mode 100644 src/faker/providers/it_IT/address.py delete mode 100644 src/faker/providers/it_IT/phone_number.py delete mode 100644 src/faker/providers/job.py delete mode 100644 src/faker/providers/ko_KR/__init__.py delete mode 100644 src/faker/providers/ko_KR/address.py delete mode 100644 src/faker/providers/lorem.py delete mode 100644 src/faker/providers/lt_LT/__init__.py delete mode 100644 src/faker/providers/lv_LV/__init__.py delete mode 100644 src/faker/providers/misc.py delete mode 100644 src/faker/providers/miscelleneous.py delete mode 100644 src/faker/providers/nl_NL/__init__.py delete mode 100644 src/faker/providers/no_NO/__init__.py delete mode 100644 src/faker/providers/no_NO/internet.py delete mode 100644 src/faker/providers/person.py delete mode 100644 src/faker/providers/phone_number.py delete mode 100644 src/faker/providers/pl_PL/__init__.py delete mode 100644 src/faker/providers/pl_PL/address.py delete mode 100644 src/faker/providers/pl_PL/phone_number.py delete mode 100644 src/faker/providers/profile.py delete mode 100644 src/faker/providers/pt_BR/__init__.py delete mode 100644 src/faker/providers/pt_BR/person.py delete mode 100644 src/faker/providers/ru_RU/__init__.py delete mode 100644 src/faker/providers/ru_RU/lorem.py delete mode 100644 src/faker/providers/ru_RU/person.py delete mode 100644 src/faker/providers/sl_SI/__init__.py delete mode 100644 src/faker/providers/ssn.py delete mode 100644 src/faker/providers/user_agent.py delete mode 100644 src/faker/providers/zh_CN/__init__.py delete mode 100644 src/faker/providers/zh_CN/address.py delete mode 100644 src/faker/providers/zh_CN/person.py delete mode 100644 src/faker/providers/zh_TW/__init__.py delete mode 100644 src/faker/providers/zh_TW/address.py delete mode 100644 src/faker/providers/zh_TW/phone_number.py delete mode 100644 src/faker/providers/zh_TW/ssn.py delete mode 100644 src/faker/shims/__init__.py delete mode 100644 src/faker/shims/counter.py delete mode 100644 src/faker/utils/distribution.py delete mode 100644 src/faker/utils/text.py create mode 100644 src/icons/docs.png create mode 100644 src/icons/help.png create mode 100644 src/icons/icon.png create mode 100644 src/icons/issue.png create mode 100644 src/icons/issues.png create mode 100644 src/icons/locales.png rename src/{inactive.png => icons/off.png} (100%) create mode 100644 src/icons/on.png create mode 100644 src/icons/update-available.png create mode 100644 src/icons/update-check.png create mode 100644 src/libs/dateutil/__init__.py create mode 100644 src/libs/dateutil/_common.py create mode 100644 src/libs/dateutil/_version.py create mode 100644 src/libs/dateutil/easter.py create mode 100644 src/libs/dateutil/parser.py create mode 100644 src/libs/dateutil/relativedelta.py create mode 100644 src/libs/dateutil/rrule.py create mode 100644 src/libs/dateutil/tz/__init__.py create mode 100644 src/libs/dateutil/tz/_common.py create mode 100644 src/libs/dateutil/tz/tz.py create mode 100644 src/libs/dateutil/tz/win.py create mode 100644 src/libs/dateutil/tzwin.py create mode 100644 src/libs/dateutil/zoneinfo/__init__.py create mode 100644 src/libs/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 src/libs/dateutil/zoneinfo/rebuild.py rename src/{ => libs}/docopt.py (100%) create mode 100644 src/libs/faker/__init__.py rename src/{ => libs}/faker/__main__.py (100%) rename src/{ => libs}/faker/build_docs.py (81%) rename src/{ => libs}/faker/cli.py (59%) create mode 100644 src/libs/faker/compat.py create mode 100644 src/libs/faker/config.py rename src/{ => libs}/faker/documentor.py (88%) rename src/{ => libs}/faker/factory.py (60%) rename src/{ => libs}/faker/generator.py (72%) rename src/{ => libs}/faker/providers/__init__.py (53%) rename src/{faker/providers/address.py => libs/faker/providers/address/__init__.py} (58%) create mode 100644 src/libs/faker/providers/address/cs_CZ/__init__.py rename src/{faker/providers/de_DE/address.py => libs/faker/providers/address/de_DE/__init__.py} (96%) rename src/{faker/providers/el_GR/address.py => libs/faker/providers/address/el_GR/__init__.py} (99%) rename src/{faker/providers/en_GB/address.py => libs/faker/providers/address/en/__init__.py} (51%) create mode 100644 src/libs/faker/providers/address/en_AU/__init__.py create mode 100644 src/libs/faker/providers/address/en_CA/__init__.py create mode 100644 src/libs/faker/providers/address/en_GB/__init__.py create mode 100644 src/libs/faker/providers/address/en_US/__init__.py create mode 100644 src/libs/faker/providers/address/es/__init__.py create mode 100644 src/libs/faker/providers/address/es_ES/__init__.py create mode 100644 src/libs/faker/providers/address/es_MX/__init__.py create mode 100644 src/libs/faker/providers/address/fa_IR/__init__.py rename src/{faker/providers/fi_FI/address.py => libs/faker/providers/address/fi_FI/__init__.py} (76%) create mode 100644 src/libs/faker/providers/address/fr_CH/__init__.py rename src/{faker/providers/fr_FR/address.py => libs/faker/providers/address/fr_FR/__init__.py} (92%) create mode 100644 src/libs/faker/providers/address/he_IL/__init__.py create mode 100644 src/libs/faker/providers/address/hi_IN/__init__.py create mode 100644 src/libs/faker/providers/address/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/address/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/address/id_ID/__init__.py create mode 100644 src/libs/faker/providers/address/it_IT/__init__.py create mode 100644 src/libs/faker/providers/address/ja_JP/__init__.py create mode 100644 src/libs/faker/providers/address/ka_GE/__init__.py create mode 100644 src/libs/faker/providers/address/ko_KR/__init__.py create mode 100644 src/libs/faker/providers/address/ne_NP/__init__.py create mode 100644 src/libs/faker/providers/address/nl_BE/__init__.py rename src/{faker/providers/nl_NL/address.py => libs/faker/providers/address/nl_NL/__init__.py} (99%) rename src/{faker/providers/no_NO/address.py => libs/faker/providers/address/no_NO/__init__.py} (57%) create mode 100644 src/libs/faker/providers/address/pl_PL/__init__.py rename src/{faker/providers/pt_BR/address.py => libs/faker/providers/address/pt_BR/__init__.py} (72%) create mode 100644 src/libs/faker/providers/address/pt_PT/__init__.py create mode 100644 src/libs/faker/providers/address/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/address/sk_SK/__init__.py rename src/{faker/providers/sl_SI/address.py => libs/faker/providers/address/sl_SI/__init__.py} (72%) create mode 100644 src/libs/faker/providers/address/sv_SE/__init__.py create mode 100644 src/libs/faker/providers/address/uk_UA/__init__.py create mode 100644 src/libs/faker/providers/address/zh_CN/__init__.py create mode 100644 src/libs/faker/providers/address/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/automotive/__init__.py create mode 100644 src/libs/faker/providers/automotive/ar_JO/__init__.py create mode 100644 src/libs/faker/providers/automotive/ar_PS/__init__.py create mode 100644 src/libs/faker/providers/automotive/ar_SA/__init__.py create mode 100644 src/libs/faker/providers/automotive/en_CA/__init__.py create mode 100644 src/libs/faker/providers/automotive/en_GB/__init__.py create mode 100644 src/libs/faker/providers/automotive/en_US/__init__.py create mode 100644 src/libs/faker/providers/automotive/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/automotive/id_ID/__init__.py create mode 100644 src/libs/faker/providers/automotive/pt_BR/__init__.py create mode 100644 src/libs/faker/providers/barcode/__init__.py create mode 100644 src/libs/faker/providers/barcode/en_US/__init__.py create mode 100644 src/libs/faker/providers/color/__init__.py create mode 100644 src/libs/faker/providers/color/ar_PS/__init__.py create mode 100644 src/libs/faker/providers/color/en_US/__init__.py create mode 100644 src/libs/faker/providers/color/fr_FR/__init__.py create mode 100644 src/libs/faker/providers/color/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/color/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/color/pt_BR/__init__.py create mode 100644 src/libs/faker/providers/color/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/color/uk_UA/__init__.py rename src/{faker/providers/en_US/company.py => libs/faker/providers/company/__init__.py} (73%) rename src/{faker/providers/bg_BG/company.py => libs/faker/providers/company/bg_BG/__init__.py} (50%) rename src/{faker/providers/cs_CZ/company.py => libs/faker/providers/company/cs_CZ/__init__.py} (85%) rename src/{faker/providers/de_DE/company.py => libs/faker/providers/company/de_DE/__init__.py} (92%) create mode 100644 src/libs/faker/providers/company/en_US/__init__.py rename src/{faker/providers/es_MX/company.py => libs/faker/providers/company/es_MX/__init__.py} (81%) create mode 100644 src/libs/faker/providers/company/fa_IR/__init__.py create mode 100644 src/libs/faker/providers/company/fi_FI/__init__.py create mode 100644 src/libs/faker/providers/company/fr_CH/__init__.py rename src/{faker/providers/fr_FR/company.py => libs/faker/providers/company/fr_FR/__init__.py} (79%) rename src/{faker/providers/fi_FI/company.py => libs/faker/providers/company/hr_HR/__init__.py} (55%) create mode 100644 src/libs/faker/providers/company/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/company/id_ID/__init__.py rename src/{faker/providers/it_IT/company.py => libs/faker/providers/company/it_IT/__init__.py} (98%) create mode 100644 src/libs/faker/providers/company/ja_JP/__init__.py rename src/{faker/providers/ko_KR/company.py => libs/faker/providers/company/ko_KR/__init__.py} (99%) rename src/{faker/providers/no_NO/company.py => libs/faker/providers/company/no_NO/__init__.py} (89%) create mode 100644 src/libs/faker/providers/company/pl_PL/__init__.py create mode 100644 src/libs/faker/providers/company/pt_BR/__init__.py rename src/{faker/providers/pt_BR/company.py => libs/faker/providers/company/pt_PT/__init__.py} (57%) create mode 100644 src/libs/faker/providers/company/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/company/sk_SK/__init__.py rename src/{faker/providers/sl_SI/company.py => libs/faker/providers/company/sl_SI/__init__.py} (82%) create mode 100644 src/libs/faker/providers/company/sv_SE/__init__.py rename src/{faker/providers/zh_CN/company.py => libs/faker/providers/company/zh_CN/__init__.py} (91%) rename src/{faker/providers/zh_TW/company.py => libs/faker/providers/company/zh_TW/__init__.py} (93%) create mode 100644 src/libs/faker/providers/credit_card/__init__.py create mode 100644 src/libs/faker/providers/credit_card/en_US/__init__.py create mode 100644 src/libs/faker/providers/currency/__init__.py create mode 100644 src/libs/faker/providers/currency/en_US/__init__.py rename src/{faker/providers/date_time.py => libs/faker/providers/date_time/__init__.py} (60%) create mode 100644 src/libs/faker/providers/date_time/ar_AA/__init__.py create mode 100644 src/libs/faker/providers/date_time/ar_EG/__init__.py create mode 100644 src/libs/faker/providers/date_time/en_US/__init__.py create mode 100644 src/libs/faker/providers/date_time/fr_FR/__init__.py create mode 100644 src/libs/faker/providers/date_time/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/date_time/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/date_time/id_ID/__init__.py create mode 100644 src/libs/faker/providers/date_time/ko_KR/__init__.py create mode 100644 src/libs/faker/providers/date_time/pl_PL/__init__.py create mode 100644 src/libs/faker/providers/date_time/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/date_time/sl_SI/__init__.py rename src/{faker/providers/file.py => libs/faker/providers/file/__init__.py} (72%) create mode 100644 src/libs/faker/providers/file/en_US/__init__.py create mode 100644 src/libs/faker/providers/internet/__init__.py create mode 100644 src/libs/faker/providers/internet/ar_AA/__init__.py create mode 100644 src/libs/faker/providers/internet/bg_BG/__init__.py create mode 100644 src/libs/faker/providers/internet/bs_BA/__init__.py rename src/{faker/providers/cs_CZ/internet.py => libs/faker/providers/internet/cs_CZ/__init__.py} (93%) create mode 100644 src/libs/faker/providers/internet/de_AT/__init__.py create mode 100644 src/libs/faker/providers/internet/de_DE/__init__.py rename src/{faker/providers/el_GR/internet.py => libs/faker/providers/internet/el_GR/__init__.py} (98%) create mode 100644 src/libs/faker/providers/internet/en_AU/__init__.py create mode 100644 src/libs/faker/providers/internet/en_US/__init__.py create mode 100644 src/libs/faker/providers/internet/fa_IR/__init__.py rename src/{faker/providers/fi_FI/internet.py => libs/faker/providers/internet/fi_FI/__init__.py} (85%) create mode 100644 src/libs/faker/providers/internet/fr_CH/__init__.py rename src/{faker/providers/fr_FR/internet.py => libs/faker/providers/internet/fr_FR/__init__.py} (59%) create mode 100644 src/libs/faker/providers/internet/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/internet/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/internet/id_ID/__init__.py create mode 100644 src/libs/faker/providers/internet/it_IT/__init__.py create mode 100644 src/libs/faker/providers/internet/ja_JP/__init__.py create mode 100644 src/libs/faker/providers/internet/ko_KR/__init__.py create mode 100644 src/libs/faker/providers/internet/no_NO/__init__.py create mode 100644 src/libs/faker/providers/internet/pl_PL/__init__.py rename src/{faker/providers/pt_BR/internet.py => libs/faker/providers/internet/pt_BR/__init__.py} (85%) create mode 100644 src/libs/faker/providers/internet/pt_PT/__init__.py create mode 100644 src/libs/faker/providers/internet/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/internet/sk_SK/__init__.py rename src/{faker/providers/sl_SI/internet.py => libs/faker/providers/internet/sl_SI/__init__.py} (95%) create mode 100644 src/libs/faker/providers/internet/sv_SE/__init__.py create mode 100644 src/libs/faker/providers/internet/uk_UA/__init__.py create mode 100644 src/libs/faker/providers/internet/zh_CN/__init__.py create mode 100644 src/libs/faker/providers/internet/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/isbn/__init__.py create mode 100644 src/libs/faker/providers/isbn/en_US/__init__.py create mode 100644 src/libs/faker/providers/isbn/isbn.py create mode 100644 src/libs/faker/providers/isbn/rules.py create mode 100644 src/libs/faker/providers/job/__init__.py create mode 100644 src/libs/faker/providers/job/ar_AA/__init__.py create mode 100644 src/libs/faker/providers/job/en_US/__init__.py create mode 100644 src/libs/faker/providers/job/fa_IR/__init__.py create mode 100644 src/libs/faker/providers/job/fr_CH/__init__.py create mode 100644 src/libs/faker/providers/job/fr_FR/__init__.py create mode 100644 src/libs/faker/providers/job/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/job/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/job/ko_KR/__init__.py create mode 100644 src/libs/faker/providers/job/pl_PL/__init__.py rename src/{faker/providers/ru_RU/job.py => libs/faker/providers/job/ru_RU/__init__.py} (99%) create mode 100644 src/libs/faker/providers/job/uk_UA/__init__.py create mode 100644 src/libs/faker/providers/job/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/lorem/__init__.py create mode 100644 src/libs/faker/providers/lorem/ar_AA/__init__.py rename src/{faker/providers/el_GR/lorem.py => libs/faker/providers/lorem/el_GR/__init__.py} (99%) create mode 100644 src/libs/faker/providers/lorem/he_IL/__init__.py create mode 100644 src/libs/faker/providers/lorem/ja_JP/__init__.py create mode 100644 src/libs/faker/providers/lorem/la/__init__.py create mode 100644 src/libs/faker/providers/lorem/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/lorem/zh_CN/__init__.py create mode 100644 src/libs/faker/providers/lorem/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/misc/__init__.py create mode 100644 src/libs/faker/providers/misc/en_US/__init__.py create mode 100644 src/libs/faker/providers/person/__init__.py create mode 100644 src/libs/faker/providers/person/ar_AA/__init__.py create mode 100644 src/libs/faker/providers/person/ar_PS/__init__.py create mode 100644 src/libs/faker/providers/person/ar_SA/__init__.py rename src/{faker/providers/bg_BG/person.py => libs/faker/providers/person/bg_BG/__init__.py} (97%) rename src/{faker/providers/cs_CZ/person.py => libs/faker/providers/person/cs_CZ/__init__.py} (81%) create mode 100644 src/libs/faker/providers/person/de_AT/__init__.py create mode 100644 src/libs/faker/providers/person/de_DE/__init__.py rename src/{faker/providers/dk_DK/person.py => libs/faker/providers/person/dk_DK/__init__.py} (89%) rename src/{faker/providers/el_GR/person.py => libs/faker/providers/person/el_GR/__init__.py} (98%) rename src/{faker/providers/en_US/person.py => libs/faker/providers/person/en/__init__.py} (98%) create mode 100644 src/libs/faker/providers/person/en_GB/__init__.py create mode 100644 src/libs/faker/providers/person/en_TH/__init__.py create mode 100644 src/libs/faker/providers/person/en_US/__init__.py rename src/{faker/providers/es_ES/person.py => libs/faker/providers/person/es_ES/__init__.py} (74%) rename src/{faker/providers/es_MX/person.py => libs/faker/providers/person/es_MX/__init__.py} (98%) create mode 100644 src/libs/faker/providers/person/et_EE/__init__.py create mode 100644 src/libs/faker/providers/person/fa_IR/__init__.py rename src/{faker/providers/fi_FI/person.py => libs/faker/providers/person/fi_FI/__init__.py} (98%) create mode 100644 src/libs/faker/providers/person/fr_CH/__init__.py rename src/{faker/providers/fr_FR/person.py => libs/faker/providers/person/fr_FR/__init__.py} (83%) create mode 100644 src/libs/faker/providers/person/he_IL/__init__.py rename src/{faker/providers/hi_IN/person.py => libs/faker/providers/person/hi_IN/__init__.py} (98%) create mode 100644 src/libs/faker/providers/person/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/person/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/person/id_ID/__init__.py rename src/{faker/providers/it_IT/person.py => libs/faker/providers/person/it_IT/__init__.py} (97%) create mode 100644 src/libs/faker/providers/person/ja_JP/__init__.py create mode 100644 src/libs/faker/providers/person/ka_GE/__init__.py rename src/{faker/providers/ko_KR/person.py => libs/faker/providers/person/ko_KR/__init__.py} (89%) rename src/{faker/providers/lt_LT/person.py => libs/faker/providers/person/lt_LT/__init__.py} (98%) rename src/{faker/providers/lv_LV/person.py => libs/faker/providers/person/lv_LV/__init__.py} (98%) create mode 100644 src/libs/faker/providers/person/ne_NP/__init__.py rename src/{faker/providers/nl_NL/person.py => libs/faker/providers/person/nl_NL/__init__.py} (98%) rename src/{faker/providers/no_NO/person.py => libs/faker/providers/person/no_NO/__init__.py} (91%) rename src/{faker/providers/pl_PL/person.py => libs/faker/providers/person/pl_PL/__init__.py} (96%) create mode 100644 src/libs/faker/providers/person/pt_BR/__init__.py create mode 100644 src/libs/faker/providers/person/pt_PT/__init__.py create mode 100644 src/libs/faker/providers/person/ru_RU/__init__.py rename src/{faker/providers/sl_SI/person.py => libs/faker/providers/person/sl_SI/__init__.py} (93%) create mode 100644 src/libs/faker/providers/person/sv_SE/__init__.py create mode 100644 src/libs/faker/providers/person/th_TH/__init__.py create mode 100644 src/libs/faker/providers/person/tr_TR/__init__.py create mode 100644 src/libs/faker/providers/person/tw_GH/__init__.py create mode 100644 src/libs/faker/providers/person/uk_UA/__init__.py create mode 100644 src/libs/faker/providers/person/zh_CN/__init__.py rename src/{faker/providers/zh_TW/person.py => libs/faker/providers/person/zh_TW/__init__.py} (73%) create mode 100644 src/libs/faker/providers/phone_number/__init__.py create mode 100644 src/libs/faker/providers/phone_number/ar_JO/__init__.py create mode 100644 src/libs/faker/providers/phone_number/ar_PS/__init__.py rename src/{faker/providers/bg_BG/phone_number.py => libs/faker/providers/phone_number/bg_BG/__init__.py} (87%) create mode 100644 src/libs/faker/providers/phone_number/bs_BA/__init__.py rename src/{faker/providers/cs_CZ/phone_number.py => libs/faker/providers/phone_number/cs_CZ/__init__.py} (93%) rename src/{faker/providers/de_DE/phone_number.py => libs/faker/providers/phone_number/de_DE/__init__.py} (87%) rename src/{faker/providers/en_GB/phone_number.py => libs/faker/providers/phone_number/dk_DK/__init__.py} (54%) rename src/{faker/providers/el_GR/phone_number.py => libs/faker/providers/phone_number/el_GR/__init__.py} (89%) create mode 100644 src/libs/faker/providers/phone_number/en_AU/__init__.py rename src/{faker/providers/en_CA/phone_number.py => libs/faker/providers/phone_number/en_CA/__init__.py} (85%) create mode 100644 src/libs/faker/providers/phone_number/en_GB/__init__.py rename src/{faker/providers/es_MX/phone_number.py => libs/faker/providers/phone_number/en_US/__init__.py} (92%) rename src/{faker/providers/es_ES/phone_number.py => libs/faker/providers/phone_number/es_ES/__init__.py} (81%) rename src/{faker/providers/en_US/phone_number.py => libs/faker/providers/phone_number/es_MX/__init__.py} (92%) create mode 100644 src/libs/faker/providers/phone_number/fa_IR/__init__.py rename src/{faker/providers/fi_FI/phone_number.py => libs/faker/providers/phone_number/fi_FI/__init__.py} (81%) create mode 100644 src/libs/faker/providers/phone_number/fr_CH/__init__.py rename src/{faker/providers/fr_FR/phone_number.py => libs/faker/providers/phone_number/fr_FR/__init__.py} (94%) create mode 100644 src/libs/faker/providers/phone_number/he_IL/__init__.py rename src/{faker/providers/hi_IN/phone_number.py => libs/faker/providers/phone_number/hi_IN/__init__.py} (79%) create mode 100644 src/libs/faker/providers/phone_number/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/phone_number/hu_HU/__init__.py create mode 100644 src/libs/faker/providers/phone_number/id_ID/__init__.py create mode 100644 src/libs/faker/providers/phone_number/it_IT/__init__.py create mode 100644 src/libs/faker/providers/phone_number/ja_JP/__init__.py rename src/{faker/providers/ko_KR/phone_number.py => libs/faker/providers/phone_number/ko_KR/__init__.py} (88%) rename src/{faker/providers/lt_LT/phone_number.py => libs/faker/providers/phone_number/lt_LT/__init__.py} (74%) rename src/{faker/providers/lv_LV/phone_number.py => libs/faker/providers/phone_number/lv_LV/__init__.py} (74%) create mode 100644 src/libs/faker/providers/phone_number/ne_NP/__init__.py create mode 100644 src/libs/faker/providers/phone_number/nl_BE/__init__.py rename src/{faker/providers/nl_NL/phone_number.py => libs/faker/providers/phone_number/nl_NL/__init__.py} (89%) rename src/{faker/providers/no_NO/phone_number.py => libs/faker/providers/phone_number/no_NO/__init__.py} (84%) create mode 100644 src/libs/faker/providers/phone_number/pl_PL/__init__.py rename src/{faker/providers/pt_BR/phone_number.py => libs/faker/providers/phone_number/pt_BR/__init__.py} (87%) create mode 100644 src/libs/faker/providers/phone_number/pt_PT/__init__.py rename src/{faker/providers/ru_RU/phone_number.py => libs/faker/providers/phone_number/ru_RU/__init__.py} (78%) create mode 100644 src/libs/faker/providers/phone_number/sk_SK/__init__.py rename src/{faker/providers/sl_SI/phone_number.py => libs/faker/providers/phone_number/sl_SI/__init__.py} (85%) create mode 100644 src/libs/faker/providers/phone_number/sv_SE/__init__.py create mode 100644 src/libs/faker/providers/phone_number/tr_TR/__init__.py create mode 100644 src/libs/faker/providers/phone_number/tw_GH/__init__.py create mode 100644 src/libs/faker/providers/phone_number/uk_UA/__init__.py rename src/{faker/providers/zh_CN/phone_number.py => libs/faker/providers/phone_number/zh_CN/__init__.py} (71%) create mode 100644 src/libs/faker/providers/phone_number/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/profile/__init__.py create mode 100644 src/libs/faker/providers/profile/en_US/__init__.py rename src/{faker/providers/python.py => libs/faker/providers/python/__init__.py} (51%) create mode 100644 src/libs/faker/providers/python/en_US/__init__.py create mode 100644 src/libs/faker/providers/ssn/__init__.py create mode 100644 src/libs/faker/providers/ssn/en_CA/__init__.py create mode 100644 src/libs/faker/providers/ssn/en_US/__init__.py create mode 100644 src/libs/faker/providers/ssn/et_EE/__init__.py create mode 100644 src/libs/faker/providers/ssn/fi_FI/__init__.py create mode 100644 src/libs/faker/providers/ssn/fr_CH/__init__.py create mode 100644 src/libs/faker/providers/ssn/he_IL/__init__.py create mode 100644 src/libs/faker/providers/ssn/hr_HR/__init__.py create mode 100644 src/libs/faker/providers/ssn/hu_HU/__init__.py rename src/{faker/providers/it_IT/ssn.py => libs/faker/providers/ssn/it_IT/__init__.py} (88%) create mode 100644 src/libs/faker/providers/ssn/ko_KR/__init__.py create mode 100644 src/libs/faker/providers/ssn/nl_BE/__init__.py rename src/{faker/providers/nl_NL/ssn.py => libs/faker/providers/ssn/nl_NL/__init__.py} (90%) create mode 100644 src/libs/faker/providers/ssn/pl_PL/__init__.py create mode 100644 src/libs/faker/providers/ssn/pt_BR/__init__.py create mode 100644 src/libs/faker/providers/ssn/ru_RU/__init__.py create mode 100644 src/libs/faker/providers/ssn/sv_SE/__init__.py create mode 100644 src/libs/faker/providers/ssn/uk_UA/__init__.py create mode 100644 src/libs/faker/providers/ssn/zh_CN/__init__.py create mode 100644 src/libs/faker/providers/ssn/zh_TW/__init__.py create mode 100644 src/libs/faker/providers/user_agent/__init__.py create mode 100644 src/libs/faker/providers/user_agent/en_US/__init__.py rename src/{ => libs}/faker/utils/__init__.py (100%) rename src/{ => libs}/faker/utils/datasets.py (93%) rename src/{ => libs}/faker/utils/datetime_safe.py (100%) rename src/{ => libs}/faker/utils/decorators.py (55%) create mode 100644 src/libs/faker/utils/distribution.py create mode 100644 src/libs/faker/utils/loading.py create mode 100644 src/libs/faker/utils/text.py create mode 100644 src/libs/ipaddress.py create mode 100644 src/libs/six.py create mode 100644 src/libs/text_unidecode/__init__.py create mode 100644 src/libs/text_unidecode/data.bin delete mode 100644 src/update-available.png delete mode 100644 src/version create mode 100644 src/workflow/Notify.tgz create mode 100644 src/workflow/notify.py create mode 100644 src/workflow/workflow3.py diff --git a/.gitignore b/.gitignore index 6b1559c..beb8683 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Created by https://www.gitignore.io/api/vim,python,sublimetext +*.dist-info + ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/Fakeum-1.2.alfredworkflow b/Fakeum-1.2.alfredworkflow deleted file mode 100644 index aeb49eada725f11d7f8dc6322e154e340d9c4d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422251 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%0D|;LFk<5?#5$?lzkvixaQ&YvoX9x!S`fy6G zJGc2;?%F%sN=dFc4`c0xGzkf-6kg`1bGscA$T|p~YPGju){XX*-h%p%;ce!1%5^ME z^FnOgb$!0>-G|nT@y*wr_iDbOXz6b{TKBl`Xd3$N?Mqho@B7;~FC-V>js@f(xH_Q9 zsis5P=~>r>?+-_n8Eq-}Sb6U+wM?@W=9`h#M1_!$2t(L@6Up#ZJe351RJ{CHfbWJQ zE=-(8!H>R&uuO$l^(X5!y7o|AVg__3A4*d7?7k=FTHPAYeB4yN)FMy6^Wr^GG-vt5 zRt>fnBQS&z?~;~xbBtI*I@`(5^A<}0l77Vgl+fVbQ_i}CTEl)|BwU3$Zc3&-;aHnu z?Om~7qfCHsWcVO&`bk29K=rTjn~1$XAEb2_*&yVWT$^d9iag{+;3yk&P@_OEUGK7y z0$15=QYiG8Uj)v@i-3D2=fg(9AVBRVX`bJtfk4d)0+}`>p1%4glid7v2rlZm%Zp;d zS}}AF+7_>eRwMHYd5pLW3w*+xQDHe!50Wn48#m9FPeX@H$2iavT7K#p1T@o0{ARbf z>KpteHd4Bv$?`A!YaoXr;j_PcBMECirUI+FLT8WXFIT3LB;dU1nr(r|FL#=7?Eavm znb2#WgCc&ua|O#jN)~+T3i!A&@K75Kj6us!K;`R2^1bqXEDG*b-$z2$MMj=}Q8xDt zycCWYTi9})MxGd0O7y*_#-+!l_W=Q%>cAw!FgONkIct>19q*JVlli?`jK|PJA9eOCd0+u287PUS3;00SyWcs1oX>bjD zC4b5pwNX!#$##tt0iTqpW-AsfRTO|Puj=DCun3QZ2?`XgD{g6jkj|oHD5KPusPGDY zgfJe`V2gGd1pt61BEDLLXuEIbMA~zgl#f9cy#Re)69p{PDrMokX#%@Kt8q;43t@-x zLNajvpS{kybpQk>$GQFaVV-nAsJ#G|XOQb}aEU}D)feq7kg;Zl*Nmi$uN{)5N%tUY z`07J=jr;*hL4sZLx7KGi%?-!_Em-l`9j{_@3uQpB1+=o@ksKCadapGnFzL}Z zNd|*vGy-T>PMnE}I)pf$sm>Uw4QL)Sy+#r^hH2dc?FL7aXIvLPIh{iwlkEpQ2(L^r z#nvvxL>BZxn^M6Q%;yrZOwZ>-m-~!+ckOm2W6Yo^?jfbUhIPf{?~T;NuUd)YDPb*Gmjr)t0MlxbXFNYv+4H{OD;ny0{J46$&zgZ1%q%+ zw?Zv*V6wt+@aNTuF~876+jyEfXAv?ELZdIY>M9UmAGbjj&Y4htYUiik-aP|e2d%Wl z>&*t&Tm6N~*gmIuso0^Ey9oh)Wv%)ExTreXc&u1zJ1$!FZAKr*z;w@i~i2 zj|ch}z74mrR28Ijzl{#%_w?Bj5ua*ez<}xbr_0~rm|bcuZOdE%zCgP2>}zu|8#yXb zTiOu#Z1LjTKQOg31yeC%b~UVGxy|wDFd?o0UCz)ySRCT@2+!yp+`H#_klurmy97@* z_C{%TjAgO_8Rk~=*663)8?5`;&wC#7;M<7MjsPJ2r?8%i;2ZQgY0Cer8hNadU8c`N zU%1k1#W*_UaIn5;W^NJ7L2WZqwp0E`(!ODywo59vz%2nOmCShFzFrQgqNofYAGl z&J#!f=qJu%IMd$*eG_Eg({r$M~jY9s_di z0e)l0rT|o8@DFOxyk{Hn^^O+K0dVkbK|)T06ki8^&k>(0 z{W>$3>G$RH72-i)oX)rh^5?)J4&(-iDM=wJHC|vBfub`fs z8m#-Q%u0*&s66H42LJ859lqEZs!cb_g(>vPPEpA9X;CUgLJT>X4Uix~+m#W2syeYJY zUYb~Scx?+F8fjfU4Jg9}vKq&DLtDBu0GXA1c~M{6aSM}P_hp34Ye1>z_|WYzYn>L& zRj||qE0GN5e&M)@#1@{~xQv#_1c?kv9{#>-?@E?7vC~G>(v0eTfo)7@X-6>IyxsH! z)n+_>-}qjRc^%C(leK1jhhUsbKbOgr?H~0n943rrVCi(jF4VjaIg-E^leMbNk@Cpp zCgMel<#eyH*z?bTYXbX3^6r+e0+;sIFfgIta3YRXaTyZiTMPPd-pI1?;!c2Bt;Xt+ z0p((`J{p6OpyT=z#v8l3P^thW%r)811MNh-)0fL6@LT8gbwc)0#^^dCk8B|f$MWw6 zA<%z{LP;2{Uw6qv?xY`f_|f)o4WLKuOe%Wj*%EZA{ET z03g4D9CAT{&m9w`&k4^mL|HsQtjl|N)+Q+>R8K7+qfWe$bGqsh1#9<-)yd&#kFwfk zjir-{i3HRTE;vx3iOnQ&Plu;{`EQ-|Z-p{9> zbdgV3w=9(hJidW6#gRT_{s^btTTP5>Paz;R(K&y`6zUxfs*|R_XOCv0%wPf`HKZq8 ziPc?e@;nE>-P>JiKp15u1)-y2_qontU8|DmY1jIQv33yoMqA~5U4+cb(3dO^ME?Z; z^IW@Z^l#>pP!tD6mh}2<`79e~frK?jyljm)UNH~YZ|tZ^d)K2=e(J0<-;dzH3X;A; zqodfhK)e}<9qLW@z=fo7i}l|LWS5}nD`8H3n5`^#T#a_E%6J|FWv~6g$rCHj4M+Su zU{=~=4rOZ}FF)|he*!|Nly7-fQFtH|M_Xw08gnHbhGk))~BwmaY{?Y8u z9|vKgwtoipv}1RgukZ8weNH2m^htU?(uVz3seFnUH99Ro4` zMLgw1Ktd2uh4uV76@xc?7K$PTJxi&g=F3kB!sZdC!miAuqX<#7y z#SRojM8U@We*7N*3R+9={vov4p*#3qo%edntai!%q`1(()8`g!E@FD|n`sWc3@(lm zh?wUDZuqiJRf^4wxD6-F#~HrJyo zU;4LY_VMR=L37|d^x2Yf{aJz7A6k9h{D#_JReX~4ai&~gFX?EKdn^|6bg*MjtxOKq zh^5ZWzLRjR2xG9V!{AqV(ZBBh-4g2K=6Bznw!+jd)WAwz{vFiP0dfUwLnde81Spp4 zkPI_yljx}4IH}nltxGj@e~Z+$&xc)J#yRy$yVdz(V;mn5@w+INkb^FSx;9{VL}Z^d zX1FO=Y%|a8v{CG4b2e#yFZ9T_)(y(MF(!eHZK1P8e~TU0_ucE1Zp9w&OR)c^lPdL0 zQ_E)s`xrc1_3_2e979M!$Nky1R&mb&9#MsD9e_MGNKT-nMK6hjrET*#rN=(F)N-rmy%c@=K=%qV(ybU$GRfm{n#CRHq4_A)xm}{*rdyGvDPQ)E|>Qkm=N2{vSmtZ`r!rb`7bf& zdIL>R`L;BEcIo>ceQXFcle+57-fpV^?rH*biOF)9PIdAXL7(E`Ql=Fm8*}4PFm_aa z$*;1K)|L}1a>3DppY+m90E8X)nUAOaO)fv@-yJ%Nb^uy0dMzpL((zpUlME= z3c%EVSN-{zMM^qc`nnCbiLIstGCw?9mUw6|G){dz-W3qhpq3cIp+QFMpub`;4Sw+X zKq+^~Y;`Us(i7yBlDx{I6$0MOHg*Dw?1sJm-*44>{M}5ePE*vYrNBH}f6SZ4IbI-! zRRyT%Ui3SVGB3b{-~m(EJ@|a%U5Gi;cV7>51xwE;kC}Y#0cOA3bG(x;7s7h&ty+A5 zq7W|Oofg#-`=)Ynzb8JL8J{5!fZ6eijNUK*3^noV-or3NqakX$ z4@ss?+)i?jJ}T?rVX~xb2A|tYk}N~pMpz zn+w#6r|RF!0zb0HnmYEo%>UtRBy}I-#Uv}SRG`wxwOY#Qruf7F}#0A{m0y9$1Gk2 z^<-2UHM{LejG#c)!m;R5f0+&gu3eIsdT`}MiSQi;k#jp|Qf1C4nbGmy4day|5mGZc z9ceAL^bvd!X`NQ?5Z}ox*%h}laijXdy3I)!It1%sk5?;`>R?cE-vKIk!LVv1Yqrf`Q}tE zg3&;H5lPv$zEJ$$8a!CFvlvTPoBThTm^716FG_tjUN;$SE$?@u)WNI!)n-x-X9~t| z;tKjQCG0XvZ}BvGWtF!n?_Zbe}L)y%h&qff41Ci zXG&1NR1#?Se3CSIRO7kj>DtqCDV}~(=I{L(3 zut>fy6%0Cx=hQprT@b$?mrNW(N09UvV>{?tWktt{KyK`QAdQ-ihlr$@u&lbFzJF|{ zfW&{dvr{>BGgC`Col(jQ{?)a=h7zGsm1tP7LO)qu;}wf}kNpEyxlY=prG46N0#LmN z(#1G}NQ7k0e@t{gc+Ry#&A2+gEZL_Q>`NPX`oG|5(iZ`mMS!z&4^oN(_0wAQ;6{rE zw*z!!_hYk>m<+IiK=i{WZ-z~F? zFSeWzsku7Blb6>UI`#}*1GVvtd^_Um)s6h*tlAbGXW3yDO?Rf)APnFHA!q*?w!lZp zLAD=t-Vpki=e&&Xw7>o5E?pCNII$JB(MzxQBIdU=CYHtmhaFSZaS;t-;|gfPh)Z;8 z%v%vym{Ek_{`&oU6ErGk8%hKe9tl`UV`?mgLuBYvs8=~a{5|~UbfpW2&H|2hLsJh0 zy{p)>mw5`1^qfXYb3eh?k#qPbG0fOhx*NSiqFcLvdvDE)14P?a&heAVeyaC*lJ+S} zpv$!6V-qFqHM8Ci-nOhlkH&>YYC@-KR`_UGM+aZZH{aqye^x)<&ef6Vxn7Ui>sk-I znV5`CIIf$%GS@jc1j{JX&B(vQ!8@g2XI zCc5Y7SP_zcHuME>;(LK^%_n)MrQIv3&%&d{_H(hxS0wV5Fvkz>!fq50!T;a`Z;}l> z2D?DNk@nX7S~3`P5vQ5>1RUnY`{_3QfQM~)n0qSc*NrLSIEfA15#*U}c^i}dZh9JY z8C~~Bqx@b<0jVYCV_m0RQVlhd45VS1T8e=aMfi&lqMvC{&>*rS2UK*DT!iSEv}BBs z%emf(TG`wdo`n!15~3@38bK;e3y<&_FbvhqriYk>5!rD*_*nwho6;MPa>i3)17UYM zlJ=gTi*uv?l#fkc>(`*op3C)nFw=7*N8Wx!c7^(NE$q%hhsdTCq`H3|U`nWkNgrc{ z_~qW<3N5r;l6l_!bTq#9p%t1h)@;h-vQQAbentQ8Zi z!CA{MZ_gZ$$Du&8c(e9cBINLN99umIFxZHN=A6ALNkiZ`t`F^Q{ESJRC<8y^vm90P z;9;99kUg-di1S#s<;*S(tAN4C%KlJ6DwEleU>tGu4QiPP1=9^Z zHhP!YT{}>-!R>}3PcOTF?ij6Yj%QtnLQtSFMY$JN-dZLXG+7}Q=5rmhE5+l~R=vlC zm61dc%Uo^ET^I?Akt*`qkPf!>it7FO6zv~LbnIqsO`(!Qj5gq>SU*(7tG1r`l+H79 zfz}je6=J1L4kxbo_7nx9?PjB|uRQ_&f$E)U9Z9SVv`k1Irc0;B6#*W*r|i)Tz8*Xb zs+UVGTu|W1FfHMKI8~z;*26^i;xc$q@ptZ%n5vs5PPfcA{)!FFEw|OEgX{iG2t6LTagoQ#_hifUaroSv zb3TdO9{P=MDvo1*)v>awc>VH<2<&qo?lxAoKmdPWeryqvLR`A3&N+6&!2M_X;8Z(omeo(oh^cy#XdOI$AW+eG2H z0pJ^y8w2e3d#-HJn901*hcxqZ_o*-wFdiI7(7Q_yBDqib0>u=s``+MiT;etCp+MEI zYtLdYjH8l07j+*&@ddr73ZGapJJPB7)`ePmna3^f*v~WkP!iANCMfhU9LJBe%uR-S z`NVpqGUs8Q7*F34|I~Z1=ewMA&7UG&FAw@7<~@cpu%9sIc|Fi?3K_g0vhG1%5{Dfo zT$C(#*VnV0L}K)`UVbB0u-^XJcsNr}?@n)~L#*;SZ_m?DKy$}Y!IPE)eOR=NzE$`w zk&(QmmZCEBkRG$gg_jm14vIEV`)&I(*UBv$y)XYQ(@<0B{<>|f1lzCOT|x3z8G%Uv zGI6*cuD$YO5^ckFLLTS82HtFS=rG*9ig3GafkyotsPmJg!O-)Fy;k73b%yQuWzhbK!wS8_HHsEBx| zkiDn*w@yZ}6D*8;o@$6r(cFU+#i2#riD$ENgQ?}#a3m94Op&icS{~R1@L1?_JWqfT zMdExcT;4MI;sc9qj|EoPV?qrB?^v{wdXiSD@W#Z^d`O8et7r0zUpCe?YDVWUm25VY zTALN(CvUVNUql0tuGF+qJfR=j|Am;(Ob$lecYj{Gw3@k+Q$0k_QNKp#Pu`3@%rJBd zg!wl|=B}p2kED*n86iJ5t4v(LzeBHj)G1Y0XYtxpKtUIYULrhv0n`AjCGhEKpqH($knLDPXZ)LV)f{Q z>B%OgLYm$sF}dfnLg+j+lG^t_h`3KASI=uRa#PQ`e9u%|&FPdJiQPXe67(+GzuL=~rs*a? zQ_@Ve1eEB5Ly%dhoSEJBG{`mv)^H17**rNfz7?9dQ_#uDVK;qke?X{$Hk5Z(JJv+v zXIuN?YLPQs!%STx5V==AwLg>66p^skFnm~#H>2FikBY(z>JZsyp6cvFtyS|2ZBnm- z1^abesIw11*<8In9`K(3L)bgV=+bZ7!fo5O?e5jKZQHhOuC{I4wry*zwr$)#-^sVn zeb3#=ev(R_zbcjb)zp}CjA^HM3q8%Xpk(ov)x$O@hQae|&J}cz=^2#D)>o@&)q_e~ z=s;lCb2+gJpb|9J?!1AJ$cOYr1d0rwur@*{B%2R;u9n@FP|b-Z_N7_WcFLO{=gwDd zP9EX*?&D_jx}xg)+OPbxH#aLi$WHxDmQ?%w4bKil6}g>qij4 zEshDtfeHNc|GzHqpLt$a6GtZtJKO({?g0Hmb@(@Q2Sz%kf6fFSi-YHz0|Eei0|5Xa z{@laVz{#DD>I)Bb?6QtzlBWZze8>pxvc%>WL;_FUmoJf~4Y>m|gwr})+ z!xIu5=Z=idB5Mxi%ob_U;e3h?xrJ=&7I(1k6T8rNvRL?sK^74lLyp@W_!WrI00lmd z9JneK0{9fc4j+#-2*|Ax)EHDyD0EzxpYag^Ei!pjpdTca6^(*yntm=O%vxWPrvvOr zO1+o2JCZx(IfO$U#!FI>WARU7$6;MMrdgA9#g;CWZcO@e3S zK^0c&?WytFaZjX#Y$dfl6C%gvHncIme;!$nS5~0*&yoB6T>tlx*%(;Z{>LM8ndE}< zXFw2{=dHwOnisS}Z1^EEAY(d{ArZBC^L4lKY^50L4ypRBut?8H5cLHz@$V=BnTkU620S7|QyBY!nBuO$j(D!q8zBrF{yUTN3S6T*p81wF&n6W~UAl=^yWAffu(R8X6k{{GuIg%U_ z@w`DkG)Yn%Sh<~{Anv`0in0$&&e5RFupKW3r*O`cTQ9Ep|)tDKm&;TTKZ>6W65 zqzZRr615euwOn|qw76;+D{~w>58;PLyc*@|ZEncH-o#sAmIo(d20*?}us6iWeJC+v$ zJ4^7*t=sW5oWv|C%|^E-yTj@%S(~I3Pyqzmlmr701J1RM;I@zpV@jaQ<`RQUU>d60 z;09juYLFTc!k9QzyKvF&2U15u8=}mH0y=+&KeMEXLPHDm zdr;Mxn}eN)>O4xWXRQxK>RR10`kK3V>_SlWm~7~2m}3=7rCC@>QimGEW6cM|UFYCBX6TaQqwJ>T}5f4et& z*cfidsiii{DD82zSaawT+B)%2EUL$3Zr9~GVg5C+9jfP=NP-e?{qDe4t&T;oJKU*d z*dlCp!GEp|2MJQ210@~e@Pw%WaQ_|K%eOysxG~TL3Ke^kdpoEq-+Y8LD@$jVOW!k7 zoA|n18ue-|NY|tD!Pxu4k^5^RHC~Pu#Q4!dmj=VQr1sRS_jWxn@%by>;wzPSg#tbp ztx(gRA7jee#YA1FT)wFin=?Gv$lus2?WAE{5hg#RaHU3UBt^X523cCmyPC>e;T;yz zRK?a(6MU63JT`2}N7>4%E36B**9)Qjl7oB~+iZF(2*|tvOMUBi5?lBdPiOTnXbBNW z84K8;iA5mu+9+)$TA>T{na3aIV5QVHx z4;BJoJthBHlsZ>d(rbHn7ZAI*glSCK&v0(@ri8(X;pJP|NfE4#VHr~Bet_Dtc47{m zF59z`?FuZGkK8B|ecipg*d%?p5$cu$kWgZAkCUtS3$61mzR(&z4EHb`qy+@e%g}f{ zAhPbs5UpnRj4#e27`fm3%MmYXOBrS-ylLC)39a(_iueyVBW}g6=9{xtx4A5z-z#@? zZzcOS`5$et`LSYRdvVF6Pi;QmDb$3ymszqm)%*eAz@GN9oxOy7X~(vItPp7C6O@8= zK;R9>(QigrBEjI3$M$z*gF%!i$#yy6&%doDK8>ZtVf+Y@CMAA!6MPIgj$d}+ws?24 zRNJ}k_f)Dwd$a_>$b?P7A{3p z75EEC6i9&;A(CP!8d6;n+Bln zX6Ber?7-cZsgt*N0UCJDJc9E@YXo{O&YNsT%#4%Z2KhoE*f5nD3B&8~O(#pShnXv6 z4>$#-$_vb`S~?IbbXjl)XEDOr4EA{k9+RA zCOvT@jT-v-D)(f?Dc%RD?E^?+2Ti9G`0@@)?OG-{Av-w2YDQO0r38MSA|hESQ*_W> zR>}m9WW0ucw`QQ6Sv;o<(ZHPm{ob*BZIb%)Wu7TVff|*-X{FcH`)GC(do1+mDN@FR z@^gkF!nk@NXL^tD;S6gFMJDw$Zuo4xFgHJ)T#sZ^YzpxkNdWlRtI_9%6L0qv2Pou} zo^0izEF1Hz0(7$P9&#g}HCuET$xOj^!v_3cuDHNqcmmH-vnv9LD0;WHQsr+0w!TaqyZ6E#O@B9s#? zZb5jYpCt&y1seOGnn}0;i4OS?;Cw*U;Mu970WPE{>=Ug8<^u>89sr_%Rn8g1Z$i*6 zI(3zKFwrVTlvp7zoTSoSrKCG4j%+`xO1<>ENN}%N-Xi~UxqpEYeFS`iMqb2~tL_7( znnENmy93GXMDuM)s#K&lMR|bCON^9gXpUqeDSU#ODKlKIK-om@i8|$O?XbB7pak5b zBD{}2&5Io2TIP}wkZgodrwq&ys0Z7(kt4|PvEJ4tE1fEpfUscAQ2Gt}Bg(S8&SISuzTqK$~E9{2@K4@eWfJ zofIx>CTo172ysQ9{$;@FPWimim}bmiDb^cdC+|tBQ@?X&Eeaa>v!^k@`zo}WIc^Eb zTu<~we$d{Px09ngCwm4mcnxe7!UvM~saemXM&rCTrV17!JXs<9i?`*IV*T67;*(wM zGOxSV;1Zk9vYc5l)V0y1PTX7}u6ErNc(EXJ`_lk=|5R959&V5$Mg*e+R4S!mq{T&e z82{>}EkDo23IHY7uB26lbIyWvlw)XfV76TS-8?O;kCxopIT`LEo;ELa>@s6(-`+e| z?k}xWggWz>g2jaTjBB418Gt(7iv6&>x)Orqfln-QMv&kht$KCI1x$E3Lsp;piA+~8 zA~Tw=P>0X2Ko0~?yiKM8rJ@S5U%38!dvE}sPT2P}BFPoLMR37r2K}@da85tH6WhFF zP8!%+KTciP{C*ji6FUb<=G(}D>u|eWCD?qKHu*zo{o3g-_&58hNYL0r*nMoNJ7gj2 zSgWvA*=c9{o=M!+W!46jIq5V7DI02f`@DPvrx>t{y6NKKKJ8g8j149l^X}D-(1!j} z1(b{_$FRTkXgtBv@%Y$*`8po;Gps5MAK;8`hp0uqdaM(8ao5qz;=f^$ouxb&l#_k< z8Fo;BvBQv0I@R3Wobj@9ZVOIb(rE-(@q49vLzN*yv-(+}eTHGy8_G1mb^x2(6r&n(-o^okql3rAUvW9_37JivVr6gcaW-{MAHrbZDV!ICbBEp*Kc+z)T$bN4muQS~yXLhZ)7bd;c=z3@tUBv*~yy5N_CEk<&jWBXLtgqP+x zVu@`yVLaKqF6R-W8Gz|fN<=b^Vv{L3G0Pxjc}LEqbNP39`3$b`V-b;rVC@KkNVdkD z``a?NHB8!R%xSG?6fr0a5U}0{+7YPxO(@d>&Pn-FbNmmHxmZ=o?l0Sa)gM!w;N#_LYnSB=1bJb!k-8nJ-I$?$;>4L&5sDI24p;}h zZlVQcsecJ5=vzXw?2aNk&;O4tce;W_|u$AYMCb$Ii;a2 z6rhD@RBweUmy9fN4r^yAc;QmN?orVOGu~87W+Ek5JFD}2kR(srHUnv59vRD1StOFM zs2^x?6cAB6C(Zb4oj-1T?=A~QIdZfB1BxU^3Vualeym6B|FF21Iy{pwErHunTHugE7%p*+enEbtt!hbQcQ7=h|l9-|rLW z#1=~r{ayi?o?i%H>md6E@=~wdz~Nb5*5gkOg^vDcED@C)w~7TEfjl`@OamJBZu)$A zt^sZZjEEua6~T<{(s2+dA2k<{PzG}9I6lw<#XMX@2%A50ZJ(`04htq!v~(J_Ewvy5r)8UkE(MAI(Hu%yYW zr~$@9SE^Ql>}Y2uYkpMRmm@p^WdnN;8AP(?e;>!wsr$+yb zW_0N=r?jo~n5kNa5wYFO7iNVf*I6@zGby+Vge?F;|?4ovl{-e3B*a@%rl>z1bz4&t~7g zmM^T2!pP7(LS()czs-#iS%GJN39{amfxt&4ChDG11w)Z|zdpMBtt|2~+ws#QtMnn{ zEos;p;C$1NK=qu-1g%VX4gZa%E3AR8#3tK4ApyFvQ=_Rz=wMJl^->gx>6xpm45tEd}S^#%OT zggqI!LGk?u^OAuC06_Q`I$`>w@@?nn@qfDphyNG$Dpr+~+hoA$K2~zK7atHDvPD)b zN>(V5T;^wJBQS1{K<3u&Y`_&2_`GUF=8D*?!q$|n|NQX%)^mh#)J0G=X{L(h0~ert zLE=|msX)UJ+zBq8RwIqNwvcoZk13_Hd~Hz{7pAJNqOYqk=y zTvZ+^4GX3Nm|iOvpyq#TT$mut@(u=8Mji3GvaR6;npkEijw43N5#|kKl8}t^Gi|9r z(Bs*Vp3^U)vS4?b%dG@+NB3hLaW*lPa@C+f3LSF|`Ue8!K+8+z7v?%U$fb5`*O9%!UE~+E zkC>L*1Slh|h3|h$eSECE3pu76 z`=$M4`ovP3s^wHL$O>Dy7Pn9Jagx>FA48tlK?cTxx6QD758R9Us(#tr@oZrD60ga8 z4knz9Sw8Vj-w10YX%nEwZbxuMVkV&ILsT z6SIKV-w+$Aw7mvf1Cagpsfp*d`ZMX~@|NyYb@ToShuk zAbdX2q+PXmD}HpbeU~b)$flgc6th)6*~-;x(<&bIJ{GwsX1=xoz-avA^jDG$H#(CT zulTl-L=?BY6r`VxM?zhvF6XA~$bqneaq1Xv|KvGnikI>DO*bI#SX$Hej8NQ!h_nZo zY~l&Kx>7j}#=&!9U7>9`Y$f1x$5>KXfP}~mY%U20tnc8302_^Mv^Oe5Jv*#3#ORQL zr2QaRS^PB(2WNlK7OqcR1>pd58ttU8U~|Kz6@a#=aClyL^~MGs8#=uQmI_8K$a@KFymo zt9_kCS5R@G*m3}nM3_hSF)@YI{RhzJXxZrk7{<^oOCN>kTsQ-s9Wpz6CA{8TJ$Hrd zEYu+z8*NQ-f7_yhVXyE#v%sE^Q&eY>F>yt@jTUCC@n`-h`I9QsTw`qq}3$lIEwbj(aSo{DA=!7Hel zW^wbv=OX`BCYo#Q(!uwm`|xZUoh*&%09(oz@wMeQ$KbaU5nJOlc%q8|Y?O(o*N>rS z#Bs}CVVj^XL)_u7ofv~1hjd1$(smnU$QcuE)z`ZJdq+8gi)oFRF@ z&z{)1M*BCJ55srPn!oAB7_f~j!Y;QE5@ISSql6M-`?bhBk3r}e7)Tm2?(J56`w zuLqO2Zc&R*`__z4>6;I{@mo3rs#o1Z&b5K(m8hrnTjzFV5m({n$oAE0g`6L6qHF3< zmNbdvQTwRFo0Jr*f%e1yN}DsnRjQ&u0RWOv0RXW7Wz+VKcCHr2KmDbD+Zy^e#@(#G zZTF+A<@c=TASJJUhO;WWY2aYcv?&zO12c#h1_(u(Yg3bSlAwH1bn@NvH_Tch1^Jg1 zC`r7#TQ3*hbyRz>G@W~WMyjdDzv4Jf$^~E?^R zP%Ne!N$>%8q;^VQ9&$zf1jy1>FWD9!O5t_ z5UN#MXZQ{Lvps#Ji0=I|3Bp*zjv&-D@{Gi&0)p-|CSBwR17F*N-uAAC<|~f%qmQHf zdt?*Acmgv~ufbn++aIAhSRcc~!(X5DEX7nTbp-GvvDC_O1?xm;`YlLTX%q^v;9lkH zp_D0FsLTkCR_i7jG~C3(U1P%Kued#pDfNnJuOz%krk$8cnKJMOX5Rw39+_sP(qxVP z6skhUIo;lIc$<7H79@vVsC<`yLG>Jt4|`-?fNCR|j!RjUaySbj z!9zx5%lB`#jJ#9SW;o@pbB1FdXCK~QN3TcJcv|^*T1i`5?Xozm+cgrwaR7w#AENa; z$wonx;XB0|Y|ntw{p0Hjpj4G79We=hTb1eMu1^f!Gw~&G=sbB=aJ$&&Kxub=Ejjz< zO=DNvZI$`nB1gyu)WvU_bC%DLgi=Grl*%dPF@CXRg1bB0<{%bOd9E)9L2vHXeEl9R zrH;qvEI`FFjgItokJUfff3Q~;;auEPO6Qg7b9$v>WtLp)-5?ETZDfO*gl zs|dqZgo?gb8mo!oqd8zxe71r|M(k$hnqYY53t}3RUu)ZrkaQxiiQyU!1*UaS*_@B7 z#yNTuFNp0%vkQ?m4L03nef4-gyjtrf?T`W`U9#JwGo{bu%N6)`=c3+YOV@j)>x-OH zy89={)a)~3JAZRt5h{bTYWQ)!9&>2;@Zo89BvMT;0n*w#qty$M<^Fh`{R2tEVl0@X*;EUVt#QOgQMmY;Fa2HeV5wcWrg z3uRonzngaD=NnC(;_!BjM~f?Axx7-Rf7jB8X?lo-loDO@`p1QJ;-%Dhu!yzG5kUth znhvG$5#+wlXqnveBW=zZERYVVj!Uk-6kGlMQ&ymtp@`baZ#>`hC5*MJJ_4Y@hv@)f zfXyDnjnzq4K8Y=F+k8WJlX}A!%#zq4Xu$kGlV12lU~Z|2j%W-5T;HM3dIh! zR+MGu3Sl&YX3ZEq+gC=6Tbd7LEvVGe%@#*-TOz9WDuD6beSuRAij*`}WZ=s<+RqH} zmG3pxyF=Gq3eMNXX=Vre051i|H~NyR7wB=NF2-I~roWuj?z75gL2T%!QD>0Z*ljM; zs&{cSU_p~r#MK;pa!VECO5kHXi!Hn-c@`6?Vx3m;c4*|QF^Ulo%P?Jwr1tJo;@WwW zm{y>oNm)rF0d$?glA=<6DSuC6oHNB>tqar1p~JY!>OG7Vp~hl4qH$a)8UY`yTf(gl z?Yvp9aqI1VVJ&LmGk^QJ`7DP<8l&TvGXl9)L*3`(=#m~mtHgK?bo;TuexSVh6mm|@ zngu)CM}DWKb43NccWUE{zPh7id2Pg(vz!-d!t&^>uL)H1hKUyItV23|#8Sb4qt4o! z54sVSU|GHE9(`cI|L?+wu`fj#@F!=x`4D@#xhNyyz$WqY7+yoE1%(dRlSKy%{ z=SxqB*ZzJTV9}-W7!^{^u8u=|8$xcPp$<=9kq76zq6s}A=gSNIrM=nf zfm6s6oN4&Oc`w=yuQaTNq$D6JM-qMQF|uPrRLk)0N7}MAXtcm>*v{Z?h0PXoS%5uP zeS!-)ex-pywcHL+H|CxJy%kBJk#7!=+yg7&^F!|vmn$yO?k*`p6F+Xlt?SQ&tR&=o z4^kB;U>1l>tu7h0;wrV;^&bcD1fk0Td9tMKCOaLW;^##jAQz{`M1v+2wJFagSV;!F zJHNQ7YVYj>Pbp#yl)2Mg>t=+CsRqSBsC6!lWhA4Z7=3i5IlLllBEC>a;@!<3yFpRJ z#lJ3Gp1-3oJZ>BpPz8fSja`|6M$x;8({iXLb!Hiv7Z6mFu3aNiI``G2BxVi>zE%Id zVxm;ltY_7#C5KoqY*2zBaab&E;Y>A$w!4DuhI3gPX%#3{V*5Bg$4*M=00 zx`&@Kk11EGyl{T!iGpi%eL8ykzHZLO^KC!&7h0l{2km->Z}qW(h4os!^0?OG2?1*t ze*b4<(ru#2i{2-_*i*;i7jR-T-u=6OD#a(iq={(6tNek75CjZR#j6~py}2)iV9x35 z8g?u>JH6e3-~X`19of*0pO{YgdWJ7*<<6+bome zdbs9aGmgpG6$c6`irc*IO0;cZPz+^Pyb*??Sq)~_I{?1Q*mZ^*534ttL}L)5jf`=@ z>8JiF2zMWq@KLOD-4AbFi?{qcRc`Mu;`JBAP2lry(Elui7=I&fp!~G|c8~x7F#e5E z8QEF?6L9=DCY7vqZoA2W^?6;&ppDW3zRvHa00>n@61m+^wwMQ5f`Jm`UvI9}Ow!Ro z@)z@AJB&RdY0=cI8o+f%>@M!OQ^D>CI|KdkN@v&R8`QMXMyT=?4PV^J!}>%iKCvVl zeL0?Oo4cR3U1iVu>Bj%vRxUFv?6vdt4w?tyxGrnjG!v=y(i@|diM+bj)aj|;^P805OJm5So={>vad_GL7EA+zps7vYeH&HJ>&`;Yc>=`@5+>x-Di+jO1EPE$ zrovun$Zh#0>FhlcOSmx6ltdLlO+ zwdV0)Fi8m6xjP-NR6NtkYG6tcG8h7v#1Vv$P_9+La1Sz9ecxLNw@-m`4SXXAKt6w@ z(?U$tJH>?Iav* zZh!w88mW>D8aYp1nSp-c_g5J z@vhn$#R7Qt22v#>84Hc!?$(&6dapBUd1yEK1uVcW`%Qx#hL(bB7!Vx0XwQN;TP{Ve zf@9OK;m8LM#}Ob!Sg#1fUx?*1uA>2(8pRJ0sjw1QLMA4M_VE)TlDUgw?gHeagOkG9 ziY}Y>r-rVz-nSN zDyP2KJL=zx3393jgaZX7Z2A(DPRe2)ArNA^edn|O61c09$|l{Pv6n<3EvWg_J_fA` z)0fK6eM?Mqc$dZ7{A)lj{Pr5bRw|&_+$Bq3YyyZd?i-UUK7H03y-ENrZ#^(oeCew` zBG@zT6_ab_^T8lOX29py+=Lh4x=4Wg|W2tA4^(7v-gh!60F(Yd>PLqnpJdI23U^r-c zfC8}?9pxj+A#=|FLJ;}z@jK2@o3LIH-n4L@o9Eql0aJvvsP2M}OveO8M0GE(5~LD! z#7Tj3tg4#x*w$Vs8G^rAyZZxnJgVmp?YC&_2Z4D0l28V@jL1kh3&t>egpXc_bcXHw zk@|#2Jhmo-$2jM0Kqi^3`T6UjAvPJ{7}KDqaprcqMU1+WrvxKyJD$I5#+i!oJgyU4 zlg}QsRs3oqP8~596s<)?XA@x?))l8Y7B0KUW;XAFs-72<2SvyFUQ3x62cmTE9{EQ| zMlz}?qjE~3?E!MG55>JzmjW`uUGcrhJI;BIv|~U&7@uS-8G%!96xlY*)3QDwoF&1* z>!Lhk7Oc^cLceE}6cg=`MhYM%_dtnKD(fNy%*zrZqhTXcVsvbJN7y!5)mZX<>`QRE z`KW*lNJvI2h}~1`rz@8^CVBi&rf#yyUZ?p$;g2*=@gF)zt*3=fgb_59nYQBD_W57P z)Jm9U!oTEwGw7RwkJm?l{uW)AeAp7&q2r%Io=5Jl3y>5Z!5w=@Jix@c_gqRw)mSsu z4M_C%47%9f5YRsX)i+u!PxAi>gX-CA>|jwQ)hpT15jfLSO?>sn)jimyQmH?WVSyA<{6WbRr=&fHa1LtU7^KFQ&SSFk5e%6AEQr97-}hgUNc zeV$~Vl%cS8MfD`fk%WmK0l{~U$K*h2Zj80))<)r*8BvR77vXF2!OcXA|9ZZ5XV_CE zoVwTR>P`4nXi6IHr=%;A;^{S68189%mX`9-X{;0J$HxSIbFC^I@yl%VV~Uo%UgOJ( z+AjQq-1IZdkMG`zez<7&aO9hICzN_XH^~X`z?cgi+@s7vL^ZQP=X|v!)Y(UA7Snw^ zQbV>9TrnZ?QJD8iv6oE`Z>(IWdbQTxeE7?cNa%8v;^_eX*V%g%{mzGpkCwKr#o&Nl zvu4+)5u=}#VuNZ^1O1UJLTJ9x`}w2EYq4FYN?%e_%J;i7-yd`g=tO*ZO?0QxRqGn# z_p7VdT-q<3FLt~ma)H|ou*~g3#a`p`*C5!tm{XyywE;_zmoPgWm=9~c_Fkv;6?8s~ zJ>Az@_?y~+d%*7#hF!OZJ427x5VXgNfl-xBR&>SNa-egyPfD=X%SsySsWY2SU8dMC zqmlm&H|mzon|}NZJ;MIr_Wv$*HL|m@H?aLr=zWO1jMOj#Lf5ex&Ewn;^U&jle|J5| zEgm6bnmI1EVSOTT;oJ7@ajBrKG%hd7LW0! z&kR@G7+s{TX+PbS(M6RkA0c$$60*SLRC$oei^8DQ&{g5k6p0@?hAmIgd zm2$>IsE0X%wJ7knZh=s2z%lT2Mp2I=gp-Q_VHV>-2Z!P!rKEbb=cD11!PPi%uSmCB zuW6NL>euv5>F2WK%9>Vg&y&r{ALM^#Ew72dS8zXBO9U1G0N%gLS{zM`f2M$q3>=OB zLr0`rL&I)U6v213c8ya;VuXo!Bi=iYCWC@@4v03A?ItQ8fu+5H?Ff|4L<`|#m&?o1 zBb-P+&ofVA=7RlsitZCk#6!9P+)t}|wuUUxCB2jaVrA1(>kk1x3GH2j;AS)cJ{*$b zK9h9Wo)hY;lK8Ej$(OL9wxlACDo2@kBx-CyVO+s1{|69Dx9FX)N4?TBX^u3R0+M26 z3h8f&W|+yfnd{#DGDll7WRTuc20{k}n*pY1enu=515iKagF#33iN!#YwU(Zp>6x1O zv+d^;;+0`{SkZ)NWdVJqtg2E9XeDkDk%-j;(4QA=|0HkYZO15rBDR^J-09!m*P7BQ zRr$yiw}qaEk-!Ib&ZI0K`e}ibL_konNfyKp($Hpsggp>YdduC1Wxmw2y0J?|(}JmX z=_EMFe*$yLPYux7*~sfJRrRY=yKb_%Im41?gD){t4~@93c6}IoQpd`X7wz46t`OvZJurfJZ0ZWl02m-1EyZlvw7Io*N>>Dc!z3>-b^ih^oVqTzb z$A~sgNFsMC76lp0M6UfhsMd+N=Yp80#7L%8tuyAgK$P?faSgjh?8}ZZ&mZq`&NTjv zb4l#qjZC|O_}A*bJI>4X{u7`%vR_uTf3%#hX+yQWNL8>9^c(c>Ta_BT-k2`T5`B0z z)88C_h5FQFPN)pB-UIhMignWG+UrybMFKS6{3Ay+I@QmyU3Tp7bPHV zI8^|>ZJ1oyj9D1ix2_Z$y2< zRzr?M8eq$Jcw#5VjC^WNY`Nq< zw$jT8@1^GhbRuThzM2nf#pu&=zC8kO6h)EFZEj64*4$Lm3w5piM0FW;TGSLU!OaW! zRVid8@F^q}LTpUe#h#5LI#>nd#dYo3QRXhHJ#JczBe`WmNa6VF1wMdtc_Ix|uU zG)w+NZ@&n5*5U=o3_FP$lNh|TdribW@N*zPsHG; z>kG*9*vnpOV3PV!nCe`bH}zz0evduc`${?cWM9rQ`IRTEV2lPvgG5WTe$VEoYCYm(OwVXQxByPenZdoM}-Lxu&431~5jQ>P)+uQc38+ zAu-HOe8g>)QQPXH%hiL+<4wA5<$0XMm8GN(bz#`kDy|5Hr7$g6wr(=Oca|m12pT)1K$=j`ye2Q6)a^s%&bpf)mLR*)#~p9bJ;s@uI9ea zu%M43Qa-bmo~=6@5Oh($DmV1!9Ta+w;3tc*cnP6Fn)niUq!rRGm%Q{3Iw{Up!Uc0g zlkjsm<5YepZP2|nQ0v!bk#MyDhA|${dN%t64RDBB^OG>h9N<@)ca&&ITgRdOhh7(4XOW#H@}PM0uZK|KqUJ_#QV2PvL%6o$-zz z3VCtd&G;usxJaBQah(fM`zFYS+2cB%U8pn;PoHNin~@af0qsf)a$P(btE_XgndVtb z))@^B^=nU7rg<&rGUFogDu4EbF8af~@Ekxg-3Fy|duc1zN+;ox4A}|eu8SP?6{+Vn zzC>WLT-O264Y4^kkyR3S7oLCz;?2Wn7S~*#9w2` zI+Gy)?yaKvloA{8bLLvLHt%7jmcWHdy#r>VLW7g(LeWJRAMP&Q>>Ko-QMM=bnnMfc zhq2=i@DpSIe}>KfG*tdegI~|t!sbVQ|9{9f{{|nZ(m8k9itn|-YX&--&(m) zxs=`BNh0NHsS-nxawS`rF4rUx9v}h)C8-*7y6@EsqK5<^?Ndq3NT7*38EJf9h1dTg zhVT&9_@LLQ+WGu@VNL3eMuSGJAufOxLr8p1M!m_+~7i?YAM@^2HBK%cUcmZgqCAI=xt&Z$ZH;s8luU!s} zqk1!|%6`v+)&cx!0hRUl1<5Kx-YXG3$nU9j4PjNkF^9>4zFzjeP+k#smF)(s`8;cY9h;<73#1$uZlVf-H_Ot{GReyMF`w+EFt&3J9swzBC`9( zgfu1Mhw62rI256`?(bGJhDttLSYxQnjSDipCW+|WQ8PTcwO`&2;|s9u+|to zpF~Bkabp{nrqxX3<4fSM7#;9!XsbQNjdHWDuMBycY7Ys|hvj-DFyzqFm6ZiYe~RWt zh12K1?^k;#bzX@%VNO(OCgBPLlG26WK&&IuTv7OO-#LR>J5a~Q;~{Uk&5BhJEf2F6 zQAWJRU+o-6fLKb8XS0$r)5Thch9)rnTIL5|=I>lsOt%7C>6tA3UZjrTkyOR?h7M9EZjt>f)Xuo39N-g`lQoP z3~p6^|9OT+Gb>CJz^kd)O>$H}oJ+{ShWco1)E2r;ay_+XVO!-t5-0H*D!bf2+Mws-7cJ8%q z7*?yWr(7g!WXvA$!It>|q0TeF)XPMi9*ZZgI8Yf>99~Nv`JLUfu zVoceqG8T+f5Y~jvO8PA!5UymxLoY8R?!=md1`nlbRcnynvhOgmLSx&U8)fX2@OVx= zot~dj{WHBJg(Uc6GxjFcj*mbRS1>;vkA=J+A+#~|BoBl%pghpBphkyDZtg`6=7=q{ zp+$noMyn$K5Dj{@PFYH^RnIfmCm4wSj#j;|p7bQ;!)W5JdFCZ5cSnh-KWTuJ5x+=4 z@y+^S6^vu_xUIsLhBd*|`!Bh_>9F8>%0^3@Kvzp3ewfHArR|{zJd2abl!m(fbVAz^ zck9l1aa;Dzw0`;-z0s$jM;_edk!1&z4YS-y=!oaEN8no+MB+TkK73(891SlGo_Cn? zf*`UQsLp+}E$B9&5KKKrU6T2=Z%On#Y{a7*BHg`RlE-DL)*pj+PovJQTV_5jjf^euc3RAexS&x|25Rm&F79P-4AnY-Y*)NYp#Htojroy8;}u$vQI3X3NTH-is6 z#dC$;Y0=>>G?MUf5czMiC+coeJ%Yawo^9GuizgK-r(=i}a58`aK(Ky2fn9yWrL42A zQn<@ypTQ+1NmlD^V#f(m!PcD5aL-Asa&6fWds|Cpdj5qk<;kyn*%i(ydFnsgUM5ZY zVX?xReX4z*kh8w7n^H6?4s^#Z-oHKx>3o~$9-g=e&nqeSv2mKUwca=qV4@+f5Z}ty z-pi=*?guc&(f5{lWI$v2?>cj^V4u#Bj$UzjzwNyk12}D9`=~1ikz8_GDU08t^ zSUO(CEPzuzthe6<7^~gdDy2a;ksJc{IO6d580fBNlm(UMO?)x75wZR(4bc%soJL2N zIz*axcS}2EyC%x_Hi~hQU@kN7Ab$-l`Xy2*Vf5V}n*BuMmj|<~W^CCVx&yf~4fO4w zCUR^AJ^0&QSYvw4{%&0A(m(Ib_Dx^TQA{qGeq6DZlr|QETnEY!8*{aV$8@&N(I;)} z(LZMqu&Ic0`jN1wg}ttPvlbG)zT3yj5HE@oCZ^hXdmpluD|4+UH!>-V68vIb9JlSM z9`4AzT}KE#s~W;{jA}-o)|K-dPT$T=?T-+3k*bmt{UJ09XL?Uct3#gNw4q73GPI`DC{F(RVE^J3p;_@z(q`e@`Y<1zY#%Mqx_S^Tz152CcuF zi;K~#LTOklZg93mtM=y2Cxu{HCALyNh(FiRI>((jjS!Yl$9$%P(RJWo4YrqUvH7g+5=35dS(mV}zZ>7W3 zfpfj{0hw6XeI>?)?zRQNN`860139&n*E-=B%$LDX91H6ir!&sB;+8v&aPK-IYB1|4 zIMUJd?3|jeUoK6-(Iy7LpSFi8^BM`n{N%|L+?q3jHNUv%E;`;70gR8GjK}?ZJM7m2{0gY$dV`Da-T~m+nV$!sxNt5{Nb;&U z4zzWzh?-Uqt1GmM*MKS}bPcqD#7*ba^Irh~7KqVquaDJofB?=w_;y=F+0VOb39-BG(xZ+)w)K13M@O55(K7RFZrp&p9nrOm-1dNfI% zcGzAbo^O;)(O?2kI9%=^reIb>ND#0EMCdQ5caR_-N>pABUw?6 zlQ7mWs-N-6gmuv?&>{IyNLKr=wQTe}GBdNzQb{y{=>hNr8)Jj;qu<2DPYZjq6Y1YN z8E{t_d71ZS69vK8N4rDhs>}h=8xFxKIbj$@;u7#A(%#YAkTDU(I8>T=^OV#*+_(KC zq;gz$ZAr1Z8uL^!o80!l>SbaIrF;W>CyiaKGN?Q7_7kN^8%6TC2+4UzX_EcO{%9n= zuoJ#eb`Z?vgmv=Z-z)1~BX1@fv4et}Lzg^PkR0+_Y8kH?Z(pRluiY90mq4RgkfJie zBX9~#o7gu$dV_COot;Ma`g3HvFEDh+?RPjZv6*~=WZKO1(i(SU2)6XA0paRS&I%WE z4Drr%)(Z>Q0_ViqQoJxWen_zr#_F(F|3<}a$m$`WZmY2c_}wtaWz1e+3TzGO#-hqf zx&lRU>Olh#5`|_&C*HF}da;z^ip$I^@(37^@jO#z6VZWnHWMNCM|8~bjF*B<#$1ve zdxBG6?f)?LPC>SW%NB0iT5a35ZLPL#+qSXVwr$(CZQIuE6Zh$y*m3uLsP{Rm>d(l^ zG4dM{GhKV2L89MJi_Hzx-L==88Z}nkFv%qaf11obqCyBYC@>B2IJl0qxhe^d_YQL1 zv$*EKC}v|x8{3O=X*%3g7K+)X!QU$=QtC*cEUS5`5RXD>!An?Que2h{P-wDq8I#RP zWk*8N4UyW62v{m-&!7c|7bKt3ElTn=OY(pAQT=ixFK%o9Q(>j#D2cr9My%y3dq@(8d!5ajCcPvPfk%|@?{J;d6=L*cq%Ivx~ZB(@pB(*6i8 z`;`XN8(#%bN%5Jy@vc_>lRFOk%?ewS<)mlPWdfC%s+75jjY1M8Zn9(tm@&yHU*}5&%!#i=}an4C|(yL#j zA(78{6QiNz)Nu$98F}SAp>KP{wsMuIw65?iyU?@A8=+7#X1?`wlgz52Z zi!cu=PVEr79ONnM!6Yj_=Q})g=>_IOkMFL1vcM76*`#+ou4&L8EEeTKuYjOZOEVj6 z^X#`xG-e?bn~$;=kgiFxJS7Hg%)sve#UrNhfr@X|=+fkRPlQGDkG8aP#)mPqoTckE zT{k}vOkHbt%Oxe|G}f>^)?~fY%2Q;yl=D*$v(^?<8@zoh(~e{f4P06pN4sNQ+$xTi zf42X0W>uXnC(QWxqdsaT&5Rs98)b! zxTv-be})u;DjS%K-L3e?umeex!@C*pLRs}G87sQ*x55*<#TZa4r#q&WAzAQ#%8PW9 z3@s@wJ-_F9M1}7AIWJ%qyJH%6M_0@!Ojm<6E2}HcVh201k$@W1hG_S(sZY?eWyeGx z=73UU4##c~%Za3H8}K5Zv1EANS1PF)XyoUFTU)%2=W&QUxzt&DHC+1 z3t~EaNg+O=?H8E!?;y%CLiobEEf_6q!p;9P49Wx7yK>kSY&c0MB?yB}`H_8zt}K(wVuRWgOry%1($Gt`IC$!x;-1hTu`etXxUB!%l ze~or1q@{sPH5>a&2;WIX%)&j@RC4WRdU_k_iM;_+G(|bs7k?*wSYL#;I{*s@o>+*V zn87ywX+wf1_Xvv$;TRTSw!~!4C6}q@{dDIuNYbu>Wa@PnPCE^|vo>-IJVX*mV0`Y% z*^(NjD$(0!Y8i5aA9HCoc2{&R=}nwJA`hYQKndH6ef~2Nz16B}!ox(wdfArBNAw5x z!EpFb-pUcLF%K1C`86Kb+72rINC5TIK>)9**+)P@J$*@M@p0o?*`MUp4%zOqij)A3 zsmcm$Ndw&Rb4q1|tFlfQ!H411O>oi+hkGfGqbRrA-6CWg$s8IubT)p*Rv`k8qQzL4&be#de(D1GvSoXtWG+Ee5g>c;_; zkF6$wVhm``C_!Rnl4y=Mqpz)mY<9i^qwe#oCWlcsFsN!a5?8`*IrZJa5$U3e z=SI%>)B8_&JLCGFSo*QzUrk?_x3Nc@NDUe4vC*fIkqo=5UBbEY@86)_5aF=Qx#N`y z0nEB>y32#U$VEJJw0>vkVB5S_n9Atgg^>D0iW&o8K?fwhN1qtYhO~ZfS}xi7^29d>_P2 z#Z<5+gDI~W7MAxX^E%ju-IN)CmO!0jY5uj{H<=D?!|ns7ZR=frB7NhDl7P*!nH*NhqfF9tD!hA;gfk z0<@|xQwowWrc@1X%_8h$yI66Az?oJ-O1jOT!1d!K>(dAgr`YqOT?-u2(RJxRel%?C z(aT*lJhbgBj+)yJVlqU zxb8P@URqcsaxHwk#*(>J!cW9!r5g4^Wq1 z@K=bCP&cfx|KZ!^PsPVz7WVrM5~y)lq9f7$c3Z@}zYL7A-=ujE+Lrg&o`85T&~OVe0ugjl1J~K_jSh z&ck40Sq7?(6I-2N)#}mMjc~G9JGCai{taEEFCA&nTv_F&N4uU&?)Mi#Vu8xqhnwgN! za_HSDi3&~5+TW$nwJ}j&9D8K#nHCV*dXa8kh#)Y!07nNoE2+^btIwKq z$-Q%wK&ehpZKr7Uab$T!N@^B9MUh?_MwUJws9=dDyI4$&Ut+e=sc85D2bdME`bqmm=*n5@Y!$Kf29`&Ia_2(UyQ2yv8g6&q;<#UA$?K%q z$BWh4DOdQ^k_D>Lub7KNbhaum(&r&D{y!L{LZYFl+==1MZsUwqXqa&s%nu`KDXEDN zJ^0gxYB%xbT4(e?SDNL13i58w&PDRT-(l4oOa)!!lj|)Sb;OqGR+vHpbNTpLkspFN zmp*d^rH_~_W_`JC_av^Dm96)(1K2S&1UV)6eW3)Ps%wkO(gm-f#UTP|$$z)lC{J)} z_}`r5MpGB#e~@{AX)hAtq6qRLMzlsQ(sP?;D!#G){*wpc!l?+c@gibrwzj|*pM6J1 z5f1(N3tsaV9KD>A#jbf`tC`dxdO;ZDCeelp+wQ?U_h*UdFnPi&p3X?rTp`q-$F%eKp+Ee!qgr{Dd(LhGve{QerVaQTMt2#~V-~-dN(=rsm`9 z_&%?RywE2#o=R^S{+FH+j2Mm^~Q$K^HXxt>-paf1Du9q0$;@LoMD z9>Hre-L!(StXa_zFYKKilr5*_P4G0%QOuVVH*e3vG+>eqq}w1l<8LzHzpaG+vq7A2 z&`ru5r*YSCv9Uq&XZF3Nf2Ni>J*NR;X+@(qxg8F0Y@Kp%-?(4sZ8%d`fD0y_dwstBLYh}*rgaV+pC5nd2V)Ht3Bae&0>R|=XLBL zDF+{5I*p9Yl(47@VF?l(@D~K3fiUPZ+pQzFHfuDKr*&RG$OAV`{C8dL!LfaijH(^5 zg&f6S2KWqug22Ybu2+oto>^ZCH5M`hYV7j){P4&3C&8CX3EvOd8Fn>J9&Z$&OjD*c zS;=NJ2>ccAUis_nGEJ)i06MybfYQiGp9r%6B@jbWEcY!@C_2?))Y46apnxD<+JuS( zTZVxL7DFz`j(>B^K|D($c4??GbNm>|Ev%gE@Hhyx^6jsX z0kh(F7J@2Zib4YfcYg+^EEuvrS%K*gj~p+rf`nZNo{+s916Uf!Xmz^uFgV^BFvNYx za4}7YKkFp&Rra7I^I*Wr^y$Nwv1j5X?r3ucF0+c;R+kPWAqkXrvp{&2)2wmj@H(4? z`TFM(O{`>}!RXzK?Dl1D^PD6@ao2QK=A2Z-I1sMt)ZiihQ()bOq}WIr z^1)Ju$_as9JaSNF)9`7ZOYHzx& zMYKxhA#D~-PZ^NqC9SLUCRKPec!BPWi@-sN>jhb!7Xl_6}a%$&o% zuh{^2G3!WGWW5Hp{NP8**gtzxH|yhQO_`aE_xKn-L@_|)$>s6(qpR(b@3_v=vL^l$ z433K?^eJE?y&B^EK$-QM-sn@q=724k)wVOGx;@3jXTUfEjS9ejG zE^WAvRbJ}5S?Px4qItou>4SY@-0v}8Ke!Z)au_a@{5pr}v5ozY%X#45HD2KEx%-B9 z$|a8LX0DVIFH*`k*|>d+4E?A$p=f#_!ZiW-E2s=MS*F>kvyCXBK7`B%Y${#!EgEs- zv0MszvWCseCy4yZVo&|s0c$ozU51zwaBa!VnU1ERY2~uf2`Bj{7M|bJe zc>;h;k>4XJ@Z77hqFv#TChx2pP})HV!nC>x`nWhA0$4ck^o+2#e=gyrTZTfFgaN#X z+d*$|x#dJ~!M?ub8SXUK5KZeC2tEg$ov%{?F_d6wZ;&3Cq8y8~AAO+`FZilVJ^RFohk!9w-V zY*}}Ti5san5Mh}tn+EeNl)%T3mgaWlF+2Lpq8wXXMm(f6zA~me=G)?yotf9?)T%N( zkIKopE13&sy6L>57TRuHvS-+8&x5XGXHIvB+o8?m?7P41Lpt|u$Ux)cyU*KDhkMD4 zypJZ(GnLCFvBk!)ldz>^$4xNV$`Ya`~d4s^!*=|>e7J9 zS}z1?Ym$FOc*@%Na*r4q`WSIoVSS{*-|7np!pX7q>5-nrlnL!GA6Oc)^20A~X3~(u zJ=DnX)ejIq3*6$})fm4KphF-6L8n^JtgQ)ECVzuUN@1|2++oF@X}FaY~5LEtG_bQxKA<@JSz0O6H&~b0F8LNvPZA7r>msSRe^sw{U`nkc#wESwar1%9!sd z)KQ8*zY={R4)q&|@n6mIL`>RRaIq11E@oX=SGqp9m@H^9nn|iM_c1JUVq|n}UBd!P zp#neFsFc;B3S)ktz*lS^toCX@(dm-08H}L0LoB!?MXjN!L?Kn#7)DP(Q%*&n;z&AB znQ{h1by1#Zl6&ge4L~&oG_eg8@7?FZ57r!U2d|Oq`C(+~;;%}@TD;0uRY@bIT8$s{ zbTo$tLaVSsOR|2A;u4B+@I3he&?Tzveq;kaOi8rTFwJVfo}34qW}%;uGTMn~yR@fw zwHk+^IewJ-LwsxVs)Ly}K ziN0E*S#h)Kaz*?Adm=sE$Xn#5cndFB8mk$HOGEG%oWJU{xT;vi`paB?I<lWqR#!6MNEJf!2kHoOuToq= zNWQYLV=T;oGC--?!vrMiho3OVLUf<)V%RrT*T=i~q@M-eue-UsiXFF6*Da3+$>HH! z288;XV>NSQPyhXm29=KwW$W&G*Q8^?NsWXy>;u>PonDhJVd1|g{D|Db%d z!aF$0eu)KA&=>MXDRW`*#T5FTcRyU+w(gCHp@tbaA#-DSyxi z5qZ6w0RCJWNdwAojrjT`%(oXD9j7|t4v7mig~K!sM}p7;=tg6}sr(MXkd&4J`BC)< zFFtCczVI8O^y4TgB_m|JLD^DbY_k5{PKys$>QU2a7iN4fqZRgPpk$3`f^W&z6wR<( z#9;{y3DtNA=tl|bMq?-mq&-lh3HIcuNJ(*G5#fOobCx@Qm<20lOlu@+;i^URjpJ%D z2p^!(K{5bYuQU*#EdtYiH|DhbvE(9)(Xh-`Oe_Zleb_*MF^i#wQ&Vgv74N~{k-ezM zl>VO@bk@fVOf%H_acuO&=xgx{YW62b>_1g%H301RMRoWj7RVqE)|DpXHY~@|qfmK; zEJVq~2A}Fv9O0#YFct3ogha^uKZ|~Bm9zb|IT2%vvB#O$w<^#Fg2PdoInmyXHfx~| zoz@e)J)8B?@zS^(>&;^OrA@-&wUHj1e!)qK9t3&ATnfkMUQN^lB)1UbR`;E1#o>Z* zvj2v;r(=f6^hIF|lb{7!bM_Kn2@WWdqi5D{1_0p-7yVMuZtNf^YWS?tX{x&paKf{O zwY3^we6Zpf?deTlgMyo&>F8cU1369u7e{)xk527SKS2zsjk~j_o(tRDh|&$vlr^cbte#!&EG4t%%vXP zE|;Lh&ETqu#1Yr;t9%gnN`)|9t68}pR$qw;D3Fn1pZ~#iYDzf($!dlS8{UM^P4W}P z|M}{4<2VjrSLwJ2$JXICjT*L@$US~L)i8Fp%zFB3uk}ckzL|hn;x5<;>6O*k_Q2RA zo>B3PI-g$Ys+g5*BQE@};Uq_Hr#&ZW-}4Ku1Ozu&uQzf$%9`-qsCE@LM&rC^2t~C7 zvh)yV3gStE@>h3~HDx`kCiC9|87jNOy zE|WQBDJ1={RX@Rv8*}l7N4@dKOtS_p1&i`e@Gx1xKUGF?j8mxDog7!Gpg=z)f=&Sx z<-L2WBT4&fV)iW%bYn|mV%I3!brF0!S~S&(mx+ywrF)l%^EXd4?^i#@N9gnvJid0t z$67U+xh0DT02W`Tm@JJar2Kz%W3>BQ6XA_(fjeTGjl z_=Hd{7rf7%8k#lyz7qk+w%%BY)daOgFlU(Z)BbuoA$tgS=P>qEnMat>J5y*!=v_ib zN(^l$5gJcHJ!Q#Du%9n16KWFD`oV{;KebVf;)|F;0`SbtL=qqZS*==s=bV3FGu3zS zrZFM4J0XjGk)?-@cztF*+jHC{&h zAb~~^WES}_F-ijQ#fwyeO8F&K3nafLm$Tj)E+rrm8%|SHqd60B7Uat#%3xQbQ(3(t zq?uf%Bk9tGa(#Qe6htbQQZTz%Zs``DE9c}=+BBvoj;_371vU->Q#=B8Uz?^QIOi#7 zZ>oe|)FEPz2u*uv$%YBY^-lc0#@Tvb>*Y4Uk3T z?MSX^z2i$`=d+i3x|u#R^BQe%5p#~&;!F3u;9q2wtFV^veA9*pa(*0~o$1>ve5#e$ z%$QVef|6!LbCikx`XN5+JkN*8XH-;Fw4*Gm#67@vU0vzc_`H_CJg4}6y}oEL*DE?N zm3RFS4gVgwpvqltzi=WFE&3=&>SC8f@-M>^;nPull1P=uT+;$6*GQMgS$t9Z9N=1u zNpTM`-|0t$FGusHfy9F-!!-6jSI$y_)5ZHv4NCjUS)hNivrc@nHRoI!*pX3!?so>g zX`(XHip5N7%xJK&Pco@)xN!qe$$F>=mc24<|(W$}R6JPG(^WaajQ!8VkC8kAx{(lh3Px%5UjFdNYw6GKE_ zs#Opr%}AzJ75auUm~^e+r96MC(<^m{WbCWd1=BlMimAel0bqeZ`AO5?q8PSSfcb7_ zT;4TzSdQwsq}mi$69;t9h0R~I3tBK|o#CeGX2w#g^1 z&qMN^7~k*J(r3@8#f>8W#A(id45zWIsERwL{AySR_^4tI3>f(*41*G~91$+xjxM?_?fmGZ#5F1Gx7-MZyT^EL&}B7_$F zDM>f|tbj1|0D)0+xof*^CUHh@$x~#K{LzlTJTaZ5(tg%lei>+GNEeZO&-qyIHf<|7 z5ltsot!%kBP1G6l0?bJ>*7h^1J|I-XSDiB35qqTFu@G-2ewwm1rye z^@VS@iZiN)mf7+T(Ui=y6{3?X7#%($8_+p4-iMVVdV4(`SMxQS$-VBN%}IXz+E+Cb z`&TH+&!;3CyI(nRE77b{t&r0_k(#uK!OzEXftK`6-V4)cfb|{$C=k1t2}KF;91ftX z4H5jk+x-5y(FF>1>a;_`;mI8UCK0}dWT=$FEe*lZlH1^eCM<_|2EwX-7_CNW&E!hQ z_WA=zio19+AzeuGmuRjotE8UyXX$uRx#nj<-F~1@%L_d-OM;Q1IcR6?{$Sqs0Y3WH zXe`PtVlO!>;-Oi6P1VZck4%yGM3*N)mpB0X%9;dk`hV)dR!xwrY;x?Wg>1pt>=xkn z1Uo}tTgHm0N6w*DB6S|7o+;)SP%BEp?~NFkjh=~snYF47r~<2mfYYbREWS~J&CTq> zS~?l?I*ROrn1C{#8N~r_o_+&>g|as9Z|^$tORQ}S$OvxBT?M)}rMP4494NGRJX0p_ACVLt{ay&E`>fg5Rd5k`BfWyBO(jwM_H5#BO(x zRIzi8=zr=K_^p-`NUsz2;x~rw+niO}6hX*;vz7q25Wr}weyH?3Fa4Pqj1Jyi3w&@< z&8&h0v|>87hvCYQf4c&a0emqA{zg9!0s=>K7p#Tr&f_m*HLiy)D?c8@eqzIips%VM zWOxmjX*wwQPeUxuTtOw9~6KKM*I#pw2M>`2G!s;zWto%d_ z)U?K9GRo5m_No}HTS>K5jjg6g*Vv?-&167sYq2n6DJF7;5kW(`)?7tiDn{T7Y5I_^zm0&H#b{&JJgE_2rnjIRh+O6jk zYTg^Sr%OY@y@AANMGU{ecL?N68H*(g#J0eVxfX}&z3}I{Wv`8Sx}0!==_URJvDtxp zdS|{V@`Sf0bR=RxD&(UUKT&Ein#fw@LfAapa3tr?JF?e>!1UE{#q zfrOR)2*KbWCK)hqj*#R$g094$Hqv~TPnX{oYTtZMO1S9?r5>DLUjOIg@`i@xp%<&$DF z>zNi0n6{lMU`2qBnjTcfW;A}DBwupu_NRAlJCdg|>-kpm5By712`?U%g zR;ulBuLuq_6+K5i>M1$PxsKz&f9z?t5snNAFPDZrB{&UV{UvfOc|>8gg6)P%LbdQ5 z`c!>C5V413&)utnv96&F{s2O~V6l_U?LX8=avT7iBpFhSyJ?tx#KTVtNpUsTlr7Hg z0Rh^|CaxQVwxhY&nehadegJ&+_eRPZ>$y2UEf5n;g9FV@fspH;cHRrW-5ODQXrR-Q z**-C3FTWQqMa}Gv?~ZPdXTB=Q%~4+IsS%PIrK`5V;3T8sB#ZAc<=iz(g}V zf#v{gQf^?c*d6DHX<<(o=PUV2&)!|qKuLdxd*WXr#&8y1 zJc8#|yB={q+#@#Sh3Qd4?pAawQ6Iv+@LT>!MI_jBhLY!XqGIe%dcd6`*c&14 z^DiH`kRLVavoZsG72G_xD59m;3R0-_PZw@!DPbR>WjxfGd%I6a?Z?{7!Va9(TylQr}9egmZN7q_V4n6V)ra z@yzcOlcFdu*KwN>T`q$h)o3x`u~kt~)LCJ|H>}A7YX;2w%diGZn;9N+{1tN$si0@ap6^W#})EF%`vf}C14kwOnu*}E~wtxP5q(%@pM@= z%>YFKRBh?1-NN=pw+Y_B+1!1IrR+uJ`gUbPO86jYPty1azZ_unKr9GT6Qby^)t$y9)=itJ_bMta4 z^yIU5kiEsFb=xS@-sY5>u^L)2iPPOS3faKUvHSi*r_%rVdUeAk;!KFHLT88#b_9sv{oa=uSER-j6%Tv~soSr$I3H}8r6FL8!a=zBS z)9{WgZEz1j$7oN2$8A2=mcHuN$t9C>Hp)t9RfET^V>kaeG?iy4unBZb@6F(ilAew_ z2I`Y&5|kYh2F`2|5@_xgm^}xy8Dd%GSv^712U!V-f!|i^a9zTusk-F?{T#rUw1rlgGeDXp+d}aUS&ZTZbYLk2%u)2z z#eVBEBA!=l?;(_AyL;A{b0Jk&Rl6z77@vx*hWOH#GY;HsmHpoAH&-cq3)gkBEf|3(Mth8ZoxaWb^z~yultZ>$Rx;k>+=SgQ zd6iG)q|I}Qj<`Nn5z_TEU*Q04ogpQy;C8ReX!QWeE$|N;4FRtb3E$)8dlr4(0Y%OLizs?5n=+uD+6cmZ0IKJ_?;b-TISmp>sEN@u6` zKs5Z!4!~TU5e`&%*~cKU8l1ol!*#YX_)v?;_n_5!+x0)pJvokL*VfNbno zQFFuT-G5>$1#)AIpJOwWFN<%2%yhZTo_uP~XvteG8fgd;3Nvb<*^p7fUk4 z`{fhzz-bAy0H%`DD3<0E1)MHTVPB9#7e=;Yu?u;@Ey5v;nLJn5Sm5EWLV0UP$A_3j zD;M|oV2qI?U!xR>rZSyxufVKOBoCH>BnXxYl-RUjCftOStNy+0*7dY%!lkQSoahdo zcyr@j*2N}2?W=;Ep-u-oRQm)Av|Dq){I0-MfJ^?vCeXxtqPh1qCaSpl;Ga=i?TY}S zZx#E{9-v&^3VV}H`JYn>A}-K6Y_O|a5T-NtOJ=yx`kL)F?slQQ`Qdfil9dWEBm`F> zSUFhwoMF^l4QnF%?CoX=I>nwC+9inAC7k?n^|B_Wd6L4plpoTqn21aiBn$i3Q#NC= zI_V@|M?NJ`N8l2;U<7W`TVH#U`Qg?83WUS_)Gr_bcEoYp&;5ELi)mf6?m;AfI)|Cc zV=4C3eymnqg@8|4SQ(OIte@`pJ=^P*$t)1r1+A~yQK2X0o1Mj~p&Z5^fUyN5em;#4 zCNH^yjvqgY1CO`^)6b%Zjf(#_NfP;&r2_%bX(BGVnPuCG0RaGD@Vlq}pZImZ^g3hf z|1!v#Qqznf;`;L&WmRi}Mlxq2vidbON5p$Id-IGn3 za^*snX5_*ycu10P?V#OV{$9>)D{O30^m4I%v;AYjxTd}kF=evyvE6S%q_lx?AyR`f z-d8M-TWN(oL9=kNBL(i;bgZ+aN0uP5Bz_|7K~J?aZA%8k2S2=AI_X}A+Hf1htGGsf zRt(Kh73FfPNH+)lPT?u5i?fQOHroUxC=*=rQhdfm$J4kVl2=~tLDr<|EhX4w9u@pt zf*ZiQSZL%1$jGahmGBs?qHdyDuK3q5Ah8?#N?y4(N@JGZ6PP#Kg%Z1E39zrclVZtA zz(d8iW*@Jq+>8Fw14pUXaHUkzCXnZBR+*NoT0hGJLXQl^d@iH}4MT!q7? zbL4b`)rA{cI#y8j!vw_Hv_#fvO)yy8K9#&hdaTMu^I-y&VFU3y;>O}e ziK4A+&SbktS?w}flcA?D_YyFz#PIUQea@3pAh>c9-L|UX=_bhcf@zsP1IPx&)J?l= zVAU^lcj&BOU`7CE9r;p8vI3FV0u8_u(R79NM$Xa@%L2fYBx=SOx{WBO|YQ+YF@(fvSJ;S^D ziUyP~LNH@^*qHhF_&sn?SfH^Brv_CVkEsih>IG-C^Y9P{fb}`X(SZE54%=o4yO=GY zmtmrY)J>1zE(XN5H_GL&6Y4~-%+pwK*!V5QAM|sRue18w6!fo|a>)3(!IY#+&;bX!92sWx6{8c2CCV;SY>f zXb=VaYyA;#APJSL+C)8%Lw5E@LPVw?2fyUKacMoE*$i<4aMoTty_E}u&K?qyG@>aO zTzt|ab9k<$c8<7KuxR8~zrw3{jv;AKa#4-|Fa#2D&JM8-YTW#upW$cNk-ecT65ypt z(8e&`XjmNXA38I=@R@|#$UcV?F)Bgf^H?>m(ooxi`*X}HzY7#3I3k5g9P2xyFDgQ2 zCs{E9`=ditg>W1}aGRXj$#_j`F+JVht`}mr51NXWmO5N99K6M9aFL4&3+;95V_RF> znD0)1fmH|C;G=Aw)-;qllm_%-eIrDQIU70=s~_3WL?^4R<3QZ2;OW)-0@Jov%5weo%*AX{H4>T@53I5O0(5mJ9{eloaEOaWiT5kTm0x4j)Jc-1+HRN|qTB1I5p zVLw5=5=afRlm$iURrUaLJJf6dCqFBR*1)q2Oggi5siGK`tieEV9)iw+4-AMVB-vs# z_*OHB$Hx1q1h~XR^ngxf!uxTmui(4EVm2 z$RaXu!52IHXn`Rqa>MZI@1Ttg5WYmtg%bjOE41u)Y+ANG2GMI{GQpZvN=w z@qC<4=1wO@-SHG54>R&Z8`Ssu1R;2M6L>ka3jKNqKx80>suKEUm#Vb^p<*-Sd)k2x zO1~hrD!yu!m5uD_VM)#77vEkH*@Yj$;JLh}?fm^7s~)1J$kP_0X^4|q3)mp{RKUnQ zDl{M>41SI8963qI_*bT_=~`gtoqf=R{M?h(J2y@EJSKi3!9NX)EjcGU^GyOv8eUyg znhu9kXm@X=(IjWXnE2n3DBZ^ zxa!_SrOq+Qy6@b(JQzW&ylPl@`7uKAy%4HoblZA)`FLSi*mNHA`J#T97T1L8I1W>= zGMLn*JK3eiz5z>g1-UZX(EDbw-&4FOih=~0!22I(i7F}j8@!(Bf;!{>G>9s>PKpBN zT`ed5eMBiw&!kise+{c)X z1mUu#CezB;c5fYviqSoPIyPY@a7a#a-q$XX6CN!*>Mx%@wGe0!o$5h{NXQ=#5C2cT zz%iC2u=_86dga$)`k&mT*5;0e|E<$dv5x$W=K6J)=3O^6ZB1cvS#r@a*KP_-2v8K! zJPyoZieL^=)}s)=xk$DB=twjxa;*jRdYgR-go{1gPZrEY?cftq*gkJ8*M=@x4JTI0 ztJg0#LX9Kdz2hedSPxX;CI(>1sh!Hu;WqCW!17VN#VN{>X(D5h!`A38LnGUiR))4f zT}a+;-Ihn!>zObS)-IdbVf_0N%fP6Q>7D8x@+8Nhjcz7~5l5Po=kKe+|2!wj-5O8S zY_q@Ut0{-gPjh`fJXq4Bl<4vU65^r&-6bU!ocU8`CzP95xf#fSYG|$my}^C9*DB^u zQgwzDwFPf0ojNU_PW!H2Fh{>V?&VEEFV7g*7dcj{Y|t6lm&Jf|Fuclp z7LPc)B%e1s;P-BO!ZX*xrdk^YLtYl`ChzyQ{0~=MNn8Jd`E^W*Ssx8=o&R zM!(q%pCA)*uU?%$nid{Nt{=T1+8Cwg2{WC8o(Q1S_-cBU>I7i{yBkaXebF46`sM99 zz#h50dZ;|I&_Ovl%qIy%{;Ao_8hOi9P~Tpoz)0eaKn6W$1xSZ#--P`KV?ulX*@@iQ zrR|AB%7XG;D(x6hiMps+{9F*N#C@ygWxR+yG7OXS+CHib&;1WgS!Cy{v_@6vM!5FT zSh@JTadr(Pfw}^BwbfdG0AQb0-84a7Eit>S>jbyk%F^G3+y7gnuIDrXlm1 zJH2r{05%~h&vpRHh+G(+{;@NLeZf#axR_jh+WrSV3OEFVVnrpuDy^b8nXn!^=&PFV zv+z2z+QEJ2i)KJxf!i(%RH8k~toCxF;)@pOi<{C)sjD?m(cNwy4@auLUSEIFlU_=6 zIu_|VE}mtpzK>4pi&pB&FhlpE{E13ZaNM#S!L`G!X6d@s2TxBZ)@pG7olI^&#f@%n zQWPXiY+!6^Ml!e~U1YbdOts6P=G2;2iB4)a4W`@acvzQkyD;ougQ4ko?&tRy3LyMY zxHBLkfcSPcAfLocXMU-Ymva-{I(BxN|Ba3c_&DgT`6t2mISetH^D zB>$xdzLr@3C5L8_nQ50?KCy$m-H)ddoBBC&1o_80$`!jJ>(x^3$6BJq20cTrR35nQ z-34xHJBvrvsX*W8TPuB-d+Q-caWWFRvG*5Yi!PnrZ%6^!xljelNWLbZ5c44Zw2B!UK+gJJxn_5zt;Kk#)Ly{q~$eDvT;Wp zWDJ#?NYh472};`;#*}z!0hi>8q5knW@i(;lEXcLEg=thUZ0I6!7hs?#2@TMh+J2U! z4@PLmd8^gdH$MN(vH~Jil@S)b@m7N(KZ1nY;%t9my9w6ti%l?C@o9A0r+ILY6B7!G z2P~>B@2fFU_kaKUwl@ZBrQdf7>(_nupMbQ#khlLI%M#8?eGwb<2s~oC4CH8@7c3is zc_0d_JdKZXr+F<1QP$Bo&c~W^s+&oiQ#;{d?6kayQTw8L` zFDfx|K{%p@J={uhzH5&qpc*Nhr@cj@o1cg4kz;YI*hD#o)haAbc9qh#?+>w>_cI%o zW&)k)i^*r(NogeYFN)^$I8RA=YH-|uy*J_Xg)gG2mC3IP1Rq;VstOKD3gx|nRef3y*%}FTrTf2Vz zsLiJ9sob)wBqjbV1I9RWPlmDL+M$0r0*Y3c-hv0Ek|rFpkz|p5BnE&HXawzdX03Jy zJ<%;tA1YF_MuX!t`RL#)aOY(%K!Xe^By&SBt0Z8a zX>84}&XI9SX>Z;UvHpX2_37xq^^j5ob<*btlQlcRZFm_ff{{SvMaFyZ;?o2YoIlQQ zZELeRx!B->R-17Nr9%9nASdRMD{Wv0e>>@**B0h#Fo_vbR6r+7b9s-ffOF2fzt(6*ozqZLpWTmRR z61|Z@Yd`{~1pmm7fidaNpI}!pHtG~8J3z}~8SgnP#@4iQBNVOVWYhI!K?mpQ{^f)+ zVe_}74L{4{sDiCt&Bo~ZR)$I^8hQ?Gs8X>oS&ggq4H2FV6DW*cPDoNZk*RUO+UZ{l ziPk{HPX{$6Z17`I*9qX6@y{zs74%!Sq62UUR^w@BjDb|o+a>V04-e1Z9I?84|5WL$ z-bNLnQ3l2;ST#E}jG}5c0cSy87&o0Zv<1GobV2=p7<=a!U!recux;D6ZQD3~PTRK4 zZ`-zQ_i5X9pSEq=(|6uvCU^3Cd3Pt3N~Mzh$Ews?d$0Wg{c+DPn-*p7b-n_ePLFMm za>i}LvKA=s2wbASeTO-jrrV-S7S@R2^;$vO*H zvNU;6vw>hH+1M?>m=L`}xbn?`3FPbnbW8^;2!cSbW@Ow8h-Tb|0x?HncQ*hK*=;0U z=FJz7I@^O$Ms15I+R*`y_jLmB&^k_w=PubNRINnhu{=0d%NR=~7}0V&BRVOgCX7qy zqj|1G5W_TbrZ)sJR8am^m2e~y7R(@$`pEc`(W`Pm6?XYiRj4{2QwMAOU%#m6dIgrL zAP%u4w&2dIoo#p{C|g|Ly6bWWX24%^S6ze7i~EF(Dy(LfRwi%%wk&xNR04Z+e{N)z zR+2a1_(Eg!!K#ZS(_h;0pjQykr%Id?#Ol2^7AkhzH9VJ+LozME;O!f>`)FF9Ve?I$ z?e_Ge>_iHQ0_!#xsV_XDPLhV@X^Uw~h1kR{5S;qyYuM5OW8 zWD!J-WY6*?$o{OE9<3a(qG*%TyjTBS zkhkcj1uYdnzfY1s?0;rT-6}JCaNN+ja|Z)0Ipk@R+&L+lld_o@iobKI?>E;Txxoxx zb8`qbaA4qQ)w{c+WgVKE=L`)HS_gCF0hXwi^i$2E51>%WwXTU<(H_T~@H z#VuDR@CjavVcrO;b!U%aw)i)AkJmj0a&=9!+)GL0S+De;E*qwH2ogS{qGeo1J&8?zv}(x&-I`1eojvRr!*oTvkBAB1Q&e$j%LuM(RZmC zgz=yxFp@{$|sZzu1A2KVPxK)hT7whBeCjwF;=o)vCmLpJg>?iGcQ_n;bjQ1?}ECy*727w_p zU(IRT9#X-qzb2&%>EOP2qU~ilsrq%!YoU)2Tw+GAtRIs4DHZgy!#4@M^^En(KYl? zNw5%ySXP(IUf6-XLvKmps_L_Ic|PlsHPkPzWy$DfcSq|i2g?lzH5I~JOQTwg!F4Ka z`PJ-?qfuw=KToPjI7l5PNi5K#+ey{vUb!6k-SX14)`|sHsAudsL4_%gE^;w$njXhzocM*VfyI1ruH87=ZB*fVi2j_CH<(hHnViNJnUs=%)@ zHG;}pn_P-{esAY@AAiG_x=C;1C$G}-`+Bh5j+*Uhgk3qiC?}dZd_E8{S-Lwi`w~-_ ziyU;KPT<1Gk3RY-&{6zt)5up>11T)h{!H#X$lHg=Pf){=;?i^C#A+c?Es$4Npl;OG zrowILsg>G%j5Q??El#icu|a(>n0h~4xBT(X@o-Xku|3a6>3Jrj2?kJrRz>d30Bg> zDbs;P3-x+Z5R$BgYS_^~&4j~8ycf!Fp#+p<3OV~-s2j-|EByv%3blk$j60Sd%cl3J z6^kKm!}XB;g`tipXRudZIaIJ{zF%Eo&{02Wi=B;(KOp}YGg$(Oo(@$t~U~t-T(qi{3@;9eIv`fJfL%`xz>b*`)Zb2lBnF|~j zH}HGwk0S{1uc@=fez?wDiC-723@C#|s@>+B4sd#SpT4zDzuyy=%&a&bI(g#9L1*b@`2el%S|e(t zA`_g8FkF{2k-*6}8Tb7ekM_wtdROaooVGk~ufXm0bXwYZ%ZXgbIDf^zvT%zl_i@UC z_QrTHoT->O?bteL)>XU)f%0N%q>HpO3C(CS-dQP7yuUMOhLt*W>}c&U(Zfxy;a-jdZi2p-gH8j%`k^G+;j>7!+LbY`rPI>n;FUZgK z>_0Up{@2|9GslqZSV37(X1tK&BbAR{V)}p6B+gW8`CPxvpOI?9!5C5#1PchB@p-7i z0%wP25@U_$$;=e(nfPSng1WgA)f;WZ*3D?(6j*;0R-BTS!;?b4Mv2bJ?$l zRFK0bSDokC+}njaWJQ+N3@r3)`f)fh375{)4g1z`_J8f@-J;#>ai~ccbZFSeRx1!QIoXNZ>8QMR5JQLixbT6F2ypU64nK6`n-=fcWpRR0VTl zqWRfADE)l8|NVFRAJVLL)|5pkaMr z>q5Q_rYd;p4aWVsN4#M8^?k&!N|PDp%uJ{7aC@vt z7mZ3`Q4}+f!;1F*6_Ju3&%(ulRryf|D7SPM?sW=uD$&{kr+)I7B+HM;8d2vx=8{U7 zbjYGAmZ^T#&ArHVz%$JG#f*K#W@JEOEYU<_7Op0_T4!Kml3JS``(H78s{M1)?X zf@GS%xR@Gf-<_65BYr;2gzoyaYroC!stt8dLB~%7t`$*;#2tu8;s&XA7jLc*hu9qs zfV*>X0oY5#5WS%Wp!Kl=fd?D|p@1<0nFpVc=b3LwcLzW(UVXI-^~5O zBRTH6B^psb_07JJdj$d%U5|2OjlYJbKdczY_)xy#G zF2&8o(5h2vxDpcQV5r;ezemlp z^Y)&KMPe#Ze{cRjk4wcOKX1`n=+Rj;Dcv`|f72LODJVG?{gy-PK;tVJK{dfqXUlDr z54-u05(*X^Za72+CSNw>)c%X0Z z@E%ACr0E8W HADnYx^QR9HXNnqIULEq9*D-vTCWyR9>GAJ6_G$)c9wJJqpfzzV0fz z5q^vi`gu4WAN6dt-kMH8e7Nbk`eOSwzk1ql6I6~dwB2aEJ@#rL6l^Bh9{RZcz8u!R zcRRi+98t98Z}su}x~=BDf41As%zfYAa7#-5`eO3n=g!rZ8$YcS{D>4X0mVd6Or>~q zHektm0C!@>mVZmh&1)}b1$@Ul5h2L5R|ONfy7mUpVm%^uvdil*SLzest065$oGy&h34f6nO*Bf>F<3~b z0aavv_!h;ST!spuX$7-al_=uI*qd`ZtW1^k89FAzUu2X5N6S<6Uy zxV#?2e8jfRhm;2OI zp-HH7wgoO#{rhd^zlICqD)cupjgd|U#e~y>M&chb;~zTJ;4v%v>R}pPTTPVgu#DpH z)P!(c5{k^IwWmJZH6v-=<`9K}%C$%)pR+D@v>MI!cm#`YjjMGEemKlaONDHhgXAm2(XH0EfdM~K!R0y(c^EnN~XFElEhd$n|qTqrWU*K3}FC_ zI^*zxlgx@Kh1t%)S+|W{BvUs@Hn{5i&=8Y;eG|HDDw*F15aMBx^V&omi^UaA8|K-+ z#_nzbi%eEKQT~KdDi9RgY8Q&mVr7Je>YA0XN@@EVAn)LPTX$FE(_{ElgoRF+Yb+D_ zY4bP3U$p;{xJhlFU30Vu&*9O{`jgKmmnCL+VBoOkcEUqYAl2szx4X zErrh=;-O_nQfD=Vv4S9ar-Gze%CNV4?a3cwi^oG~vr}-ip!Y=tG$3Caa+X@-HB5TB zLaP!#uonm%;buS`uXv=gA5F6%;t1Hkvx5nA`{S2{EGUAS;S;2r9&`22@g*Aj+Qs8^ zaSIlRk6CO_;-=yz?xO8)>~6e+G{K9egG)IyQNoy(WQd*h1;Nj=3V07mBN9rXE>(qj z*YdiAN#*$srI(OEk2HAZ1E1OqARi_EzB_<mGXpN|DkSEXQ&REFlApAsi*>DXULlg2zlDt#*vtNVTO`4 zZ1V(kwF|$M9(P)kWz>$F^5A~Z!M_NLe$7(2B&rs`wLepg&65X8ynX*(E^$#Yj&p)H zI?GF>)W((&Pa7*f263rkAPKUG<(KC**S|?Kp=J)=@AS?~I4pQx>ouAM<*>*$RwLg0 zcZ~HUA4vSilR3-oTKk;2RbKBJS47vwf6BzdzS^EE*l zH8@m5U=ldWiFR|}fTQ`xs<|>fcp|Pxz5_y0HRIfVVLK)JFeAnAF2(V*OFktGW?Wkd zI+W4kpnIS>Jf%5oy*Y)JN+V#at(wzXrj)yy4nE0Cv9lnB09!!%-DLmLMx$Pt3v_EC zn>*C80`-f}e#t9Atf@F&aw`$9&pG_@B1wG1F)b0lO->N@?O)7>kS_4=5S}0ZFV%8b zqgCRXUe#HGx&f~&;~^-r)0j)VP)v;{oGdy9$LJQF5%+`aAP*ergh}Y;+#80I?N=Oj!V}0Ol$P1bs1kO}~!4 zNkk-1Anzw0Zgc zya9bCt`xY@YVob-TS65GLW_+>M*#=DC$(0OPTYNm<2fB#0dgz2eM|mc)HSqfAbT*a zc_G}Xav492+x{j|p{v%@l+OJ7d%i@Y?M1@Tv{fUlcgyVhc- z^&k#RV#cQ~)6;Oi@ZP93(=zO!JhYjScY`O(R6!EI* zP16;j=)(j6`X5)90iNUg-(RPL>ag^stPeDVT2u?o-52R&s|I|v&!Zq?j_W3; z1i5KT;{unx#v|qZ)n>V8#LkO6vCkg(O=59F?~WBU8nEK6pA;_v>UPjfpmW3Z|In5C z);5WHNdbG^8;IAE@8N!(BTO-DR_v1rhK5$flXa;T#F$MRK0Nf=V0brHDaisvw0apH z*|nf&=Xgu^y^L$n37c3<(voscDbf$3w%7{b!#m~(((~DYDZObtC!3+(jwE8wAZ4PZ zo*5<$`77aWqw^qKXG(cU6P3S9M_@NZNVBHC5eyJ z%_$ZhL1RU=dwbQ2b$t}}SngMGPxM>5h!!!BMaiiK1fwCelq%?T&XT?H^qTGs^+%)9b*7e7#dKUa3n?EdI=zl>@FWg?R%QK}%4)>C@ZL8Ag%^eYAlofzj=v zX1$oSQ~Xhy_8VsS38tVYthWam?hqHV5wL3W-Z>L(p^X@N*edy6XvXf6)~~Nt3ZW18 zC}j)=er^;WOX?C-)apL#JNh(BBK9XPV#vZ+_~<;1txdwBEIzBrLH35$(+ChlBaWcR z{9NhM_39MD<7%r`C)ugP<(1~r`)G^C%^e_VD=L}^Z zn@iDUv?H49qf6l3*W;ouGF*A>WH_NfuMX?z!QMo%{G`39uTZB@+D>K2p)>YiV`;ND zg{g|KFrVzW*LtV3_-2K#y&~u@hk;nh!;YWdLc;*H1cu%4oxsUcc3gV6V>=o`V@@x4 zAEY}Jmy!+dG=?CJms$IK0X2dd^;n}eLWVKT&V&STJyipp7*WBI&i<^FNEKf){K_`4 z^EPOzKphG$hMsOOh3riydP&LIsQ1aJgEs18qv2Y@!(m_BOP}94)&>P&%GTa;-{z1y z9c0&Vf+gUHg&$A|V1(tJrOBxZrd5aG0*T`aCsxud?3VnFK6O40B5c`|(#C%s0-6^1 zAcF7Fjtj#PMl%zV5f&Um8^6DLgaKU5}e9;J_Tc6-uadztb? zd`mpsJOu}EyeSf64}+}E&6wmY!wIlE>q>QhX;^FXKZe5?orNRgJxkf`DK_ldpU79> zHB`vBB0>X}eOK77!vI{yW4ref~iKP#0fnoDU83^i+< z93Te2k%vpu+=0~u$JCTch8u0g2X>cSR?e$5HH*@OllhmB2V;Kur_4VGrx?}B`429$ zh*a2_u2jMer;mDb0KbbjV&BbX?T%@zwUG&AEg^~)J`f=>8F!1zaTKywYZuj;mSO@9 zh-vgg=-;}HX&G$uky)sRu=Enagn6*P;QE3^b?#iO>v|#CN7ei_os{}I2Y`XN zid0_dxu`)P&RRBb>nS$Y;W~`@yU1-_%gCr@B)EIsuZRkRn4u0kV(a5cp*VdkP7PL& zcT_EIpvdz3Q-|q+NzY4S(mZ-dvm>J<=7~xbtF_Thi~F7bqUNqs_ow~A>4Qm1;57jl zY#oHiNmvfhhqoQklrmJQ2T0WA?9fDDasNeWgkw~PS$0)4m~<-Zg7K*~@kHE*nT5ep zS@ldv23e?3G;6Jw<{vzzn$$t_{FORK5?HKyB?hD2gP`jF=-%U?t=SV5Fn$z}kBP8K z-Jnq7IH@sKB<`qXVnbk;f9`nRM<6}NY6c0Iqvy-ct^T0xJuspLWMT)f#WE>r3HeT) zgVf1-*;o8=uTTIt>eXJ^`qOIfxoB-x8nNdn4T8|FWSiB;UQ&;#F6}dj=mh2!MXcDe z{1>XaTB99}v$nf0_3Of>l{krTY;`oL;k}}{D<9DsdEE6tVuv_DB-{D16%L7KQPp5M z9n?BVzXT1_)BJWeqzXOvbYo2j&r~@j5VcwbNs)8l@TO@D9N=Ibw2){Gdi_qX`3biH zXew?TZGu-nhHs{kd5c^j!~nUt^ogh3_wS3o=o&Lc>BeZua(chZ;9?Rq8vs9aCY2-i z+WWIzFK13A*KFv5&Hzt3?Y=Eqo$zrMfd{HEbliNpIQ?F|0E%aOUXcRnRK&310?c?^|n<;q4~ zPvy1+9vEs5YV^W=pc@%%slnW2ObYbR>kj7)I&(90i_ug3Aq z-@6gS>r`Bp-UH??^(A}649dhJ&j{?J7X!*qZ6#j_Ql9dauX%MRZXJh6YGBkdFLQdV z>KmtsQj`(oVSau;98$HM)*BwFs5)Aw-P(MoMkJmSjF$g0;c3KGrpw_{fh5iwXt1AbOT~b&P1|$9V8v8zUvHmJlv-BYrkm5dB z!Be*^MLZ2@FzJU3cdP4akkzSKXE6Mez(gG%Ih`UjY&UMuca7b=kf@`?tN^os1ty$# zhp@S(wQx|72Q~wr8%?ei(KWGEr|Gx<1)GdN6oI3Vg-uxA+B_+g4uClET??BS3b|}0 zl&DwP)tyS{viQVU2W;h<5hN1bMbX+n*paS_rIabySOqJHW#uapsOw+ji@J6hdNVqK zeSQv}lIZpz8$ifxwjU7$?VctJf0(G)Iy`39n619I%JoGg&`z8@NFe@4C{gP-cK*QZ z4$8&x+RC)Dr0)m(FX*_#VaXBO_VCM9D<*k+J~ev}7eO@cGK#JUB#A zTLCR_?KOU!{&Tdezp=$2NrFL|lVFn}63SH~6R+$U4wvZi)0~WTIo0aI!`;ex&omwSzjykbuE>(gH;nm_GyP~WjhxTN6E{9*0=me5MeJcoujAh1^${x3oQfl z(>ztDbYS8Ey!!m9?9Rj-fz;LlonMpE@TxV^UrzuCp=Kr8gp*7GPH17u3N{XGz-=m6 zPw8X$VJN_p5mmjyO1TJRDQae?O7f)0mgyacn{0-&qr>3!l-$s6WO#nVXXE-8 zq(80DC?vfDmhls%CP#Ex!PR@5?O$SH^jUy`kNhkYwPsdCVHC?KIKf$MaP9ooERhZt zD6)<#CaGDl!+0hi4?Nrqgo;)ZC*^TNXVcxNO2p5kNVWiD)02$j1ow#-&=F#0Hc^0{ z(AB~y@)(uTDLPf^HDG|qjZ6S)p%Is61hBiWRP;N&PnU2VA9x$B8g{`TZYz`|yY7&t zQM>O1mKR!Ot^Q*JZHEXHdpQF!=lDUKfL`3x)EkQf?}ko5-xBR#+(S8RTyf~xFv4Ss z{YKqUaMsj-9Pncnl1p-VJb}^S(Fl?o`C*LM9R1pjyzjk9F)+&`7B39$Sr}G&QX?N! zIKf<=DAz`85;b`jhT{^Ejn7&UVIOe9{C<_*+FBxVk0z5u$}W{VBjH@|1Ys5y15iyM zB!2IbCw-BITA>q1 z7eV*8lM0Z}$nifY)zSv;f24lMpi=G4u7lGur|CzDQL10?>W3fX)pftNQbo1B)sG)5 zL z^@x2*AH)}dh>ap`n8T1=6&5&FqMCcFB*u5+%*ab?>ZvB;YzRI`$w?l{L>{-CRQn+P zlvUGHzduCbD&$EVt+PvQAYMtuqx%IWPdxIy!p4i;JMT|_aS_LEqH&had3=shb=HVo zJi=LnVJ{h|Ea6@#xrh&B9T631T_p|2ZLD~Kq@z(v@ zCaF+h6pnD#Qnfj908(1tsGw6$2o;B4bQ{4gloEpPNvD@(>L(dv!UtNT5~a+j%`Pj- zm%{+Ikk;F*#YXb$5d~n=Le22+#%&W$t3ug9Vp@%q=6;dl+V=gQYGrX&!dppe&=M;T z6dZ!Ong(e~kEH5+%6Ur%0=ZK82#em(v^v2Ud?vx|jOM@Eez1R*g1@4?U4&0l@)n@d zNs6$7?u=ps`Ch|bpd<$+-B0Oh~|&a^vJu%wF#BySG@ z87v=qZvSe({%NoT2A1cl#JsXxK=FZb$mPD6D44iZc}L2QjaD`pJMz4!R4ko5aE?T1 zC1h5}uT|Dt=*i9^2QdsHUN-eb28HFcY0D!Rn|=pg>dB`n@)X4ZO_txXP~)eApl}M5 zFYy0V8oZNJhB07#Ub6O;Hd)tYOMQW1(30}IBNvmp6-;4w(^Zr?=v$QKN8&OMMtWlk zRJMkiOG>>>Ft51C*EQA=ACtPL2H4pe)x~!y-M3%BSZ|VM?XbjTG@A_ZVPi3%<{KyYv~TPlz>DXd zqQAdWr({S7(_#hh#WAT~@$l}k+V2{p-|o=@Sp{$zm1L}fDzk-WeP=|IMeCX-@^i{9 zaME-%H)SUra<6h6=!*xtA{LHwax5HAH70OOe^Nr8a2l+{Xim98Qo=Hs!U#uX6s#x3 zGFO21Oa(!w*ki+aoLH(6jxmZ6i4E~oNmCTW%*cHkB?8(~Z8mWi_P9G@cj0OvtfSqT z|9;nL|K#6p$Xb2=ogD(7CnM|A)C9*wqT*x`k64Bz$epJAWth8DVMZ$fnHPZcOc8o< zMhX+f_txb$%owCf?Cowyr}-mr3+cP=E~j&`hRk*dMQn)E9Od-lJR{cUo+JGER;j*2 z4-ul6hUyRFfrhq$zi!~D4eh~E)&G-DP>KV(oD_ zH@e(i^~J>LC9YScSDsGP)Q2ao_J(1CtC6E{Ionmw1zd*7Ph8KgBTmD&C5p*!tut0| znrNU*PwfKie&n9H$QFZMi*E5p$S17cKZV;pbIdo4ky#5px_ja~VhHi=K-2CBT?4QQ zy9!Z`jH%r&913c+*uT3?Ss@*vd_t$x8X+<`!z9tx3hOZGNBk?n8wUxw8@l#9qf+y_ z8U>>k4cKa%Zf34Q8I$)BMMm+oUhhR}V^yWT5XL*bHuORh#m8r4Ks9O$J2t$lP9X&#eqdizUC=ja5hzLOxnjf)f4 z)JzZm$$LoKS3B;%LzEsk0R`WDNT-XJ5hoq77Jn6v@24M6sUiq+IjQgya?NQpSvf8T z`|kfj_APkbt95v@tr*MQ`{N3eB@Qk1PY*cwf&<6oUko4V;G*F@bq$Hbiu2+~YR4gD zdG`Pg>x9Zc2IN%{BCq__d)<#EazHGGJt%gezQPUfm!`rs1b3H~>KU!)=;U?)nwisP zJx)6xdk;T;B~N{(8d{2Ayi*C-6)aDPqp|3F0>lPRGwFO$#;~2XuG0&m&%c3npURS7 z@nElzFmGg!Gj_Ot-%76;^A;|nwBN+|b=c-9Q)~BcPDCr;D!dSkAt-L`hU3g%P&g~S zO(+#Mh|B9f&^s5G^taC6LFJOYyjUQ6*CE*$jhQSA!X>SNlKW$g>WgmvwG^S4h|G&UG}BiOv}sA>Gfo7(EH*AHA9 z!O55GEjdHZ#XGA5L>vFQ}G(=VL-X=|kU1=&!H!H-n6?-JI69mPhdHj|I->8!h?ciVC|2gR;cuM{U4T}W64Rqlj3@y(qldD!)3N zQHpnz&3%H=BcWgxq$J34EWn)w9SV2?i`1p6-qivJ$r-=Y1C!#^q%UNZj~xAniKHZV4JG;#Vrk;=TartEOJQ+keT zsqzr7fYw*f4gI+XZy&f)Okh(Ab+ACek|M&(4AH@tASGblwn7n(cr5fZL%9$154zRg zNfy7Gu5bB$%d)cZ3=@V(2)B=~`BQvHF(}j)M+BRuLUX_Nhaj!SFFxN9Z5A|NzkEu@ zo9gA4RAEZSo;BI$VRRNc)oR6Zv^17|*9J2b4(Ck^rgaxc1t0c?B7-rQ77;(V(r)eq z^*Tp)wnf-8p9!Pr#Z}Dw#(nu-AI9MS6eRV0INsT<%4Vo>s*VrCBbHDqz62W!sC?Aw zjtTf=w8)UEZK>ICr*dc<>2=Q_`n?|3E|w}v6t^?#2&nc!rDICF+S=@|BCSut*L}5MhyT zk}ePVQP%oDNhINt-MKKxEVQX66JELKT)3^a)q{j8h#Rz5p?J9FH_vCJK=2x!Cabim z+g1$lH_@(MyT6HLKHXsdo5`lVf=hhrC|TjtQn7Vfe^Rt0F86wwq}?2EI^x!3yWwCL zes{09aw~9@MB&pwcR)6Jjn!EDWJnFZb~U*CviOe6 zhR!e-PrfF!(p<0RZla%LmGFs>Qim|qUWW{CzOoR2E2Cc5BbD?sa0a2A)rFwO;QW# zwZG{Jk?05g(F|z=qSG&KCnjLm;thf`yr^^*`c7ZF4e7v9&sRMjQkso^RzK@nGX>b3!b@wT`N=G4f&eEwT_-)!$DeVZ5cbDGm+3c?pmsvf~tWs zCyReu^aV{pK{o5-tox3{cV%g%4jpFa-0s(n$G4KfyBSjx1RW68-!X>g4ti$JtIxmS z-5l>a!hfG*^}7V4pAqZq@aF4Al|$j6;6$9a-2H4_#A`o>P6m#@v{H2d9iIB}S%DI( zruOz&jkung9+ILuR^VQw7i`64{e=i=pTUIw*{=?(e*PM*msq4A7U$e2W;%Gh$xfTo z@_k243w=2H8}WX&cO>nd^%^o$Tl*X4J(+Xwl8oxk&-!WwtA0}w1;8R`V_<|2ilIG% z&-6FOWdy!d?G}OoXHDp1qqr6(#0xD9MH0HDq%f1+2J}1i&|$WD4~WrnO9h>{}tnsZ;t zk}${?HjdUB#>RI~^(NPenh0-ssjF5;WDrYc>*T)h)3dZ=x&dlDu-a4Aha$S$6&N1C zRk6l_L8eB|R^c5Pg4OWE?T%}b3-$_pfj;gkDkTeJ!p7^{{mXil2pen+ZFy!a4xXd0 z3r`+1jLf$%V@Bb? zR48xwBAkcioClp@=Q&BQ>x=|fQ&E2KS14T}j}oI-^9LvO_tty8!~=6g0mdzHaU_(J zMDcF0GLPp?I@D~=wu_;jbL>MlDf)xWyd{;{W&!NkjNQvdGFcT6ij6&U7q02}CmgI+H>GR=q0|SppvjT|;gQzk5 zD}dvypMZ3uQsTIbV0${jj&Rdl3y=#Zkl#%@T76)0Hkbd9rOAfC-7Gcm=I0E#mm=|xrQOY?Ks=as)Eh?*I zM1Tf}t9asbEY=9y4~Tzt{@=x z;#|wX+EUj6Jw_wZQxv@o&^$dtxJyhA09c`m&dv4_Db8Wi?Oh&X4x@kR`cp>xn`BQi zze=HbUbq+cY{8bHY=N$BBRLHZ2VSFRMJ0Vn&)BIb%U7edmC+|$@Is!o3O0dx}_on4|Tef^{y}9I@Iit7N8=GJU{+*JU-YC%8`Tq^3Lg!!M2nn(W zB?dVk8$!};g@gesJ$2DHI^BVOh4J=&@f!4kW{$2zX-6vuveU)(p6XgSsv@0bc>`5x z)1bS}vypg3|4Rer=Y0i#V%noMHl!GL&PL^-i-Al=^*r@DRFFlF^j`i*>}g=pWL=3lKkY%DV6UMu-UdV znB%l+VJ1F6>k35agUmCAfnvFlm+4JQQ@ht9usXO7nS#L?nvWMM{cKBIy3(M#84$Dr zOmyT?aB+!oXBMQYW2R9Yo|l6TmG%$u zpn6MfGY&gD@US`bj+31ws~xBrNn35BMD-UsVfE8SI{6N_Svrzb3t*SU5vh9}I&H08 zX}z_ycxjRvlr!%Ywyl{tcVK{fCt^jNE^IH+eihKhmuGftQ@dVZbIQp7 zox$wxx{=mVaDwitu^_zr$-`{@8V&nut!+m5`l+Kp$F5Z)waWi}Tg@?(@)m3Z~U zvMe9U)wnV~;qy8gj8Xo+m+-b?S{ENw$A>B`(Q`Ls)a?~*;OI=88255CdG*RnC}3laWQ7jM}HIj8CmxOsnj z2g($=uYD@ViZ>Z*h_DR@-@qTtvQ6q3*Uv)rlTWqwoj`>f+}RpOLCRPq0$#)v{&Qry z3&O*VyFX}+E}gRn1g3HH{yKsvD+#k7WkjE{1eUUUug;z$Nq+9teg$?;x)r0kVNWGOHVC z`olI|ZQr=M{qwj^DnRv@4)laWPssTkxsI>>vWW|WpOK;Cq%5!qSLddPqi?L+Q={e6 zUlB%Tx*zkCz=+R{YC*4&Bvo`+LeJgyJ$b^NTIWE}c_m@`AS zdouv=K(OJR95z8LlV$iKzb{+jFoa2AhDoAjg3PnRIp6g7*%8Wsf8iP|7;j;0;{YGK zlx)#qrI#oeyaKH4GQghWsx`HyCm(`YNKHXbm;Hb|0lR5A1fWk!^SGgCBcASR(O z9)ra*KUXh=PGnE)=Jl`j4pjUCCyWcIJ#Mj6odrK9w3%7V3!LwO_l(l82Pb(9y|oH$ z)#%aT0thZd;XCBRu>StpZ*TQpb1O?s5>+>Ea5q z@O%8$Q|_=vu9&xzj>2!J?!5iP0Da;r#@mp23;IGiJBhlk^{}Uy;*;=yu#B@77C0bU zeS-4K<220~gRIZnjd~t*8F_9(xhfj%MLw10<_h9wg2(gDRogXQ#2b$jS_#g;A@eWE z^+%E0m|SDRNSeHCUveXx#p*jUB#SMz4P&$+^&c)P6=4dy_&nN7H1skokkJ6rI1>{n zTtL})@940h#9$80IfXyEU1hB5YbuG)bp!1$$T*8tzrwlupOsGc)?DY9$iDg4vYvH6jRv- z;hidzj;MTlk}Q--j!{D*gXcFV_dl)hm7N=Iu0<6K*T*d3x7eR}|43XIY{PT}Cv zsRbfqYZZJG(TGnsQrqhe*_rUF<CQYAxPA7=QoR*?rDuN0=0Y0 z>+tQZLZJb`;mR$aDnQ>CeRn|pp+|yn|J-E&R2!!^Z|;tmt(n~5zTPpI{+R>M3E@Ss zRa_;o znep8%Zq6ki>g8^5!O2v2RmM+xx>Zc7QC;nQPf2Nb3W-c(towqw^Cv$sk+F5L^Kwlt zz!(8Ai&il7vk)DFb}}cMuqqRXAogOJh<2A^9DTG*u{U$mEgn&+L1Q@Iz(Maf6s8O= zD(!MoFHk@uN97cd+~VrdYDZFt+q+F#UnN5%+5vco^ATrZb<2O6#-{1E9MJ?)vBG~Z zGO1WC&nJ5X@U}{w`j;(>)#BR4yi48-OHckB7V3PSy}~xb{36R9xdzH|K#1BOo^(mL z-qqoKp}VwW_s<0qYqNidnYSz1HDw)nXB%b?o-{%TsDLNNbVr*^<-@70&mZ*>gYw-k zqEXCKyDrpsc&XO$a-9TXrZ_tmF^#}Av$aydLG8cU7npMpCqQHAo2toK^s6*srkanE zTNDJp0Kig|*??d%I&b02n*PH;4re8SElLY6VHEA6U3SP$pCr267M!HM24b|WAic;0 zA%h%LLeoa%tQ@TF+0;a~xZwl}o~dD~?q65`zZiR`=**&SYd5y7if!ArS+Q*=RlytE zwrxA9*tTukCx6@LX7BU;r|pY%z1o^>&Njyyz4vE0K&*OpLI$*|l2HZ81nPvB|7}yF z$aL0_nRFh8jg7Rcl`8tx0_HP4@SJi*vbM8nfb}dO{Gw?aehWU6Lf2+Bv6fDe2Hq-= zl%dWu`mUg$63Q{ImokSyqiyb#^y8F2CWZH5Kx239o$zy?fA|H41!)5La40bY0=yz{ zlwe!-q)+E>|NYm*MX0xHhZLFD4c%C{U5Fn6@}*Alk*`fPQ|J;B~FjRia#iv{A4SodbVw?li8c&bXbU- zjR^Ka(0o50EO~}y9cxWsp73lg=(>3Lfe~7VO@IVA;f%EX_8|Ir5xg-^6Dgjp5lLS- zeRO?C7HD}=`aFhsd8P)Znm`Cw|j zy#+*BMRN#;wdf;9`*bU?rnhg2>zfkE*`K<7uBl$0}TZ!Nua}Hc5F+<737h1-D6Z0bd{lVx%(~M z=5;t^OSo}NwLqq^!6#U*8FqQUdgp1gn&y}QES3ro1Hp-n6>;_SlU+-6JJpbk8@lyA z)V=_qP#qremNkM20u4-m`BY4yBPBWL@Mi%Yq5C^;89&jOjpt7^rxGcU(0dx1uOdk+ z4;BoC^QpC3HrPPobM}T(U#5=5FeO6cjQZ;~=$2iwlV3aUyC^P#v`(Y^Cw-pk?o7fD zEW4E?vSHJ=S3;vQX~s~~CNqF#!#?Z}5T$)0a{3tm?sXe{DjDo$R~!O@PRwQSsxpA< zJ{qe{R$O?}c6e|z0Eu>W*?aK6?Lwq_5j)qCR0ksUvh{hQGW*rmA!v6y9+DGZO~$C% zk_S397ZJhz$KgnXTJsyF(2d2xK$@dwatolv`<2>*G@jQN4`M!R+NbV&vgjRCji^ShR7vjctvBB{%B0|&&eF$UK3j;z`~D^gsfVirRTzbYoQ$jfEJ zkLqcL71xR={jOERV|E-F)$Nt8hl{J#b^z*IpQW-S!ReC$8m{&r6f3POw^D1H31}7q z{$qv(qMVj3Z72Tiiw&ye ze};5o4FI`O&UckR+Vnv(q2ggUrNQ$fc>zMjE|~9Vl?k}G_RNb9m;9O;M0A{C1o43z z+$JCE^li&an3wJ6kFvK(yz@=g12|&WOGS7o>dg9tOihJ8h%Mg}toe3r#bg^vSWPUt zrbMRmut7i`_wW^{We+h zuJF^N1>_e5d|f^a@_pHa!(essE6+-?ZtzJ%Thryec&$-0m%;^Z@T}r&hPfb2H5$n! z%?oAox{w$@ihj9G&@dYNKqeFEALayy3kO-epd zcv4a#pL(2RXYNerU|c}NXBf!C<5!8JZ9wOFpbWHm+UJ6Z;2pOVq_c^<7O^;$FIP6PXn!GMikLHV{0Rnl*KLvKl;_xr*G>B4(JF}ZpD?c5i#44Vw`C8>7 zL4zF0JKL;{bK+kO)^ii0EbUK3x=H7*#Vu>wl(5jt?k5|5rVPq_2%Fp%$-W%o9QDW? zxFHVgH3nyA*4cQR1gc3MaO7hzF(|QAb># zD8JK^j~e0&aBD6syjzpn(T zk5m0#Qos@Q?|b4NJ?Hi)8~pqEusScNt4^h!bo=i;!++ODDW4*jvVT-l)gSrvKXEPo zOCSATaxJ2nVEP&1#N2a)Gf<)U1@lxGW^l0*Rt!Q52v>^+U#_G!3TFgUtX?I*|4KzO z`Yq89imF@R7>b9-l5g)DJf0MgvD7=@mZ-)Uvd^FQUIiiwXoB=Rcxw+!Le0hmzxK0I zB_|T-?<3xEe_a%dHU7NE}9Dg*Rt$vz)%U+4ol>ZsNIOS6>R2)Sh zrLMLrzrw}%@82B^j7A0Z^UW+j9E$(DKPXd2!KS+Nwpczma6>i>{C&{4C#HVyJA z`8s7a4P2;YKfj&bwl|)9P4W@~(lW{_iNTejeL-}-2LsV5i?yf;Tqt3p_-!u%EG9d& z8p3J6j>tH~0HQO{xPxiGaonh{Pncf)z(-QV9Txl-_`ff4ZK6E!Is_2VI_7^S4E)#D z`d<+S4mJ7g57?0|KWQ)|4RPCA5kT-_Ioon|0Z|MF`Y|SklTor$#+2aq+ zD3#p(H^RWl@%ytTHWOR=XZ+`-%P6~-NHk~vY=%Tt_o)~)#_EHsA^G;-9`;%4%P8@L ze`x73;(T#aN$g$3s7p~Xg^W5ZX#v|yOPS|7rU#45RzybC-n7?`pKwu?RaIi~hn^0r zCsX!cwMz{>VRKY0p4YDS{p(jPKCW!Y+#CgwMSl{RM}6O`++9sI&f%(h-eR_yc5_-o zAifFQC)sjBpXDyI^%ZpT(C_t+zgI`xC>hAvH)J@zSHbm^Lu%-r0P&3}4>Wdb?9aA% z7$bil>;%5i8eBe;x}?9dO`Bh}A$Hrraz(F%%v9Ak&GFA=7mFMnGKL?cLe20iwBlf} z4P396tn%CYbn1iLOYK{cO)eR!hNM9!z*77w={NDGL}*HVFF?@J*38z}!3AZy0u?`j;@VM6BES*CkE#}ARmAW5aj=Ok27@8V zjOeI9Dpx01#lcLcFO+|ZUO3Eh#Xf~kuN`9NnFc{vHj$^$P6tPG*k*jnFO@8A$H zA6)pX;)%OJ1NNO80TPD-)WrUT#hKBotY)gzjO9G_nFFo?JW>0cX{zqQc({IT1@%lQ zjj2dM!nPy_aGUI`^Q;kC01othFb3IgXPId^mTs^rXU{ z9`A(CwbO+5a8-DBIP~_0BUDPlrC)xvtpk+-NMsgkE=WEmdh}}`=z7`wkHSBE$DP~8 zNtQp)z~E9q>W6T++ub;Py+X%&!UjI(c^8)Yd+QMW>gp(41W$=WZC&NOAv_4J-gfvc zzXJy2CA!&c3X&e-d%0rb&q!R*Sg6xi6Mk)Dyu9AwY%wF)!eP-SFXLs*b^#U;1#O{a z8e_cWA$hI}#8fIuerQ#qbcv%oW)Y4Q6yxh?NAJ{1ILGhwww%>!{4I4doM{(16Bg=8 zDN-UFb)68_y~f@NlU%^%=u%AA2h5tKbpUqHieU#Rc|(!&J`jHP;$xGxpQy^E=PM<$!tBnz zB@V3tb=oj(`cJlbrpkyL*xsQ+FuR?|(ZrquIoHvlP8H#6l62Wp@g zc+ZVx=k&9bSgHV%>TV1&{bLc{}=*4rl~+aO96@LYRfQsLS6w#Y=gqzmO14+CMpDQ-35&$9iW=RZ|*CZ_tLV*k-V_#eRG zB!tHHCYE;Qe6B8LbU&f2AFJa3@fH5pWUIihKhXj|*keE1|6DKs*PH%#e!`;PGWNJq z@!jtlXgeY;{z=d6SO$Jcm5`=k%o>SgxlDd>gVOQPW@=7%L`@c0sUqLO;7Ty!XD-b&_z`Rxew+<|i~m?Rl%!iqM%1uK4_*W(ivB~bLe@B97nCRqPR z?KIzJD8I{(m@F&9a@QSfV^8hD{i@2MXUH6p*(kax`A!0Gb|PUItzSFFuyTaC@&K~j z1GJ<4_CCOXQh+%qpe6j?;>*`c2Uc>BeTo+`_?tcMy$LG1X4e#SsAY?{$n|~i@7`Ie z$%JAFXd}Al~}jBr@1Q8q!Ygf`9!G)P5%_IUn2yZkX53F zLwwSJu_2q3PQcd0++&IcKDDm2?qE_F2fiYUTY?8;^Db(u(<1OHkOkFwV-n%}O7}`# zUX~`f@8K`Qx?nrv%;|l5(+lSQ-|;VL4Zu-PWLCsoWuH@KikPSkn%XA}`=8N4pYj&< zrBIB*|FAqUB5l$v)aKVkVZTE@Jh)sBJbq zr^|Hw7yk^aghe(v+tiiRS1(H5m4yDVr6$-MfgL*7y@nkc;?|NbpPS^ZO9ssQ%r_P1H+(+p3Nc;*-(|8n-V~r?4YyFysiJr|Q{IcIq#O#g0qO9n9Bh5ifRZ zlF-I&GKmN|w|(xvBxp9R_hs3NNGtGTl^LH79+9s&^9FIu{AN~Isxrx!V;tbEtKu~w zz--HO)MwMGl#%!v#tqUS@IZLQ&@;hXl-P&&8+L}Nc_mhcUs2-p#L=^4QoDRnv@nkq zu{&!}SK93Kmu5$&;76`9uwv=&1c7JCrl6iKq=52fzuJ$9f^UFltTb+sQU=*B<6t2^Wc&>NZyXR z)C+r{Na%-6XboSX^o)aaDZ?_yAs10j(}h6wYvDXGPJ_^8rs$FFGV!nv!4Fy^o5yhr z*T{C_{*_5-(Nyco$+rwc4myu{4AKdM(}10{IL@B0Tz;An6kDo0^ zwV-5~xj0btxEyy|_vBPpANF7;Oo0J(?t3?k>jibM)Z~y9Ckh%n0}M5lnWD&~^MUyWIXucQLCv$FL8{CY z2ow_nC^>|})hhfMfM#6`t%%w3>n9XwrE9HZVTkD7Au&3>a-TniRO?)d^biB%Akz$u zl4)M7C!aW(V)Zt=PyPfi<(8!vu#`6%RHff~g(NCQRoNJ2Q~f)-;De?YJx*<8=y@ZR zl4Ll(mnq~vS93d-(Y;>QNSPcvk(W+EXbRFAp1dYIet%{r@ZI)V9);hM5TTls1l0f$ z!dwafp(G2Tc|gOXt_fV63T`?8mmJd88+CoFcph{Ms-$goYX`8omv_zG2tpVv@Ic6= z8Q&!l6>*T9_tcY9gjM98*9Wj*PO~3=S3DId(P;33!Axj1fJ#4%>1gT8G>MG{XWwxr zi7wacr9n}a??@s>r>xteI4PXt9Fkb`+xfRSiV|8NMc0Tt7QTUS)44hr8##DoT)A%g zFeD(NP_9NpZ;<(Ypy^eXcMe4%FhoGgX?V#FmjBdp)wNvGi}uXjv_Goa4P1Dw_(b!&^F>VsW?bRexh7%7dPrx6v?=u*7tZEgrUW_z-QOtYRej%igcxjXkGy*h12o`z2gPKtj|*L1i9)f z;?%wTC$=UJpnR&WU6A3+ARN>5>=sJo)A*^{Ba4~pTDT&j#IC_#(QPMM~C8q*hP~N1RaWnXH>MzZa36TZ&^3wfBabF$>17<{6LTKfDKJ{4nuyx~Kc_P)c%rMQ98 z`X?Q-tDw*o?N>p;l8?5H7gsX_<-g09WcP!OzvOKRXru+{S7?iS^`{V;?nC6x9iWgQ zLLUg8h2EXOEasHW$$G~2^ z5fp9@%DV_M${)NzZ;CAA^3E_;s}NM3E!-ky=5NHt5;XZEiZdh}K!Fu;e$QYV2Duk( z(lGsacgjyYM6Dd~;owDx(QqVmSjr3%=zWF0OtwG7AW~<$5kHNb&Tn9&ezoW(Ey&#m zZRgnM%*@=M_)~*0K#D9L_n#ie9LMy3)!PepkejV(f6R8(X^Y7JOp4l^;YO~AQt||N zkw;_1Y|(be3^FPZZOjVP@T*FX;IolosW+5=6CId+OWL*b z;6Cce#rNH}_QQEB>loF8+7%ZHRd0nNAQceZ2 zSVqB8foxZyyPE^O=v_yy;yFDbpl4FrEdrh!eV^+~zuxV?9bYXHqrl`%ZP`Qh{|sxl z!567#fK2i~uJ@O{I&62%;+nrts>6_D@MfD!@UgMMH;LDq>6mZ5208M`&5!Tw!z--Y zM~OZ}D@5;7nzyIIevVk+;M3%!ays*~I7Hw5y=XX|{j+G{7NM8N<2TY$$2@6d z(PXW!^DrMlnEiZV_VCB-!I?yNZqxI9vY8=sgcZVMW1--aPnU=-I{DL;qVjMPZ0>WPd!Os4=8&FD~8RbyB|b+}l@k zm-_HnTB)W?a@tww7quzfu)^2K00Uh(JF)bZ%c7cR)sKPm9tn`Me|JfOeauje8j2}l zv-DMk@cU^=Bjs%<>w9`@)QG#HnJJ{yQVAMR#+_P1&-A8Az-*>!RGPgSX2u(Ss0E<1 z6m^zX#w;s0suyE8nHw3UgEw-%Ik_BwYH-L6>(iO;TTZ#RDedapw_pJh5K$DIRd7X1 z7nff&qq~7}uN$iRA^N79(-qYI(iSY$bH$AP6ob=E9&WT~z4gkcECd*y0SXFLt2Ps< zaIO>&zbIv(vBpe%53dhYkbiOwPL|N;hpa5<(CLK(b(}am$-|2ptPFqf2L#L!YR4qODp= zKFX-&azbh42*nbPHh8wc><71q%xO#>d;MHQPCA|q+jnmZl*mp9O#3^qKBQnzLu?bP7V!|oxvtn z-olKEcCc46BQ5yhl$m0$Y|Z_o}T*YqG~_Ey6Gt6%;0;@tv< zihnw%)Ms*X?%qe6+5UST&Ar&pH%7v|`Lo6>uT?L#Wt*n1(MmzSw_15{u13WUESS_$F&N(aoHlIVgxHeK@LA5U(8N&ohro zxJ#guYZB3$m8YWdRuJAe0*<4;+u`h2hh=q~On+JTK)&Ov5JIEOwBRUM#|GL`ZvS$IxDe-uQs3krzXRty>F1tj0|)ZC?C=1?=)Md^QV>>pTQs< zri+?&-x39s)8GB<-}?JCO4ea}CE=mc^brIfBlpKaZuVabjsR}rm13YfIyrIKPiSNi z4AkeY&s_%G?`wuag5O^~TM}SjC$5`_mfv|THw>iTFF1^4zOl~f(p{d90{^`+v$mKH zcKg$&3H`qS`v0pj^S=}_73Cs8nBcmeHNe0mguL}Ictb;wc`0c;=v-}z7;TFP>X|2e zTc$$X&gfw?M1=LWWbmefEG)J0 zhk}wZ%kB7V%^%b2T`@2iE#D+e)X)o~DXFz| zMbuo)!yYpuuG^=~dYr$@E+AAE67wR-o{~M;-?{oZKY;tmZBLzmY?eK3NCkZOhW^G4 zKkBo!qgG)fpyW0o2}MDVuuJ(|p0oKwZC-YvZg{%lXL^EaWA}4KFEjn=oo3knAHrRL z;58!B&obVD{r`2-{*yN9#89sOKjOH5RhgnU36U=U!W7ck6v9hmS2Zdt+ag!)V2%8!1VzXR$X^ES7 zW{}FveDWtC8CB7ovEq;pV=w3wfz7kcNX%CW{Wb02!-?jIqbbiQo+aIWsLnG(5g0fw z)VcR*y%}xGn^Mi3)V2}%7Lj*f6WYI|UUijfIk_PTiH1_q&Q|#0uk zn?AU&fEi&KwRkzFLnz4I$E^afAQ@$SVyCu>*Ba_;;;6meWw26GzS3z4jJydhAwQeP z1dA{Rju5)-h%$3Kj$hKH+6_zd}%SR#X8kIOC8YF{Z)^ZO2OaaFFaD@Qt z*of_-zT+DbAFfpI#;2v7mX{s#ELDcdy#Kb=lzR=V<|_}y{G!N9S46j4@={PH?G`l!sndvWIS{Dwn5>^fxf|~L-%qWMr|O3RB@oa<;D6SL|LfHL ze>LL&u+bL(jz^Pl)gN|u6Z>nqpwH-@_kq(hreWJt;ge9YKr~S)I!POi9IDQ5qEoTG zX?rDX$5yNj#zbLXVx2x*tg9?GwAVr5<48I4M;6{1E_{2m+$CAFf3Lcq_k2tf_-I1* z`2N5L&b!Y8J|CCe?R;OZ1JKHBqbU`p?D9zTfX1 zJ)cpn(5KhF-}5=&?_yu$*D~$Rz9%x@@cG{r00Mw+2SZ!;mtqjf?M}tF&(gP+$z9WD zI{$4*#D{+IN5J8y@9huB=R12@K|m5ymTEmUte&A;f9*}d*Nh{zYE?or&C4xxzY@d z&R=p9(T--<--~(?Dn@GMc8U3(KjPo~Gzqi|s@l7_lvt^3XkCR=!`q3H&Vq&4JTL*{ z^J{T(OI1CeNto}NDhDQRbI7H8s+3lXl#2>}88}`Q;iq@sM{ckNrY~(K>bc1H3;?h% zN^L|{#WfZGpo6bU154s%j&%cSTuV_PEZEY^sKtm=3_+WBO-UmS5rGYJPctTRnf`79 ztHaQ4D2I>eYoMTPK%B-Eu0H`=0FlZoq@Baa#~C>j)=R25Un<5j%n=DF%6mhTuh`0s zHzjNRWfYPY&SjFZObHb!n#uNiTU1v(KZ}P(zA^ll#Ucm5s6E$NPYbO&MOt3^)g(wH zFPtE%{!4pRp4;Z3RW0RK{?cUH!mhilZ-t|{0?E8 z53kZs#~h?pMqUCaS?z_9aCFj?MfCvZ)3vxc4I^sL!h_S z4Ng_5kCFM|L{-MyEzW0Z%WbPffG5}ye`AmVW6O%)B@l?8gf1UC7m}6yLbB+t`wr$W zTxBqz}J2ge#(}X|FpvFPsCM=|F@=STT{9BOAxlDCj1JOidh!= zLPZpuA~KY~x}ycY)UJzu6{)Xa(rVcSny@Mb`IRKI>^*f66{-GgmWJLO`DdVMH z`6Eie@nI@@)g+UU-jQ?!)FK8GvB%9n51&ySVHJ#~?GYdXe>teZGwqJR7d?EbN}ks( zt^v1JW|^|^i5RJWv2hxNv`|WQHo+oqt5H~sG^91|X8~4+lC_uWsbV!Q z%I)Q0Q4>ZWL@pPv(U@_{1~r!Q%3SQeVI6<4N2|H`YiP)!{P2^Ig+9fm74{#fTA=7 zD~bVVlb|<}90e|C_VAI|O{$}V^o|6{>883YM)U*lCCwGxjM{jjq?z@1))r>}1L@Pb@wk%NxQMCbyDg{fw;jPCW~3xnp?p&eJ-Pp@Al$Yd)t z2=$U?jZ`m8eZ_=I@-?0zO=BZ8aA7Mn)HG4zQfU9?G%uO)2oIND5Jr}b=^JTRtUGsD z@y{@5u$;VS!JxYKw5KXRx??}BBcm>=MXxaxNZ9t0*CI)6!>u@Fw5?nS{UzW{zqn~; zmlYptvN$Rh+28*SMb#h1a3QuO>vk;MwUIVdE6m#skjS$t8QP9uwe?5CcYu`Mr`pjV zo$G-tO3H>2H(h8~%^S>tIcBkMLS;4X0X9puVK9+91OBieV2?_GP<_9l`vz)07hmac zAyLaQ3zcKIYCuU|Q-iZr@tLII@R8a=S>mu5ExWwc6|YmWCw6K|lxjuQ{76Ssp6~HI`v>2qC3y^Ni3{yJx`j+AX(roBfW;%~X}lB@z2PIWeoHrU=KO zLM91{9l&U`(L7X%b^(;xUQD@1SA`-bZ?}FG`a#BFb~;t*7ONRd;pb!>2G!VXf&8R# zA-a_&jcV6BJ__Y%?sgW9eQB!ZJ4}HD(hDN9@iU?wJFHerRhlBMb7-&1)t@Ut@kbJf z@Vky~b`JCFgp9GJ1hnI~vDDiV#9=h^X%5gpRPa=uU0--rRl}!`kst2b&0t^W-fyj@ z?h>&mFJ{tm`maaY0(MIOM$GyQ3}3T(eNhJ&^Q_~m6nlT^aw&c`fF?^b#(n%8ljH;2^AeN#OQ6Dh<6vGKT) z-X=o<3doeg$Iiam>JEzX+XlhdOi-#OKN1^ZC~sDPyEgV4B)uM%zw@~OvwHN4N~&TJ zmp@8|j@P1vqj3Bw3_4qP_)QA;R|kwLGja_Q8cCRuwNg1PR1?-DBV0Q*NeuJ89YDoZ~y_S3@R3zk_^lZ#&P)^bqQQ6XCyj?i68p|3lt0@R; z8^BBIAknE`Lek1o)vjGLh$hbkS~k!@0>*|kdemoXJFp6?NthypYZl#p?}SpCZgU0h#X(ke0B>h)sMdWOK4N>FzEelTuP7Ht20FkzK;lB2izU ziKtcPP#Mym%9UDO*+(ah7n66vebaNNBgS%`U+P}&_kS<^!K!qIY>M__e|JF}%VULN z7hV5CZ=%DverClr0))>zk>L_s8kAHoCN2Qk2G>BhE0YGAy`#~GQ+s=D+DFwogSIzX z1{PFl6nnxipy}_N#EQ(6bts^1QV=ksQd^BLRaBvxK5s!>m~QeYZxe#S=>m$xiP0i@ zv)Y-tH#(xilh?6bQH#)2?yP|j_^y8;kX$)NyVT&I`5!blaV1Bp-gmlZP5gc?oc2pl zXu5FKPeB4Z?n7IrMpVo|BRbyev)c;bd+ECPD_}t4x0&Bfa6yy2f@s$y+(Od&$eH0O zI9YcN#ELRVkog0hgd3`6NlUE0)H<_Uy@i%sg>|Z; z@i<{{vxb7k^~J>0JVr;BG7v$LAzKWgCr5&HbdpJ!)E5hbzmZ@PKUDPeH-bo3Ny1t6tq{Pe__0f}G$|ykh<3 z9^;%26-Z}5brnY$1|5vXVsLC_wqzX;htY};fi}m;!n!Opg#GLU1W{^Y6V2oVbM87? zl8pO{MYn6B^?XD=QV@O^y(#UMScAnm7TRP)E=C#JlGZiuZQwO}#!k7~#&d^T=G}{h zM&)hdjLAdv1*-1{7RhM-XSeL2uuR^I!}dtMoC_6iFRPuxuYOGThax}!E(*p712d;+ zxsj${B}g@$yAtz&j@LzpLv*!>w1lea-$mD^dTQW(lqWRxC#qjjNHPlI(Tnq6DOK7j zGBixf`0?xp3-;`9pI^C) zku)04D&A1Ex#0Ziv)DV`jVQkJCWw4lb4 z6~Gw6GZjklszY65*E^l{-VbGKOQaM-tN*b{3wL9)I4kNw;Sm9l5n`un6&!7`)RJc) zkX<}s6eMkQ#Bp@X%}3-+N64U^Cc__yYCq=6U@@BFaAlkkUvU|EYSZbV>*5Bgt<_4D zw=2AA2eRGWblt@BJm7T-x;hT(hsj*<=Z}}# z4b*I&#NbkmvGk2I=(_++LuPBb2T^mP_eoeD$*{(rj_`+LYmUSB`??6d7vr- zii}23b!{twxfNEvC{t*uZF00oI5s$@FUCePk{q{p3_Hs@J#?t6&JrTQ>RCDy8atwn zUQj*FsQQj%gce0lV?VNE;d(pB)(altL}kvxtJubQ-Yg~^sQ4L76)WbSfj3V8a!OY@ zkoCadV(R|NV<28soQrirDkW!6Q7V{3@F2>Y<7!Dn9XgMl+Mys>xtt90O;88I)4l>> z7k{X)x8quZ#UG_`K2$CTlrWb?h*!u}omNXuKU6gH^%=*2{7b79yx#X!EXJSSA8;ye z8_GO0kWY84gE_%Zs>64P^@ZcrV_rz1G#vP~+Zu0Hm&P&~c%kwK#Z<2F{ti(m>d40C zY|`hM1zjrpn~T~`720IUu*>quFv^iO?IQ)r&R}H&3&tiRPD6`Hq zN4Xe)kAi@R6q{C(nV!hrgs>WJs7PT(72tsq0%P_-R=wO?W%I&4T1^ROeh=Fg|0j8W zR|8{=`a$3``8>WX#>15+jFVW0&t3j5NTNf zF!Em2Vf)TIyuBIJztdfB4d}j0Tg#JpcJ%>2NdYZwq)U1n=&~B6nP!srUz(_g4kb4- z5CKs7P9ALJF0?3Jtzx9aws2ZninX(rJBb&+mO2PYipGI#&B^ ze=feoTsZ@OiH*S0Kk+obD+tMol@B)D7)Y$kE!q>~U2Y5iks_Wk!mWjZbt*@Y#61G@ z6d%-ztH7a@bcU?4L%SX-zVLVcmfN(;OX~^|LTnSds_eO@$yAG=i(h%iN=Foqqr-yk zdmz&SC(GsG1N1-*cft5=SLh|hz!Dh!j`0Tg>UwNUb%jC?Y z!c3;~u0EAG{m#DPanp^cbkCZ7TNuwSPXTGu)$S54Zc|nE6j}Q^UA{;U)D$Pc?y0T1Cm@nJd5h7XaER?ZE{7VdUU=B z#Ljl}w_wR-XVqUVR(3lSLrfluguHNTO5h zM4|e)8-Go#smZ|8kQVc$#|h|4$9~6h$w_#$*5bEB&~HkB^56; ztjA0q4oDjc!rkaYI1zcLZ1N^wDYTpFI@zAAon zBpjBusdGRaA~S+i5tI53u01~GLc30;zY^OZqwb(qqCuCwuDH8W+H|)b0O6qZE9>G_ zSN$i^S%2fi_QB1l2k5m&L|dF1GN?5pZ9NCs%gchQt=mT$$2`03^eH>@1e4JTGKwMR zL@c!mD_$)hm#dO#Tp<&H|DjxTP3lC;JG%{(LhU!yj|H-`^2$)o8Vr(m@ua5!XG!Y; zOW&Ac{SHZkYogkTLu~ZMKaikXCBC;U;nU1j!vb=!1{*RXVLPd>;Z@f(GKVO|*)jE9 zS?f|>Wvy02%*apD;+7tng~On}5P?|@AeFEu5akp!oeFi4_E%JgGGgrF<>plWYxHi0 z9({S1|EL|6+8W?qlw77kZt&4YTx1fX`Il$ORH$Df_Mvd=w{6Ej{RoiAN6pwHD{eKk zr^#coq4}Esap4Osu!uUpZ=j3O?$MmA+abgbZSJh)<5(0%s0KGdglT%OMLIduF$U<) zZej&qorK8j0{bLdH`7dPytut*wB zjmC0ZCMP2bi~z$;QwR@91`uUQ%Nl>%ENhj7;HZ~1-|9)OqWPMc{HxLt0up?O2yvAY zvRTlGdZ<3ubOKUTx~E95?G??jqE_#Tyk+f&&hy6R?xCvY^VUy319dDCBI+a}$^l?9 zqSM$~QDFxjoH&xf;#zJA6{`}ibD}p!4V=1N*g-C8ZCZH8G0U9b!}B#&3Z_y26@-;V zE1`kmZ*}Cz@LDO)Np?)~0`XhV0b0$22q0NVZ>VoJ`jpxXs!=55Y!xOFy&MEv=AF1a z`t&;}DDP6(Srmy$zbPwi74&DWQAAXX3qfYTQP}o@sGuSZFmfX8JE36vMreCl@)--p z0=feH4Bodmr{1<%xgZPV0!ivnf6}{75f6|=q8D+rPGAa#XIVQ}p2KE!wdZEHu&4ML zglY}pvW%@I3ffw`=lExBQJdO5LnJh+*u0D8RkT4;0Zp6QYnKTBNS(6B_2S#(Mud(< zoutJ<2-aLK(eYk!S~YY)sJv1`e1>(+jO!y6q?b~FOB9F*u@L^rmu+1R-B#QU?04j_pR*(KH# zOZrF?BCo6KT5upow<3uR+#;Cgy6efwHcCN}hR0u6Xk1R&I~!E3U%Tr`*;Iq9jB!(@ zmyynS>BtGoFd=Fu7#3H+j3No5O%PG6Ol6u#nn$1)0IBTh>I)5%lFq)*A}s0V1f%$~ z_eZjvFjKR6YMYw1QIJ@N91t2g_Vjj<$!Nx^1HZ9QhD=Bm>JpWTXba8X#^ z3dB`2niRh$p>7t*I!HDHAlGA2H(l_U&mr{BV$Euy%d-C;#@;DPvo2`2Oxw1zveI^? zZ5waewzJZB8Z%npzeDtY}U5;a}+q%N>#>M z!SXN&UoQUC>b&3=Z@OXR_MC;70B0$a$OogeL%gkCM8KSZg>$g66dtf~fo#)siOpJp ztkW5%a}vnLuUyYxkrS1S0+9~!Uui@Y@=Agm>BmjIi%FPjC97g-7FXy0$nc*i{0}Un zDAKLk+yvMq*T0F&1hva!nem>omyn>Um^7zE2T0&09Ck&Xh}cg-%*#h0!SsL!n?;Pf zorba0G27r2vFaBmz|YN?l}*Z5&QF_AJY>8e29%QgggMEN{Ph?IWy|(V12=e`7OQ zOH&o7z6XJgf8=RbHqbC8fdZ{E$QELfd|k1*Ut&X7%+oC85X_9TCz zy7U$|Rtm$)p$-Q%3~Ttd693;Uy2utErCk%6>`QR@|6YW1fY ze@E-wYpL|EYP=yyA#-Y{5(K}@ies%*cZ*c2@gDn1v`<|&020D}gDjH{Uawqn=fT(n z*i)_E^3|mY%>1PH7^uTMN`~NK9KpTr+x_Ie0vilsuZoZwzDooL@JYOQUt8=ARwEL*Q=#A^w^CN>e-W@t)QA&2vN|5l&vGN zUExIpmDcD?{x7px2UJLU%NE zq23$S`ndj+W5!?o)w?b;uSFA@uYh9^?yWf%dbRkBg}5s)*1Sz8z`KOCn-go#Y7ARI z>P519OG1J#v1qtN`sH9UsL5V1De>DvR#hRUEY75g6dP_LSe+-MzTM=P_X#-TBOZZ? zUaxNu_*7(gcf3EtW>Upj+LBOsC|S(1erPy`E;eyv9gsC+;Lw5p&IkSD@ZaAOY8dwS(9PuV6i=vLo0GgRs5BNcl63F5TQC)dE;n zdwL(6qovph5wnjfJj~FfuSC&@0m~TX(j-)QQnEv|t+BC*V}p~0ZIg1Ag-tUs5XHkB z1MJ+nVR-Y&g$6nIud=1ZZAx4nRk6f)F)Q>ONl_UXPU3g{j8|h<*x1x)U%$VsbZ zW#u@ro-9zFK?qu*NRss>2grVvUeeDc!{)7(Mn6z zd=M92-FKp;r&9k)h9a38JEgstVx=?A);gAt8MaXjHyiyvpoU0(ql^#=%>8BAr)0C7 zz;f}IP|3g_9G(-41VeNM43-y5F)&&CR3;Ie?VPzK$l`BAB30Hj-F@>lNK$ug1x_wq zNsUN%WZf)&7x>e%YFy|c&!K{7P%q|v!R zgaYcXxxk2htYU%+g5U2TsOXx@rUR}! z8}V9P#vhf6PiZHpg}HU;p5r;z@|Xb^rri#@i42PJ6#lNDkwGh_8o`0f zWXamEjR`HHgT+$jSZaJ1GL#U_6Q!5Txe^GkOg;r(BoJM=w|wP5FnCATp<4R>vp`-P zwDo;RKofJO)XOEvQO{x7TPOmWRBRXi`pFZHjF)xuG5k?JCRaS(MBTU3XWMEF%w9R! zyrIML2AoO0UnSg@ox1S|uXl1QfnOW8TC1k9zp5|!QfoKf-{Cg*PE0&L6T{BLdj8h? z!{ZeU4p2=|&H_vfGGeN}wmJ!HH%$sk%~@zzCQ{-1n?`Q-7Hxa3CXR+6 zd#V=x{iKGV5LXkaI>Z`ZE~dO`*86#;AqIkB;T z;@uGGaGVZ1e0YVX^l8AX189mLpz4pJ8}cQ!SstJ~;?#R18B;Il9)ax<({`sB282M= z7z=H-MFBR2Y&vsiAL71<*9h59J6q=}nJO(M(;nKDjJd|Ew*mR4JF$LZb{7&w5tBHu zg?;~M9Lj2ZI;lZw&-p05J^)ZBkk1<;_g<-ORhYCSx^NHAM?D%}$Rbt22kV4x;Ej0+ zqM`_&u|r*r>dosg#B|&qGI`Vy`ghovUXz6O9WN={f;|^-5l@0(W~1N3F#AT(?AZqWNEFB zHQXai-sCQ{zEbMsrhh+t9+P>;)AY#XyhFtWKThXwkGca(->Ps`eDe-m>3mAE+Q*YI zfCK)NXJ6DR7LV4DQnz<}MNNQ8mUzBCpxPVNYsOA!yKV#qX)x7wjaVKL0 z)K)sA;-4W38yUSY!kUy3SJX%=1 zFcQ1tBUQ!BDCK?JbSeG`K_l83wnqO%sos_%wo6m}$A*PCEFpvR4-|Smn*ivDCAK+8 z=AtNp+1`rA3(TPLzOVu1P zcI(%WB{D59Vw_w|&S*1BxPDqm!b;sOy*N54>`&RXC*`RcvucT$KaZs!V;gGtP85Hz zC^){MsoXEBbu-%^A?`H5od+1W* zUP;bXclP_m*={N=pultrzOw$fg+!>46j{hNK4~tP!QMK-L<=Mc$6#`vdX$Dg=ss=( z_q5b}#orL{8*O*1Xl|Bz?TuCKY<~-Q-EGHx&7V=L7gH7`?ezD<%F8U%VX(H8{dq#m zHKXz0xp@L7ucX6N*Fks<(k*yMgnP^wG~v-~G~W|cdXua+@hR`A@Fgj${#dg$@(nw; z#di9-ljdm}n?SxV#`Hdqqr07)Arnt^HfJEqEMuXuvFcBC%_(5PM1QUvxNlgJIM*;; zHB}_BTDOu!gj-t0A^DWbPo{=Q=b6s*oP*-=cv&ECZW^L5$3#CUIsP}?Dk#gAQ9^ymyyGg z#h)|VoCn3w1wdfVTAMZ7T$f$Q`$w6|)$sT2gJ)}sp3@JpV(htZmBm7{r)I|+6$(`cLFd-vLAj0ZdrabzUI#DB zP3WuRZU+1ZpsLd^R%*aE^ZaD4X8q@NA!jFQR1uT!`*GoBBBJ)K3!AEk9R7p5C&25g z0}y}sbFM`K-}3=_2OD2pDjDme#)^>e6X%bPf8gr1yHnbsu=A=$h>ZOswArNf`8eLs0)e))#}KWf1y_kVIcH4dUrw6mT)<77NuF zx`6vI5)1hUVop+2%~|s9Hl|((n3ZQY1kyZl1O8+p#ZO!4Ne?4s>A@vtSHdDiNoMO6 z!1UkE^>h`d5iCQQdxr@i3+C5GF@JTuWX#>Gow{go$WCO zEcKtk`<4GcbI%!ZPy9FZzmz@E|6w)sf4}B&T^wV~ zK;@3~DP?XRV?6PnvgdrHhoCaEN-QR(qS-vl%L}jUeXQMN5eIzgus}7+Nzl{E)#;He zt0h=#i?c%|$cc1M%(X6<91>EBwo{H4;o*G6mm8~ZXS`jL#piM1l))#YM~#rLI`Ltu z0J+JlGAKERH;UH>%=-8H0VkW~SqvaAW}CYRdzK!`rfY#V253ct5QOGaRX5XrfB4j}O$uYp zE221j{?R7`hsKS#%8aXfG@jiw|2J+Q3B!|Wz+kliw{ih1ooAI~c4!SXJc1aHUhyC1 zY<~3>7y?<+D0dqFcL`q7N9m_zS0#Y|QDZ3qGz@zx%rR9&zKfftaVq>u(YPl8Zpc!I z!FOq~RMQ}b?rkyW0ip$Fy;>}LMOp4AxYrCUsFVdG{ulZ0ot?XBgh=L18WTwaDwJI> zbCq4ev_+8^GDlOPLqJh*X7uQ*6`iRM@qyJgRX|ZP>!ltxdY5y*6_y)V{co2@BY+Cp zY^ZG(?SA7-k#i|ENqpW$wvc~}u_c5hEQN4Y1w*-Bm88X(u5sj)ev% zHEHJE=nip&^)rHxr-B-PTIWU*%Lfif>dvU2gGdR9P#G&RZW>$sR*JNbJ7BHYjm2>k zkMi8(AP8J>`^kui$bp))K;6Y5Gt06NUoK{f=8UsgT49RoqqNUYa0weuZyZt`;%~6`EzUo5VORkjf~kh-t6 z%+)h{!wuTTm87kA_ZzjyE5+Ew$y+4oE3VjfT2i(YSyFSUI54t#3g7=wt)PAHuL8h; z;6iBmWq59|uqib}SzHG$gW-r#x1#=p2Nfna*;BT!_s$dRD*F+Jr`bC62gq79&rwl`` zH*Iv^_ZKEf+n2QYV`5r))fg~!CMya$i26~{zx z()!4RZC?fca+pBNz^wK!%n;9>pZX;*msqJeeV~%=98Akvrg}Q2>u<*~-EaK#&`Jk> zG)zUUd@J%SWZ+%m(8oAES_5dVS#sbsK_e?hlzw$FDgk8Y5NQc=--&j$u-X!s=tuP< z;`##*Kaz0}7cm#YjK?{@a3r$3$eTVcuw}jOV3c_3@V|iaVxdCmHU#Ch!)PH~qZm6> z(RP>vR%qcSie87lAS5mvYWcBA6QbJQ&QM#nUQ|?Bc{=p9&q5dqnyFYQ3d-Ubt9*)a zfq7F_O%AK{`tdNC!umpapuv28o`Ax4+o=41nr?*6tO02!m;V+H~(%4 zmb&aWH!#pzKOg(viC)bG(o6+EYU+IwXp0l(VvRx=ZHB^Iu^)#!#oa;FPHqhHWV5sn z7bt0i_7iXm@h-%TZTd~TjpxOC{mB}Igq18CdvK5*ta#TU7ik%UeyGWwFAuh?>=1Ou zj}gV5kKCQl^>;CbNq}suv5NiBh`rIZ<;~q)t8f=se8af|gt&Q`Jc%ERL@;}zbt=IT zY1WP3Bg()ga*8y>xOdD9hJph{M!asqxY&kDKV;69C3F*aXfx*Gm&8h52Qb;2!6}W1TGS32dZ;# z{?Tyf0N2Pf*I?gXeKY()|MYo!!Qg4*(VwNHip%$}N zUyiP8G1HEKsX7v|iFn}UcUPz6(lV1*x3{kD)Pbg(XzZbXP!w2FYvezD`pT5-)r)w7 zyX_F(XcsrU<_jHIi{>N+`DAs@iWg@;Zzmde*>%Z!%}vNXBx47*>`XMSj0 zq*DAp)@Iw*vo!nn@bEu(7Y|Ewb@#UBDXz`>E&?lkErK|5)KNE%bFpzJr3n*l;z&GswY}~6PRR+!UVRX$}W{iw`a_MJ06|9EDLCT?e-@RND&dr%&b*Q5=QUM93j@xxK- ztZU=tge`2Hx77{181eotNan3qQyCUA8d}t$NsYC|P80`!FtdLh2e@D^zr>%Krsq8 zk!L(`JPzT_t>Vp32{i)tnSn+TA2M}tSKYJ{C4SRPC#MM1ujr>7ke;H#bqb@h_fHnu zO9d&&-nQ16hPZL(rK(QDh_1JDtlR#^n~&n$6Ovtcms^Sa^B(yQ8|lb`?W=SQgZvn! zV{|m?v@)#sN5y%C^@PL*VP%~m-)Feee5TUy5&w^&a`DDLlJIl(`6gpd9S;dK#q~$E zGq5X8rqIOXgMs5Eb@Tv1#-LE9>JL)$qh@alu}|0EWn8!Tyo@}8xmkT+jtowW+BuMP zwNZ%K8b42)h7rZozctf93u|J1jQM89KzmclkehFOC*Y9KV*DO7iiESfhe@xniKP65 z3^`FNb>7C&zYcjihKG;AV`SC6={W(FwKs*bEiIr{i)~MVCF*Wu;}zh3mg?eCj2ugo zY2nJWOUfu6oV_jhgHuGhJ8=8Ki!;iLvDR`@0Pr{^#D%{G8LE!6Tr*rxLpRiqjl$?#3pAd3~t_$qkr`nvtNeuM%^s@+bSm9iDTub>{L ze-Ab*N0QZ0g#LG;X<4?fblz!ruKp zZuT=nfAcvpHDlw&+5WwB>We-azU_I__3wFG`Qmx&g5B2lY3$~Dv(x+KYiFzNDTfbl z?*{SvyG!9=X2$24`Sazc^^Kn0CZ;;ZX6y6(`gHoF0N~^FajHM%KSF@bEY_8I|Aes*t^C}`*luBMnUD8;%CYyf+gGVQ zZ4~%oZMECuMtuO0=dh8xf%Vw1_4xSpd>cNjT+N9U#N1Vs$tne86#SSwX}yCC=EQ7| zWPE>3`F_6iypGKM&?MP@f9gH%d<}@_{%{2HVzCaeyd&PxKF@pz-re!B5r)OE_3+}X zQSjPqf80b~W9pE3-T8`dbGUg{O8>O=TzCK6c+x|AJAO=W&6U)#JdRH_gNpioA+8HB zmBJr+-gtXlcragCIdt)*TD^zeP95vqjJS6Fu=lh+SMRT%#HZEUL62@KPLcQ zxB8G@M@;~q&z7G9dS1M*d)pfC&x)Rpr5&d^z}NeFjqg`W5A^Ad&c~9i&s)ZJL(hB0 zv3E~@Lr>@P#m?ukp%9-N;?G-2jqNrJ^?kwy!1qp$z5DaHQUf z+gbB-wd1k${&gd!djGNG%J;C7-t-;{q_OaYJGAKQTw`n-!e&o>*N7iF(Ujt9InCzY?`q#CDyfj zBLQ+ZVH110>^s)%Z?@m=*KewQ-19lN4j{$ zn}El4xf-vd6m}oahv}=H)1rIv=c*_mr-_Th8QZP4>Zop?m*cG(zK*+Z$f(>!N}KkT z@jJU`Zo##m`6{A6tV}x}0PP<>>#1J{baY@xQ z$*LRngSYNS(00Z+*54bWEO${WK6ibPE8jOYH9Os&4?k^p-Cg@N z)xe*xHN2xPT2^m>+3c7f-?{9Zm~zvldLMb(T5vhhr!J48HI0m|R$W_{|-p2kzVpyvuTK#S_l9+V0uaIT(s?p6v#N z31Hp4*4%mh(^mt(z^H|i6CukFfS3V@_{Pkb7lR+FJj*gxn#t3?2R*Od{)4{#)?OCT z^a9!G9=wdE5>`L5OqwU_*WGu7D|h|@|5X15K=w31v^MYF{M?ZIC36)cbn|3U7s4)^ zu8BADZ9ATRGVSRssIky2zoI5%jx3d-YqefC@Abuz9K=~Szi40PylFY>u5_>xz`JU> zeh<;a-j34Ms;U!sBaThhl7A&M>LjpEZE*EG=f85NmKxV^+;vh{Xr{?$?o*JQg@YI9 z15dgf`KTHOh8J5hBGX2gpA(pPfv zUwa%r&2XKlOvK=|y_K4bF7ml@R~mQ-jbVIQ2TZwzU|aNLcn}zhJehtYiyHqjM378; zJid%5-rg~fft{K-#{QU>`m+&fbh(kDZfo7+acR(t=@f&_5PXv%pkw*#@ekbbX%8VQ zIP>H%dA9*+B{i1ONmf1f@GI*cXE^Pd*PA}Gnk@Gw#U9@7zkrX|ZAF<-KzDb%B~}iB z&qEKT+}LdtLC9&V9iY3Heke*Yt!E`Y!rE)S^dtj^6e~EO5ECmYfnPSWqpq# zq1gC^+j&*2OD$t3WgJzp+F|yO^REJe9PU}(E+WG}hnN&*ZFdoZ?!|Wj#34j@#HStb zuAL>em$!k_Y9XD(N5J%gxEZX3%OmbIxDI}pGCz+iUl)g3!}u_Enp&1O>)(h6jRw+Awl#9G0WuAKZw1i_rOI5UWK%|p9eUdeeA%!ym zZ!bFtht*Xql$6yN6~kY#8#QjO8{&mXr-KBU)>pk(H)fUECMQduzicvf_Ox9VU5jr! zqnuNc)Q~l9;n=Fe8t1Go6`tx5{z)MW(> ziR9@-R;JY9!6k`z5Qmj5kKKqQ*u~${6gJGRMp#D8S$fn$klp^b@~tzhOE{2gg=fD# z-%uL5tVX^|-wcrhGX=VmWx7mGGgs`(EXqRr>JITp6hEWFOlD-)u>%m2qK8r&GYUT8 zp9$EgA86a0nDnIc_9)DP?z5Hdoa zmuv>uaSUBdO6Bs^$3jzb-&&VVmGTdF68kfwz;F z{N^G!Z2!!_vlaI;TtDUDaY0QtLw8R6>OLEt*H zSd|-0a#uy!sJzbvpAj~8LANSBq*Lg#9aPCUiY?{z?H59}NK=DO&>7uBJJQwGom*Yf zNgUJ<5S-cVoVU7{x|?G~yHpiY?{hGuKA51fHx9Jlm=#|myvtcI>4W7XSGpbr=|&kP zb|_vW(5z7R|86S$E4|jqF*(r7B#%=V&rlN~&VHd{1hGb2dujevQ@_ZrxkkpPD`6~LL zzJ99{ea=O>C?`UJ$mP(crohokEO6>L0kpXRHd?)O)#|2>X#( zs{o6t{0@MM<5$=6M$U8XMD+-uhMP-EZ(D!k`dZ7gHd)%4?=lhG2FU%wAh$$DS(rB( zXRUC+_u1%WNYRqRoeIQVN)IvN*s8WlvP^cMRv0BA4(g*M>m`vyVCc#o@c==BvOMx) z3Y9|txQYC9xtD4}9b?f>iLyxGOcC~1nF_LPj%)Id?yehtly6U;tn-V-(_}O5w!rCK ztDL-C&lK-=qfMgI05@+lVzz|}0*rMkhVj0t&P5%HQmj-et}6EtxcahW&7mTD#Px$n z0dRGgjo;Z*)ijg>^0vVP$Ivjy!%T0iE1pc-E4O4zelcbq{M`%ZIEY-D--WJlVHP~3 zy3t5|DK|MP7D0%kV67uu+mxWvhgC}JX(BHa54vwng`)1DPs@D1CBu1Q$~>yN(Lgqo z=q(9?$1K_aE{1)dpz9!a@Nfi*=xqIfHiDj4+Np=-hJ1b#Dv1rjZdbzeixfIft$;YT z`X;tCTYgQJdIz`Wc%6lVjuEP8w0RGlWg!+66C{ILNOEUbV?Gki!OcI)E3#drx#Szy zWLS-Hhv%HK*HSQb{~qIStu6;+qpxr*=h9!L0oPlduL=z?A>0vy25CLBw3Xm0-T0Jp z8RSDuO%QMeLUuq443jNStV3^P1xfivi1CT}8sk=Ww?>vsSV1%1fuKLz?S^56?j zeLqB}+$RYVyAGGkv0$FHg{exO%d_E=WYdw~nDmp{YNTui=b8msF<0I~PfUg{fbtso zsWE*OZVo$2_E!e&k2422%F%UNs+^}~i57;l5_8z3KGFHhP=hQVAF3bnMnpFPbAAnq z)S9&AN^)0UBvkg_ZVpritNJXJPn!D}W@BFOu!~#GCdaDvE)yxkbq8SlW1+;C9;a0s z^{gG#A`6u-p`;TGl9{Lc(q9&M>5-9$MT%9Y?+G?r3S3u{zH=@e{cprz0jySx3LaP9 zxGso!jD3>o*TgQ-D$4nRa^gHVHT_PYV-LA&{elnto(FCJ4jIXrrJeD~zcZdBQmLNC z>ed3&f5H+T<>C5jy|x!b=Gbqdf{;_+I#d#acW^6CjPf>gQt+=wgL#<7$ZN^GJ5ocZ zZ%eViO4Jjrmr9;|&0WS&xwc03tn(yELoNNbG?`&0E%1MSqeS)H$}w)N%ZY2Ow6m## z>T^{aqCXCXIz_UY+$2|XMNh%@&~r_=S86w%uC@*DwTzZd{Pu`Z@jv%{hZ6cKZh4F* zy6WzGeN34_4m?=syYWeiNvDvj^-L!|5-%d%>mRu3QQ#2;3s`vP={Gh(@dRPO`YC9=klk~!@WRWZ(j3hu&oyy1NCfwS%S2v z!zkwy(Bun~J^>ewU~kt3=rOTWKm~s;-`s<+5;{Dk?1!)Ps1%)~?Lr4Y?W2^x3sm+Yl2Rt9$%#P07hqoEBZ~GD{-Cjig)F^lK6HUQ z)ftlhJwEe9f@F+ zu{FwUYlv3jSEIf;fF)n%7KiMyoHlgeXOZS8(nyXxSmJz`1qEGC{|lOpS`q`pdlyS; zegqVxq`lnJ3@oxzRD9P`J>_>NjfP#W zj>vQC+h*i#B7%f%s&_q`2kApKXyCK4Cr=s^Z&?{O#Tx|JnhWU;{6XoV9Z9p7ZUpp; z=cSX#1^3e^oe1{e;bgaMF&BTbINNFhb?D%u!%&Ctcz3!LYJZ;aurZW-seG~*x~)&h z%QF-s>(B{3RT#U|;~FSy2!{M)wVP%?ys^J&1xJs^-wuS+$-pyB+iEwh5UaxKx%g1o zwvy)}djbBZ4?o@}7|a2H>PQL0u<@vE=>j4^A6?T3)l=SwxhW_!+BBV%!2qFlg3N79 z_-l$Iw^lC$F&T7Fcd0v^4pDJ^Ro<68Qvn{>KxCuP_ z_H}I);B$qP`^omEV|cbyj`PLdj9!)^xD*atU2rZdl7#VRQE6C$L}l;U0v= zex~(=qEpCCl*KjS33(O!PYtV3cfxB-$Bu3WHkB#}w5D&7+p5aBENg}0d%YXz+ev&LlhH3FG24Q6 ze?l)jCEB#Ue^@dyhV5@$rumUSP!;Dt34?;ClK+jix^Cj64y&JO;|)&l=*FPM>RX3Q zS*zE)DbvxK-vX9$z#-H?VVCsmNSis<%5BItV0GAKxkp47&J4VxF)Qqk$vB$r+cp^H z|2e5uPMR{cZfw#`HyGq3EktQ7(KseMLTNA3%Qu+L9ZT_NkKt% zD64_!Y^S+`key{&AH)erbw$IOf{^pEm@B{JZUxrcJVYaS4*oyeCVlyA=@ zZVxWY$UF~QYxs>bBtAgTNKCmOTD;9do8RAmjwa z5TJ3*-ra%9p9@}aWmZA{Q<>WU2bJ8_gGKJfZKVjy<@wiiN?ix$?xxtPFaMJ6Q!|#6 zVE~u&3)ISc;GT2q^f>xAb(M*28o!<)0He|=b)_?2>7po5C60~w0#9~bF3VaN;TJ6n z$!Y5vpZb)L{B&JM({sa$T}(g2fQ+nnCMnWy_82H|!4e_7YE%UM7^}G%;@L!YovOIZ zEpRVi}M&+{=p-QZrW%9}0now zq-ItzdLq3bNh6%(Nlg-B@#t0}v$&j*Xo5@ZeGG&O^;C3_}JJBZ&>D2Zle@NJ9O7O4Xp(Q+SVz$ zs#>=)TY!$E-cZ(+y*AhjRVt!1&D>4$qFk1gAZabIffQ(4QI;`?ze#ZL|5JSI$#6i% zMZ03ktcXC87m%G|z-wbDgItRU?(s1AEjCM@%qyOpvTrwF(__l7v>WE-jrerc=M`8} z5w90GOEW*xxp8z+mb9C=yzYjFobre5af`mzx(*h?!lBY;(h&+Av7jrVg3${*+k-W- zF_(UTBR}9dHoL8m&$PB&VNdnnsZnQVVJ%Rzxy!4sjwM zrwaXh5+>&Fp%s(c=7M0*HaDRQ>@}SI?QeB?@Qu=_&nH)=%|TY4ba0P8z5}?>wbD<0 zqGN&6pc&8gNuhtN&E(nj4H;Z^eO!w=TN@Oxyb-*bZOv_Hj|@e9^cmvz>S^ng?lk3I_nmhb7cda zL#C07xX`d|*7F=VEkc4HbBIw`d{t%KPDN6bu@R=0ICCkXWS}Hd6A? zyJcR68L2$M$O=Ck+Fi~k0{AB`d!@5P{MB7b*w(7*qLI^yje+3`+^ME&Q-Zyhsq4cQ zxF%^v*oR^%r!}ORw}9Rhv&=yPwLeToS7%x%!??Ok65EPGvBN!GT+BGY==+W zAq3m-zmPgscy5aN)4P>8jgoaetJXq}Mz;EUxsg$bb(Ta!pW~b-n1H^&7s|1MkD;@A z2Q!1h4!!^cJfMJYVe&E4i$dU^ie>6&O)g=Sk&*hDL-mv=L9VN!WyHGF;~MHW%gD`a zTKr4Rm;X9-xhT|^JlSot7PV6|f66NBDUNf578r=Z=8Q5*o9Pxcn4nAOPW=(r>!z$C znbuo^g+1G?tfx&6Gq_ZE+oFKBmzDQLe9D>VNxPu0@QCEQ1)&SCoIk6DF+>h~1MBZ@ zn5AYPMV;k8a4;YRg5fHzdZxk_(SaEmpC4M{7zIZvaOCmChdEQ~-YQgXb7?arFu=fG zP++n(|GvtMjzUXID?sxK04*u`2octwZBwc-)(m>Z)*aXI<6y!A7L~W>eBGI7@ufAh z&1YS}7ynJe=HI0cN`mO=@J}n3RZ^UEC}HI71`sxWKlE0M)P-jgDM5b`iIo`dX<*R= zHIk8;e%uVX7kD0Kopf)8t};LFRxOm&qF~8*0u8TbhNY3@bk(Zi8tZ;_Y(o7YkQYX+ zlG3dMBiH3i^mqWP;1K3P`ldX|=HVV_*VxPC?40gAaTt!9&V_INXAcxGFv_0@rq;Dx zq@Mnx68M-!R=odl1@XGCm2$!vP2C|&led#-#y?;D*Gr0X)kL~9dtH_jnQNO)Bu^8!7R#DY*4e((&jcTu$a5c1imYGJO|%$BOV zorKUoQL6nL#!-pDM{B0OOn`i_vR1lfxFWH(zhU}v!fRYJtA}lz-6h7|r{;!-(SSF- zYM@b~UKo2|aL$Ky-O{*?&27#}e9xX$3#;_S@J4YkPquS@(X9({-Y$3G<`F|)_CDRY z)R;FF9rBZT@CjS+?-Q$d-jo?%f`iVe(6^@4Vv@7B^@&=u)QO3|vYWF^d9gw+Wl1Fw z9y8fW=1UA16x6HAG*Yq=>yfTy*)3IfpJi}V;_5#G3w{1(lV;(ebQi1bfdPHnkik`qsUg-#@@eA=;ZRAA*ZfW<5gM(E+~0s8|fNrN;q%EuJaoRn=P z&qfs{DRKUz`9O$i$J19OyAP(^w=@1C9bs+#!7ANQEoM3A$&c1B z(vm4?w5=Utq;J)KYq@W@^cTtLY4|RF3U8)(+FFM%ZLD&rsc%PCWa*-J(PGzM1`UEZ zxtl74Qsd#MNb|I7VMSuOnsFmH?%FSf?4Os*;-&o^(>M@T7UzJQ&oY7AUZoZ}mGx%& z+j0vJnFO;k5z87}qrjrxxKxHSIHhCxUTC?><+a*@NkfZu?VgY<5t{Z0gjN&6(}4AE zUGww=1D_Y~dHgfFPGHE6M_2tit7LN2aOrqLoFCjwd6_+}gfo%gVGO?Y2$meGIHayn zKYj6x#@|OyHE}(`3*87N% zhif{{ofA>p&S~>)*e}^ALI!e1cwNmItkvssfM8gvngsPrp$X!fAo9K3G)QO6x_Tsh zK62lQ0}y0Nv)gPVRwg}Pv`u4Zwvq3X(Jt-ic7i!Z1DeNqM>7@-zq=#%UM4=|9reUc ziRW3c1$|Vii3nZahWcse z0tM3pP)_q7?O22teb<~G_w{eJ667_4-Wg)vB>u*Ua9YS^>FCMT)BZkaG;bZFs^U(p zm!U(cw^L4Zh!*8%4_ln``4(qfrbSsyO+@R}eBG!d)In*c8^J{?VLftDf8+EapVf26 zv$CV3&SD@1D;@o8N3;c!`9_eGFYl5PWJQqWtD7r-#^tlRLX-8?IFcR9dqqcoh+t~)WqqcQE zsr5=;I{1=+h6ly%#L(~@#x2i%oNWe%7g>}k`G)eoj~MHvdc{l^j>$C8Y&b_`Tg>w= z3Iz*qXs^EF3(3%l<8Nsxc>1*gPPWMwXAGxB%gmwO4xP(F3kkWSB2dS}QKbP}JJE>D zd%#e39QKy~5 z2|GCbD%UNf3e=7!96g}|3UnUropb}7sWB+65i%PS@9~c2Hh#^%1tDgExtnIt*)i`A z{ob5<9(TYeHfY$aU|Ym1xTD;fi*#}gP`Y~OYLb?u@r+X|g`Q320xf8=;-FAK&wNTR z-`mmLrqH&0guHl*O1N{}2gIsUlE8r-xdW5hF?Q5@k=jak)Wg8_u^mi8&UQ6>q-3ff zePOtlQK6;aNwp%L@oy*%>?Ic|5>DArTfk1m{USTcUZ-wGmzIJ#uXh|dm-h%mvA0zTCkGlD@;Jq>k1dk4@B)_k`3!5l0jRDv?rT`;2I2v*^&UrxzM| zyqYox#kox}LBqk}a7=_Z&cwPL)m*T^iq|yPGQHO@~&Yd#B(RV zqatZCyEFuR!>`F8cD zFQ&{XMxXIC4#Dj9kWE?_IuF)`IOJL;+b?y~b%;}-_>h%l9DAT3M%^RayrQRF4#4FVnb|s<H zP!S_DOR%!?4>jy+ST8?M)j{2F2M##%(CBHWZ#I<7IYFgAywzNw-TW;3ZdKT=t->RT zupMa5A@G&r>mgA*LbFA@nh~Mzog&tWjfgKi3d)R&yShqNXzrKYmLobn;q96oMD9A5 zAS5p@+Ew{$<|r4yo!kQfE9sF8K^C~jkMGks73KqaEnWe@+-!6Vc)ptBrD(T-FM`n?E3D2ZR&+w$1vn^iV|Z{cq5V7Yvfkp;m%w_ zzGb!^V9nGTwqKI>rKfLqH8z>=zNPs6(^5*ipjQG4a;o+l#>2~)xG+6hv8yKvz4|Sx zrQ?;})m~@2VYDvNr`|gAARuY%W?N3aqYQwyOXLKNC{Jf>>BgGxLcW|)r;1^dO!UpJ z>LGOYfPXVnhGM~t<6sg&RybeWN^Ez#Y6DET2-d>FiPG7vC4w_`4)3bP?-lRyTH-V* zcTtSr%wcF5GHY-Q#~?|6n#+{&QpG4ARZPw!taI)!G&Q@`IAU=QT{YTGX$%ff z2N-MKS{Gl7^KYR@{X=!1J>2 zYOLTp-VD={rw#Tl=h#IWF$rHvyVe`1`!zqXE=Wn!hws89#lzqO_Lh~Zy>`eNx2kev zCojnQ1pHEJPg=EQQ8K;qhZ?Zxd8QvC{GDZTeTXrUQ`o1;#D9qJc4m@zh(l4sB^FAT zw09pOtj)4Tr*A7@6Zf8-RqWp3hd9U0%#07a$qPxFThw3DeJW9++fgGHxmbE*2Z$hpEg zRBj&BE={h-=4zi}HIZ{(j9o3%a}qXzSJgaZsSZhS?hQn%hfoq&NVOnSa@h5uCd=a$ zHjH^7yC|EK3r+jFTJZ!;578jzvUvzaaD^DL9^z(fZUho+QStNm5A{xMo(K$R)(r9x zm(gqv1k+eb-dEzN7n{6qYj({O%KgbBVtsu-$R=JsvxllVlqBPpVpn{ka4fL-TV4f@xmTE$3x1tqiCbU~Mih`2gr5y+;j*~Q6BSZ!A%LDypjhqM>gD>*eQ zzJXPui#jwp3wiR0JFt={nOE!_H&8O<4Lx8MkSjJ%F|IX(K(|j#(#XFVjFHSh8nCx< zspO`NrSGQo3eg}WO|>DGsR#jO&zq{e;UXvW{#9b@ei)KZG4a<4kbekU0NKJCUNoeA zBzeWtGSXd-AX=ohqeqwqsVen|cKRbn;(G)udAgz>saZl&<#3_-ky;7UJG>sj8n=!$ zo35`%!oO+W+(#;6G12FdSfh!(RS>%ZiPVNz%3>+9)ROkQ$7&u`k^*NXnX-b+#hBuF z4ZAd{dKS=c=??VB$r$lSeEekJd89#%X${0@?=O3ySm<8O->|NEEVy^oD9Vl+dlgM8 z&OT}nvyi7RL>D5_A6+bcXAvW&`FZn4m09Do(2`v?wnCh7%bgJ$J> zM6bMjMD3kF2ph@9?EZi=2{Wn`{~+qUV@>Ozj-nbVaN&aUyn83L;oed-+`IV?xP=Ca z6?A~hxfo1%B&R0dP_c}c;|v?`)rd2}td9=g{TOp)Ldwb{i`ioYx1?`KEz*zm2>Gz4 zR-V4&6`2u_o$E*+TOen$galy@na8@#tW#F}7(svw8UpzksZ+y!+G+jd{;gE*3W!{F z%h z7@7i8-Wo&|XAdi~qbA!wQ^X!?Kt>zt!bXP$Z9LXZn$@Uu1d7L%oaQTnt0_ZPo3DDI zOXNK0#A)Tx*l+l>QH;m5JO;zqaH0(#LnEG7+;|w!2V@g|3^v2}|Hp1i!~NYXqWuXN zGNPMEdCF#=K;mB~R*WZbucZROlelF0v=N+V5`3Z?UWk=>MK*&c@fbA|WuCwSGVG%# zjV8mczii6sw*LehACCZfLO0g0hJx(WpV*7w@Vn<S% z*78KJTOx02BwkkjiuTQG1X&IbBkhsNvM07|9+&sE&yryG7D(0I4+vKEWh4 z3TNP53U8B98tkd59wg{#<=qD@_yu8&f|O3cDp2_J)84Za^i1j9%amVIvzs8^&Ch%A zoG-O^SfE);A&$X9l+%}v5(RR^S*_6U1H=6RGnD&z_cZEl9xd|h9TMNh!Wj(pGR+w7 zCF$RbG59CWax+}4BAFU$K!T62tFp-A9``EAJC$BGY)C2_7{W6qwP+m&8 z4#^(fyZ2PhJGI-iI4a6s^~Qf56-d1ghWkrHP7AUinil0FWakXMS)_P9jOy)UsSUM@ zZ;=3-79U!wdWip&<8`7G;UL#0e13Q)0M;Y7G zyQ!S`jh5mZ<8;Dtn2J1xjBUxu!f5!0*kh^FNND6T2`1fkadrw>aTHK1am;Okay`hfbL!(%6f+}DjAE!9&iDJppLKJK>(61%JEyguILT;a=kmYK4IC|c z4$acz-+_XKh$g7yNaNx7ggAFrh?2`uCKgQ5C1)Pg7N6BCZlq$D>bq=r$nj~9>B)gB zW`l`1Vux6Uo(_fMJ8da)%K$ir)yFqf8*F%~hajiS%<}>Ws`!TYBO=;UgU zY2FPXhF^M8hbC_EzPUxxk_dv-E4>UQ9ud!1wx_Z_UzT#tlD(848Hk8XpM5OG(u7L<3tcRQY-zF)b;ePL8G;^lg* za3`K%{z_N8=7-po0#b;_R~LG4EfqT#4kuq&xGU=`>YFko&uyiho;_<>`6`=YndiJD z0DG!Tc~(BbxFWLDcsnu^wTI4Q7!Y|LhZI*dMS({VP8JNR zMLfp^yVyuim_ML~?*Zwa#$ryv`WI}C{41U%2qkn<|N!ljG2W(K41 zEcspBY1g^im*=`iyXLxjg$7}^h~(5>cln}GQC&z-NehNPIP>L!oK6Ld?ug2>bG>UR zVR-HN)m(zjbU#1K%oovXCp3abD3%pZ+Ggl9oUipw^tI&>cePv5A@LTkk3<{uS4Qa> z7{R|B7Xh$L+pgw(*cH>egu58qlU5*|@L0qa&+UgRDnYv3Rq_1OrO%Co!s*d8TdI{i z8g~~9n_p2|(o&vpsq+ZUQqkhh(vPR}d3J|LlQ|I3()fal;Q4`C&t$zb3f|3*OM zZjIjY4y6w9o<_EKo9wD9BuRjmh@LDcb4YW+1$ns#$ur%l0I+n9{u>3qBdd?{Hb}5n znNz!zirv(dpriC4T{w(`Y*KZ4dZGLL)!*k#+E9-fwK$t;hVr!((JSV$(dE`lOOsnO zEtR*`b||i@k52w(RN4b1{%1u$IyQsG4m}C!5FgNFuzljIzN{Sbh3XPqnCOtZvtinL zS==$_2Xnh9i{NT;wvOF+1jBMO+%wgff6`N`70-!@Mv1lcg3LSEcUZau5z zh9=i=pm-UAYr_OssO$Xy4B54cBka#@!bWfFX&3NGh2K%@bg^2Fi#hH;4oD`?H*gU#uW1% zWt!RS{7Q=9oxOr!mOFf5jUH+@#Jdtj@hs0@7l)FExj~X4uG#U{;&w65At@PiHXTuZx3;w%J!$DSR2M9GQ-@qW>Y3bny{PI!^;g? zl$&y=YBclPyQbOOyf2?ixP{Z^nZsp)S+pO2R`XBL(L;?{Y}{0D-}PqgYRz*W3%2I& z3g8`drw+)37yzxD_nTne&S*G0`qQFiOtO@FN2!s5jMqk*?Cb(fCZ$uL*%XtPGlzlF znU64Sm}Pl5`vqpuIStad2x$Yz+_{i9x$^9VjxsY6U4+xH&RX=(ssnRegK~Wc4>Jkj zMB;>5AxQ91r*&A^zDrtO;7}Kvr7||>G?CDr)Qz`G&5CcFT_R^m;OA%dLVHEKPg*y} ziJEv)BbTFL55n(xvh1Yv#HIJo%7VgOPB>>u#mqS(x%gJ5n3LPaaJI-5AzePV+)Vs! z=eo{6-n`IsyWD;*43!HN zbG4tbB|LXU>m`^|I+IH0WJQTNl=fDs_Ybi*1@$u(R7yD=;>}&UM{1@Kj3p@b$i?J{Xo9 z6*w5-X=a?}n%0d?__>qvZ4aZ$E#;*fStWVh**0Qxgx3&94IE}(R^GLBdzRDPVJ)~1 z-gQAooc6lhOL5__iG`kj^%;}|^LYAOsq!GdL%oZ;PdmDw*!@>&;B(F=P+F)It&N0e zF-u*kl2`7%ma{IMVM|NbMaMvR1`nhwCGVsgE@AlWYMR=+ZJ z$dvHglsL)|gkG`(DFu6P5EPkRMzD<3p#E?>=u6&>ggu)c{{+6l_@g3TpoHO`w@z`! zuNq|IDn0?4E9Zy%{`;=&$55U!rNu+LDDP0mx{vVIaA&+6XJF|A3`_5j>mqE#S4lvZ zluj^H=*}g$#|MFOFLr5{*gH?IX&iumADK}VG+(HoJjkrnDE_%85ed$uS0E+)58P^5 zN}PXY_H}UQdG*lzAeg4U!Kuy`R}|zn%f(w-mH^nK>2S z(rn_$B;^M^irhO`4K~~(8iM*a_p}r$8TjwW?qezuCFPs$6I&V{o*4FUD3@xIa?@j# z9;Z=+&I)!16zsY*9i19b92Md0b706{3GZ53Z6x`xiOT35^ zfm+LrZTt?>y{Ln3@Z2s@o?%}t`Cg<5i98UbwtK?qlNx(G86t?d=9hr9sN*e7@ewl3 zI%_#4ekL|unl^s$K%L~g7~rIj5#`PE_wA`(y%sg^ccRPL+D)I9J&ItRXY(k1Ga2=! z%}ydNO?%IK^#R+JaDyGAMrkHbk}weF7Oy44C_U={%sHGKFj0c((pl4#+*G*24GF}Q z9he}LT*mYbBce6j5i|pYhBNX_ZXKaqjIFN26rU#Wwxfvm!01+)u&P&9uBg!^?Nh@G z&uo@ZT=@>xf*=fpL*r){KK2p59@lHT_mgDgQr#`s8@+eRp)l`BM}qI589Ss%`OeO? z-bg+tbd_}wIU9P(&v%1xnh(&a?+<@BZ?a(cH9DF@3ijnbjb7i)zJAql4W)otn9R-l zkx8C}8yz`{2|&|5X+C0VXhHt>^otLo0~BHW`=^b|Ah;LAK zLL0|~t^E*KPCNQFVqFNmo{>-J=^e5A%`pDaY12gV-jm+Z^oA5UBRomUCy6OY%4gJ_ zXIL5q)IgQg{2cL0fmkW8wlU;|qcoM_ zzJ&17d^7tR;C@1%l7k}56>ccglp;n90*0}ut}ez$T0%9vaTb(?{21y7_$q~@l_$tI zG^j$bEr-7>sqtoCC7CysIaTPWM7Q}FYfa7XSKC(!#aZLET=GpvQ>7nwzDtd(KhpP# zS%Y#$Y-_wWFxtm^9LQ{dla{$UfvH-{-_6pNNjc^1R_?T6v*O28_i@;VJLCh#Qpj3) zTDvJsk!2!G1q8QMkatZrKQ>#xQy6w7sKe)vQ{0%t%!T`s8M2ZKY`qvyP}Sc+2lc)X z@N^bWu^QQIoN6!%f16@--5AOPVfGR4J9YRAFt~abM06FLJH7-f9ZoRCrB`VrxFBmz z7^$J9grSn$2b3az+&FoJH$~!r!Uj#7N#jD1ZU%X)+*l+|+6SqGTqTV~%0{(uL`+b(bsv)A4W;_=vz z4E0pA8M7w~Z2!zWxKB>2?BhI;$DAWZ-*wt57MW)~W@<@F_ua<27?4xcBvl2oqq67~9HbkVTU>+uBPE=V~RnlvC@mkaJz7(Cn2wC#T?^ zJJ8V7EN4ir%LLDL+QJ#Er4v#lSfTQ|*Iw^lI$)4T*r9hpnbmwBdAeC@070^CKc9^0iuH5AlQL&^~tejs+V7M2;Wq8^*rP^jB2ReT)2o}>A%*^$# z61PAw?L-WRLybmC`L(u&mh`y3nW4`e8w5}?o(LIotm}prRM-IKltadE^gyqketH&y zhZqbwOYTWh_J}Xdbtu~WU88u@;X6OzJ6pPsc#Nf`NG4p1gu0*&@kw1u{Gx6H5s-OZ&MmnjVd;-&Z}2jEOQO%My?t z2i=dFR_V5QhHZn#`$jyhD{@kNKWb|Hc4@>#qCn~Wiw{w5Jk1LxzuYH@n= z3ES}D^p<+@IM02Jf2HPHWz7p1x?Bp)3`8_wtj#ojE0k|Cxejefuf1)`X`eqJv7-CU zdgJfdLMu~W<-Ri`!m3Jn@BzGlQ^^;ZAZfl2DNS{=17xL2dC38Mez?(|lymA!UQS$P z2YTvh7=?M@-ajTtI` zHvdR)sAn68rvC$TbS5=CpCp-r@NJWRp)zUnh?71L~DK&_jV~dt6rMgZR=bCMo zg5T?46f7Y4K>QArJxs#vcY1@FYYtj3ZO|VajLZ3bJQWHKDhZ-y^=Bp&lxM$&7$iD} zCo1;vmgBxHXQXB|4+4*vGk!CvDGi`8ocUV2m_Iv=BK4L;lxmoU%E4uxi$BuD*es)F(r7#iIe}}pz(uk85pF8sbsNOZfOtvkJ7bVeBF!8KKuWY5}WKV4bLgA$xJE$ay z=UWHiV~FcJsS;zTBu`|mojcB$7US+1!+8vZp-c5P@)a|e85P87>ZlT$GwP@kOvGr; z+w@vTYL78|EyGbm7&ePi5Ug}!bbvw?;OWE!XYX9Jy9BN8B3ftI++TL~0M;AG(%(G& ziXi;P8N+yzk%Kt8J_pu2XB@sJH&n5nShngBE*YtE_tz#5cn5fd@KTR3vL4o?9L^`a z&|gEnRV0ajn0ur}3wM1Q?jI*RP`<1OFMZsfJ2+^76_qz;XHQ9zf5rz1Ctd<=+Ec{@4Wly+Z;_jIIS za}hYdf#yJE?^2G}Iz5~o_&kW;OO1kt@$#6Mi*rL&Ju_<}rGPaTuBkI>0(BnxvmSEc zZClV3i5<)ts|C0TyG<+N^)MYl7xCAI;rzY2$D|1ES952l#QpPkYElQaMN*C~#?JNMpp@r<;jG-vTp&d>y66z7lQW;K`#S}&;J+0-PXB?32gflu8E|4eP zg_jvuzf%)&k9d!sr%#CdH0A@+!>DR7mfj;BhZCFi3bhUP2wze!Z%c&9x~)d^bSQdc zJ6LMxE;H*9?AprRq*MF>;eqO}wfb?B5a1S0ikSJu0Ykr4sh+kc1 znYXTc4~*5h!jGR1h`lVWkxUNI?N$E0&q_)qDn+Q(CSW|iTW`{Qhi;AcmODE`q{&G7 zElqxcAVE4D#mwoXcYli3NK=Ly%?gPqN5}#_VtPPsp42jWMA0y2AF;b&hr6}N7;G`m z5nIFSBu?m|U!g_3r}%h_<%#=Z3}w0sF8xql-iskpDyq*+9n0i2uFLv|lzayC zXuQ5vn%pW^D%5+LZQ+`u%^Av-)dqD=b{&YMT=_SJ3&qsQjG!pB5=`AN?|{9n3dhpL zuCI|&x?-S+bKPICyjBrnP}y~XVgQ(!uhf-}l!(1JAZK+N(`DE)kBgItGcLt>hjg$} zwNY7GY*syR5A5pgjZykf1q50vH zyZf%h5G#b{Z8@LnkjjlgC%mVeo3#XcfV%_AMo|-s7tT4ewRI8vz4VOmfu(@vrIeaW z9~Utq#d*q+EG{4)r<3u*k&Z7i(lIdSe)9vp{K6mJaI}l-_KJ|Pyhx+K9SSc-;KI%! z(=*WrXzPMX<^>{k*b_66p02VJbqKHa%@rE^aq3!DjN-EC=~FT~hWk5Rhr*5eYH9Mf z47HSD#`3veyhA*T(JY*x$rkt4j8bIgh*7NS6)kMu7gt8i7{yl3{M92WHM`ePTIvw( z+L0o+LLi#fUi?Cb>|G2{9db24LED|XdRqEG)?U>k=hsH`h{jdvWZLeL`Nk{|g&@>i zL~5aqQuessyj*)>W`#CF1U#pvc$yhz5DV=-C3iocQD$4j^W@H?24kCNfRb4-o005_cS2@X)1_?$y)JtQ~;^r7*Os&*_mDe<=!%#0!+HR=PFatWyOJ%FC zJv?)gK15)LG5Dh-GhxrG*NfKf%DW~GFvDoS$lV%z&Z)aQ)AK@+Rkw_W-)`OF{&pjN zwkWy~^o`@d7R;U75#`S7F3uC%7>%g2L*`yO_aa;sZ!f4@=X%8r6eul=BpE5q1Br2B zI*n1}zU%ZqoN2>beOknOYSmjyz%CsVprCg93K#W-#>^;r8kThB0BTbzuE1YQg+&-- zxF89xzQJ}GBxzdc%~wecBRZ*A&U(SEHx1K#<^Mj=^NG~3r?-q`_^47i2B8LhiyDi;X_2%?%x%QYr3jmU!VjF_A4Mf2 z_Xa=JV>BM`*HeWwfD70H5gL>u#o(K8($cFvzFe{V0sNpZQ0rhsFZdpT^Pef# zd!YN+@NJTPHvP(0bxB%8gQIAQ)B`B}msOhU^?)C3z>dOtnC>)|m!1U$VjOX>Y*5bb z#(sLO6EBlauctV@kvxPGEyIp@8YXVgNRK5zdjK*%@-(DlCE9x^Pd!;r-2)m=v8S=X zq^IEgmyR^|RAXd$YVfBO4^MuIIIMdJu1`nI&S_#s+`G8qK5G#KmlEkeRI#DfI)Xq z%3X_6?#;Bq;bsNaE0eIFY5=ZeZAf{5BsDb`GfbP{N@W)q9xu%HXK?p` z!fwMO*)IaRQHfQ^>w}Uc40@^>9jBJw8uoUniEvY`<7rhoJ6{Q#U^3!r4?h`{u1nws zTmNnt>Qmf|!%{aH!XjZJMy-*C`oUdFL0ZPsNc{-Tl%^B-F&>=EarPfIAdvA6!*Wkg z?P#EfCGGf8)7N^t;g1&jl$36wPkCS#aGFl-M_8AAS6qvmB_u;puf(u3R)>qM6E5QP zNQ0qEx~de_69deB*HU;Iyiu6Xh*?LB#vgI;DfjflkH*JFabw*|2{NkOk6=4IBI?Jg z)HCMHK=Y#*XEawu@~j#>)BJ6MZFu{0C#xwqndPTC@q_Y4D9Xns&B16v9Lq?Gw zdqE)2U<)`QWjQ~XQLvp+vCNYTCmjSZ?O4`zsc+<&?iEw&WqyXi<@WQ4vHHVXx6mDa z*u8d?GsD1wp60fHGx$c+CDly9b+XYM;-KsBEhtUiaY*eMp_DwYEczlTmqX-#Am!{W zJW=Z*Y@_MkeTYP|)5H>YsJCMd7r>$1MO{t90j7jwPSqSdE`iK8+s2l*|Uca za%*Rwj-3kVQf!4J&}ZUE&+y_7`MaKJ9z3SrFP!LLV%31$&w@Q5%)8zP#ACgO+P6#& z9(bX8M`n>Z4&4^__4y8s-GZ8-L5A(;l|&FQo0O3*2KJ%0JkJY)x<;R*9_<#>zH}%G zee((NQ5Z$(960LZsj}7Lsi&Zi@owe5Z^P{3T3)MC651I5|QK?^I4)0~y)>3Cq zn)Up!vh-(5C+&++Jb-3N-VMJr-REE@J>#q&d+mAUUk0Hx%^V4bG1KGiz}Y&LQZ5i1 z#=nL-d5LuT6e7Ro-^3$Wy11hdM4bClBSq~WqcNJ&iS0bBBxTyE9AiyK94I_ed_G3J zaKGQ9aBCpy6|+RQ6s5;QYKzr}3d)i__lWXXIFI0`jOY?WOxb9~dH20~<4)#fCCxx! z_=4U+98m}#e!G_Hc=o@)1nW){&nsU0Zh|hwx)c0nG;(NQJ+ZP0E+L9M{Pj?SX}Ce_ zP?vzi^b}*KaDeI(qMNB?Y$JhChZWD~dZ?=6oMs0+R3(Mo9xB-86}?~-ytd-1A>s}K zvwSz&p(=npCos^O zTxv=c{v|n&6|Qwo-#0hOgJPbf2&`raOblDiJZaatvYu4iYsIhFRSL=;#16nG=QJaq zPj%X|nKFeBISrdUlxR8{LmRLqT#w9JJXJ~2O9a(YoKa(?p)-ww^`Gb7?-pM;C*LAP z#ztcld}EwyI$vxnZvWtfRW+lsEiTEWPQpWt!W+iDx8>|@D^Bc&Vno;Q^Z=C8Q+|45 z7@zfO+UAVjP_MO<3@@9)#u^W^I&VLRn>+PsOlv<=T^IGNLoG$lTQcO{mP-HAo2TrO(kMyBT!L{OY4$R%xmXb&2tU681G%f{O3HxW4(eQ zvcs(@HxdX|)amui9W2{BbPE@q7uhGdp{=D5w?%q1t)-diY+rTT);YN4*3)Qw4w1X; zvV+sG;TF$rWNM(Vc@S-v!s9@=uA90$BIb=puG|@+ReDo{VSZ1_;lOhz2}Y!FeF0Zp z10N{Zp(iVM=t)cXSYIIWk8_NOIa+v&^RLBA#xwW@dY-LiqbN;r~q%s0qPxM)W! zLHHZ>k}I#iTV?dF82b~}-=CoKm zay)vWOOaDbS~}mU-=*AEhpHz$bZ9OAwG@<&>I@+ zbwcNn;Aixds-bcrD9f1tj`l~gHYor&{QJs6r+tW+Uj zQm|1&Tx*dr4(pt!{UF{QF2QzEVf%>x6s@aeXinQ75s_Ki>+k%`;qfu&Q|K1Q)>qb& zR0mhoQx|SouSLy}Zk!s4;R&^B+of(Cv)f+MmY~PgnUIP3KqAZ$eJhM_3?D%%zA;OZxjve zj+VOZq^JE_9 zi4%?NH4o@9Z$bXhP4p?aDx!K8f_Xv1N)!A$rXH%Ph?V316jI|3(#Bdkb`&L^l5Sax zQ7=xUkvd7)Ti0pkTq&QZmQA%b&#kHH1lTlL#|7xT(-k8NV4WP}4yEq-CA~B?`Fb59 zoaEdmsT)x5ZD$&NOvQ-oHBp96DYMoHbiI&(n33CyrC5y{Y`Af1c0{HhNd`n*&|>l0 z>14gHmKVoT(L7D$c-WWj(M3reh+wn#hK>=GrachOCNRN+&vbTO{UO)Yyz^*nx!%%2 z2ChT$1efCx4X8_Gm(CM8I3@Ekj}J%-PaW@);fQggkMdLQO3HfO%16~>^;V^mVGEOO z_|oT8*?SJ9KAj@Zk>8M%HkBR*ay^$@dstcW{AEU6YrS<7>3X^f;5VpUa$g%DJc@ST6C1QE;=VqM2J+jAFRbno>AMnC(H( zw66<#Jn%Wrk+Qm#^hVt0${*P6--?lMml~Dm`Ffwj0#rC+3{d*kb83o>2(g_ACc;*# zk1GnhPs+zi2yy8cmGR)6_Y9l+rSe*Dt_toYx;8v)%b0&0cf+;~Uvso!!#zC*xRbj{ zG2!OUCYIjU`Ie!yWs-GEYs8h9E>&3D{D`Vi zxpN-J)R`74*v7ybAf?|pwT}6``l)GBnXV;HJ_|n|?KDHuX5gL-!V)k%bmBW9rq9I_ zECDkvN+uQ%(kWCIK`Cj)1BsX)ykm^>GQ&vvF>+U>zQ8d=SXR0u%ybNoV!GW*d8(g{ zn{9ulQ*v0J6Qo6xJnsosuaIqYjKiNZvN4P$4Ny|6z=nqJMj4@$K&`Z8uZi{*N>fwb z80>KB_RQb8pfL}El)=$~mhdN~HoW)J>=5H>qTWC6YTq#xD94o@ zpw$q^rk&sN@od%udwQjvBkY^Ccs`k`(xMk?koTWw_k^@4R|p6`s(z?>q`ML8(XD0= zWDKK6LrpD0lbQPUiXLjD6DpuiLucMJt9d4~v4lj?w|(1u<$*IK-`escPX@LpOp(da zhJQ!o#Bt0a#KM3O;kfv z3JE`|5fe(?FZC z9^#{Q0OHPufYNwj!MsE)V>Rx-$-a4+Ir;|*I@>OyuawQW4oX_9nN%H(aja?i7j!%> z;M8D9L4$*&JhfkpE4ez2TRz4JP4Tfa*De6mX;-kqyrMlK7g6|6A@qxsUkIOS@U)KS zZK7@`K&?x~1H3vEuD&=H_Xp)Kg%d>~2v6%hMj&Rex( zfHm!^^r%Wf&m9Q1a3l3w+}{Ev-@>^ggc<4yG!n(S;V|DB4E=scOP7L8nuxlshbi0b zH$l0$)kWEu6~vKZ&D zRAlb24oZ;;gk~?2V61j0#y}-3=fs(HC6t)-Z6*B1Y^IdX>Xs-=yUCB?{OpZkoPi3) zlb;*vohTVcyUm4j4yjM!u~efG;~*0tXR4O?b`GPE!^UZju$Cgvp~`qG;V|;R&^6@f zP7Tw2+f#GNypaJ+$OI z^nArw6P_{E3J7tYj3HLBwHwOclG*E>&lyX=9ChvmOhQG|_t~8W%CGK+@W^e|= zR~Qg*gpZJpc#CF!2xPA`k}-Y3BwQcGI$bemdUa41Pcha=fDCgN0ZXQekC3()#*U_R z@C^12wGy!-!KQji#u*n(CBA`aP3oEFU%b#z#SBJ!nEU$2>M3+Y>sqhLrZ)(U;pa^+ zyhS-F4I<7d+ung(CR3Rox*BWDD%oBjC=s_3%31s^5WVDtINH!JEVe+9Gn!k{FmKMS zRXlTrAeYJfmQrjolHB~vGye2R4^(9GYClg|mmZd3Q5J?t)C>_~6;mPcN(=OOg$yzRTIrrUy>UoR{DY zUmjI|5^0~ldPYKZr97RG>uS5DE|iGELg>76N|wQTYuTjF;NDbn%0bb1nx40=bPmjo zby}ZloKArwQ3Yj9VG2v|DC?7DCU?YGa}KcJJHbkIO2H*?r2fWZI@2_90Of;vXoj2s z7-Mf@JYD46Df74}X0nPWhitfMo&{TK(hUCW1&wbMWJ&Ypjggpyakx!L1D5WFeQ#6h ziJthz>0zbGaH>rVn4g+QC|u)9^UYaC7QLT0%rv!<6O_~d7f@%SiNS?G<9g(PUAQ$- z%#qv-_b&q(H{9`*E*Z}6w;U~x8XcR(%y#=DB#4=k)*d0CYWSWb3CVN3u}2zOS16nD zB=I8+v18}8k19zmenv(oU~jQPSg@s`NY|6B;3Jf;QpwS<;p#ey5$66Wg{Xo@mF}v2EM7ZQFM4TXjF3s(b4GiLR&X>0XOc zf|*aH4HcY}*g+ykfSBPQX*5cz$9AA6-6AGhuU*Dfd|+sbY4RTlMYpkiDl@C32V(xI z`Bgk2vx9Ihpu>|T)&!39A)bzqE}O(}XTAPzPROcu(uV5birA*w8a(6%hLC+A4@}1l zc4WLJn(*m*8JSxw=>;2ay=$an|BaHGICN4aBQh9~I1#VsN^#(HDHw{9RULm>hjksW zhn-z3UbM2H#Y+4%0kv~IrBh9QGES=kYgU{1QSJ zCj3G64H+%HhHajM)KHFw8f&OBUt(sAW0g1RJ-*<~Xq&E~Y64?skg|-hcK$X4*qrac z?kqH2^564RR)7>cQ?Ku>>J2A)Hx~(IG|rGnK76K9`rlmMrFq5Cz@5kB-(NaW)k|LQ z+?~Ka#j)A|?v1vtv#fnm*L1JZ?lvw3>jJbav|K7!D#tqmku22L_3#5vt95g+nhve^FkPl)#P3ePr~o-rbK4h7|4u1(;^ zYBLQE&N`!YR_^=nI5%?|%Q`&_AG3HW>_LW*>ooMXklQ9SR9L%7XIkix!<1qaq0TbL zmFJQy7(DOZjB(YTRpunpkvg0v@lPyqVm5*f3vcobT1cq$$tvw$wxh@Hz$#}aD z5@VfTs#ph-x#qK;ZycUQ?Cd(A_oBrOh~X~k6O#%Eu7(AtXy zy_EoE=6^j9=ycadltlgvCh|wZF9_qy*o;?L%B7tUTre9+?MUjrP$}-p029L}~UIf*>~?sUR$!V1N3QtNFD^KEsszgOEFfCi%mxupVmcXR6rokVZ`gBF4a>I|G zEtp9KR05G44$?vVUfi%3BiYiPIKbr@chPM@%u%>XNYC zVn&w<%j^i>j3ygc78uwCbcL) zRPfLR)P5^^H{h_$-dsK$ka+8Y$v*IH%$$;3M`c#;_o7cQIfj^ERBVGf+}O-LG`X@h z41hcTL>a1bA?Ogj@GGf|*P-nbcXXi{u3>+Iz287aPwS*Z1oeldKDHW&sVXeb z5c+TB<)2HwCXYOOx7~iBmCJEb77?WmaFz>IoZ0WMm}6S0Y>mr!?H#IBy(ji%WEKNG znyfWyLGa->K{&McYGX8oBn=>V&VFx^B+fgK9PzZ zr!j37LY1H5y}k*IVi}doYhE*c45eHjD6aC4nV>UhnS32M%W8>RQa5ewr(|VPZAu(t zQEy7^A}M&{p|Fb{f@B93`s^M(>23q8sM0fbbqQ&KTokia3;3VZ|oRY+bF+Loz1y_lOiP4oceky$KZ|B5mh zD{ec3|4&x#(rMqrIN4of1<`-a?f-Q{w6z_`a>#f2vz=_8YB9X-_MJ#xrv$$;_cqqc zMi2@Vt|k0pfuFtuE%%QOglBD}LM0@rBfVy(dnoZQa^-ANhJr9f9;ZGs@ZgNK&$GU5 zr(tqui=L-&knO*ilYvHpjxbbEeMvDm z$&7u&@uyz3`d5+9Z{Lh7>zR1IW!H{{y1ug>p8I2Dvp^>LMHfwa5}_L3RPCt9=Z6=n zYCE#wtW? zS{ythEmI9I`Gw;swZQfpS!`;6pjxhjfR$CR&6GAtX00GmI6$y9sHK6(4gv*?+C~Y3&Ucf84!uR%MTlO8H1RAoH{PmPFoF`y zEFg!5%9eyabsrCRjjaN2r*-3p!Xi{c7TH+gX|BaCStHGtrz7hTBCUKHLbnr0!(d`8 zT_naC4(T`I%{EFm4x>zCdfuDLc1_Ss7nm){bi}$KWvwP9k2L)6VHoIn<{Gj|?4}Xa z@%QkHRIcx5390S4@#%WOyZ*rFDX%xiyE&shGk_D7}b`eB*eO7up>-0RNu+?wof!{_n z7Ju2rSWH9*EdZzWQIh1brCTXoCaS-fdk1VsUuX`zP$bI0OcQ`&E-yNDa7~F3!`7idXFQqFlO)K?_ zhlIPMS9|>+ZUeT`0I;)3uOYv7Ll|6OCG#+XPSv5K7Z6?Y+}hNII;cj4iK z@ljH%6!k`Exc&C7lAMW69blG$8pppgVl{oHda}U7!>vMX5!#`s9gbM7U~CZ?lPTCp zB_DDm;==W~*ky)QwIh`z^!Atl+g!ZUd25LdI#~MPm25D>!hfHjcDh5;(n~dz85}`~ zAIIJ+RAcFu#!xp8hh@=^4KWH$!3@R-MpqI3*bc=qPs!|zq2?cXw!We0fUr0A-(vpd zN67ydahLQ3%lnzy2QqvA8J6r(BXmiiclri4{#`@ldV3e~1@$YiyB2^shB*!z2aRdO zo?wn|ir^Z3l}Zrmd6+rg)(&TT+?^I4&ePJGs}pMFecFvok&mjcjZfYEkt~Ho&aS1L znE5UykE2lL-WMZKTVrjhms)t`R92Pp6f1W6^+LxqqE==HB0pZz)L(_~!CW~^-<`wHl8;iwQ z3FZ&xQYw`!wAf{nndR5o+1kki;Iqxt|Jv+ov)uIKD>gPS z#ysXU*C1r9I@}0D#Jnu8mjOH+tG#F6Pn&C0#w=F~U>W{RNJvn?B&@Ff99aMLdDWbN z@#$-&uh-O_^|jvh=Ck?M`G_I-<*g!LCZF2rsZd^ghg4nWt=pZ5tEJXic7ATi-e;xF zFpjRys%<;=^Spw0#h%;qo<9$y=Dw)uAZ;k554~xcx?b(qT|w|L)bU3(rcL|JO2!`N zoX^u$W2#2`-WPe2-f?vvWPd8x6u-^aa{9thuixojUA;z|{ZL-L{ytv2caOa2tEK8| zAXf!dOwWs6m+!7H2HwdO>Aom=GOt%CU5K*H1_-N?-QI5kGAD+ePH}qkp`u{XTLSedQ7OytNoGIDf9f{J1#KaKeA(OAXvB#8B= zmm){LVJBgclSSFN9ADN;(x%7^6@a%n`rtCWSA_4MD(GgS33=K}_2guI(ZC#X&2t^t zb&d2rU4eyBv6YM*W4u?VKb4sfg;!cauoCr9h&>)XJsWN99K`jj2N~lcIUvyAyC>RY zfR3IOJwO9|* z_Rh(3QQQU1w=?7u`Z$99D_~p0c+XW-8=jGY3~y$Vb>1zLM#`q|$xMhG`niFm47-!c z0AMrN>on4IWq=-c1kLfQ+I3a=Bqq=XQogu|ddt(w;5`KfKV%|C^Eu-(om=4qNwtrn zb0@WwI)q#6CXu`XAP+_{8Qy<1a4YM|B_X-b*){MS3#Xa2zEVZ{20IWz7i>3B03jd4 z7s6uxJ73fpC8y>cuD2n}rWS>I@uYSOFjZM75YVq;GVMmsfA$_F@66L#EmZXAJ84AD zgFv!MAO4kFl-@tr1aDA?QdLDH#yFajD1||kiEHGNjl9kT?C{gtzu6! z0EA3e??-DjtV>BMLo_fdKSdb15pk1O?B?g2PB`L1h4c+TQHztTTj)VgBSwkNLhzGK zf^o_*fhS|DA!u^h7T<4;7ZWPVgF#jxM%>{hKh;aWQo-K2+68 zKGK6mj9f%V7XvUTZ;VER!N!#i=&bYhdPuY0C9yvXF;BdZP05mgn2+36)!+>a)}lzg z%CbH57jdkQ%B5g>^%TQ-dRh|LjPBEWcT*YjQNL=^|4EO_+lPAE!gV-Y1zwWa1B=p zHqE4XW;i44zts7_yCU$gE>zdfNlMXT*tSC+z$zxxI!@RoRs z&O-NF#Tn(#x)uEy@vKs<99n9e_pEH4Q0yP76U4_(J1-Ctt31Po@*en=AJdHLk19$8 zNFqfT(y~8)a9_-iT7)ue22(#<9*~?*?zN02^B809+S(J!CWNK6rX|4!&*LA zzy#)*bE^vcCy|y-r~E@#EI_3;%ks`NRJ#b140p%U>|S2kghg2sh|?g?8m5{b5Vv;1 z`v^3?nbG0mpk%DU1Ce75l;tZ=HO^hMAs(MrLfajtI22(THC*dgP&lWk+e2TXJ6+K2 zeF4CmNrRfI4*s0F%EdFItHy1>SFxcAH9O(7%;1||9V!fMms1vvhF31bJWG_Q1Q)3> zHtBe{YS0Q+x8ZdG&n3dHV!4lb^jj4iAeQIl)*hAsF3a-^;;0!KOEBMvtiPXa%T$MQ zy7D^eomPz5j2e8E`~w6tW0+|ay#eE9R&A)t6{zb2n@n7%Mi$$p8V5Hg0FUZH*atd8;h%C*+%$!NVSdrtZFet?Y*Mm4$7aJ+ z-;9q?snWp-esA*ys0y_I7^CX$;BA)2Z3hU3`RrhCBw=>Mi$?-KAyfD)hlRb;UUcU| zV12`Ss+fHrJ;iT^mTz6T5gVO1SLhba$fn9Ie5hQ-o!j8y+_hP9&EY3%{H0IXo2JP8LQ@|B+KQQ!NA}qz`zLq*I4E7-=1f0_y5UNm%fvBeB2>3o3owwU}TP5&)?VVTa@%lZToFAuL-A{jiysX|AZ#$Lwdp|u0 zbiLi()>leQH-Et!VZ9zCD11FU<{wX!j~4TP)%$;%lz(22&YN%Zdfk3R+7tMGdYs4T zWdBV0df(Llx;rR0pVs%ez09{K5P9(bI$qNMnln4i+5Q~=_EY-UL;O}{$oAb6-yhxg zXCg=;IvCj*O8dOlD6IavQ8+%7D95L0j_@N4jYE+^E*xyy(%NqNrZ|7~TKrhP{(^`- zeDl+-#*AQFKQDdN<;?ugJ+WPFjGs(+Lem?l)kr?IyqwD$VXN0{Td|JzRX*so@UO|y;1zPm|3Q=q~33+1!u49q0)!d+8L{{u@q0anKZ}p$hO-j7ze29`EMB^ zwa|XOTWEdBQaw@(XO+WzdurkCvMGrV^zOtL?8(6{xsGXjxs7&Hm@WYQdg48`m>(U+ zYZPM)8^%CsQ9nf?23t>6nW0v{UBupKJ&xV@sMlEg+9GHJ7%p=Iwk|dA`u5P@K}sj8 zPL4Mr+&}&?w-I)5U1R@Yyb++3tY&Hbqq7@v->$pYmEY1@VCm`PE$p$5Zm_{$WF3ma zjB@hJ$IKz3iI3B^EUTLDptwC4$iVVQza7J6?J+@pw?Yvys-45qd?r5m z?IhxF6P$?u;~Fyoj&y2lOljDMw!Jr4ZO4VKX09{fd#%+a{jFbVBdF=B5nAn%6MRyI zNnd1uf{pOL)dLL8i_UiVhHt8%NulhiJSp1x-ORu(JeU|g<3$;Iv5ovJRlFVioWEF| zT1@*>7c~9r$Pa?e?z9GgL2gZSaqZ23hKz!Ih3}*Olt%6AG@~nSNMfLI||uq=5O1a*n2(Idu>{itJhHGaoo8V zYdGk9g=|)Vn!}68^RM{(Op7g*P!s4n;A`aUn*2&Q5nRf-;?4^5@CxXoV>$Qy}dEwtrB!yk{$?7?lw!%+;huX8k zQuGcE|L}P&TsOWOZ5%x?8$8nw{`qAC$u@dr1g(3(EnKN*C9NOUbRF8WzQXu763mY~ zhYgc2>*+x^>=LXPKqCK4H5qHef!EmCm7r~)9yrL>9ehP{m=MQ9VmG_=QQRcKHmIN& zhSL3kI?={_adJmLkxO`Rp1ryC!Kzql4J|ikfz-_e%UsSD2yte;-!S!WYW;1)3(h>T zw0GbhJK~4A`mE>R&_$oTY6(>1)*Wdu&lWE80a_aY#8hrVE}&)^3hp`nr`Q{|JXV6+ zlf#>8v6eQto!+-B_l5bNh3U%*D^CKLPRcT8(%Wl8O06H}7vrH=tCL%l2)q*)&o!uW z2If_C7*rTW^!Ndb#V0T?KotF#EbUzd`s?sv4t9&zEl>zP*o`P?ZjH6nu-lFFg}}^p zown`wo?t$UzwSMd`kU(($5zMu z$ol~C@|4GL*$kclyc4&_a=kqlK@NI% z)Dv?b=g1epr2m4gL5AZ*agDICR0}NwU)?TU;$9n35_anY-=4)8obC@$K`~|T`eOM5 zckX+Y7-}qU($f~2JL0>-<=k}t=n0yF4Dgu;B4Q%nXkH$^l4p=rN!_lURR|hf@O>?*KV^RZRQySZzropuzl^`f!XF0 z_iRypeo0FR`#snG!Kf)Cr#7ox&av*U`h}hTFvX|RN;{#<^7BsypI)Pn+#_NQeuQ+C z24mkdz^_W5$6Wj{z`YzqJW>%1;m$xlF)!yuiq`iJF8y}n$8{(BHGjv$$K44Va!OyW z@3B=ZWUhK0OP%gaX3l}u<=g`32LIukNMEkz{j}9-E5SLATr^*5j4jWGpGsP=cu$r*>HD<__sA{&er8(|10wVP>e;R0w5X^VRd<7tQ zFqC2!PYI6Bl!D*}vr-s>8Rfk<5FU;{xo*_K_6?#6f)+Tjg&V(lG`jE6&6p(q~sIcvlxnPP^^+Fx}+1lmPy5u z>lVF|s1l0MTy_R~20E25#~;Zl?Rg!#P0?y^JD-gv^>+eem{>8Z)@~XBm-^vXVqTa%(WFE?GWIp!Da2fId|28<-7z5MtgL(WSaHv@Zw|5Z;{g zG!dpuIfdM;I+Eu3Q~HRvG^Hw>;0BNIkFgq$hh-PLitv6j%4DS$5;n#CjsC=Q_rsnk z*7L`;0rHMyfIZoQRSFJHQCcmEJ)!9#qIHEZ0$#|szCBZj|l5@!#>CC@o!uTCCaAgURItvA}yYC9Gt~<;tfV zV{5A7Cl(Gyw3ovd4!~TH8-qjR`+sEld+2#yQZFZ+*}K*x38{k9TBILAnso{}Fmk$< z3F0t3!lkVvXt^_?%d{yqP|sl7uvZt5BKbhy_Ytjr2oQxcNYfa@7lr((99lFe4Kw0d zS!~j6Lzm+DMcn18W%0c+SpdF^nVXKcZI8%jde zGvo`;I;xPh>?IS=euYU*T6{cdv=HA_hKcAhq)toH*<&Yj81w9uNXGN(g|V;w^hA%y zi0P0uJo6f|_1Y!kZH1lNK>rc@$P#n#n{HW(E3s?JAw7hR^U;N1!h=}<|K*CT$FbZRaVg`BPhwPcD_eM}y| zCsd`(@6#V4;#u-C7s%$;aXOl<7})*X03hSAkBj9s{%}y*ahA2I!W0sQ466(786B1d z7R{8vNk+5OFy}l*ytsv335HcMCDCxq$bfN8`IZFSaDgWHMuL9YUAq*+q0>rl>*kWo zu$lgzv29F=zRN<4jRHE`c4KOD*}nLvuju6)pYZ#?BlJsfi2?oXl#L<-bHgr6PbLL( zzrZ9;)`xS-4QP|fuV3ck+hf@lq2F-DQiBOyJ`{zyPZ zF#a~{C*W3WC132bMzoL{idqXiWS&@x%TQ4o)|>w@h;Bd3g|_xKG$@f0E;cY9qztm8 z!oI|$*}(@<8M5dXdvXPFSN}deDJ-NtiOwqLTe&bFK_LUhp%C`-cP=c2a}W+M&F$?s z;bqkR_a(bIisABAlNKl9)WX+lo(xvH%|pRnbf}_W2cc-&1HuuR<1VBbHt=lddE)YY zX><^$%vr8G&P3hlFUhXLM)m$dpTPcssv)s>J)G+Pb7OttHlpINT1bEwNtSvW+F`@~ z#66EkDn>c=W+HL2ZfL-EM01UYXgHBe`6KWJ<>M={LXK>~COvk3ZvHtZ-@Vf*q8-l~ zH;+GSk0w^`iWokkd{lO<)QqbOufzu>9 zCbk9^@6;nGH2uukKjn5kyFAdjxOQn6A(dM8@LS$RmluH^vF|Em=N#Ik_5X*1KAp6YrSTEqC0{_t$}SXU`z zdi2CSMdf@3eh%IoG1Hf`Vb{o#l7dG;17f$$?%_!x1E6Ei-J!lli4P*@Hhq|nK*0f#8 zw(m3fU(67fVjO)USF1l3-vhrYo_hN0sVmR?L(eQZgx(3(xU^MXh@|o!@d9N781P#v z56QJrGu1b<0_P{hE7<4X;-kW&2rpi^#!4|h#K9&{Ca4*x$tO1pU&1LI&Z;Zlozd-) z5enFUpwZ-TVXJqCOycDAtNg{7g(3xven$+ibm*%7z=yi#zJNzd0+&f{yxNdlcV8Y~ z<=mY@6hf3tQdufRvNj6N3!Ba=T)^}4VIJxDhGIWQHKc>dtU<=6|^m3#_OX? zM$^8OPncSS7Xg{kQ-lpoDQRlSv6(e_tI9twDdEP_Y=uxZU->VOiP9em^?T?UvT$uE zb3g1>QH;_C)mA-kep;H>6_KXuQ(+&zSAjanA&mS{!}+Usy9;&dn2f35%+o-ssCcMN zMFtUWT3GH)H7BWAU9#oB?c=oI6yQS%^6??B7L$Y=?9ba&Ev}KD@qpgO%0|-)_;q0E zqzuOLJQ=2fAE^|%_Ok1PsU>{ajZBph-bI7E%@9NtNhyT zvZtIgu?C+?N>|BEB-*AZ8?=d!;~Q;(?^KEH7qe@$y+foA9Ya+=qnVjaLU0^fg-A@n ztF7FzhN^T+Xe<=j?S?a9$K1#-c{lOKJEt7Go zm)sXcDlfhl39=lZCkxv_D ziQD86z(lYIq9H!@{IuWQ=eD!GY7~JRf4A1?ho~rGp7hrtwXUt>HVZDNt~bklF_NM3 z6WPEjp>TpR)+o~)FmbnGb9)l3dJJ;(J6PH4Hh(WvBpL4;u8kStAF3u6&-90^Eih~= zSfOAT51|M|JHj5er6Rt+ z1X}}bt$Fk!dBN|HSucCAxxqRC?Na=E$hrd1>_3&z%rXJyPdfJa%HGAv|mMWmcr*dsYfF?)d_D%KtO4D!{ zBJVkK+7HQM9T8}{z5J*4LIkmD&WLvW8V$;}7v*HdG*LG{Hm?Q!7_Xz-1mzHO2#i;Y zS9vUEG_$eTrH9s%%05}4bh?wEH7u%&Seh;{1f|&vTQ7ZE@p>>_HLIa=*i-voJ6JRk z&say0Vn4B5vb&vKd*YQ?_*_emLn(gFoxn$ex2%`Y?p2V~eH*s&t=l=CsdHe?k4f%w8;9uwWPrT+5K(iM^xIE5SQ|6Ne*|fDr zWk^)BE^Oc2w_J)eZP7gQ4kPGxLQKZOG(dV@IfxG?DMrDnHfV+kGun#1*J}ao-ze5g zSJZ72FbSfr<1Y}%ngdA4zRA6bUT;%2bGQ3=I@!xv?rnvSUpqclaqLM|Lv)WT9hzln zx98|37UZ&kyJwAUM~iK2(L>g9;W*lsB6@5Xjt>~g zc@>y0srzRijE9nPk;rW!oGHU=-xc>~IUD)o5pxE`3(m(#%tSU{EjiaQ;bD60k?wk4 zMDhLnCa5M4_G2L7^hh)dzpZrmMcL0;CFbyr(|{ZC;1ME&bw!!Z?Tco1hgOOz zS?{}U-b=WPybvz3brx$0t%GtEmo=YtBeww#7%&qMY_~&vX}!EnZ+zU@@!b(DVX9sr zs1eQIN^liB1tc4)w4AoQ72M2(EWXKW%rR>!xYcnx$eOFIe-8@^m605~%C<+p-I4`Q znPTX$Z_%#YYSTM9U8mycK=4p8=YZz|%=r;IZlhRLO_2%w58WFoFxb5;pxGt1EFjX( zH3c+D%^+AXsB!jb$4yN!!fX8cxz>UIeCsXw+DX$(=%F>^{fdLVobrDqcLB^N@5e}E*(!JEQtS$P!V4-&YPI%pd0F!|{ zoHX@JLQ<@<85jQlH#GRdZ}+*3@_n`eof-sXQDF*#)7uqW6#NVLjs)1t>i(2QH9!0{%?MPMwXR!V z<|^`WvAPhSM&ivf48^8qw)bxIZK&!K+i)A)qIS>f_rGx-n6P6~hBg#CQ7slHLXJ6t z-E=56TsPjJC#J&3e-u(5;$s=hu>Cci1SEl!5*GguW*7}e@rR8|I?6B3$Ue)XWIs9}DwakBDaKW``(`*{MET1** zZZc+CeIl+x*&t08AkGr#ZfO>voQ0HG3+R^`$3CkV)Zr*0j6T0ny=s45pjfz(1CF%|Onba^5?1 zPrqMn2SHjD6FhG&jd+Da=xhnO92ryZ(<;+7ops%sRuKEB$rkAEDfZfftX>hGVko@y zp3=qKVR237c(q2J^U88C&y9J&h+8g3Y_UkM!32l}yIM%vI~yhq+8-KU5gi>*eR_Ur z7UlR-u_>C9E7T+O_EI40TI>bDGuCLWMRiEidz(&XJYJ%&_%}#I!v%bP8L2W@`i?t# z@=>kW$d%uvw36U5u^3*P7>^tNz;%z1;AKv7j&hn zTnHh3K?sDxC{lC2Y7|-Vt#x%FKRLn|gT3SZT8Q@ni1zwN&Wko>Uz<<%+|66D%lics z=>9*nZzd0Ho=S_>Umj}xGwjQ`q+Ct&I%nsVwYZF129u>v>`{S6QBfA!=?k;Hh7qN6 z_`$JT?Lhmlp-lE^QLk-?FWRbW*6~-nTYQNm{fyl;_qr@rFO4!M!~Gx}?SlP2P9hnX zPtc=F{}lu?OWH{`x782yN9U`?{MTcfW@W4(=i$Xns414s<_5|L=d=(Uf{+(vPccpG z0v#@`j0C&lDHnSz)}&-(&1WBPkaM+9R-)>DoyG~%5u#^umouB*Y{bD_@>W(gZQje7 zHSHOIO%Bf<_da%0HTf!l&2*eDTJ0PTP%eF&g_wkfn8;_@aa|zCXV|I9GP&FmKLs+f zl<>M7hsZic?@GoxProkn^v!7$DN2Cc4%ZtiJv0WG7jWVYc|A~MLzi0 z_=9-6HoBM|kvNHOMgx~e#FKNFE03Zk83Cb8d)XF=rr#uwPMme0RSx0Q74Fmjhwxr1Cu%tJ4rnuld>lXiL>jZPlHD@+P|K}Xm#`c`f?YFN_i5JC5vz( zoGgy49X&{SGjTNb%r^P{Z!!-Xe`|IWAYR>)6**FUvQae}74@>+*rb}6`}*NK{L@vO~9ePFxAopm5z zgsRa6bt)-Fk9AX4xI(jdvf2y|_H;!>*zigPMga5o=Vb|U*DmfOPn>f$2meGV zq`u44<mdxt3@L1Ta#)6s66M>!303j!OzpYbq;{)*B( zsE9f3XDI)NOGbaAB^=l|d1!Ju5v_>1zoWbuo;Z1CkQ~<3Ou#Z;2ESc?VbB43`6W4) zhmlQ85;o+R$W!SgxwJK~1i&W71Goi@HihwT9%%(oH3pam2!!#+oQ&menu4Y+35OM! zt;c(RZvvFa7Vs~4dH%b|q`#Ugy9mKQc8X3u7hx@10-veOj|8287uUE)O5_xM01F@A z_np~Wb}ixb=-_S6PSLDw%^42aH0t1bR~VvOuDC$fUA|PWY-Mp%(xCh3(Eu`mD%*zU zgSNA|bS1SGo$#+pL8b%!zEszY*%_B_5dX}F@jh);ShXt0Km zq!M{(F?I6CUJB1KVb#fl%4`PoHbmxzSk5w z138KI(8}UUiO&4ZmrrXoBSSLh_~Yxh4D6t9kJIe4u@TIMyUrFgT3i}@i{CCDi{qv) zzE6bG?zytu5xl?w%qxd3Y8ayUaGD7)MVJrfD&;qbb~uXdERo88M5fDzWmvFF6!Urw zKL2j+NI_E8wY-4Z0FmpB`q6xi>aPzxSCmchG;Y@XqJudfrkSks8Ilz8!eRhnm=Sr+ zWVMWJyV2;6Da3frwo|Dv`)DxRBeuQajcbXov&5vNn7a<}kC6C7N@#7SKOL6^}A>#3U@7NLqZ#?s1yQ<(C=Rdc@MjTLb~piho#R(EJ*O1-%Q=)kUka z`>R60l)*XBUyi3<#(kV(rZI}H)uJX^x6Gv0<(rUDM`A=4dgu~EggUHuS#7zW0S}T_ zx>&c-@^%x=G8mH(6$@5wf~-5pTSj3lFEyqYwvOzi)Xtd9uJv+IIcr?U!<4Ib593FT z(K`9-$zvh;uQMsB2rlAz!FY0#aQX<<*%JUaqgf@LC z1Z+L&@loh3P8lXg#1>6rbRi&!nqI&g^qg9lbpi~T%pX<;X)lcndkqMLHd|KguC@!8 zvgt27QyY_qR&gY?XgL0JtlD!}DThtm;+F1Z{7oFXWdO^KKuyp0z={Fv!mp(KL$5ia zm+|-`!k75JqI68%hc4!{Tf!4@#y+`+d{ob746aJOVDt7AK(J4`leOX^O5KC3)E$?) zDKQYYkR!j!c9(KC^^oUWLh{eKc&~;he@0?Qbi3_HfJEL9X{?Bpp{Q0~>bECp_md=A z)%(r#$YHvQNUu~l_2iJ3m&InvLHS?2=#(ru1^Zm7UW?A(lAQte4+z3sl&)_-0-5?w z(ozc~$@lxmJ{Fh($1Tg|bxUVP#`hLb=0r#9wTVE;4_J-(&Yv5O%tNZf6JWTM4=m+j z{8&d_ENqu41J?&gvdlKQ{mHVEx-AbM*uw|Lz7sTM2w`Dw0O?Kp6ip+~1ZhRn}DJT#l>rFvKcm3;(*O0Olt;+In zm5tQuN7(VhU!ke(nSDR&F7?W7B7P^W10ay(DrKB)#dif*5s8_aM34NjFVn;fIl+DFZru z>wrz_!b1|sUJk5UkVa@z$%eFq*RxrMf;nCL@FMaZz&v%7XnORMw6m<91L<_4*$$qr z2}nA(Ve|ulAk;|TlX`Uos`im8g#h_Y_cxcq8=F*)lSI>p)h+k7qjPidG_>*L`z~7r zN(Z;%JX_ZNEf+YxC7A~r_?9W@deDs)!j8-pj!He!{7n*Rr3&K>SCpDbSN!td?ic_Fs^q9sEcuYgo$}klx#9&_&xuB5X$>C!kFx2^ zA-~7vBT|0Ea;jX^dLC{Y6T_;9xY>-ELoXg?t8tA3-i>J6`xwR+Z!KJXd&Eu!D!|U4 zwhygrD(9Bj$a{WWs>0KFsZb%$X4|@A6I?e@!ZE}TCL_R6shl{RE*QW0(G&f^iccdb ziH|tqbdK_QqpI1LabXvkC#bc$F7hSUrZtxF|8Vw=F`|XbmTlWQZQIsq+qP}nwr$(C zdD^y4+jjT#yP0I(o!mR`z1hjeuS&j3D!W!ytyQ{3**dS3Jr6#n6YBLf1IbB8o#LRD zS-9j+#z>)#rW=waQ8-7Dk2WKT$gDIAT3P5trYo_XxV-ok!>`$hxea-pnJS7}xhInGv_mOZq{T7h|<&hMU2Y zx7ZWSGX$PqDa{82aOay-6t2lRae($$&M6j)C-+gu{_k(5vw2g@qDCLm)IEXE(EtYxD|XZGjbtkj<*KUOBE?r zkQ#{AXJo*BmS1{z#4b`!b*M3FCuEz$MYms+r-_OGU1z$X{Lpi2daZ-c2ozdQmYB&v z87Y@d^$Za!g~&{>1luV=%&1fhtC8TNAMl2<^pz@^Pimn|8$bcl&*vEK)Dx1Qo1k8`34WExU_@2Jh>`Luj z^1Ra=cM?^`*HC9Nf$56TW|KcOFq*|iiFckmZmx_$1_?Ws3%bCj%XJuNbpiZ|y<6+L z3^s^W7jM>qeBwcRHt{jiIngTvoxG9um=8k}iF85vD0tB8u9ckcS+w+M*wTI1J_mmK ziX@2&SmHV$*$aleX4{cG<>L2^8blv>Rk%57b|Jv|b_qcgR->@k&RlE^LL>sEzhi7oIXl7~Ej2-M@;y_54T!_F33% zzLXGfG@q217RpH!FSk3CoH#1BT!?rOl%Mg8x95t=b1v++Yc0NOQD=msa;7wEWA8+z z{Zn$jf9`JnU@lw!fSu=QkEUD4>S!$+gf7!il&bOSev>mOn$8 zsE|?pkYqMEnBp9%88AjuU~((7!Ah z6ES`T(DO2N%9T2Kn+%23-+JTIP;}!aepjI_aA%!>rCBR18wF%R^ zy~a_x9?RZ9l<%*XjnNt0Znw9Kdp>(9)E}>=sc5+m_0Bz)lq>tzv*D92m^mcaH}FkPSc5y58LZ2^zb)b< zN5lrw%@Z1qh06Ph&7+4)1(X=~qLEMj<2q#kiwt@}K3X*x)C2H8{PH72@N;#Uh>85; z<9|Q?r8a?$uHbJvU0rhH)sGrkVilO01%WPBmeC3a5fR!c^CkI zRU!ZY{D0;0f0))cGIB6>bo|ej|Ap#7w#K>b20POCcCWzdpbk===4R=8U0?o6oA|MUoC%}taB zZ7OT%m2m~-{gQYUGmAfwVJrK?12b-q5fu{9hVwyG)i%Z?PQOds2DKp{_lF}J2wj`x$Z&bC9{OZ?g7Y?QR(V-1~wb^GDrk z?Y0j&2Ac+$Mwo^iW6k*9eE8T6ElQZTvRTrg-DT==rml*4-!!nZ6Bv5GtJ`rY$8gaO zkFXhPKSE*RY6pVRUUMH)`!V)q-BOp|2#F zBz(*KzGnin&M>V)8{j1fWLvdd9m9@u@jt0Asj0$DSYq5y(s=ZPj59oaNkQCTX&M(K zvRK)4(M-7vTQ(pMM&ux3MInzBLI)i{pd)Y|FYQAh!fsc4;1_ClH&fmaQIK%8ZwE+^ zs&QDqX_)xg6xnB4t{JZ(!f#gzk%sh#gdJ!CBTE$Ca#)nt;f;0UQggq$tC*Gfjy306 zlg1Vg5a<@!EDn_`EPiKsTcGf-Opp2;=IL`c(K1nEbgsg}3q=nsRW{TVmKUY4;v>K_ zi;?0aL~-RJsZbISzDhj6U*=?;%ihv8ZuGloO?S}_gDulBdb9U0(kIq(c*joMF!JO{ z9(=}>X|chuPrVSBz`2X*Ag$%D11A3XhjgR4*OYgqg)+UzYp$0;9Qq3p7vkK3w5=PE z2>thd=i=n51xPsHnKiw+8_UwPUVyZ0yiLT1Yf{m=%6scYJwN}8)yO<>Hx6NFn@MGh zDO`llApp5^g5k(K-@)gY83F+Pc9bM{gSR*(R${m-DqX+pA`R#UjUs~j?F#-y|hFX7My>B|wAFn-~2Xgqyo zORN=toT>{s=#6mwWJ+1NPEK=Un%rO#@f+a>N=1vO_@%w^w|xLB2H+_|g)PFT(kO!#8g4IO;Fors;&@oB+gxP761uTZfT`kKOhu)Odtf$YF(n=5j z06I%k@ac!eGb&nlsnj%aL^Lw)j8I4;(_9d&#)gRnZNR)pO;I+J0>QSXoBPI?e5w!G z?0GNE4HA2#wReBLI^W)(=YG2R;YuKTp=~F_BeVYX`GY>sL?x{qr4$$?r{GjNU%^rT zypA%u?rcIdNsUlw2*{@Tx~lkMD&+{9itWT@w1JKBv*i{fvVVPQ`(m#Fx6r0MEoFic zKDDM$6MgZ5$g4bs@?L2Dx`Mr&^`=ZXB4)VXR_2c|W>eCi2x_E5SWxGet!kwe$3}1b zJnW2_$DE{?KtGY+#DG12zYlJF(Y|CGwY9;0=mKN8AYp>n7Vi57s%pu+ylx2Bh}zVa z5qPHA>!K6~uo>D=I0I<%5;_bdstu&T%g-Tbl@sxgSscfZ3e1T6 z6jL8_mt<({Q~Fu_0$yNno(!SXZ%YF}pJl)$#+s+~mpomEnBbyi>qDm_aKcvStI6If ztiUpw-zEa=>fCwcdXC58-rsz+g# z8{D^3T2RQZ5^=y^S)Eh(1v_=8aaMd0@jK$UT4Zd$dZ#mggzFZNWrdnT0+VG4>I1#h zNXaX-eWEMC;<#de&kyvhLCxG*N%%qoWktZToT0#45|gcGeE<>N7Og4?x!&bo1Ppm- zxh<*OI1$~(IqAG?dDaEztuIKlB8VGq1{AJA6W4f1sW2f{pgKf=vmpP`(@*1)6po5* zRfPetlzSqg;LYLYOGP}Up{$SmEjQlqn{Bl`okIIAi)`|e)2%xZ3~hV!$xX=nT7=--70z8t?GZ$yfXJ*W!o|(NvV7Uy zi;JXsNG_#pPvv(YQ4PD0%jM%1$R}5_E=j94XPTn!yyFj3M}c`pv@RSF^{P!_3N4+~ z5!t?f5Mql56=8c$Yj~dK*DaU71-(DS59!+8nR&<+>9)jQ6q-&@f+XiQf%)~9 z5H;4}9T$k+#;T>Tq%;nc2y7_~mp;?OBm)$vL)7Zk<#!Y@-e>yiaPh7j?L=!uVF?y4 zpaj304nf4AWy5bak$Ip4=tm;lS!EeToK2cY$3x^vK%SNU&Bl*CZ;JV&z{zmGvzdeL zqmzIqSsPbmIhHqkJ48_o=`8nd(dBsgR{+^xEbqY8?l0i^g@1VS24=c1IG{q6vw=3+ zPg?Y^I4b-&>c^&)7ytg+WgQAXdR3uob&buKPE)ccS?oa6g_F8fX{uP%$w()|N{r_9 zp+-WRj2L zz84?7vM{I4H<7lcLpkL<5BgR*7{pL;LgTovBcANrlvWxZ&loi^!&96t|lHcBEJCD%_Wm| z)GIs$J2V^eYInh_?`|1?$jn5UxywRrO3u)HEk%72t5Ekg=~j&6-5Y7+W0g}}OjqI976n5**j$t3g>@$;N_ou{*34z?#iY+3!}&~Y zJD)M!J=N*aG;8H*mSWvAPdSgy6=~!lU8r=Xl&iKCU$D#QZ1+;+R`I#Ne!(q6J5o7Z zvGRt-oUw0(xfOG5iFuA5Wg~8TOd9%rs(GcwN1^UU^-N^=G(+5>Y>c}PRB(!nmxqPrFpR4OjGg*@GF~; zhouJ=ZN|-)l3>HHDOLQ^69~}v%8P9_5+THP{0XOF zQPWJC6imj{SWmSQuX)k`y^$(LMPDb16MRNorLQ75LDPFH-TlrJHv7-lf$-ta&%@8x(B;wH zw-sK#c%HABtDm27`}fHA@qArIg1!t_W-sN_@Lm?Gf(g4c?`_X8OQIpXMcBQ+_=G*K zf&bdgjRxJP4t{o$$CDGm%QQWM+~J7wJx)G4_Bv5-y}zfbacd(4zvuJE(CvNv+Wh>K zP2YWf9lJW&uDYxw^ij*^#E@lp>3X}qLF^U=Dy;A;8!G6{40n40lj(slZT7_M96Y2a(~N_)eJ_SgTAMQMEC1%RxVtgM^6ggUdt0Na`FtilXqCgiWaLGs{)i6m?cimnltW{`tc9cp zlkeF^7wJ_%m@rJ;ML=F$)9%pH(tH@1>!DNSkMh&M~%}x`2Z7$FrG-`G;-u#fm z^K$385&wM?Muv*I<3odszP2aN`vq>)y-<0)xab&i@Iv>`SjpvrG&$!7LB;(*secJi z|ACe4{s-_hMj9%R9wGRdW0;?uvKp{8SSQ~tFwQ~%cw~$?9=A8#V6FhJYq;xrDptVK z&k@y&f1JaNN$ml_V{29APR295z)`3e$8d1tDdD-li#}TP6&l=me+H6{m7wS} z$gx+e2buB;#DF4F#0?yNtdv*TCBLbt(adGzC2IQZ*?)Td#T^9n!n$Ij5E~UoR(odG zgTPCMPyJvY`kxP>bX;=jCdXh!%0?B0A$LBl zy0QaL=B3CC#+_%tQ2>mQW`_PdqlwciT~Mxzj!I0^kFKk!%MJ3^-i+N!Do4 z<-yO$?4F^2@X-5YpB)9kswA!Y1Dwc#0{qy1x?z(GOgM-z1rnv!c+;b#tf46KkpMKN zzh^RY?k$5tBB{fPe1_Kh*tFF}^KD?punsF@rE^&q|K>-DfHi={aY*6kKSJX4X|Z?f9g#@Tnfds z!$2GlL0Um_@khf(KJteo7`+V+KN&ojM<^>H8b<6H9SS>;9ViE{nPl(u)8_U$im*zR zGM7L37liZjH~2-Ocg_1J%)qQyshZaR3ImpOz-chtg5m~qgK&nD5xr0uYASR4hT04M zN;cDEjsP9xG5VAH_|D;FVCPdE@SA0)rhc>?t_R)J8p9HsGpzHRTna}%@-lnTByu1l6%oaIhvK=_u zg!%!l#nIFWJ~@!1_k?YuF1Wz&k;90UULR`gXxQ{9kcr+RHWuJp(heHl-N2t}8;{U@ z33GpzOj2se8yy+TX0x~465C*qI1q*@k0GwcJ1_nDyoK=iK-aj$S}3f_}`Ko|?x zBI6;F=Nm#{xQ`vKzc8+;4cW{51F?gXFrkhI7Ut5bJlxcQ@MyTWlxvS8Z0nP9j{ z4|>54OZ|*8UhgW*(V)k7U0jx|4S<@Es@;Y8Qk?AUWyyWz>2^(QdoOt4s9#I-*SH?g zlCQtC9%s%@ZqQt9;J-C~E%yS=Qss1qIwuUlj8_l-5#$h*`H zZ<5g241*<*!!5qTw|)6$>*{ld-qq#k>|-hc z7E1Atu?(&`wNqiGD#2{T^_yHDqd|1x*|rdBKJl=4jB(P4#En>p+|{E(I>utA3P7+X zu$EpY6A~gxodl$(pjNQ#h*8I^bngt(>R$mlH`7EGTZ5d{F#&ET0iv{->J#2$G||f% zjKrv8aawY&%iM2@&MRatkc{5E>1I{2(E$kOa6rTr5gNMoen45q@p{h7jylFohaKAA zmFzk(GFUCiPSG28NJUa&0>DxnI9{&TXKkMXSq36xj0cg(8L4@GcW0><{=Ab{8DKTK z55oD)7e$4u><+VX21q}ir=RJD%!S2+>0Ofbd>JEEg6@qe(w7 zq#}$8LGIdt`SdB~3 ztgGJ37DL4u(E<6l7!S;q{&Q8Kzl@bt^izV839EoSH0x-m&Z@HwG>@o2!VzZpN_#$P zQLBy|laD;aI%WdIt{zIlBfUCN@-LtN)#;rC1*b4iPjk z{=CO1>4C@O75^AdVE<7|o7uA|0-8>N(cdS65hvDlpmhesYgfN{(eOO_TdDCdwcwh> z9-%Z-8tepHMV3Lz8(_@-3_umQM|N6hSsxh)4Z-;zIsR;EkBC4U5w?N#gr+!tLhF#X zAOu8X{qCMltuD9z$oXUo4h-0Oe@FD03+Miq1e}Qlz_{%1bB2Zd@nk~i_ zFze97jp|V>1YA>$OKSxq4Mbu!W=A48D#r^%Fs12tsrInI`odEqG7cN=Y=M(Qoc#p6 zDyp`3FLEC?ibZ=+2dL{UmCWxfq}_-tZdj_qowDs5ft6BI&1-NpBKfWb{Kbcd;_I{= zk=)OQZbH3w5Uvu!R$%-*UsGgaYDdm&SXp-#FPFyIjti+q7~SW6qkv?=Oz7|AzO2#Y(&e9xdwS?vR#_Sj}OfRU}C zq${V8ahPxM#s1O8kRb4lc|4q;NL@x%$mLU zhsyACAMDtfzf$IB4!8MSafna#WY2xYYF-?f?xtiG< z(}^yKg?{M}6l~O}U#c?3CJuW$Qu4`_pjX_&xhE}BjRt_AuY+JB-pgPh80;!)UH?^Z zo}NY+qpt9BvSFwj1-hYIGQRc&=_WjZ08Bp{Y0`Ky#*O0ku#&!@7|ui%iMHUk$%T<* zj}U4gW4_laVe^4JyxPN^63U`HE_Sl?$%KuxRN3Za9PY%uxyJxDUZVb`E45M38`9t;$uYzWBq#i4K&tPx0nT<R1@ceQKVzpN$8j?Ut!(!i6rVx!o_J#ZM&{L-IL*7)*cjEIsy0=# zk+oXGe?7lWMJSy_nXP?^tLv0)sb9fG-yOgQr~Qb_skl)#MTn#g zJ;U&YMPHhbuN}zLBYnHCLF?cl9M&3ft43YnHi0I*iJIy~!vHtL)(JjAw=&;KV0w0b z^NYT$B$nnN16w|F2ojKaP2P5vS#@B^XyC-xfQo6oom-UU6&ZM+`^tT`11&N$)!K_{w%aoe zpVeqLpKGz=X85Dr`BuJ~KOk@0&3=h75Ud%qr~nU|@h!8VT}NTztQ3Cmmi~4!Pp=S} zRdMaDv|5pU)T&p}3nXim*qkc{cz5{gycF9@>&>CHxBni+&9KwjSdX4JlB_-8iwTB~ zlx|&&1yu4(-TZxhkB~Cu$vk4%6W}|_dATnM586IM);5sJ`$3;`*`X0``j;cFD-tRc zN^IdR1yVTJb#Y8C%z_zp42APw(+@eT8IY|O)gUkaA$N2%!$(Nc3kpi$eu z*R%Bzv%)*EW~NQJBNZafuwc9;()2NjJ$yiCP~P^iDi?_a1k<=^+xFFJCQR$i7>BKA zZW5Gmql5XBZ4GmouJfP^_UAIIhqS%~n$jP&YG>p#C!zQ-3;FS}5q4~r`&h4+R8%F#B{)JNIgC{YuW88`mNrO|;|A7_D$0D8c zdN6>;N6Kfx!=udSLtX6rMUZi~fE+sy&mt?U7{jNlHvQ4tshsuX90$G=9DT!o4 z4dpgxu%`5tGdq#gjT2~<^5Gzuz%KpAbR@V0fT&$aUEPz zeDPRY-9OoCI4-ll;M4VuA^*pz|3@%JS@Hi9#*_kk-#ftp08CT-TNv|W`@aWcim^Ur zvAOPCzamhVxcDt9w=F#ta-HUXzfcqZO#oP_Kyq-&uFBkU&gq7OMg4w{HXX@yhDh=Z zU3cUDO1pLA)*T-@VQlZtZd=E6_slGFsFBWYlPKm)Yz?j`MhxCE=t5L3nXIl3*L`}b z9%Ce`hOK-Pp;IE2CbVjh6$ETFy4=7Pzm(&`IvMBM(F#j{u*O5XxY)C)q^Zti)+Aj1zFd5(xs$YrmIf@n zzZ5_PwP8syiKu2$BxYF_;R4H6pEn}BCfVI!tTVRs@08BMQ$v(?WcOp9+k~W>9u^>^ zLNf}mu8FeBHMvlVFSqc}Y)4w{3{EaC6IZJJ$kko4*s!#=E~?6n8|KZzgl~eUW+(Om zSjj#DDYu$nuQr9%Lv$b}*+DYk2(5gQ6HRios3aM0BRXoJiH@;T*@i6Ij7NnI!Cx0h zPqGQb7eKRMGzSoAXK3l5PETS*wGEAnKCv*RwyyjIi3hkYNoQmR2^f&cpr@!u+XrK2 zxhI3QYS!@^5RT_hy5sL2QGb`=eH=s`==C*Qf@SJ-s1$(VR8hF# zo+kRVVD{y0rb1wuL2o>(N{lzSzVZ|>>GG+ua$X}|1{{MdXCW{+q$8R13!#oGvyJfN zomC`m{GP^=-cRglATkfojEjbJv7~W!oyG4`2zvIOb(r={w^MhH2j4H#sd!AR3WOm+ zvnR-=EvTj;rFa3%xf*syQ?-+lu|Eu{Y@hBjt?@$0`Q3ClwTQ^PJ zjEKV%#Ni%d_}pp%DnU~>&hmuH#j?UeBSSMxiIM+;NDuG#Ga;cQ#5Eb}8p99F;Tv_a zH0*;gPSOGfCsZVk0>u6RbdNz@^G~ac5&`Jz2D4%Z>u<&97u0)~qX4rK->B9G#=#r~ zEdSFdjKyb1o}ph8{u_i^P=pmA-$YU+eQ)!|5r2#qC>zq+X>O1&o8AGLl;7nSNanNz zw!a8-j9WL+xc5+8loGcdkWi79dIe{Qh~AfayawIwg+i{MNMY}QZU4pJuzEAYne?wBVk zrj;gzPBX?I=$H!UQ&x|~`^zE@jivVtKK%$M;}npmPN)1O%4*QJP|Yj0^n_^Cdd||e zC11cX80|2ji#xKQT!rm(uPWgZ%mw&9azyPwI7Y1M??ax;!O6t$&Cv>b8H>};3eYdq z!!h0T4slC(K;+bZ1->J>@|yb#OmBY*QTQ9b;5SYLCX-7#m6ihs6~BwI(9QgqInJL) zW92pDdIT@uK%7M~A(Skb=5PW7VJqTpv8p0hGT+%>T1!CQf0~&Qm}+@&+Wu1d=&}J3 z%Sm%+-np+@pgkl@@6{(zb*P`sW6%DL2il3aU9B>|1wA|C@PWI%r}BZ5<9fcmN8%GL z%M*QB`we=zPj+P&z$9BE$1)>#33rPuI^!XK(!6t(O|*1RR~FSKiEi#BdyDLPiiG=o z`E-M<>Kxxl>##hi+->}&6IYrmUirKK^}baV9c z={?r;*kT%!Tc#JQAgLy#dsgRXlyVJ87u8A4$dIOnTj+0=x3cv7OMKZy_@m-uo4!Sq@RL3iJ-j2fKocxj`*$;I-tXL zdJ{<}yvc~$J7vNaXDVb-i^y-c4yl`DQjdg>1MP%ybH>d=9t##{LjTrm9DbL5M%E+6 zx^zmlCj~IlXzbAk9HTeAOY=onjILA@>P1&X^%UUvKAn*>U5NF6EV}KqM}DL*6)^IDSFNQ^k zQsVU`HPqMq?UR+p^Z7bagJU~27PS~qsSkloP5OKtsH={8fJyfYL^+l*xeNd!iUsY9 zkT4C8837xmmi%MXQV91)(8YEm51&;80BxbQgNZG9r%_0rvfx3!S;VtdX9oJ8CgQZe$G;oK^BC@2} zkJAzl>Fm&)?bN^3lvNK5x*bP?$T!ZA)m6cs3+zWEcBT%C1&D8<7gEE9JrS>s71(4?Yg&F5-Ydry5jTbgk z3->Gf%g0ox43M5o0fN{JAR4s0d@1IioXL_9ANPyAd~ZD<2<#DB>h@EFQD91>U+6?) zITsdM^trLMiXvD1!R$}0Gzhbo2u7`Qy@N=Zpk-%v_)k9~@mW!1msaPgD)x;>AR%nX#OCUg&M7Z-NpMwM% z-2!Km%FnJ+FLs#ywlqjilcrFzM@|piOSm!RuP&`pcIR$6-6lMw2&&}VB{Ko47$iV? zaOgVdQWjJuR1MefjzXZOCViRsU?A!~{VYc)eJi-~9a2qj!`;HA+@va3(7#yCW)SZ= z4qfL8D@q+|hwyPDY01-0&he+9fyuiR+v{lc>9^@oReu+Qew2*Oy`^~y7wR6id+++N zA-WzI&4lv{l&nBK`lxtYbFvgqi^#f32r3T+lL8`dX}F!Qk;Yh5_n*RQ6+o=7{eiFn zZ>5FQq|0{$0csV8$o@(rYyZ*cfnuVtUF_IC4XCy5zQRrY)EHO7X2qLOTh~qj z*#YlTx4f-;_5}8g=Io^jd@7J{1ORC?21CGmTgsl2&MeJi4q&g8wFpNrU+L`ySwL+h zZcI0nEs)zNc9BaZ)-abPU?Ek`1FO}h)O-|w##b_@iZ3Vrv`VGhPeO~+rIP$D04nNj zCsjj)!jY-xNq*8oCC!r^pBQ`;vXv8pTzVEO{#>OFU^wNC7JLyn z;=}c%nvw@MfDFw3V7FY0i6~+_B}(L;bi)shGTD+zG!rpUZo7vpNfF`#4((aTM6Hev zwEJMeZuYT5xl-S7DQFs zc2n|k-;jGpf8NZNynGC}9YwZM578any1$$|^WB#lHk$)E&Y|DU#BI?#1M7dWj3_p( z_;Ac_J14sNaBMvrL*+A~*@QiHh~*fXcdpf{e^e6!@^N>GSma*?4GBzr?CHOwGyB+l z=DvT&e|*K8bwLG}@RJfS?jD!e0;jvYP9U#c>ypw?&$~9*je^3{n{>smbs4}W#}WZt-<3W7h8=hsr&o%Y_i@{$Y%aS95Nl3nILUX%nM z;=RA{5m|ySgT&dMjtaN(V)*;@&3Iye;+${*#bWqmz??9t?TkA-LuSb4cwei7bt!$9 zHp+8+qN$UYhRXJSO9adrZpa<^ zBD$_Yw-4@rd%g%h@pgaTywlmbG5M-T_6D(gC0_`h*c5wb=-SE%-#%nUG<~Ey);_sk z0XDlFn0sn|gZ^`U0D&o6tM#WT2SM=vLbHap)^_?f?*GN~bF;c+>}DHc&$}wK7bbQc zPTxC(9)9RcGeaG=C(qLn0tj%6kobdKk$?ivmf=h9F%_CPPe(Kc1S5E+aD0_PcMqk@ z`9)o4yLl-+hr45=;-H!Ks- zy*}L@chSvD5pPEgWSuPF`WcUZls8{qet*=Wl_C{B{bfR`sb6B5sRvXEd)zU%nmj9H06>>}>U=3^ zCW;g_<~?aJ8fz>`%NVVzXRUE?MKf^-;53M4rE?P}TxEJ4xH{*;dy$+s6W1D%NQ18x zPa=a?!kbrdqE1L01}eT&7~SD#r)q}OUSyYhZQrjy2n*N3W;r=cOrF8zpq6Tx!VXmu z*;lbNjgh*02a&OuA25t@`w&@RT1EP{M(r4Z>YY?UCXW;ovY2~UoJE`LNR_}%WLVJM z)r>RWP$CDJBp6g-hSozC!H;ln(ng%4}_PJzmmVh?Cv++eX)e$7f&ClyvUv z=8>}aN>FZTf09O>Os^SqAoh1CY8gfkq`|*g&;M3tS+p)%p5$=Q84WlLPt>}EqFnGz z{h?WVPQPq@HC7E)Rk;>2C)+v4{!t7a&T37pG$zz;f8+w$i0cl3uv9B@tw9dK(Ho?b zDSf;ar;>|i)F$1FoV6`_qh9c=1Z_u0uFJ-e2qVf4&j@EB@-kCS8w@q2_9BSZuhbvY zK{gL^=XGAUR90Y~&rA)MBVrHoYUfo5qjT&p5anWToXBGpV?ze;ar4 zKYODO-3IRzy|Bg9m1Ho}@>9{8^pNnZEw-`8sY!S8+KNP?TmjTkg_Ka2;^Y(}Ijy}$ zxudP!y5UUk5G6NB^h>D;JY?TSP9ORVW1OhDvMr*j;A+1Dq74P_@`ULqae#IQm}W zO^#iFSP}}6jU`6yEKC4#l<4Mv`571{*UCZ&yN_-qK%?)P6RBZFBJ}L~^a-W2~$Q7w@V zgR^LM2oE2rxSIPGp&~oS3Km>uTraaM*kkL6yR)>QURWk^$1CRJxNOd=Y0dLn14+JR zV%B75oj?JhY92~?+GZgRX_Da73H9?1VRkG{5!DLv(R@@Olwe5|( z(0H*%AvPWWVqx)lw#F;ky-qSzIfnVimAy*K9?&4)tc**>DEw5O5^$~+cPJdyYcq|;ZGAGQh9 zBfq&FT@YA~*u~@_>6XzQ#Zhyv*J_2z9%S1|gPJi*D-5F`iY$h6L-34CFqg-5C%$vY zEmL31^(kLqpV~Yl9ZE8h3zE3iV@|O)1ZOiQ3t-sa{n8`e4Ix*>_%^#tQdDrDtX9HPbvkBL6i)KiV{j4-4neJ|)L3sAFRKdggq#+Qb7nm5^72j#A>T)t^dC8GL^QbrgbZ1m}Q{ zJ`O^kpMKk)J#u#_7DL5RPsKKSYA=M9i(T!LiX49a4j7<^rfTPgB3)*}imNb77cv`S{T zOIl?nmcFdQP}xDgf<|md6ttq0#cZMRhuy!c;BlW>2WGy}W=UaLjQ^BFRlBdqAW75k zni&wTIBH4gDI!dujpK5RlkCAMU<;iCE*OZ4D<(G8ejI3621ZJ{&{*XtuVc+N-o0oV zSagdNx&CMp!1w^11r|~rfLgh03XLr8fVE!MG0TT2xYi+kN#r-iJgj>ZhOm7f@dOAQ zsmC(s=qndDfXhL=aNSJd%6AZB^&we|uqZBqoeKiVkwsEr>+1$TU{iGu{`x>;Y6CLlynSf~UPM^N;zAuey zKy3D$bO|YWvxpyyNS)*Z?YgmZYoWAE{Zav3qEbI-Wha()|BoVXtoJS8X`$t4n43r{eOuPaI57n^{NHSG&X?m3!z zA8}pixtHPq{!j<<%SlNNxtB_1E>_)HuUW-QFpiQCv|vY!R>C=3cr>X5u1vZeHT; z&SHYgZk1eg+{#hbfk0%gQuaugsHLbQoFX-xwmywCrF-d3z4$xux2F=+X!h|gb5-Bx zrT+%UK%(`hyLfXidohYzt)O|CZ8Wt_nTG}*azdVV09Gbllhkwu$QpebQVokbAqV$C zG+I?=doQh8onlpIui^9s;bzO8+$>aykbg|ZZpq29nJhBr~-fQsYiQsA9>KE`W=#6ni?rDtKEgb?2zwBE23AK%o4+l&5=GPR>`Lvw@8dS;XC*Y?}Ho~Im z-lXSQu*?wcdXiFnDTq1NPN@as9^D~)E>H3`m@-Vj(!eK>B+v7iX~toyzHd$fos(nG z;=_#sx@zWSvlX-1>mjAxr(k{5;qH>=Al*XAnl@SM%i~H~o$q+BZ;$EQ%B)s#B0xeV zo)4aT`Nl&g%O{W5OI=j%WMSSq<2P$VrY?i)BD2mW2rzIB!7kso@(}_I*PH)qNPtu6 zpO`dWp6}1sSBX)tc||qAQ}&71qzPKCO|cqRyksW4(v4fziN4Oz&QMuCO=H|!hRE~l z&u8rpqsgtTU02E4Z@lYViTCgG;_v@!|7vj~Lujc!0Dz_%;J;oJW~2Ml-uiDX3ft=5 zu%YI1pn2QYt>5lIw|W4#>g$^;cB-Tlr!^PnA%meVQc8+YR2OGqYGhUn`Swo4Gz6j3 z*zUB>O?7<0kAX^v?_v@I3#8k=^nLw&PPNDA{(0$Md~Ln%rPepj*jW15Ug~)*Jo$Qr z?|r?kxE^?}Ff3NPf_JifrIvgjx;zma%KE-7IBq<2gS|?gexHB8Ezs><55IadJ@odb zc`sz>ejTRv{`vdzeC+%EjDG&U_gu4v4e}EE{c^bT%~OZE@B1;D`~CV&*T2*4Ue9-* z_igJ-_i;9w`a$%4fbs!2nSM~~OG)|stirw}{E(w}fx znZX@tjOQ>ao04X%KQ5Sy5Y+)-UYd`Qx^(U4I#!lrg0Ce>rSNW4R)HJJ#c1LbN}{w( zDjnkl^(Z1ER85Sx9++`KD<-RugDa{p-7Y1n0L)K<>6D$>3)l^&LGlx2*41sEzyd3+ zW)>|w%3dX4m=R@}>0bx~nUKn)G)Ge&`OQu_0z?!T!RwbN>3$?)MR433CWO`%5nbK^ zGl{o?V6K?Uwd3%Ccr7N6Q3}>`2^-ahQiDlpC8GHER;T6@6_FqwpJp92(8TiTU<*vy zC9TR90>MZ2;GmsBFnh8cEQz`Cp&lk5M|dSK#s3RKK)k>C`S~R+KeY@4?1@H26VQt{ zEIg}jUC#Cy*|%DRR%3Mv7^o+uZji0^&VW*=L_8?_DFIZZ{j8aN;)86sp{_e3qo`9~ zCa|r>yEdggOJSa{cA}e+GzWEW*=vyoWEHYO?6t`D+V%Dmk*m46)CS&n3S8G~qRChr zT54xQoz;Vu$HDl7wh5BkL6doylbLh*u-fH5G}wnGXnIz_?6bX1eZ^{G_nfqAO?`^R z;!dR~{Ho!Xz zfO6=hNDD4u24hXnKYIPa@3IZ2F%08Z&gYehd8K3#kx8gmXp_Hv{=$XjJ>xFNiJATT znEe=1ptepG3bo@f*eT%+v2--+l#v~(Ce^XtI<2?vM}zr1pw0{f`2NUp(7~ygWi=<& zmE$J=VfZ5qXo~lZsrkj0PJeYnTh>UX2;m8ap-x)LNGdWdvs7pu8&sDuc6CNoyy*t( zGS-8$#V;fz{ire+h&K6aqd=X!Q@}3BEhHq4OdIVK^N?P13Iy zK{w~JP2Wf|Z-5-6kf&35~xae1}|-zrn95$QFNq656&+iJlSD4Yg-R&%Kt zc{T+t1bPgn9s&KqYO$!$?I$fqPHn*r%@~l?)bCnTvWpa>e)e^zSYucP8c_YJCDTml z;5lG5#}S$nZ2yib>HCp|(GT8k3s!7TLBK%Hh5-o}pS($EBBF1-#vC~z1i;YS)GEh( zITn8;IF)>`d?M6?F(+&22vB4 zbm=g)blDB2(1vI5*~}H6ar$i7WoINQ`5dJ;etydLkHct%p)kNnTwAf4Dex0{A-GRg zfPbRf_=b?o{Zm<3$8lc*eiIttvCQhh*(xD4pXUt!Oz^W{XPOa<(PQ(32+wa;kt7;I z^)bF2q=62g?2M7nF|5ps#~iedIb;QJ0HvdAhl&p;t>YjcD>9vC%6H9H%YFW3%b|28 z`Yi^i_{(IGInqR&k*&#aog}YO&=n)nw6XOEI3eS*$q?NtWkHHYv|&fLQP6b>PK2f< z`kYE;LvI+WCt$e@n!X{WZx}S#R3$7>el(p%nOZjr9$AN}wH)9WUpIE4P01f{avh2{ zj4vW%9osFd*Vb#pNSWw0ArLZQ{g$q_FRLxZN)6?#w5Hm|dVn`ln3#xm2_^4cm9o}_ z_33{0c2DTXj@yk9O$tDwa2iloF$)w4?i<;1n_(w=dV&(P36)$T$)(8Ph>;<%#>~N>@tW?*zKzsGFad$St|Gh_^J&(V7pb6sBDE^ zMx}yLmpoH;uzwQ4;99_e{V>4JOckG@v+AkA1_ez*otd&9w&oLQCJT@PhoxM?#$-67 zf9036BRA*X6c|O?>;!iut4SNrl`F#)15+Atz!dyWutcW1vp;sX8`#V$f?v=NPr#Bq|`1&eAp0Pdahk|BAeL@Ob1*S@tE^20|Rj2Ek z88RKLP~X4NCe&2?_PV(tKiY)J$kA;TGf@QqlryD{h`e(n+=5 zpM`KK#L%?W(ZoqS`SDsFL3ApAbP6XTtH9KpQp*~4IUmi{up=9-j=_IP(v%HO6Pp2t z&=d2_g;IdFHHu28q!S4LgM&j#yZg8N8$4ae0nX4FbZW%U29Tg%~fv)rYcnWmmE&` zv}t>j!AYS_$S9<@FS&&UniezG>oZ6s4owmFiQMmMMg^zDD&ys+gj&L>tr<;;&D1hn zpE9Gn76DHbNh3CuM0~QdVHStC#<71NIl}K+X9&n1=NB{R>$;4zNxjKshHb*y*ybO( zNB4!@zIo7AhPEK# zyMmcD3}ZC(56O>8PTX~fz!H>cvT>gsvy|<^SdR!pOBrv5z+5KIpscu-sgFQ+`QtAI z76$|~eoo|S6(Y3c-8Ts;*2da4qi%W3KWxox+-5Me`R~ zQ34HUuOSlARjizT&?yVY(!-%_00#x+WJRMRXNKO@YJ4~FBor6{CK4wtj;S6gqJvPJQE1KVX-o zRLjfz41HmgeTJ*y0O5{_=CvvMH2Q}um6_xy4LA`YgJwQvV#thW z{1kVpRFO`yF?1Bgos((H3{4#8rVe|DGm`Q-msQBg-+dReRO>q*U`Or=}G@7#K`C(T8EB!nxw?j=F1`D zDNdWBOAa{4jRR?JJJM~OhV`d~rsHv|qm~vyVqkBr-w*WA@o*Jw1141zCx4zq_o>|n}YDQV@8m-s@xqMeI|epvI^bVvdDP& zd1|9by#*|J>2PFIho;7F1f2r)qvvx~eHO!>)#hXO?`T|Xr55_Hr`C~;tCn!5_9vsu zy7%q8P50y?`C1RbbzkC6XPKhPH^x^3By7IDTFzeSq77Y&tg z7HJv}uuEHe;a7DEx@dyX>cx*I%8MrvEf-Ht28syglr5fj^D1N^RlBIKDlDKYwZQUW zLH(%3wndCR+w5Z7sf#e>P`}uEazWKEw$yH2Y$q}fKtjE|G;pg#sp9^^Y8H_k)uf-1 z0a8-6Rlb0-{30pKFRR*mx+%*ho$YQqQgOopaYplmWOf560L-mZh<%%a5w zh(%H=kI*W9t;z{A@}jj`0y-2gs9_#}Cd;O8*;0>qCOkovVL?sDMav0rp$g{LSpdPFpG3EU1&cP(|#;o~H>j>J&}@zG=6F)m@%QLNJR>_lU^YDq~A-OxeCx;F?ML z^*vL$Cx<;4xL1y`1L-XWnaP$8mvp79BUH+mtYRYC_> znhBP0i!|ck_)d*HX`_u(xu(*MVcvce$yL&oNQ9-EymE$Yz9kCP=r`e5h4P%`x$~AJ~(pyu^8WXVc}Bd z5jvQQ109`e4yjKZ8fH1H2wqKnlB!gMrjuA1C|3x|h-JaPZZ%qeG0+X}mY2q-{DG${b7x)*ZRaBtwO z8L&NjhFz1h2C)&>=v}xoBbU1}K1OeO2{Z`~BBtZVMEtIyt8Kb7oODN*BYnie((118 znQh}T1(-@vXSUKLKWiJ*$r%q60>Dss)+%stwD?-*OFrlfGr-6Zu_F;>Vd6Av?Oy3S>M4TTxhhDXtAcbyev}isb7^nE zDO=~c<|<`ERYTA1t9*rLe&=?Uvh}w!<-)qCR zqb?!N+Xnh`5kYNkh9H_sV4Eoz|03=bBofMNhG0|6edlqwLyQRnT0{u%SV95F`X?f* zw5q5)lm^e`VpT_s2oaftT2iYkQ0Lxg4D+h#^OzVSc-|p3I;fvVEs(MU&lIG83=O0m z-{tEgGdglmKj-a}2tfKMw`=2XM2m>3apxb&#k%q$e5;3jhk)BsKkcI7TI51+aztc7 zQ>DWQ;VX&+7fsbPFB-I@88EDJl9q767J8xg`Y*Wole6;5!ME-MXpaq?0ND;c`@s@mFy-htSKv*NfSG1c0c)rPou^1 zS@ymQ(@-D}kY6?15BmxvT*Itq2|#J+(Rb%3kcgP|rr{qh7KuKRB zZI^6VmpWryk{L?vvQ%{nKM`(EM^??3dk%`1dk2To!zH40l|Il+pdYgX6DYy`6gMot z2SKk0`WlZqUrSDyL<8`0&*Bnmt4k&rhc1^=tCv0=M{WU2$>WmZ{bk^V8T^vs`z7{2 zF0r9;=|#M{?CCs}6NXSS&o+ZO*#L9?4RBv>8(u;tyzCj#L5=Hjz&Le@)ZkiTa61yJ z6PQa~%LXLv5W8}hx?~N=!%G~VonKC0*vYQTx==vDLFRD)L_ zNtyz9(*=I~VHGF|b7p`ERfktX!Crv=FxjsxX5sTCVOykmYv>~8mMjc|B(A2u&2iOO zhO)}RDhsvgbEP*$0@@n|Rqo!n47rM1j6I>vP=YWpaP_s&x!-Zs>{VJ{RFGALZ(QkKOG|?i>($i}Aj7`AVj|rf!8b!V+zrq6iN_T&* zk~Tdcae2{dCTJAT^!PmX2+8J(SC_9$FB{c4pI+HOn`H)&Pb0PpQb4OA=Yx)dA5;df zQbVBhdSyOLt3Z%VZl!5*Wx0QOWwpee{6|A{93h>yFUPUP)pPAkK_Fcb1LkDVWz})z zwq#uDonJZTz;WiDkx2-Qv>cqaVYjP$P^2&~J6#+Gtohm{|5O@CW33JtDa=!wzS>#^ z^wmiMY64fa%E^^WU-Mg*d%S>8#DerGqy7g#Z(b^HfnvMl%ON&k4sQaD;z`L+1uNNU z?${_JP^Gc(D>2XzqpznochHnfa4_FQpe)d|sa_O8rTKL=qTx_!KLXi{2xy{93fjxq zTDlcCU1JFBGMJN4Evf=&EB?Zv{ zEM0^tmut&(y*EJWDK8ty{!5hxmyPz#WnF9=-A zMvFaNaa}e&Q`*zAf4N#eITRt%bkR605w zq|x9H27@6h&%_0vrh@=nDJ;LN2A0`n;U!iEORfx-x-ytiN2JW^8Ge~(uuP|D zOWl`^$SP3Jx;0H&1XF5DpV%{As#qQn+Aa?Umc~@u>X9+6U25h|6s-9NA6=QUNbEZ&A^-t ztq!rO`w&oHCrV8rF4-7umIu%CCxM`{zHNPtJ5s<5!-1U~`j4e*eMAz7#qY|M-7;Ny zTV_|?mYg;92HR3^uq}CmE#oqiI`uUP+Jv$INFDFERh&2gW_R6|de==5SWTLy>1&#% zl#odaRA7oEBJmPMII-zXm8_=&=EMkWKiSBbhC?0trm8DX=u|7ptSiW@E6S{^<{2Ja zS`-Qpq+MlPc-3Hho52pKBWt#vRr6+Y+$pGrnn=sSv3m!cqVt0-0TcOU6JynAN;*r| z5Dbi_G}UBTHFdIZsU-rmh*i4Z9N-9Aua+Zb{Lz(c`kl+X$Alg1h^|yHS~c;4Ohf3a zu`klJNQP8sgMDE=45`f2cIgbKniEgDBh2DV38_DCf(x`YCkhX%W>nx67}osgWou+c ziPlxsH|i=I*brL(rbk?QZ}wrkVxB_ zi_0UB;YVsWQ=5QPrOf5Qc_~Kpl~MneAvy(^5+amIXvMpGD^u?lt#tcwW%%a6Dzm@1 z!gc>_ z`bt%NrcCs+3JekbdL{82LzO=*cizShh+3Ty4hogSK&Hb`wbBEEXs0nhEnP#<1B?Ld z1=SG44Wboq;jJt$$VM~)7(W1_;oAD<&&ooZC<4UiC)voTu|I<@p(;sfe`-Z-nia22 zMS$*S+r+Nk{sk%b&VDFMloD-9u55C@@S765DREPGtDtWtg+^gnhsjj-$|hc&QN%QM z$^y;R_HyebXVxQdpO|vm(K$7$t0iBy*lPcAr2~Z3_GgDrq~O5f{)EGy&DSL9MV$b1 z#1v4XT{#{ruN;cdy;fz9TQVySAC3mp0#Xud)nTyWh~mToX3nm|uJa1p)+-%hR6^5z z>lMcj=WD&8NWyNyO08r>q$H!Hwy_G0!YW;!s`pZ}x0=9$%xDrap`9A@2+Ks8c`{n+4W0!QsoZq#`vK;!>URXF76;)sLuii}^;XkrS6sj-z!-2^@z2qE3K0zPk;o^ z<>vXC>&^gnDY&db*Ia|Hqec(6hSpe+uAA+bYkMwq86P&Oz)e=-=CxtC14u7&=`Clc zfnK*wYYN=tKfvKtgH%^<1Eq5iXV%RQ>yH^_M3xn5mp-;m6}F?+Jc(L2Z`@djFri7I zruWTMYnhp(ZHEtu1%%boIwi5SiPY7J(!)Z5%8(~pYdzVDh;x?UsbZD+a+F>-dyw|@ z+bhE8xUSE!)-ahZ2;Cwq?+#6Z%v`4dwJ5v#g8y1~KLQ$!h8xx9>$>skYK!&Fm(udj z8aqPGr2H`HM;@wGx~;ic4Q4eE^6R(S0r+IejOcBuuIOI_ZGh*DP5xuoB{KQg8jV=J?eqP|rVLk|$e*uJ~g#d79>5*-!B+Sur&%Rjmf? zDFN*jbqUo)Wp#^9eq=$roXqrColqhy#q;%SfKXeGmXA$Qa^F+}^%E8|DTTz#05jCK zZPTcaBf<5Tlf-qSl4*oagY`=5vlR7C(^;JXuk$7pRxS#4knum#;1Mxv=*@mswwa{7a|C4PF+hCZd{JJkYnq-E1^{4ua>CsmA! zKlmucj9GHi*A`0E#~Er1osxZp`4@|=Z{EOb*x4`h{Y*oo!76Ckc8AP6`41D&xGmX@ zTlHYzk@JIY@2=Bk?7BI~Vr||0tObal8U_W%P@Qa@R7KbEytL$!1}fwEB`o^adXPLLj)$T=N;p;Q28}VH zq%i8JxS*4aZhWp$xRqhLwSA_3SA;u)Nol*xKVqY}tr+bx&(s3uA8iI1<_+!H%9d5m ziU&q(8|8hbJjnD?!eJQIG$m2oiYT7*iIg2ZHA~5T^{yudYmPmZ1z9fFDDnA(+^D2|Qm(hYyQR zx9`^OlWl)SO@iV-ijbJ`8@+@_QBcrgURM4Mqk zeZ>i?0M|IH46aqs!3&N3x_Pq-DhVl)26%=-kczvO61+xfUq{0Y3JlRy^3hGAYpx}) zDZ5{1cNDI54SC%-rq7kV@j9;K`d-duj2w1#?Zz{*sD)-_KduZ>2QW_isDs7ijBCtF*PM*5O}%%0jl;L-ZWWmw5Vl0Fk@#%-h}ab!M=11^OLhS; zr4gBg*f`=3(%;H9VcCeSwpjZ{zHiEn{4sA_S4**L9i6W+a9xv|!@=OS6WKnx_@rK5 z2&ihRj`rcN9beeIW+t7+XBD!3Ffv}dN_e}57qbT88}3O3 za3JNNl$uSTFu1as_U}mH9u9nvzK*>#pmL>t1FfW+jxh+{MH}-5rh$X2#o*}_!sQLD z=SPd5jz z1$ zlK^{s+cBzdG-)`g4B$<40B*m$`*j=lF?cR?D{|3oT&hEP`gT^rX%ft+wo2B(v zxI=i4L)Y7A{lm@ASLsd}~8{FB?7_u%T+gMmLx?dgoxH8h9J?R5A+f>6t#}IYAh_+!(z48$b`B z>|d+4I#VoIyfSNs>*|0=LUnFTr*4%&gDd+H3=BkyQ35Ge!&Ji3Mpe@`hGDcU2Bi!P za{z_KTG`ePzY%Arrw#(8hi`UJ;R&Eq0FteBBsZCKyrBTRv3iwtL*aG9ZHx_j!sd%@ zuZ`93^l*_>3pa zr%gS%TLKHWDkoj+Z*W?%amb^~teC_fm?&pxn*__Enn_}Zg*Xe_B^JzgulD>Su6p)N zX_BW#_bCOQh1Juywu1*!lX+`UR(iV58{wYkR`@a1>=HA!bO)`A4K2QJcD}*lIR+Mi7p8A zkX_&CHVUdL5R!&h02Vy7+3C2P18}9bpHBTtnJ1VgR;7Rf7xusi_*c}x_ z0+;|^;aUO;;df1|?CJp`QYLuq8OH6wVc+nzuM64`j-_4d-cJSOYja}0aSb%K; z479CzVFUF}&7R!R?8yxEK?-0DZFgVZ;=OA+^%_!~!6qo%$9I}X&#wevOJ1IN;5Ol1 zld8*WBD}KbSz6=QEFLsD5$zOa)I{bufA<`v+~Ry5q*<=NGpYShk^N3>xZSB{(w*+@ z-OiSOfIin%LNnw|vuIAL4PJOkAGL$$D zCZR7`8?X%$@ZYt2?9!E^fVH^%R*N&hsbU4Ab`hC`m>zExB*tw*)y>+w?D^Nb`7u^y zNE0GXA;+z@8T=1j4-5Zja@zJ6EX@XB3tw0ecl<`gfwoe-Ut22;VYYi#?VY?=^AYz zhV8;cbIP6Ks^g?X))^1VC!;z=8Tay5=UsZ`Rv_EH@p<$qA@#2tmA-fzpw^x04FzbF z*g8~;4rmq=CX(9AZpH9Eyt*ZcjD6jx1 zf5-RLW>i*Tps4NeyLXRQx$g$5DMw@#G>QySIXVxrOC8;ofjvn*LaowscqN&EJiDf#fb;UPW~5xdqVE z64Bk*qqRiPC@Kg0QP*OCyM)PxN$VATlJn;mexHfoXX2sPcmh-=lH}=0OuWya%Iie= zf8rU&U3|LKD4K|@0(j0tcFrmgSYMNNz)8DZJb;nG_P%+d6n{ToQz{q*l2u;|r^D|b zaP_YAJy+HD)LPCtaohV|R}lAU1rgwr5+StB$SQ2Bl@-Ovhn+yn5+pFrY|CPUkb(MJ}pn-qYgZmU4Le?;Y*822JO z-Rq9#y4P$gRA*>kg+4zFU(^q^vHbZCB zGnj>|@e+mXE4{FLY_z8C!O}vh3vkbc_q{5H-7^=qGI|#X8X_U^L*}%>Sw6OS??kQ- zZpqC(KQnu=?1(s2IvwAfj$9NH?_HHk3Ly6sV(uxs+~d0BJ$1nE^$O!XHdpUmr2rHO zc<$uh=>qB=)*SBR0|`daL}V2d0#c+PjA{DOBc}FfpFpo5Lp3*S+24B}f(3+C(mi)9 zBCwDGXFSlqFQ+iC^`*vP?vo{$`(z2`-osAey{D`bQCXuNC!_atKP&-L)2%K9y6RO zZj|O9^y<<>x|{S6r^`l>!j9hM=<^WfEIDR=P@5$W7|tFr@;}hv`vZ^DA2zUW(=`y) z-SUBUARY`|R0Ut}dQfHJ2cCRASYCvWsBCHWSxw3ScP9NHAGoLno}N9_a`*#ZXLw-i zk7v)gW&S{8Lk}F@A9Q$skhjxvPOe4Eno*Nrfe{-G#eQiNR-Q8gGKxB-T79+PffZ$0 zq=(A%gHY5{Ml3-nwU+y751c{*sBfn|=&{=)$Na~pLna?}>+`XZbUd0)_7Ni}rlUvd zzo{5R{kI{MaZt3#D<&5l=BzlGJ8 z!uaOrkl;^&ysH?|tdE^D(z{>ZntqRcsc&k={aZ5Q{!I;-fBS0R`denq`WqYdH=gv) z&?!_K#NQ||WQ>v}-fwC@_gk```)%|zpYl!Li1?;Ex8ExTf$uyO`_3l~zJvRBJtp{` z)>+>hk}4w+-}PwcJ7$>goMFCmhWXAJ<~s%H0HECVz1r3dzk_@SuYqm?NHh;HzQ@+Q z19~sl(~*LYphtYiwZQM_dEXrz17{K!AF0Nw?`V?WA&h^IQp2BS|6j#p!21naweyO@>jDfg^=e`G!9BsGa%xNKv z@qrPlRGJ9C2a$!3wlH&Yw2kMblCiC8Ulcf^_gz9`U$S#}1>$HM&5!`uMiELZBGOPJ zW?K$&N3SCd1p;QBoDxKeFm!%3M7`~i_^H6lmx;1m7fZrV+mH~6#~Jb zHY^+%H9cyz?yyID#HYWH+C5qCT~+E-hzW@G2rESa%$X4+lhBMvo2v2(1WO+8JCk7G zlR=YVm*J}SwEe&`7#v*?4h`KMf%>pM59QIo5jR(lcrX?LV=>1EwAT;#gr4O9O4Dpd zv{XI=$Ivnf9z|QMJ&=d4(9u4=Zs8QZmhEIO+s#LNe%X4sQr-JKKccRDp^Mv=Wzls} zEQDTH_%Yzd#8HrrTL645Ht#;6s&RC68-bHZm9<&}pTTwJt)i^K(1B+!CF{aQIKmc}2pcH)fP$g_a zO<`#0pLo6<;7GK4B0v)RUEN%9{&F<5=xsp?eI6CI$n1#InF!D|Y6a^+Xw?gD6eSoL+*M%qn28nuo_t)nq<8&F;cLr`)0i3*w;l=`$) zUM6!-a! zNeU2>`mxzkfH^is2DOYIcCdoWj~hD5KAM4l2H(!gv>woprW$C3rtt%|1vdO)6+k~J z;;+m)%?fL_z9C1^U$gnz5X(__PN^w^|Y7wCw08J%B5zdxSk>4M*&LDFXj z&ti|TBew~qJm6Ntv2Du>5694{Io3UtW2){STO`V&3E6(<-e>f~iFxDWwka1y$1N2N zBJu=1NpA$*v*x*NG)7U^fZTB>ix)iWW0lUO$P@puDs==8n@?+ki3t)@2*fE#p#}x99qp2(f zl}61>V>l=4*8sLr^4A}1QH~W+n~4n+9g}=$+X{N15BQBt@7SR#rkc~FmB+Rn0pd^m z$fTd+9k=5#COG3XO8XzT>LMQjNj`ATDY^jKwa2bv=JlrUG3~qu@QQQv0N>~`P)oN~ z(4T2Yfu5tx5cM?b#~j%r=E;K$>XHahIXPNTSTsA6DSPUE1O=E014~_ zro~PgB(tw_rEzi$GIe;2+Zxy00TI1-FFpM=jO~*l>w?Anu zvu{`w(}}~- z<8}mkRuLfrmF5QGZ;1O5GKG%4h2~o#pjRRVFGKE7aAkP#} zKaDuN;}f0yrW^nu2+mQ?Q6iQ&cDlKR?i{T__)z zz7Cij+xaI*T@l(Udwz?}`3TwABUCDr>$R{V64L_(r$}X~q`BB(g&n|PK8ZTz`oZG! zRSWC)NWp-hBX`J8;@e}|8?uMUPUL~yldwX2EtvV{L;Hs}1^^8rdv0vT4x8NaJ%pkh@PI zZJx&Mu%1XtI3P6OQc*MUt!6L`?3iHYu%Z-32zohd?7 z@xtdmdWQcAN7Fm8>2i^NYMN(7Wj;-6@rF&_WNqGPj?FX9l1?G7=Uh~7KQ%NMa%#fx zW<(@BHO#O1p@2Q0TvMG!nF8O|Y5J6Hm8vO$mMPGJ z(ox9B*>27)j!Q^cHbl*K8C(Vte{Tjkl>@9wY^E_O^AF|6hGcj;HX~NU{=IsZ^VC3n z7$gr(=qkx~l zQt;H&E4D~sXe7&Pq{K)EO_N3>sNYItT95ymfb zAm21-1USC#NHzp@+Bg!JG!h6j2@_%jGar>u7bzSE%m>CO^MO6dQ^P}@QyZU~0Mabl z%8bV;OHx&KPpx@HH1=p3=smSt9~dI z>k;cG*t=&qZ*T_@WKUf+wNXv$lv-L5?xV(d2H!I5fWr#km7D@eW7#ZLz<@|w7q5jP zf8j@!ppLyJph1C#W+RJG8M2SM+CoC0FpSRrD(FWv0l35$4G_(*;DzFbe&MN8VZhM} zKtP@@#v|wJ;R`1&r*3?uOF>Z}@P{~@z1?TE$U5~nWD0BvcL#39tF z9&(?Kapjuv8^JCJ`N+Kt|-IeMjGa#wz zk6GyWIHsV9d856W01}esu_zO@fIPV1&eTG8p%%Icwcu{kB1(-iqc58Jd~6|lp$i_! zEuN$fqH8{7v{^hQSJ-Uje=$ZZcxJG`k--9+hl}m2%=I&ned2|NtPUZCK&c;P8rK(aLxflywbs?*$s?T{A?Zi`kn)fX!D z1mwARUSOYMQR_oSf`<<>0<-9X5(7~qU$nSz5JAPs3LV`zf*wGIuLT=Ka9N|R6%(m5 z*j4=aX}cQ%poAEZLmq8!9MO)fK5JG|S8WT0jzyaoM5M4+z`|(zkFdC}*|DE4C?W>n z=z1iZEU3#E&{XpA4$0w1A|4nIvgCq#gA3{lF7W-F6&5NBbhY*qW%0=}mkZ~M{rtF+ zK*KYF2+O4Hu?4Vz!eDd_0VkXp6CrqcsVe?X-`kr(0g+9B2zs20y{i+2+6x1!kMkZ9 zPhoY@IXMXn00gQ+Ml@fE%eb*t-gh1w_%l>w32nRsDq(#y@8M)zB1NY92nRxRH;ALr z-4VP27`SgGKUA@5+$}h?&f0W>bQqlxl2%>P3Iqo7^8C+&E8H1?6`NEqIysB}xy)Z5 zWN>UmEPCiaEV%2x=z9zc{a~KZ@B4wlhw_Xf5)K*&`XdYK-!2B&_gF-o6CK0`?7A+- z*XnuhnSy#5d-J4lz)8-6A3Laib%atw2eFNpu{#)?-3!X0Ayy*1KOkQPP>s(#%UZC2 zKUn0S=8Xl)#ZmyNlt0T$K8w#!$OmW56UNpvZnc~>Do8{q{ot&T1fMnImou=lW@3KM zWRwq%Y7C#5*1j8}p8%+!GgIrfoY&wg(i%3zZ?-`7IBKu6Y?aszpEBPF! zg6Gi)qqNNPM%@8Z;yJ7>p3~Z50By-8Naa0zsD^ruP408PiFvN7Qs<%bcMMf46`fOW zA%K_IHGnyHoJWbkEXl}0Vz_1gK zX`NF)^gIkf&!W7N@v#kTnxESz)^iwtiS$hNT*SiQaHa;V*tKZuw#{NPd6v?1L=cE6+O^YaicC|gp?m6X5I2FkQsoTd8PYWatj39o{!jJ-&!!qiF0TyHiOj=;qjpO z45Z9Q=xzm&TFV%->G$yHy7D?qq%b!1@6JVj2#&hwfw+7S-R7la6DSAuJD3Drg5*2w zJQ>a(ylAS{aH0CS7pg>e(eMgnKo+2d!#;G;lxhUwH-jic>InqYlLmHSIfgcKF{>Qq zjP~!zOV)-L)X}}bOn(8{IJ%}Kshn4Wo-R zXGvMrHTb|afIfIWuvgV5p^-!qR^0-4lhzaw%CveAX-T%*!*aCcsWDFbx&-LPLt(0mtQ#9l)m^f zg9VCqK-ERMP#vRy_Gna2zr>OIVtx=M=jE{kpAiZyz(FDN7fsg#@RMOpQzvcgHN4iC z(|#pOp5RDk$EPQT8Nalyk^8k5BO1XdFA+x<8H`B%kgBmfpt%_LsgaKR_nl`9jCfd% zMHgi>daaJJzB_r5GKeWv zrL=*|wiPo3m*HEoLv*Rzbs4+v1yaXl_lnkdDQ7m9vipDOF$7&w?4N;AREQCm+;Y0? zo92wYQ;=vux20RQZEKfp+qP}nwr$(CZQHKeWt+YG^nK|6#_8yOS&>gOBF96n8JT0u zFJm9p|H2edvvZNgOu1ScSVVE@)*haYDDg!-TjynxU>u#7Q0bwuz0hx?EFEsTTd~{1 z-;+d_HbM_?a^;Y;Q`C9kke1;}8!tW*xVTgb^PP^5r7BOxgyyl*V^HMIKeu=ZoMh8X z?aX?>rzpx!lszRn_vB&;hAh7?Zt)2;@O*V1w94i=(Io$ls{PQZ1U_Lf3tB#lp#DA;xibx@_r z4l8(rd>@rR=%{kTYJ~(e)?a2srmtNtUoF0{K#{q~ODl!b_K#@)@;Zv%QNZ0RLxFk= z2e~#IbU(!z1Q@7rY`{h0LxjSi@WO@UD@yHRu3+%wjr@(c4hv7?JQK^+kXnpsGB%VN zihpfkVKN;iZZjtwCPx1cInLg(^5=FjZe*H&oib9?xN0`pH8Zza z&*DsURj6H^-g)b23O75PJnC}s2t!G=>@=0LQmt{1M@S~5jor7m~F7b`@rQRop zQYc9HI}t)HRLCJ^%0XM$3#}3Ii0uaye*y^)8f`-MLd=k5yzasn2W9nzIkGKPZ)esQ z+vL3a!TJpJxdU_a7a!9lGAp?i)>(TU{}AR9$KG&=7)$wX2S=JK@-I?p3_xEKwbPMi z?KT%(pHBeYKFg}~7hfL_APaOw!g@tsig{o3OXILh7W?#8HP5gORc?<2F>SYl+G*qW z42ERx_afEX1}1CCh8jf?SXUFXU=lG#W(O(^rJ#cYg^;qiss{I9#z>MB?nH*$n>|5A z@^bLi!qqM#jHX=tXvfrJH3bi&=^(bJK94Rp4xCOWB5f&>wvrlen>1O`#D^3KOkP)z z+WCvlBhjA)TX+?)PYv~#6>HvNm#DKU@(&~3Vy#hJFd2wicw-LgCt zF9n4zwd<;V*m~61JJnu%SHB#=LqKArIGcC0&75lK?=5kC7Og@Mb0?HTt8(IjS%XD2 z7?xO8b7MnYfr{&YwM8v6)j$8Lk;$5%&f@+-`WIvh7O55aD=v1uDxU@@S=`ew&H)}A^ag%oRJ66mRAOa|w05@^ z919N1_l5BK_UdUy>W+T(!)51*HRM#}7z>*Br;kM7jY!oEwUr~rD$^?T0HD#(-%1Y& zO40*xZR%vTPWjpQs}AH=OLu-ch=himZbf7gsuupn4?}kB7aFlBa1YyVSb(h7JJoMA`+I{oD_e%WDd1o>3+xp_;1MI6(4Ha2RUm zZ*C^q6A=cuW&d)5(GRTMF4ze>sa?qdFR?Bd1cg?F&-V1RV#7F3s8o0+wNI`8&JsXO z3x1|XXIKH1Q){_Xe>>m)2Jsm=_I&`8@s;Y8M25!erSQ5^rnnT5{hN)JyQ|iMr6Sbz zT2>MEBxYl}ENUiZD9GJ?M)#7}_C@FeK!fJSiddUhNKs7-)(m$Y6*=x|^HU=euMY9h z2psD&fIs_pz_8~j*a!3`MjcLVg9X0M3_zVh2F9(TJRKSZ;O!L$w~foA9#K5(use7F zN|gj+=E-N2yxQI(<>I+1rPE=#LiFn}O~Y=l8_LdzynT$cUvb$33ZW*S>ATI+(6h1e7d1H96Fjh_@R zp_nbw9)yanrL%lV@&%+eDCKpFX#Bv8|EfQ(d)APnSfQS-)+-_HJOqnTNWW%*{f+KX z1&s+;ztKhhDq)yEwc_V?LVBy1f58+E@$UHUiH*w`po7r20gC|d`~w{1Te@iwfnq9@ zCAUX_y*WDIs6U74>MTVyEO>q%;YEM>W{!oZL8|N5PZGtsXqnBgN+vxj>i>kV?B=@j zMg9J5{P|uR$a z3JmI*Y>~Ge-rzWMo8f8D7W;`RAER}-DHnu ze8M`TiNB(uH63F0If-Z^3TtClca6=_i`mK2#Rl7DMNN>JkN5r(Pv~1?Ge(~xc_NK5Qnh9nG}Db~%-l-pL2Pt=2z+ePNdyT`2*KKKP@mY` zG0W6hZBqmdO?dec`T5TR^L+8b{%%N08UgO8M|hT14+r)< zKe4UVN}q;NA7AH*@S$hJeG6U_Oq{`W&;V#DQqX5_mcMsVx%76m{U1IRsGX`}&~7&o0Mb>A8>n!tJPWAN&heX)l> zY*}>+OSL7q+SpAYaFYH+n%Y@8xg@&SQTyquz-LmvG^bfs%psTVBU8|W7>+jVyI>%Q z4EY7d!z{lpXCH7o@b1TPY@Hl4Dqt>k9NgMRx$@2_greb>^OrOW*nuf^AH#d@_re71 z`LY~1AOLEU3k7G}N*-VKG&@&VVu5RLMlt|k{4TWsxb`k>LKIr=g=5UXM~KlOs$OZPUc%$(SqmUHi4`P^u7YQt>GW zTB78@1K2vuy>7w6zJYZ=VyU$K?*8jD$;>IiK7oy0`mpt?_JL)0M*0R)$&0==E_!I#m?xmeo{REHqYTiE0#yZYQ7h1K#kZ0>(?1;gt6#=Af3 zyY{nv0qR~y&q5!h-^sp(nt!(Icedx-e_?Gt=JHvBaRcZt@{TpdM=SjT5p4vJn*36A z^0BQEcAlW%y44+*rd&p{*TOsnhYmy0`hfkx6Nw6EVBx=rDYDiHb}mJk4{h(<1?&}e z@hRHi&%CzpK8|Ec?7SW$p8wiBl7#q1S*f&D{`K6-ueNLOjIjOFzjJYM?7F(Y3kf5# z0`%<@Jnl^OI6z}73)c3JbA#e-ZhcPVungC^QnRd;#B1AH61i!Ez(TVrGz^h4SmjWo zmCL^)3TjF%X(#hXaClFVM6@q9fxXj_7Fhv|bcf4~Q;QnO)&?cWZ0=2vR{k}#r(z4u zu6`Q8vY-v4)lQ3hHn+j41|{Q>4vlJFYm9hZD{QAnYX`9tc1M%e5JXv5u`9<;p2&d- zO()gA!wIWkQ5~hxe)8RZ14&-YH}=A~%{Ou41r2GoFZOXpCZLsSPMAof2Mm;KK~b8- zoLGx=z~hqwJVGWuq4?IuKDJR|XTl%BYfWf_r5~~2^0kfCbHjM4dD|QQ4%gq*iwz|c zh+oIr61xQ(CUL=LGZ-Zk=8rY(!dJG&#H@v2eN|V47L|CNQR%LmCKh+&MzZ4s8D1~5 zcn&4t96cgmG6YpbR;V8Pa!Kg0v@x?o1ycSEut@Y!5I_q+*(SR_Nlg1=x5VZCzu$Ww^0XH1js>qw(GJ%V>9W-QohPs7IgboEK>1wR{Fp+i(v6G|-+i zM0u52q4*Yu=!oi?X)oSPD;#P^%sKm<^;1r)j7y%M(YQhIby_&}yd1mclX#I0e3XAPl3L_i24aegDax&%-SZrPvo05GP|TZCNu`WR5LKdI!rT6u zy@t}Nh9M%w6Ar4j_Oe=DO2rc!+r#bF8hN%K^f;vO9*u@%aEw=!%f~U^c0}OpI|1!4 zWYK}9Fr9mKewAl>?X|;~J`ktqrxZp^gdIMcdMma8*MlVP-%o8bm6|e@YCzN}*@zZZ z&ufe78pM=q%Y#OWBWB&_;DXvQTiZV}cN(K08nnE37x2{0c(WG+SKGKA#8A#3@EfxViVa_@)E=3F^$->09% zt|8vogA2^nkO71mrEIjD z#quu~_7#ne&tpba=Ujq+|KPKlLkGgd#05YxjUca6G|zez=KNQ5>aN z>uh6go^>iM6}y@4eId+aa**{z(TzyCN_(7t&{jh9hmBg_z}PMCWDpFF|2e<~DgWo9 zO}p4h;15ik!wsF`>Q%x4M4=&47G|&wZ9JoS^H4yK5I>3r!3ROs@ttNS&8r@ERSu30 z4{2lSmf;byLXkx!zM%y#_ei0FT-X`-lIhQtI}p{jp%p=zgCH8s{e@`=ac*nUO*$54 zda(UV$%_NmJN}2@|8)(~cdVONbo=)XLK)cT}g!u|ioM zP^{X01NJCrTR?+~5Q6KME?no4k-gThDUYp%hzTlL8G1_i{EIo6&kv2o^ww`^_Y+Xf z(MPut9nBevH-ZxFl|8u~lm2o`X48~Jt#eb_=_BiHriK9JI=Ok_^GGtQnw=)Fy#w#y zcl>o@;s_aQ-%}R*(X*-89>-SUAf`VGHO1KXH;~0YRw6*>0OE&MpZ}@=J>~AR{O;c{ zWl{CvzBnv@G65;`4DDHo*X*Pl>~mp`F7r&!c(6_L1`8P=)2R_{i$p?}pR%9l-s+jKeW2S$5s;_St{tCNUNg7=8M&Ea1;@E@X z>Rfrv(Leg`Z8&Cj>{ZAFKq%yMwb^+R!I{6hV=;HS$i*^a`9Whih&6~4%J(sP+KTRM zeQf&V&*RMY$oxwV4A~0X#yhoo?Pfsnn{%)sx&}s#hG;1dgis0yOI`p3>scr=ekE^n zP>IUlEOn8;cJ_9p*<^WDo7}YE=#T<~4eAyV0OQEs++#fOsMOr%Sk{7^UD8yDFO{M) z5PJZ%8_2+r2_iIsU=q(6@DTw4qkG*U7JPK?)^xw35*Mj`nR5R@1M~tbRVvr6d>tYl zsmzlZU_1^W>x|e^?osx-wNVyNiHvsVFV>Lp1LHYu{w!|x{RO9^-yuJF#(YSk-avfE zZF0oe$o*E%V(JZ}aOdMSQgPy2RNd&QPsV0_O-8?Q3CP)LJoU_JQX%O;{+`=4AD(@{ko|z{ne5R3E11LAivt> zii71vXN}xU0L#Ic66k2Yzi_na+%B+9?RsX%v29uhJl02DDVB)gyX3VFylBvYU!G5a|XV4)OP|cltJ; z3Sj;T)j7c=E5@Hq7hWgdUdgt`lj<{Lfock|N$_7Ewyq&~GgmsRcq5C2j>QgboE1h?3q1Cu};gf4^Q> z84bp(XnQ!b*#31e6w6ZgyyEj)D)_O}yE6N_MlRO-`Kqzl-4>WfOPXy9rL}JJwmMTC zE8crbzsr(d-kY{fE=sdo&-^_-#`w+J=FS5wZnLwcp1RzE0Dj*a_00zMvpXb&F%@}d zK*S2MbEXQ?PAD!YZtz=^n%grNA#7)y@v+-Y?n>5~tq{UM+ji6G^;z2*+T&34NxNJc zz^qC+bxSf6-#l~^r`v;_2KOF|*m!Neee6+8{-Jdm%QKy7!45stzYB?=AkjC@UdN+>ELxAw&28NtM+N+~Ln4^lK0({jEoawmQq$`8Ra zc{z;jY-=bQ=_l^H1&_<37cNZVLpD$BuO#lffVXvlCu8WB(VN z9=SRy#>6x5E_SH@s6s|rnltM%;J$3f%$o`;$a45y-iJH|^BNf|9f+0XU;pHRQ^Dfh zAOJYoHEOyRCmuoS=N1CdVM5cQO+cG6j|0G!BaAaM5XacB89!nVVhwx~cAp9x$_a-X zo4pD~zoi7#_tH9HrCtbTne&g`nZJbIj(z{jMRm{eaS(&R265PQ^8jjRZ4Q5Lis9SK zP)$Xrf)@rFDhvq?rk59yDo0TEH#Q6&7ibDR;vLGS$?xw}rnhTq9KjJ>1MgS{Pj7|~ zhTLKHcoI7@y{gE)j#Sr*8VwJ42Egm2QeIRvnW_I9itQO7tibbh3GcG+;h21hK>#88 zk*q0cwkR$17`~wi`3Sd&7SDGZAO6Cb?GF**p9Ls9TajY3Q^BecAG4leP1+Dxaz+3h8bEnj9Cz zxB~-L#|E+A@Hx5SSB%zl@FOQkdZ1n9#a#_xFaMAhp8{baSYi4}IM_WVTW6Eg)2&d! zT@7YskokKL<{|Uq?y!@G3y;si-IhI4sW}=;cD94W-qt#UV>FkD zM+WAet2Ozrb+tH4U1r$o`HP`abQy2yLUf9#O><8-Aa-^ZL#&#*7Jg>`3RlY#BR%Gp zjmoIeC4Wm>VOM$R(hNX#ZoVAr)=@VU@_d8Wt737wX{$y*ED>b8%7pj9yUbxfOBR(j zo546a@(@FJQ6EHde%X9<1!8SpoQFLm6cr?hTg%txBse$3W9<$$`-4^kgFAz~kQ*2d zv$}j8cJ=GnQSS3YtB!)%LblO8MMb3&LiQ}?VA5XykKo`Xm2|({<`Qj|?<}h&`1PiX zUFwKLAi47`Sw4p?rDw8?_A-% z!_ad^IE(5j6LI(>4dQDz3#mudsrsv+;jAlHdt_5gPF{fTLUw`|t2>|(Mu^kf=1>FU zF8g!WuiDG)u7txWUMQBh5-#Ss#`9L^Jo>zYEc`h}BWj@|9~o6z)3&(m`woR@s2Hw| z`hO;~Bf!)S90oD!peu6#Ucg<4C1Z}m);ULRW*Zly4iC%a#E?wC{_ns0gXJp0AHqro z6oINt(n-~@+|Ly6DI2O@#8i(Diw~ziRc`Gza{}%rFYOA}^cQv07zp95N2D*;RJU$h z2Kzj&J?VHCjhw-{1z|OY@cmurRSeQ98*v8ipmP;eW2x?1Z({1d_qz9&RCENALE4Wo zlkQT?JA27$P`-a`RUTI5Kn~x%7h_LsJqcoLF7-3qzP+(%c#lkXn*L?J`RJBJPX4N( zs6Tn`y7D?B!f5E*?60m(G~TAF^#`YI9n30=CHP(wu-4?*xfe`^I-o4=afXkg0Z(nR zJ*+5%{bk9;p6KNoeN}X?tL&6Z3DjXrr;55{Gk|>~JfrDaXYv;HT4zeNVu+ZLNzcmd z#+vPWXOpaZr}NZdZuh&la|lPOISzLyA)?-ZS^n-ga3ogEjl?}fAg)N<-G2$hztU!A z6Tqq)P1vHh`_@JiXe**iN&azZu0x;z!r`@&xdnup zSI4$Fey%AeqyC)7E@EQ?6&$ISA1?tb+UR4VsG>dZGSyR=S#g88>S!$YDvUKoDK4l% zN2PS&@Ip=vnHQLQBGD^vxq6X-I4@W@qZC;pAmCv!#4!j;FlV|za%XZ)SYoA=J^^_+ zh2HEC+)-2M_!SnScAk7zTVjZbYRihYUHeJ+c|N4zzdW;0Cn z>Gw(+yt;OkSC^!AQ}}4rg1vb9yb*HS8=||FhGK42$D36LYk_$6A`(|Yd}&!tHK>Zn z)QGXP9RWh(i7G!Z0^AcJ>+w2T=`Jop24n_s;=$fZ;rYGE!3J{^3PMq&6MZreRmxmsYy~^<`i(2w{4Oo)nafHi2&GE1A_p`*#-Ha9bv$h)+4ArzC<|6>C4T;d# zLW5q{*Q3U@#m$|x}d&l;P1o7C!CER(43ehR-JbQ3C_AwWC`W=-PT#25r@;++_SgX zQmKgLch63^D^ejV(Mj*Vo=XneqFvDfGGdOGs6+_TY+j(r^cQ^)Xz z1xG8E^U?S7zQ(ACc2f689Ffd@ZSSotF(CN1$k#b1ektSpe21In=6G!gt70Al>qk=2 zfqeGl3;uV+BVFq%yW%(5Wq_-`2KhzqB#iWHwfhT+t;uXrZ*chG;qrG8$}{h84DACH zp5OC5TK~^0eP!6nB|Z4hrBpXFH^i78OCg)kSrgKwi?5=!{ZHMkL4p1cP-&m)UYhU^ zydnY250}N8U+xj`h8NS-wkmQ;>+kQw_KQYhKO4g3v9O}6%+wAn0@*yQV)-w!Eq0fq1P^Y72Zujez0&@kU! zz^`bJ@{!`(xZe-z`QvX(ViLQ^M8Fe#iZ>ce~EsRYZo#;&d7yrTB&elZF*2Tuq#PR<^g&T5i-i;< zEt9^1FXvbWd{@^ph9(yKX}+Feb(l}N5vCH2!46A_ zJr^qLmo!&f@ubye*P$*_*(`}wp%p#dB=<0%hQS|s!^Y_eKZ!zeJ1e%sfk7u5NpEDN+s z%pnHBHv}bDT9O{@m7&d!7P5#_**3`3oh}_&K)=_MP-Zl<4&IENm^D_4NLC4c4G;R9xJl z0RTas|49de@~_B$Dr@%*S(Xn80FZ_Lf8Y=PS7`%dV@DGwr~kdOBVDEH|F3e6x|AI@ z2h#uK50YW910v<2L&Ma!8gapIEvPpJL88%Dc1a-_u~yVekSp#B`9{WZyw#7>sC_ql zzbU$LIe>NXs*f1DBvg;7iSSZV>Oix64sDz_`B~e@#MnkoO;t3_-kq2bW`?k~+Dr1s z(v{R(i?=G+nuT3#+HaXQBrL2Inkva_U5!>uZ*Fc@k_a#};q4*2Kg`tt`IR6q+MOwO zlo~s6tdtUNq4}Z2wfXJ&YFhvPoQ?g)wdMuKX<4OTpA6n9dmr8@?0@!MClsT4y!#|3 z@-%qONG=Ds5kAB{^_eXvGup=%vj*Da&&fzgR+l4P+F2Hzf1B3-z(&DX%%o@1XU{04cqLTr47 zs{1848BxBpIM~}`gvBg)!0_NFjHCy`T!M5ppNltz}ahonv0Puaz%RGwg< zBZb8#62p$^IN1!EM>nx1!!W*#(!9iIp|YSOt6C2ye{zm-3xSCm^v-T!Tpq_q>6n1MG8`I@eT_=ll?m(~aoWppm zZ9d!7pWmb`sA41#t4E+rZ(EzISQ#O4EHNt42HVLs1u7aPMbRTMiH$V!f2GzM9n#x4 zOj?svWNxLybcIR^jHGM#^kP%6q@b$Yml{TXvM{x$F+%!K!eY&SveZg%u!aS+_j8W$ z8khkrrPb)UBItFYRUZ(+?TdL}@`)cu251^)ShtBeb)r}4XFS)4FIj?(IdI8oXb(m) z6s_r3qpcYEUDfA_o!coZB{|ay1ik+86F*4pDidN6su&)w(M5z)h3}&;5e)Uyh z%znn6>A}s{W;tI2S_}<$IbP2PqAv26m&R3buTzKLZZzWELbj2jWlXh@qZ3~zH1FZ( zJ5K@@Qhx4Idjoc~#)y)Lqq=WSd@B4{Y06gqmU%JV>Hf`r) z19&I9A+$%>SE8u{liZq>&$R_iDx82839WVB!oR4pbsnd8Ws{Db>HvNc7^vopwA?LO zvcE@r6D|!smUzZ7QCQ7sMHcphsf`7;^Jkh~o6+VHEBJBTuDM0^+0Y&OdD(iBB%HMySCShzdLPuY=Nu>xxviyhsLrUDB$+Z)hnj zY+(d329un)V__X!wx+gNQ{W3EIz-m-ic;LI_L&7vk+P%X31q=}Z7^OX@Z6#)zLbp- zdrozquOJMFqB5Bok*MZs^5i8Xx5$coK^+@o6y+A9CmFUFRh%=v_Pk$YmRN?DBFdup zzCMjjq-NQ3GCHE4EF$CCz4n*A51SG4M$=V}QUV&k-An^AuZuS<1wjVQt`bh^?md|B z?r}GML8#2<&V2Z)TTPsew&Lb^`$Zv4&0|kE7NJC@`nFj3`Rx-m?JD6FgxEkzDb;vF z$Py?8-aD^BK4K`WFNGkXz!Ju={F}Zdum!eAN0+!5Q(ady>b_uuU^sQ#-<2Y`}g=PzZi+Bb=&sZc(rEZI+LH@Bnb zYaFlucuMWR4(AZ$*hPEz>WM}v!9IJjMu%WVTd_G2L7pQxUq6n^HQXoSjR z{nN)S40Kf-H4u_2iYM6D)92|#|;S1ipejr1Wp;&9dS( zjxf^Ze^}2~DuzuE-9uc3?IfdL5MN6*{XiAbdn3XD_aq9TM zC8h~k7Z7X7v23iYoyo$_+nKVF)42R9BWV9X78d;-SOT>?Pw9)YK>&(|r)A+m244bc z`I|B!#+!Gd&F@O|5eaPe6bSyq!A3hY^j>+42cQ!#ScK-ROOUG?zMp?7Sg+FX?j@!6 zg>3H=33EgCGeH11)Z-{FyT=pV=ex3NXB_br_iY`zh{%V=2rNp0_3H%%dOiR zy6dWs#3jo22PZdywt=O$Lt;xpuY{b9@A+=5N3A0(>+tb!1$~Xo1-)?LX2An^?{LVe z9q$bfS#jJF^2wgHZPCr{=MgZMr#enInh4H-L8^z1J)7v`uU|{a9;=l#?@!yu*9O<$ z)6+lAf5rN;vi3eW{nVZBDB8Q~xkTL2w(%lV(c@TE!k~WLv6R24xaV1||8~MfXO@Zl zeIHA)ULvmfWwOSVhn~hY7OBaS>ZdfE_3X%byLq!3;o19%>jbas?$bW*Rl(DRfP0cN zni_+z`G^n5`>J{W;hXwK|Ig0vG1MNg5)}ZzS`gsB2hIIg=lA~vn!DDXu_fk6>|ImB zSQmN)VDizWrteQZX|xtG>Y3Sk$yE&Kp{WzHDI=y=QTQ(0`$LGh(G!yl> zqfsB4c|O;2-mK;_b=~`UBl5YbVbSt*qfdD~r|i`#%_8`IcQDkdYLk`at+o1lu*aLd zu$S~0bFtaPm*`^EmeFcbVsR>1X|V_?+~9 z@;mt<_xsuQGokQ(01PedYemG2pW^nC#fP+hmYJu^Qze=YFqD!qScK{JU~~dY39$}n zV)zSH=}&Igs%>Rhg-A!~RpH^vpL55U^9Z^8CQHNeTzafz*L;hkX7LE!ue$+tr4UcH zc!-_?$cFo9Z1|hIl@8bvo!ed8zhqsqDNddRDP*R_?D_)YEPtjfgs;Re2A~sUw$yiz z6T5yumC6k2zeZW4D*p>s{@xHJ#b+u6l2TQC>$=vr(rBp~p3@ZSB?YY;5ZQv?@YHhC zP6-D^r;duDpTYA-sn(KVe04Y>`b{2~8eeX_qt$EW={6O**QnCKfS3GyA1==;=hRW( zb)ZM6`}>;p?D^t^b(oIdEeK^(wG-x!~@?Uiup%=$)4(RW-g#hfHC&3+`}>J z?&5T6^d=dW&Msq~`6e5;4G7O1=m9XF?8je!jV@*E1-Z0lQ994*N5!OMLv*0BT3ydX z>LuH$!Hrzg)Yn~;-%U)sS?z?MV>>{!CJwdoqS;SN{)p#p*ZCSJMTAOIL-~}-p{Ucq z3M-v6BeHj}m@Qdcr0zwn@;Ry*D@lsGLA_@?MUNV&h2C9_mJ`s5@58ek6|hABIzQ)?yiX{d*T&t^$HC3 zo$@5}IP9HJwEW-6@b*I)a9P=JoMTY6iy3V2#yXh(Sgw=JFK(rvN$C@VEO~|}JJK;$ zBnS}i+-1SnX$UP!z^nq~cvExz7Wr*&z{^f~Kz^Z5#JkLZp`k{M*!DBxO^ma$knSAT z7k~cYRgHGVQ}kGn(CZx{YYhVg04X4Ky+HcbDE;}$WfAD*y-LmRVgA!3L`xn##qHRP z;l?DW)tBJt$$nFI0*`^_+Fbg}V#M26kSl*j8juKmJdrY;iE88!Pbn(X)`tzfJ9>?x zQ6lV-E$e2xmc0u}bglcUqKIvYcXB}8WIO>I5X={FJ6wJuLuxN3AF zpc;dP_P>x_WiB+TkGWp}XJ4PLQ#NUqLy_(kI8$qiF1p=4q+Tpf6ehkEA9WQ+Qm}PS z6*L{nvCr(Fp8F??RVkiFs-ED4>I;MY+0{7Rhlq6G z8JZl9%WnR#toxGtc|rV;k?s9W(Zmh(d{FYS;C&JFMTkR_5dUr;dT6@dFhUj`uLU??*88SD{bpRR>o(}W z{UN^tcztjJd!MEc_LyLJWobLe%Zk!|&o} zoC9t7pXd1x#WIT})2Jhs`y^}B$obWX_bc0&w`B!4)Hx0GTXqcq5L1x&Nglvs%Tr{; z1xkX0pO+9A7IlGMvF`C~#&?W8!i}{^Tgs*z7Qh-#D8Ou-vLzYHsTGGml<94ZvydJ?!F)h*7wEy9ROegnmob>lh<7lFd!Rlo%}+;>(gqtC)oU_jytjE7tspMrZe zXQ-YF8)?4JETAkEW9Ta5ElOBpRv~4xV_k%WQsDF$!Cgp@ zjcQMTZb~Zs-U1Yu7)uqrS9}RyG>qjE`oZh-&F_hx;H9)~C9c4!US#0MlG9@25N6k~ zEQ2xNmrRG}%5^Y|*su$3Pg>|0o zGsd8WA999@TP&E9umeR`N0m~5n?E;ywVYftVTXO*^lC)%oKrOs-cyjw#hGyB6rwgU zFKIVUR|UHGL=Tk{U`pHlMYG zA)LfwnSH8^BABbrI+SsSIRu<>!Km74K$=^h$kM`+a}@&e(5cmLPFXXXS{Oy~vIiNX zQjtnj^S5P^PLs6}as~6Ci}yyd0B(rhICoM4L$;pCb9Nlk5LcpnrWqNM@iovI1&TOT z)?gMFKPoqAV(RkP*pfmVRl?qvuD{Hwkl|lsIdgf?j?;~%^MW&{gT%%8#sR}YmeHF0 za!~Sx+dQj{#lRNt3r+`y2DSou`%k02x;14A)@!%li1brkvx$RqDXYU@FY*xPMODe; z4hS^J=sV>r(Nb|P3zDrg!txY~4@^3C9`iI@A(aPWcwn*n=!Ou}hAJ=n8u)H@!~id! zLCaZlywmi#4A@O{dq(#{ zSfgSfY3JdgWu)1l*N%IEYm;j&6`9p?+)86tt<2RRtRro}JPJX;C6z*&h2K&U%JKed zr?gF4Im^J|E?m?x_0nu>As(G(VJF4gC?I+A9|i(W{#32m6_31_4aK^!7;#XXY-Ex# zaj;rFWAo$wBVm?oRj9_zImtrcz~kh?cc(<%fv^c`zDt^2)_8ng z#k`EN{6{rutC61cm0{qk@fI^+7Q?fAk+X^GgVveD7AE;sF}N!6xe9KPsW{HH^62&8 z8SS8VmlQFlL})~Vs(V`;1tw95Q;g4}y*&yJazosnMC+hC_DhgNo&>AF2+7nUyy~U=* zBlNl;+Oygq?S>%rzqB7~6|sE;O0#+wd+$kkt#iynx^O&73h*Pi(4%FW@5l)FGtsr4 z)GcUqf0ek0{dL0I5ywKHnAddkgLQ+A>X|5U3h^-YNNj?_U&~%ZCSs7zgOozq_w~mO zFbu9h1dTnWW|Viu7sA1V4dTtR=;|oyf!@&>7wu&rlUP_v+I16~5_Ti`Z`X&qNuq+7 z`lM9sG%}bDvufGD|M0dio8C%>cCrRkEry`K5~GV);a=Ovtt#E(Dk_)82bHF^N8*z$A1B`7T3ZRm|(Jt@wbK!|7cXY5V z*%GD8+$E2#+cF(5<#p7maJxvY!<5(KDC4jc!W*e0a^{y`^0#oWISGM5+`dJ0iKCo{ zTQFIvHHdM$8ShItH7aH%k@5iUpHdYXHoTXrX2Q0$f_$z?zoxXyIElf@0_jc^k2#fA zMw<}Dz&_(}1?F1h%>sADKf0U1gFzlrJK?dv;O!y6YdPRe>*C<{a03bUX_o4`TfG5!TET&Gg1z-l`Z?H;d65bbmvbBw6P@uLzaf+DuXIU9*Z zTxjoF!wykOxWsTzeRS_}=xFpi*>uO1Gr*+XzgXU@1N@U5{Za;=#Bb+K@8~mU;+EHS-|M zv+F!U{nz%Pq}`CkpZWX!V%g_nLhDhg&};7p2Im5{EkeoO3C`MwNjYTNGhTIRFIFC} z6q0RT1T)+9h&(-E#ZLqJAH9dXoQP})3hhw~gHju=VsC|kR55oj+J^mZB zJtq~s=;eBR&!9^pN zCQu7ST11?QqeIg_b+>WfyP`5{9goZ{SZqZW*3hPz89@_19uK(dPmG#F-*Tin7~Mp! zta3qKcp!bP+O!?__y@sV7~r6n1uxEdOP#3$5ZN-J^M-+ErUnP)3^~dy3u`RB%Rky&~~X zNBX>9TadWuNTNl?=Re?{Iycx0a_X5ef9JW)oqK-+QL+Z%#uMxOC}l{PwG=QWNxIvX zIHM@wlg+P7Se0+!eKqA^S9+nEanZ08d@LL!-m(6NEbg1J0|k3P_O;+-nUQ{}2P60y zrED@J=BY5|P61x$(X2uptfT$5EvH`sh>N3`Q*3o8mm7bj3G92hb97x%j3ORkkYi2&7ITtr)ccf(E(NO2ixWih*ND`*9Jj zr+#wh!~6>3Bn}*=9EheeHWx=13DWX@BGCZxZn;&{i3&OOmMNr1#2jbPggkLYk|`%} zlHSbNHX^*TH(|tcIxgZxkh6&FP-^I}Nkaj-F)tzb6PHE8GgB)zfK#k3=)6Spz@mPf z2tP1I*~~cLG7_foLs2-0CP6inW@qOyLn7T;eOHrnDl!&CerTL@Dy^;`u*|G`c;KJ7 zzny13-0LB$I)hTt;cY=lu{mTsoCz8yZpYfze{Oz}UdVYntaKUIi7Da7Q{RnEGk}{+ z)(1n%)$ar_SgSnd13jNsLG+HWd6In}?I~MEuEYg(yv3nGPNDh{F4lpo7CP6XmT2A>DaI|hNMPeITR+$`IVo+uJgLsXrYX=;I}J@Mtm^Q% zj8k4K&3`S>>-L6A*O92vAyZQY_yFA=7%>Ny3wL1V&$#|)k(@Z#3jzB3Q+^PqlZW%< z0xIKQczDc#YI}c}e3Q9j2==dVj1!BVqY1}j;_$g9sgbn`o-y=V6e5-I;E`bZbQTvz zMl3PLA*(kk!a?;Qm>_CCqFMoSf7MS8_I%P_$-Yjl+^Qt5vn);tyE1W|GqxWHu|+}U z)5qH6oy8nhgvkAdIG6}^Gm!nWpu8gX+I<-@a!y~W1`z=|IeBINgFNH-$ve&XIYrKJme3dYz3Ui6E%+{ODKs0dYkz z)3$OmCR{~_YobVlDr1$dO>l}`bm+Y%RYd;ULsg)~hiwK?3t5EzAB`lp)032(BxYSj z&I}B80G%-x7{4^Huybx(FMtt6X9OvrJ?=X_RMNAAb` z#gyj53kuR4{@rExi;&Ov{8xJOU}j;iK}SNQkiF!r3-EPt&&a561Uq;4DTLsDUJO15 zF#K!^W5M)n@Qz+Q#b$hxx$A)ga5)gN=);poFc|yYjDA&P(iCg1ep?W5M=leq7q}L1 zRdRTaPVavnIEVN=R9<`T4}`iDsg>t%SzFD%SFG9HS4YpReX#zp*?cVQ_k>V%vc3hc zXg8m_!!n-IWTHAO3q8VVsf_FJ7|z9=DC34fDh}jFg$Z!((mRG-?f@xS=Od6WM7EsA1H9*W5OgVq3=AEd#%HQ?LV+&= z+QA>IiR9jBHAh$85i)9a$a_Pc%*d3Nq76*{iD?DQ0*T~&x z&)^+{80QqmgL<{wrzEe z{B9upcHacHnF)WoxgbSHS=8 zUK5x9LESqAi56xHnrYj%ZRbgzv~AnAZQHhO+qP{xPiD@kxf3%{cdELp`>l7xe*Gi% z|FC1>Ti=Regc@Xk`R$r3xJL*{tG-b_N1e3A-xe+n+k$GueQKL^0B8LW4|dMmqyOM% z<}gu(*#D8vApqx6BwpAk-sm8ocJTc5ry!5f=x0f5+uyu?(W4SVXg?NqwH3j@iE5;F z^+s%4x(`d}N;$$V)TL80WAPYDVWMOD9p1YEIBy1?yN26hlk#%sA0PVv0ThW~t4x2t z5#S&1zX2$u)&3n3sDHl1E|IrHKWG4e9o&CQQ2agnKO-oLF((zU#UE~J%lyJn zt@Q2^Rfj~X5HRXUT;Px@x9j4c&C;5TGEr36+&)%I1xx(@LeAIFnXx%HNH^nSXTmUG#F?7J;K2C_;cV@7<$^k# zVajx{Lzs`&Hi8&f>BgX%t7qj<#fWj?WQkBqiORFcmjDLuN8$*;P-sWZSf3x?$o{^S z{;VP;?|#KYyIpT4WR4*#JO$fWESuM`^+b&Vr=`=A-YY{G{y*YVNONa#VTOsa~rE+)q)VfTRvs&e{MR}jmTvltSHfoEqdq3^xf!d1+S zLDbo(_z0&rfzC$l@l3TC$9GSwW@L$K0(mFB#U$HOLJ-Z&ZJf#FP}@M@8zW}fkmrS< z_B7~y$;et4LPxZ9N|IQLeiI-n#~y&CieaghEq2UQ&7cKE(ud)0o^YtbT)}C3h18TK z5&LvTcE>Om5@XOYH7ph^KNbv06HuKZ(%sT-AN4YY#i-~^t7OYwUNkQP0^iG}m69*Z%JY+iqlE!1C=56mQf)YA zW7u2pgQcdTqotsq9JAz~nwqPttC>{E@f%BI8&WncMCGkOPITEtGiQn>oIzBR$^e?Q zV}vX5Hp71MZIJ6nBj8b*T{z^H(I@t`_48&TXiQUp!R|zjBOhQ2a2jG9e$)tVZ&0mi zRQwX+FL}$K#F2SJc2FAAGU(^DVq{DhlNDB%UG4*nK!#7hAfkR`^%&4>`Xh5&(+O3? zt@l^P&1dIFpvd;Fe;#Ab6WFB5zXy;W?nYva;kUXUG<&2l(sc9 z25JN=;Jud8{fvj-6m8)YJw^aKd^n%V`|qN+2;?b%*2zDnGXNE$8cn36p+dRr*@&lh zzyj08+mpmk>Z=p_SF=aFwx7H)fVUGR^m8K97EK-WY-^u3GqoF#`?okZWqR1BJUK(QF@# zTY7n`E+6}2?+?Hu!g^P^&w{c&h66eO3CkT>qP0XY<@Vgp{nmoMOE)XHB-iW zDLTFfMmEbv{LKLmx2eHsQ}^E(z`D{JF>E6x;09skIT5{Ki0uM$auW^0vYNQZtl5k^)gl|R=DL<- zyeTJ~NN(>GxNEzYJYPoOxXn#F$&MGZIb13NlCFYYCYNyq&0~(VUB+zcnJ1hCA7@-H zMMczQjap1xHzn-{ko}|As%uY}@XtNFwsa6xlAeN2`qnqg!{vRD-Akp==msIDH8&k2 zIrBRUEL-cxA$XB!trf4>l2+D6nRmymCA7UHO*F%c^ochQ!tMICvJXWNi^^i5U|?<;b8phV>`h7#7sFB|gm#5JIlCr-lI2@{cLY&Gp2(v8>7*V#AH9&d`tW(FBNuGCb}!M#Q|Y zatu(No>Rra6zi<7q0w>mx$9R@mEfO6fhDGM#Gj~$xN(bp{mC?4-O~q7kHBmwS2{q5 znr6B}5&xYWO?TX({2fn-at_`O+@e}L&x2I`VHC%ZH*H=D;LOTH%Pd&-C@4RPB0 za0Qf~tN(}L*GmhLU*fN5MUEY^!3!`=uKu00_jK+9cbrf~tKJ>c>UUoU%7I+$QpIYR zN;VGFrKdH*JE@$5a7;AbE(IZL$5wg^h9#@DlEOZ;)`&te>4yn19~8sCB1ll70vH+D z^t2ynA^5>R3)3|*LBtX9Rg96(C_QTx>TsGMyYg(5bYh|`PZxrytbHa2H(;R3rL4c( z7ZTsuMN`-h1Z7To;SDWv@U4rOukLH2T?qO%#idioMO-Tha-cKod2N@H4}LhT@^+cN z#SC#Cc)?xnG74k$&uqy@`$EIxhC258>tFBc^Vjb3s;K+zQ7rkVjBwhFAd$eK3RhDQ zoHX2!9abwF64G@qL6l-1F$B0^t7A)%Get%^ubS2nfw+>@m$MWPneUeR(7$DW>G@lo z!v!!u)sK(3EmoP?p+sS2yWM7)fE7(nEOt?F*fO$wA@&A~Uz@zEWY(2M-0q>(pcOx6 zOPNNgkTpyuMC4jPpzKJ}-d?eC1(sQ-pLS+Q$zxl1DM2uN=TfWxbSX9lWG4i)UWHo>E_QyRYSWmEy3LeH67~SSI4tnIP31?@E+NV#cPy{ce1oXl5 zFS?0i*4hp}!o(xkd8WA&C7A}=L$zyZW~zW%l#F;INsV{Pd1JmB_@f!ZdYtD*dp>Y_ z4Cy-W-14B|hnQ>Ee?0)ANnEK@B9|JS$(eT11bn8Q-;rCx)*k(4e89WYK^^MqA6nDS zCf}c@ga$6saf<8z3OxfyGCaUXlx&Qi9DZ4RMtPf#R35C275O&y7U5OvWl0m*L6EVy z&~v0RkBb}X@ex-elzs-V$YXk=_Ga_weNvO7c6Ctz3*V5cG1(3CJ)y%cm^CimT$F4S zVSLHt^ZGh57tUGotEe^ZW5ZP+eQ{-&HMMzx2ik2D^;Rjzl*2e{ynN!VCew_9t~)Iw zLK4hJ-_&Naubj?O+>!P}?N3iZ3Z06!6*jUu#hafHdql>*8*DBRPQcJ(KL|cx$EHRB{Dd;iE>%l)EX}WN_j@^?o&_w!g=Y}v zoB!lz<@w}r7}p#P8N`NdlI&jbs{gM0bb+d;R!a4!jQL`!!2c|+|DD{{g*%ZDk54dc za>?S=N8H}bM2F|^7**Ji5Q{WTuu(cpawkqIgrOtpQ}P54aWmfbG}pFtH%XuDdfLhD zkKvk~w!OU!1S3vt+~CDe-j_95dIsux?4QnouhI4ZcDR_q(*f>JS0hBySa zV%SC778?S8+uOP8fD}Hca)ywPlkDrP4t+57lPBc6CR!~HO2p16Ae0SbBo&^7ylZm2 znsH0l*Z*^huJ*_0aT_&a>CdAjjgORvRkQ@v(u$h8x_aN|16YDMO)4MI_T)>OdUI~} z3O-{c9w(pCMkD%cihfgT>#H_4qxYF;{`!Ux7#~XCW$Y(P;vr&SclYN2oiE5+ZkKrP zc-7D0J72G9q~sDl%h|!7pZa6Wjfel19$^V*V)*=x>>COHN0Ggut+k!Ljr;$Ejc!(# zj>Tz3?7mb*$Q+dLHvxX5_V>fFBDI6TsM80YA%sB7vU!0)w{nnb7_CHoGIUxJ02gA{ zJ&iq9M*Zw0U6W}*U@>A>r%~zlP&WDzxc+Wa98t}0`M#5KZeRZj&f&E%Fk8O1UOcAD z*wi%MR18yh-Z7|ZcV^2h(@wBwXID0p-RM0F^~N4tUm>H)UUGC_=JR+ulRtKn7)%?D z1eDF;Rd}-$v~rfYsJ&o(J-_`pmXw-q)oDFhrha}fR)1l0mNvZA?e6gT$f@sCxBXRx z?hp|YT=p|B^(^>x(=O{9S@vr2sY&zXsj3CHrIA?r%YBG1d1m?k#VLv_eKS|E>XZ&o z^R1KXqT9J;<#}1rxwvwosIOWhx1mPpD26-8%#qqQYx!G1mp40n9&c80h3DYNs+ii- z{j}WD3)$xirZ=3=#m^aZs1{`C!fduH;CY?HlYdIB+G(n#-i#9w;Td|KWpis8ny|Y3 zy6&dGNXi=Yr}Snizp~I6mfAbO$9S<>yraDf7Fs}i~ue)jVXIqo#0)A$$~ z*5zn+W{cxj0(7tiQ%TH0DwPI@I@c?wg>3@`k|t7b+7^eSExDe#;4-OmSU$Hry2`K3 zrOG*K*m6(rRu-wncL8-9@BrEPPt+}Z?616@sMOUWTJFS@bvX+Rueg4Hv}*-$*+%(T zt`#O}ZEyTA&USb3T!6^bR!NKjKG$sYTFnQ0OE0`_Q*UHeKa|b@eGlQYsh2JkV_tw$ zlN!_cBEs%Kn2k1Z-V<|tYRp2-2=VNIJh}Cii~>^@*6|^_W{3O&vGmXt$S&K8LN}}= zd~4Fm7P3&THakDUBmZhkQ?{$EjX{uMTBIasZ|WDGd9YZ&@E3m-4dGXeH>fDX0=eHn zrfDs{LrB0O4rO%0Su88{p(&^Gql6j>b_dH*C$xa|k>fRaa z(hUjSCNASZYHj9AKo2J#6y?4mlq%#-S!@JpfkQ^s^nqu7oUev7zW-3Ov-X?XTu0fS zWc%d-u2^6kqU@K%F9PKY)ba!A(+1j#WIX#Uzp&2q1x!^j4{Ug1pl-lGWKv0m#}eSo zI=UX_Q}_jc_)g}oJFdtZ2puNcAq&(O*Af)1R9AAd$qf(-YXxBAQUm3D(V$)@!1GDX z31$tC(CM$Vp!E(nCcp~eH-lUq+9PpNO2LVcV!tifQj=Ru@%pCWdSCZNn>S}DQUY*7 z<&{z_lJ)pTJK^HS!-&+G4Z^PHW79N2Eq4+9eEzp$v0|-sC1Zm$VO-_+KV}FoJ0y0~ zqewW&HMs@eC5~dW)^`og-lda($}!2Qj(}nERb~@nTp3DNHsC0@a>~_YN+A*qrk}}F z;M7TEjM8M0;HIXDB3}R%3tzsULYH4ekp<9<84< zFWb!Hn&pGRGPXd$SaQgez)ckJ!kumq-w$vU@dB^Omq?r5bdW4ic=VNovT6B&LSX&L zJ|&ylw-Cc=#l#5-6JcPd03Mc{!`@>R#K2QC2qgLWXNVa^H}MS)aXVTgYKM^t>3i!39Q@AdQ~M;Mr2bDuzZkGh^!${RT<-WU0BN0mn4eso%%q2n z%V>6NqX)EL0JzYqByW$mY-L7n75E7U2w?d0Zw9UOx)zXy=t+az+PYpq>COn~Ulbu0 zPH5hnZ;{FEUFkrbyJ8N7vnUuV&H#aqms%jSf{W9H79`YQ>~tz6y&P7Hi269a!Jg=P zug+@>KriLHh+*K{0v^F|!*=AEZQYnNw97L)#ES+@^=@*wx(+M>+5#yQ7@8IWp$xC~ z9++9meX^>_303dwSbMc5*OV@?bbj)|O|4oIdk^A1V$_Uklfu6Z2801z{8MQkp{ z<;ALSI#M6anNC%)d|To{#F!D|PMC9~YU^LlbMbpRGeqdaX-s3pk0u`R`l;!2CFxKX z@=4g|8h1o#3yuP;SljtZB2349e?!A2;kJ>oP+us)9Kn)qIFJsOi7fA(^JuRP95rNz z#5R>^xVH$XA6C(1>D&RvnD(*ynJPIM9HyStn36Lo_JXxL$oK_h3a|hPZcK5TyixKU-eXZ_pUnI>1C~ZbWmd#>CCpylS;%JW({kx_X zqc&$UE~3n-8p0s4W^O{EaW8w|vD-O(EyqSa&Elgnf&{zZF*``D0LgGzDN>U(o>2)} zd}?) zWCSm%Za7ItwFGk9?Y2hjfG!gaVOu0mKnMig>P7=(7%e&=wRoe2@CZFQ z4G1Vz%EN^w)rQxf^-`oGaCn|4`ZG;2xglUBeycY( z2PJgwps0*|RI9Dc9wvPF1nP^TSRy5%`=`If?AH|xc);NUrPN2|Sqp9jFn!WG8;b8d z+t52GDl_VGE~&~vP;VF-&{td*eq<`tLz3kZ0I(@MNBl{hief$;L+aJ1zl`^1R&uX^@ zZC%}dQ0uw|A7Vv{B}}#;yJk{E?MFOg_;-q0o@wJLsJiWjV2G`O(>dMGyP!1D@A@Csi-a z7AhP_a)=7q4w!H;w}VxVuYNZ@v7`8#3}2bAXoT5Owlxr}J=Gn}RPoeB?OJaMQN}&i z0MZ#U>Z8^deilJF;@8d&QtF-`fkkca^{-5Kb&~BfWP=u;uI5F7lf;J3aO0Y#>{SR7_3OZ$K9J=9H{Tw%y0OAuGstD0RX}y0sw^3{9E$8#=k>f4^Wee(aX7 z%l_!C;4{Db%6#%Mybs#fj`IcU{!=9WA-l}AMk&VaIzzg}7J z+aS|5HZCY@=5pcc!sTLt4haiD)!4f`Q9#blQ2iWaFhTA-TeEx3o0C^nFtLdq%Lfxh z(NxSxm#&VBV=va5KcaY3xgy9K{wO~13}Gzm)wyD5c0x&68t9cpiO09@B*L=J9IdpS zcfnUjr_pI)_4qXq8b8d;-Lt95};UuE;_g1I*mXsaHdYiFb5WDfKSHth*X z&*m?_GqRE`JfdvG6vfp~u1a)bxx){(ITzrchL(7)6zill=(LfQy--YC_Uge#Z3vvm z_uaWiHg+>;x6ffq$o4MI*GG(-UU!{U3bv5#3D?q3?#w(lJWwr38f*YHxs#?U4^6jK zUA4nwlH|F?nOc|TmyKJHHucns@2BdhIHwEd&yKWO@X&2$Y)9_wO}0F0rosn~ldrC! zg;n_JWLGfBA)+FaV-R6yVe)#`!=!%A96C@f{l028wjK38ZXt|$tmWaXk~2e(c7Oh> z$=&O4xU2;lYaIvFRd$L~$5Hi?g1y>9rEP?ueZyqzE`;omupBh2ADTGLKwBB(5v1fN z=mR>pTNc*&Omk`DTO~C$@(BDAa@+&Hydtm7uGa!qTsBdA{+;vIrSXv?_% z72ZSF_Nd7F_B_xS<`l@V^-_!6>2Or2@99~~+>Z0kx%l?G%bUn$*7k2K;6!h9agKF> zt@-pzVX%Yaqz3R!M?jR|vZ`Wxi;?v;yUp-7bn@i z&nC|J=rP1#hXawa+^1H4?hRwpX*I`G)d7Bh(yORf(CmY5q__WnRG_Sd1h z0#a)1GaAG>Y}uGgc$G!o!o$3r3{j3|PpC&8%f>dReJ)=jyy$$8paHNStcFISg+z$s zHxuZHJt=;tp9P;Sqq7)r>sCcY7Tm-B-+95}OWk>0kT=%-t*%jNH`?V)9jSXGdTW|h zPO>3Cd3$@TIqk2?&SNkI!9YP27K$Vz7A~@Q6-b&4*}N#(9ryvVY{&UfpZ5l^zQhXB zGeXUYfP=eZr)H9$yKsyjLe8l7018pN2$!ieQ`dbEVMR@a)|j~j`XvzLSuy!$>?z}oWD~I-P27n;-XDm|sQ}eM0eBcx0fq0j> zyxAz``HUX2CXt)Flb92CuSPU>vV3iVRmoZv@ZaGB{JahD@hD*rj`|7AuH&<$*CJjs zW$1Em-J%wvE*k8vDo=yAU8FP9mg`){Yc~k~S8NbZV~-G}MTX^_bzOBERD~6GViJ`B z195OTWt{DW1Gf$~w*C0WTS%NTB-=BP-n=uF#51QX@v(PVSyzk4ODOzI&ep|I+v*Ln zYt*%gO53<`)TaF0ENnr`XIb)jwrIy!tSNBgFP1ur4%~^qCrJH=&gX)1XS>UnFi9s+ zt9~%K@6pU+<6da$&Dm+h7la)gVMxH$;c_{u*%mMy=ZVPg#z!YM&I>N?=dQWb0&a1q zZgk(LX$ch0nSsJ2X5ly%S{p7Qc_;mzyK#S&i|umx4&|AGz}t>D#IH2

mQ!rD+~B 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

@Px2lldYAMP0_ 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 AA^-pY diff --git a/Fakeum-2.0.alfredworkflow b/Fakeum-2.0.alfredworkflow new file mode 100644 index 0000000000000000000000000000000000000000..501b0f648ec9594eeb6c7ba6d9e8135a908eba22 GIT binary patch literal 1199814 zcmZUaV{j%wn61Cqwmr$jwr$(CZQHhOPi)(^ZDW$$*}d4UyFdD8S66jc*Lmuk^U6zs zfT98b07w8Kz(Fc(Cio%@5&%#`0|1}^xBw$N8yh=YT6+%_Whekh6(+nUMJ2JOi#rSe z2=o~U0Qk?X)9SajhiyndwPpIQIDdY&VAk3&=K1X_7b- z8`(P5_wWnl*2vG}6R8;`v{20hK7wdw`QT64vav3f>A*`8gU}8^CJ@Tqm$dqW)WRQ> zjic>o6)ILwd*O6}Y)B);##yyuIxG;rE}n<&=F*X4cjBGPK*f4z_Xw1$U~8muEq}FL1eqgNm#mRQua?k~4P!R=5EYAt z7;7JjzQ87=AbV8&u6_HXOZkwkx`I87lc6Bd#31D&pXAuE&OesfE65^Osg0&stX#3N zGk&bO=X2@RaK&ne? z79|0E(gP03Ye1_ATos&lRz#*we7vvmNmt~K+X-4}pWPPxXK2-pWq(oQjs|jstq62? zciNy}Zm$xs2DiBBxGXp9J7+xTe`E!@{+@Yd-cC^M*noW%v7iipb720L_U5*UK7HhI zvuq@G)Tmcc7e?czMui4C72fx2aQN0T=+y7$-R=};q9QoDq1j0$g?Bdm7b1?!%$tXa zF(P;qX?xs{Q(lH5*$`b@FP_-sT9m!Ig;7cx4y65CW5``r|IHxO52_+%dWpiyyi*jNyuQcmqq)ESeQ?fxkq4U^rcl;lP*{F`!q%7Xe^)02|KY1 zr0AmiQ%ed})RZva_JZ@PHoGUm^vS$EKA#dH#DJp{C?#3ALh@<3E*iYN!3@+=z%mJA zK(YXH9+xg>S;OX^jP*YrF$3v#j{ZbfIm<_!{R->_j&kmk0PTQGRP>fq?J_RtIx=Ot zFagq7;=yoIjfN$op`_G+j{B2_IUc#a=@_az(XnWIy#rPUGFutkJ$EHNiU{q3;AAYJ z7XpVPRcM5oEqRKWEt)!3cXJ-R)c27k!mwA9C^48p92)}-5rtLmHdg_|_x>bxWY?#c zh7@XJNJQ( zxZ7Og{v8Sx&7|!Zzv8h)a+kvG6M2v_V0jWE&gIN0GJZvWCQeq6w{K;_o@UTF=eY~M zW@k{#F=s;^OIqS?@{CBr5Dc;mt}XmyR49D(C_z>oUdA00U z3s1gOFF8CGmd3doVq{noY38y{-wy>M2o!RW|E9>*AS`nxJD)e8=WhDVX2NX*-#w%h zwcC6ox0r0=&dS<_H4AE7FuUY#`juw^(lYo?)o*7DcM2B(f-rtLB(&GMa@`8t=i=;W zSnf1tl;+;|_{#FNN0VU1-5ND3V?@YnnSBtV<0k-PKWzZnRsY9;=qTaCz8Wf5W7f9f ziB0q9Z6)+c^=-L!&RxBN|BITfgr`(UqNl#=RAQSpPf}%eC?$!kr-^?nWx|dB+TKvk zCNTMJs}2y6gJV#s_x# z+-VG%&PF-4WXl8k7=Cw?*uFQ3#<<(^$a2HAe6I3HLw4S}I&lBXkUNeDrT_uTI$%c z*ObAA$h{f;phRpceg0rGCiSgpl7x2{$s%5-NqGels7Wd^(`ccr@s|*vb2OfYV=yVX-PahLK-ZAdOAtk^D8l(69vAn-fx&wj{2-v#wE`yA?C* zO;gZPCi;~^o)JAs^=%j@xiD%nRR%!zc|{K&9K?jLz5D``Vtj%lpw-JfPqM}z93>&` z=K}VIzeAo_q#-Ma2IWN?IYUR3P->(;x2t6k>0YTeMn*M`Lm+vG2)_9cm5%te#;QSR zw4vzr0>`9(NGGoxTAq)A5Otz>Q4vZA@MR%4xLU|gte3YM3ewD4LtR5->1!1}w*XcL z6Z%||DDY%`A5NjF_IA~g5l+CB`Z^huO5@L!NyfDq{JbR$~**JuWfq!Cx5}=v|D=`Q5PT5pnM}i^Z-hBLtL8wUgd4KnYn?Nh>oI6_so@ zo>DY^&`p&Wf6*+nWC)PW<(ym5yDO#HbPg_-DCNkZRc(Z{aQ^N*fq^z%tkh5P9Ajex zmcBH437c0Vsm=Ik~65Ry*I-*>Mo zLGq=rET#{PY=e(0+1a{k(OCE9k?WycbQrbrDnpqMIE3PE{|GAYSUV~$bFc@_;dK5yrCj>I zSF)P#{>rTUL6HA{B*WnpD78yYIjs&304V>1oBvHRwx$+l|CeO8D~L4-|0l@|t8dzF zvSRkED%rzDn zwE=VV#_0CEf6zijq>Fk_{j1*f#6*nxNY})YIm&xRs2LaMSf>p*5WHC`F zK&-*O53;u!MSlQ=Oqf}LCac%O>GRAZUu`y<`_2q=Sl+u?WYvMfF#QJC@uEItM{V_| ziPHvD>#xv)`ziURr6c7{x&J6oUdF4``u0pet zR|joJa-T-RwftJ46m2t|WH=F-Hl{pU#y2kHDcU3?x)kz|9)p7fvxt3L;n!U3aEAZ- zR9e+beCs~*I9PwCtwyTBk(X`qmXa&ZulnKwZ~DVk9_B1+jJLrzM+U7frY&9>rMvol zmnGkkM~+-N^22xMWhE4|#mD<)?-;ekXKdl9^<(3ZI@(iDXNH_!zG%~`<>h9^WEiRM z33+JcP{~3@UE0c^$H$5CP?>4%Za$p4GWWli?yLkq%z5}pzc3cZXFWHjme`sKnA;!I z@hRkPpSdQPs0nRI48ylNNg@})F3Fh%Nt*Mq0tEO4QAZg4>c=s~hC8cBQ2tgoUCl(H z*pYzD9i>DA#tlaD?={QBaSK1|^KOC1EVL&qTpo}b04yZNaZJVSh`}1;=4sK~yQp35 zU+;0fNG4~Gd45C!3fT_(WDyB`;Y0E6eLI$V!@|fr;3kb^-!#w$0i`1l{BJpeH1x@I zHKoIn5ri)xMd;WSySfq;1(;}ba348oL;Yu4LE9`8y0jEWle9#E(O1N?q2LZd8VC5} z1g&O&1e!3G9T$>m1vYX@%6=C*)M@yFW{Hq+d6~0>EF0%Ub0opWc6X@z_C+0gy7Fd4 zuQnYUnsiRwnrOOS+t$toi@m61fZlYfYaiiIfN_({g>F*p)3~FFVeGjH z=fkky;s8WcySp%~igc;P zd!D6UiAAK@0waJ4p=xhh3cbh}?T;jlV4d)q7(ac4Xwf2gXi)I_`+loSd=ti>&IVW;>*pp>_Yo2G zk38Dpwfg?e*s|vNPD~$69h_h=Z<{o#FNc<2%Hg7Kt)k~_t(Q<6sD2{%fr{a}N#L8L z!A-{FScpbB1pqG6&4ci z*nG3|iG(y$a3L6V0AKSfR&jH{a@#qg%!i6GhASdxT<=d1rvm|$;`T`vq08PaVu6(i zuvl^)WTQktQw6Ln0_Qzf;ov#Y;u-y3n=u>s@*$(7WNgrHCHxBT^Jt35k4z?WN(GH+ zp!SZf5UqEpcPNNl7pvOlnSR#Xw8+4)<*$}7{+u`^1S|SYi|6)oT>V+c&Cz^ zk}r9}WWzbEl%$d?7?P^)qK)5o(moihAEFi&zOCt~%AQ+g8ESqBX)7|_>`pg>K|FMi z)xH7p8wx&-f(RuuIA7xxVw``}NiUmo9q2WSwXhAeKJu08~-t_dqI(?}O9amH08PfPEYIw4)3kVqqpxeTHt;=s`+)P~jw(?9_J z$x8$X!{teo02uwE7ps^NBiGMA{iz-1A-wGC$y$=hopfBdkrc!-az!joE}T3A1+t4v$QcTtZF_ z(at#%FHGkI^7INfR&I(8U&yxi{`h!%-qkO2vbU$7N<(hhi5DZ{qj9 zh*o1Xvj5=FJB!r{985m}dvubRlt%R}%}q{PDZg~(?Rd|^$I8)>S%@3V8aIFNiSx#s znb|2Dyl2PE?Izff#`zNo40|{m&Tj4YgtZBQT%218*>X7OjFhM`Vb$Dh3S zY{uQ0r~8W@j7W8sy^+d3V*JX`(Ul>_^C)KCnZ2j0on0ZCG*}glFscwFB5e8+ zBsj`YnRev}uuKk-zj1sQ7KL*Ji;KI9RfL;p^{X;FLjqT3uh!l)*e$k$r`2*9b24HkTEfr7Jzg?)V< zxV*GSyPCG;D>not-z2FL;(%;m772#Spy-Ek5U$M(Yta){58VVnN>bb4j!Da zFZvw!L306?j+arQyYtuGih8aZf?Xb&$En1Qjkv9yXq&p!j%E=5qE%}`rb9hf3(ot= zh8e!IvF>TRrqlM?gxy~d5cyH6Xm8!y|nJb@F&H~OC(>D#Bd zP5!9Ki8?#u?5r#3lwf^}dj*%9zMMbxJ~zF03O2`WiWcD^fEKWE! zy4qiH6j^voJN%}MA7#sOi-nA5zu(hN-n_&o+tmdWa{yYS$B1+bHOFs>$%36| zUdc!#q~pWDM@ge5h3PAEm*t>KktFJ6?e}-C7Ts1aH=Q^dqPYoq{OblL=v*m@A?GHB z`WJx$(iw2K>C`L08+mJtAYjRi%(CiH^Soh0TIIAsx`m`I^#vBx5tXMYr~vU4|4a{W z3@DLh!G{U|2h5!HCCMj+NsQlw<+O%VT3oU~beUYpLPk?z&M{ihrK_cAn21_(xAv~L zgkL;Xsdq(+aPXsh!H#6HLb6|@|Q{zlBgvpLzN zFy>XtnH?dn^%*5R>Sf>;mj1sh#iaKMvTq3aPUpISu(?0Zf1!DB&^CCO_diGPO|wj) z%D}%z3V6~ZC3+jmQNBd$lyf8s5^FT9o%Mh@7FAA)eG+$VLV=7D zbgTTM@>Vg{mJPlXz7&Orradyx1Y7xbm`gaRr~+eA+!!e*vKvx>|Xw-`&Fd zEkXKk*!q1a!#K~-%oR<2p(Lhh@C3D%A7TW(a7RRq#6!`XVoEjMF5WDREUJ$06%L_G zQsr9ZJyE#}*Bf09fE_U{BPj@qwdol=gFeWN+B8%a1Oee#{ELuvMhd8RC4Rf^DBLr8 zIlM$w7ZDBj$~p+fpGL-(F)b71n}+--mPu>lO|#T};Af(yd>jaMsgCQd_1ZtzG$5_A zo5tNI-)_)M_;m-hP-4s4yb5>F_OKv(^3Ye zG2YkA>-_<~+)oVTM+kPuy$LD+k%x)dbxd-tbOmZz^!3!8(;s)Tx4oLNV%2+T_&RP* zH%mU_osUQ92`Qqt<7$(89FF|!b$PkW77=h-ui2+%d-tK@MvkFzi?`22>1;5!orS}j zG($dM2{j#Zxs=!M#SGG`lz4xfC=rf$p#AF2YYQP#mArWnVnH-lmjK$`al&cV;!~(M zj(7z#Y`7n;6WVXM0Y>-Ey>tM1v^r1Mo5<()6H{-T5+9`J%M*?)k1TB{RC_uc#=lt0 z?oN`4!*eUUVFlYINlg#&iQg$V1JWyi0wM;pXQ{VzMNnA| zPG?g5&6#=k*Yt6N2`36#m>Vo4z=vLWhYuRlbZ)sB1`kA9MYj#ZSuQ!d+u)W;s zopXS&(xV5J%rp+A%=BnA^92`vo4{iPS15YSO1tbAiC6tk(DTYHizVFR4#JvNFUw?A zbLzYP<>70~=DW7ycmuoeIMmb~$1O^%2oJ346z}s=lH?jjIIDW7DbYxkAi_Q0f3cZH zuf3Ee>mIcn1^{sSZ$bVGKrD>@BmS^8`_KG?@?ZX;^gq$eCEbHt`F3-3b_(;8ktmYd zNG(-zj8U4=WE>mmm(e?Abjj7HG-_jMGZM0hhNww|y)dZ+k}Q#uct*qRrhDw|?JM^W z&*^jKs>k$JUVH6j&#ceQrKjHbN^04A+i)8YV2_D~p#=;8TK~Ck9A-zWCfNnxZys2B z3)XSJc@iJ$?*2m9JOyc9+<8@;*xID!YJ;qO0P93uF~EljfhDkMMS_-!`pBeoKWco5 zR=@61ZZN_R3jv3DyEL_9-}Ir~lRns2WfZE3gPYKLs)6s)g}kpGbvZp;&b6F zC!d)3E}#v&|8X0Sh|D=a$+On)t?+}g7$1q_4rA2MGx!PiMOJvxCaQ^mSd{n!>YxuA zPIOIPa4t!TrK#yuH){k)!X1%dlEdHPuO-f*<5bs00yjQUTOh%Hc78)Nj~vfJ|1Kb# z3qN`*(42uKqETP>Xcs_^#!@p33dv!M7AI>GrIqw|SRt&W{ow}&i%3hVZy?6Q?smmt zwY4l^AOw95HHb2hu;Z)a?Ez>3ey%=LAU$zHb5y~j^}LY`?Gwzf8Ljk#cE26Zv-aG` za!#v%x^*B|O1AS@0!Izgc0`GtSe2s@7kaCg&egvz>zi68kVP~dMgJ1@xkn|mOqD)c zfEi}J}83p$v!V;q9NKsMk*swnO>(YWR-I2uFI9MWBh z)@L&ep?g4Q1AX+<678Qn@Xg-oOH#PW@A;ILLwaq6iNoYmPIX79<~(*ktW7? z_R0-n*!|-Q5Gbp{*Y6e>L3CS`_(3A*Vi`S6CK%y!+lI20?$79P9#!dq?oUNYSf{+a z93YbcC6ym*Qk`Y_GIjJ1VBPU{n|F_~oMTemwu>9OGP~m}%(nvErJRf29=<#Z1aByA zrF-x6Wyv_PoZ{BL&Q617QO>G4WB71wgcIK@CktO|VRndvIK#{u8Q%WJQJOin=SPTO zVjj}VrK)H(0ieDzN3y4N$!56xYVPe3QQh>8?*RLxob$%O(yD~;X_Wo1{GNNnUdE-uh_88SCLV$?smeiTx@o zKV%_U$hja-`KUHdj}RDy`OQ&`NvB>;zq8Ub-%b>E0UfbUC|V5PAF)c<NW4U#D(y9qsFF+0?P~8{}6av9V9@(51P%f z3=@UWntOk>uZSDBJ~%hY=M%^1w|K1j;3X9?usMGZ>;AJrN@;1>UH51U_o1d$IO>dh zJd8zr=XeRVbcAzX9n-y8O@ecP2DAG(PW!v(L$}EJ}Gre|F`gPcxoXQzsrde|~GH(ip9cNl81RyLOh(B-I zs!WF^+K=t7m!n;l>hR7PUE)8*fbSU~9}vb92PXS>49SnRLcP~~L1riv^j{L_7PN3n z_+&{6fld50&+(0YtWh@auk(J}e@b?4W%y8~196`9sG5Y?d$-f z>2`(ELXZct{W}w;8?Dk~*kCVRYx!JYzD(wYQM*2sFiL_Ja?QnC>A7PncY|5gF&owS zySje&=dV{rPH+*<0&^LL?t5JAszqZaF4F{i)&|M*;8vjU3^k{g;j!mxJwZTmTK3GY zk1;$<O77tJDUts4Y^-L2Y&V?E%XL_;~b;x2qAXw4Un| zenFM(aHOPc8iC4l&8oG}$xg|ugTy0M3gTMXX83%7fmJkX*S?m2Z+{_}Pfxi_BQG1T z|B-{b1mu%VBpQ|2oaC47;@9v<{5G>FiHW-LIte`6FD_NkvK`U*Fr9a}oZy3;vVwOQ zwpo0MwTWr3UYT>BsL@sNz`@rH(tK>3JkJVl&N(mwZn=Qek4^i9llg0UP$?y`#8uK> zJ2aQT~aly(L`7Xi-ORMVeG3t1aHHJDm zm^i!%@B#_?R$Y+7{%V;Yqtx z`btq8Lddm%)%_V#$K;8eZ4<~I%iJ=0rpN-sVwkVoS~PFTkzF}jpzhtuRXe6o+!2I1 zCl%k+;G@-N*Ec!=oJ|%-(%x+C^8^suwpTE@Dbu(p-8YF7J!*^jHK!2qw~w0mlxC`CQ?S9` zFS}!K;89?_f$LHeXIDtR1bx-xlln0feY5VJ#lEmmS@kREy?MR%^Ji5jAD9gKw6*ou zDojd{(J+ADCmC0a61sf2Un(7=9!{!Y1P8ULgQe~h8&76a>fn0TKCWh z33=6^=623wd_X6yECMxGiFfj_wPs;#8Duy2KU(n>GgFD8V6`jEvv^;x9f9GyE96e` z$RK<9_>o1x`$p3jNM|8{Mq2cBI*`pb@YM7|eBUTgWu3 zwq|xMNo`&qzKYG}->DF`;k;WIBk`tTLINVvnR$tR{CU2k_*k|(3XwC$FgTzqQ=mPK z;S?x7{Y|S`oNP5CCbf5t4>*YMOw3hG z+Ob(EfHw{#^D^Ni#;Q7(CnTl-`hjW>uMNDu-`5K2iJ}p~rNiW7cLU#kg}(1jvD!P5 z5tq!mRaZ&0qGY-=T1fJ*NP*UPs-6htD9>bWw=w;zJrH?{>KmQYcF8sNK=K#WSFm+e zL=6Q8FWL)Ei#hk-!qPc>(e^U#F}3};({cNj76qmh3i7M7F)O}^Mr|~|>OH{A^8)$J zPVJ8E+Z*)x-V(z!YjPCfKf})d(g58i&L2961FyPCiqa0p8t9nMr3BlQ;qh5-A27MV zZzNPiYFaRIp&F^Cc0wIul!tINdjq`-M;iX-hFO!zL_N9!r%7Ej&?ycakz0bPZIc31 z5L;c2M%N#$JFKWKMJ-`SQ0vATwE^lR7Yxv-=Z$|mfX!mjKQ$8nrnl;*IkxjPTQ3A! z91kdEu3wCcLEZp1Dg{<e~ zOO2N644-cSNEO^>)Rs3b2`!<3|DJ8!k6{2g9^vuq;##v~A7vf`LG>0#MQ|rHtFdqQ+hV&MTShdDT zS5|J7`7FY27{xau3w$$8tEi8e8iL8WFSCi7}4FUh{) zm+eXmQ21IeKel`KEE03X2;Q}1WK8qDU2Lmo*DN&T;ea_Ob-QMl#=<;)N0Pk_&$%4+ z9E*Tj$RNt%WE?IOuEQ(S^-dx2uy4+Q-q@c> z8|E6UWVxr5>ymZmt)XpDWkuYRr6yi{a5eV%_hAI(0NwmTt=X<*_^`+3m$J&enpxH5 zhKSYnT=b|J15!Ekzx?xP=@`V{6okz#<3VQMzead3F?KO#$vw@o{e{Z;c&FxocpGY_ zP*CuDi^EA}%O<&_H79>Jw_osp9p+EEG#)g;P~mrrKp0>d3N4* zE-mB8nx)^{fBGI_K&?&97FNY=BME4@%6&o5$6@6dpAZ#{a^u{Ep_`t0jvIf3vfe~l z=@EdHc%`O483fOfA{KF)?;>*=_uM?nTDms5CeUoEi$B}D{&8`tA7;&f`PflxPm9OW z<2j9~boQVSbP(}(&*2-~SA~1JgA67hAP*U)L-n3r*g8}PurswFDn1q9T_w!V)1=Z) zS$?M%oC3dRMV1d-BE&X6LSR*o13)0;jNn*4ERkH`qegeZ%lqS&QFDHy=otyQch$h2 zTRL~8^%&3fL1$wO0^OVI;r}S(-JWwNI?xo(s{pRn?0PDML~Rez5IAGS(B{fQUW}Om zv~=+%X0WZ!MMOhY#*}P>$|J@QfB;r`LGp-luQePCz#tUFiD@+5Up1zOe4T<;ur8(~*3p z;3YFAjB5OZd|k~6eAfV`^Y1Dh4%RXj`xku1%ny4KPL7z&_0Ij!kadk$M?WI_3LQqC zckR-cbrHROEWK!BMuxV_cUVl#8_P{hn6F_ieLiyYM%VX^UuwrSehyQhHrR3x)p_(1 zek{|^BNbVC(Uk@~Eg!34JtPX7V=LQb=DaBlQ>^meTw+~KVn(_3#jHlT=j44;VV7QN zpTb>N!9toZiO}pxiztlNcdx$I2_#%lQccMOUzx=%ExyY2FL<&q#5z(9{~iR`5jA_L z%M7=y3u#t7YWKusQ8fB_-Pp+T=MQ@gH>yaYZGVT-$B|O#1XuVI z!opLvM%nE|Yp%3KEjtc8r~SrV3ZR(P{l*zh9R!t2=g-0TfODcpdf(vA3OtEjG+d7c zn(4EHF9$#&vV-{wh2}k^Xz>OH#`JW-#LvIp!xe_NP9M2!Kt$(-4AlG8KHGoq(s0g5 z4Eg%Yb(&AGbbVDa|F@bPVRhty{Fmn_v? zi1+5xi0GY3@y0+xW^oxJzyKE_!{$v+s8n4OLdwuZX8P?+S0?o@Y#rlWRp;UB6{4HF zT72cX&kId-lbHTWaguiQbo%Aeixa!ur5=D2-_$;644I9S82gK z_hJ^N5a{**k(U6DF!-PMZWXvD-ascoV%#P1mgj~#tGG;g((2Sfb3%_<7Cp2e4RmVJtgJ!uBKMhSI%)fQqB-16vAZ2QPlI72W%F zVj}oSH9ZfmS$uPTE=4C7O5lZx>Pdsy?$XLRf9RtqTt3<|fhNOkd8Y+YchC;>i%Kt# zC+TR@yAVH%Y%Db(5yyecRIl7lDBQb4@?HKU5xA(&NhV43g=;OTtr6k?*w*FHVdUoA z%faFYPdMSXFSu??+CX`V14menKPC7JT}D5{S5ivJ49Tf~a-!j0 zzz44pMNJT8;7Y%QI=rLTN}YLo8^=$n;<~harSuq4%{icvZp{}kweM9veOMJ3mY^oU zx<<@$MrEVEp)*GfEfU|TP$V4V+Q080dYhE1$%#Dm=+vmfqg&X?sO!Sxi`U%EG4oP0 z$j}~K2U&Wt&B}*gC#%h$e>pNec3C=P+qoEYTImILh@7frR3jsO9Qc2DkY_MgRFs3D zqKv06C0Lc_&Nk1ZCaE7X4^kfUb;=BJq??6=2b8&T#kzKa8d-xfop1A=u^`i(Cf?Q- zd^ThFzAOaJN}god{qQzy4ol;=A^RF*m%w87PIDp%p$!j#{_-kv!gb|W49pUrcH^qs z-X;y|cB3)vr}xX~z=)5y_O+_7ZGgc}_pnO{`14ofa~s`K6ybRvxA}5!RU*AUHA13Z z%Pgy*?WNvNtG>H1e!c-^RNr3wA^CN^aYLC(G33jp@7s13+lLQ^6z$z|o*7ZIGm_Xu zy`eyr6qd@_KxCkISvFA{z!wu%*Bl+SWclRTKXK#Qki&8UvFNNm_l4pODsvu}_#w!IsQDnbsQt4G z-rjHzyq$tD>0@-q~rnAT&c+d{S#E!2MnW$ zy>3mRcuW?H2zs{o)c--sQ+%@!ezKNqZDT_iVKaU0ead+{B|Wp_hcmpOmU^s^nVol# z>qyy9oCjZcbo2M=QO5u5{4*-4DX%;3W}1)peStmpLGa^gy}iS^M2U3r#T}PP*WLXrM5RiX4^IWo>0K!`Rzp>~R-Yae&oju-9(qw) zOiv5`uPfqnR8&&lOi%szuuTT6Av)a5(FOUNiLP<|N>ngfHxNt`MXy;mJ-(^6f9O7j zYV6FBM$$Uu7qf(VuRqkoFkur`DI6+|JoO^8f_@e2LJYqU>!05XG@Gi@RFK+%r#ya~ zFiq6ey;`x1IA(nh#F7J+rH<`;7mMqG&eM)E%l8R4IJAFDti~EuP>_^ZezVkDna@mI zoF2yda}7e$YvM6VLc5MO!W>KI`c0lI?4Vz1^=m+zW!5Pqyc{x{RZWK(WHWh4)^_pB z==#%x#apU3@!)}VSQ2fM@~2(0kF|u$qAf0W`MUxWIw+@^J^T!ZhnI}^QoFb8*f%oLY=vh=i^OTN6kv z3lzmsU&OuQ1XB2SSPmjdIkOZ~0I7}}lq0v6SZV1-K*1-r$~7C#8mK;1{~3T^OCdr4 z7wk8_3niK>qDw^-^YYwpDA>W04F&*(Z2PHsPbCuCdZjI44!Hh^^sYc@t-`KaeGU5! zgM80#&d?KZ_-EK)9%xZ49M;0jT0#T}{IQrzPwev%pTHP5Z$rYki#;pp5MnVVog>i5 z0`~wU{X>fCUiRZ_+^gG!2mb!rV;rCdX|N!Bk3A9)HIZL0KES>TtFeoRII%%Q_M>Ae zXpkE=yCN+`mf{Td`J1dmz(amc>M{V&P$Mg00YW$+$WXfgeN1$9yy`bzOnhrs6eq>$ z78U|v=v^p)$bq6ToSImrok5&DqVNSCiT`!A1q7f4<(UMue%ZDb1d!9m*iZ>JMh3{T zO^0`+^gwX7HXK%j8)W@=dH*WT{rXYfl0f{sN(n;MfC|=on-FkB;q+~B{VK>~NFZyI zOiqA2Q7|X3YW(fN#G2q=1C2hW%8JY~6nT5ckld%fvh$k$mD#SC0ju~bTHpyd$5)OI47MhheapZ~@`SuobNCNaB$A_9R z#u%*3Y_Kg%7XZmR*rgfDOQO%QOoB*gTjSU@BZZIf8*R}(;gO%-xGz|G=Bi1-n?|!~ zEGkd<;qPe%*}PAM#@guJVAlEHR+H6YnocB-0UIh?tYMidA8Mgli|w^_RI0jj4=Ey? z@Q;RRpXo8kVuzc|Q{Y_bKX}O$S$9|b2_X{r0Tq@Bl{T{>&D4~v)Tzsf5Cd6-Aou#F z(;R&-vc{l#iuympX}rEY36*)iJQe%Ac?G_}rR;n^@Fxu)C!^za=9f|@_N4?&{IT1q zZuQ?XJ+=~k>{6f9vt@m!I+n^B!Vb#Pp3jP!jEZfQe<4X6*rKar2Ax-QXq#48atoK{ zh4`j4X7~*v&o1Gc{w!#YSuFFo*4hYNr*x^`cZ!bj@-{t9X-5 z4DD8Q%bFn5z7dFK==V&F+Ow@XY#ZczC(3(tYpQW6IaPV2#R>RVK6ZtuTI(uYTf|n{t`9tdHBONTAl(6wK@rJBygHJ zSL`RDDLe=TVO(G1VG}r*jge;y5k7}+?Wj!V>N*tGWU~%?J{>ec6*Zy3ebq-i^+hB+ zf+OGj99{VP3IvSYZk@7L=d*W)gNMAmx%rXF?XPB%H1KDG2WDEz|qju4iWF zLlI^ZhGK6xU)A{ZSPjLxGMx>fr-jR^@>(7S$t_2|nA%XQ@vOn2i$uTg?;Psa?>9w( z!aJMVv^p63!tS6{uniqFc6MVM#g48-$x)8&npCmmB{bd{kEs=#U9Y{H2{$=L>wz>D zguzMnsVE2at=GkQb{YJ|M&=0ecb^YLIICZAiw;<75RN!pCW!HVCMn?mI;!>?H=Mch zA;imOTPV<6feRL87lQ=bzaK4smDsGSJ_XKAb~4LWT<6o)Y=f<=n!Ztbbbc?6_Wr!= zA5NRtpKq|G5%6jE@=CoKhVcg1!SKb@P_;sozL4Wu=Pm4V=OMtxb%OT%DoYXY1m;k;k&82hnhQev zlR;ddRtZY6z+nY?IHnMvuL}BG8eH*SoVFDTT?c?BV+AU5b^IGh-d+17h%pMRgd&ai z=em*yG7|u8+GHNiL+~uUeOy%EMn|8m$GsNC&P?UgDJ>zkFc$(xqRPbcuQzbD9zGAh zta6o6tF~uMZ&NCEwp{%+SA>itv>+b4CM64elwNZ^#&Xq#t`fBJOIW2-iL)WiLpZsX z1(NN#0?MMMkmkZTWN1r1lL*Pv>a^XpT!3D%!ozMOAk2dr7R8IzjP8ITj(ujfBvc4N zXBc0!Ndm(Q?35*}L{RhyNsRoZd76pF0z%P_l?%Kf%=E<=(9#H>0&M>fq4OqDjTz$~ z&V$>O7T(!oL-Iup9I%#Kgas%F)6>=MlW0=G@Cr4dQ?)*MGGpTewMmmN-ACFadnug2 zH_;OB4l&jmj)4s4iFlB~m!C=_)g^#f4=|JE@{v@*4}bE9FPW#phW{zu0&{{hN$!XipSiW2h55^}P%j{gUl6aUS=r2bp~-xP0( z`cLd(3(~iqoPhRE{c1yrF-Y-QA$Vr@dtKm@F(# z33|lMHL5x~11s-bo_khhv!D%3DhLmloxI7@t3at_s&RFPZEhOXg=k(psw9aU?4hvchwbW?X9p;DI#OxR$bozL!Gwv||nQBkEla{lW z7=BUwBa29!;xsLjh#NQBhNvx}6`>B5cDJ{a&mK{Droz4=difnu2-bN>Tc^*uu5!5` zTMB8^+`!8os1@Okc0g#keH8-jyM_p7?r{%7XYw8Bpw#lT&LykBn<4?-U@?h2Cvec> z;%UM`WEw)kO{0pWXP~NjlciZ7$Tj1bt0r)u@_BF6dWEF5jC|h^nAIiO(&#!MFCM#~ zQXS7-hIm}xO&fUkS~y7sf8?3ft)+U@7o<@JM+cVWmB*PPbQB4^ZEpo6W{`%8(1Ma< zGH}d*g)L1Tf?SF)=L&hE8g4lFh?n*AG-xH6S?Zz|?;-z20(IL*wrZTkRy;7y(oIpL z+A8OUfG`z-0D5Jmp?X7c#>N#H(>lo2z8X?)l^t5dMDjfkeQBL4cr^bnO^NEnnXkESBqu+}nIt5um0%S*p;35l_!6W%+ehZbM@o$_k40_j` zbkun3T{%!P>p-kN`dtUkS%e`|A^lCC0bDus=zs?fNGPxuMif&M225V^yjAT)s^ss< z#Fb3rASImHDUFlCm`KL}RfSCUFhG3d8M;)^!Z0y#k4ygvg@(#UZ9LKa;_a>9Ok)*} zKI$khb(Kub8=o$ay1scPa-$@xkTOqV1tLJ*|i| z#y2NjE-DvKvgIyz)5!2eNHul6+KOb??OL_}+?(*`4rs~(L+tlF9h zg1jQM9V;_samu;I*daSZ#h$*;lT$ccpDqt^xreOa0mTauU)ijG8HG-t3WUgJe03V@ z)rsuR;A9MZS{zHSo-9llu8vxW*FowUUWzP+6D8_5Ji}Lw*{d4_(a!lh?<(YiX{3~f zUx{VbJ*PJ?EF|wG7ctn#2LLu>p(xDZFvAe%h+CK`oaFsfidT<%L~6UNf(`$Rv3HKu zp}o&D-?0J-H1AH~CU|U?N zb$eND0V7G*2DUMj3Ql`m;Ziq?@lajUC2&c-8aI!a?3aqwbwYNZ_Wpdsqp<}!0W1x$ z;i^@InG%Ai*>5L4qW{Y8(>lCT>l*%?XN*T6o$;2s6l0rT67#=Cb^&-~S|H?cMF;TH zBWGtXu<&0+ekKp%30=DxdONVJOa-2VXpN(X_p`$k+Wz2%S^DfVmF3NgimaPqsE43l zQ!d74nMRBtzA=h{E(kU?5h!rxzkPSfj|2p`VI@eRs$)rmthd)sR7bo1oAAlv*E=t) zV5JY5xiqrV|3X=u6<-hFV>pQdh~LEqBatGUI`Px9obx88qJ)VDt2%u7y4p*8!d&9gwPO4F*WgxnGAR3P}^|O7s8|D2=VOEjtfzNIX35;?hfu@hd)?sFE?

P6w?@7b5>p9Cq$UjIyBrJbi%J@lW^CcUIQGVh4Xf@_(|M_uO!uFVd7GMc!HVj+x zR`1W7{F_|1IEhYnZ({wOWklcaZqe1f{hh3;e30%j}n2@XtGgA=NXoKYe84K6(=qb0x-`ir*qfGGwy3B6R)N}+hFfJ z4E8}6GIxNKboIkz?p9_4lQ3zpS)FlfDF}=rV7txrZKVN=Z)77SQUOx2)in~G=cjdy zLarqI!DG>b`STju>XpYEoU-=pcLl#Z^7c$W`grb$pD>M^-F6>XUh#4z2jQt?+nL1% z+|@6FBKO`8Oy#_>F)$+7_~M?B&$rZDnCG7?MizsrXPxFQIWao?r=ir%Rf($~z<+GG zf7^V2w|_8a6hD0c(M7fHt<SNSdN4-6rW*wU658rIanj%_}su1m4199@k2s$fu zi$;^#`slCBQh2pWH%Gb_oiync%GbeylG9X~&<2k4(arQ$`<-1edQsr!Ox*?t3409} zbtmwH*1?_0ByDPTrPpNl-%HDC6r9O&=SXEpuGW&DexFS|5T*>?^5mqS<4ZcFGoxvo&^ zW9PLm4bk1%nMdFOmVkAX7(+VTf)L*Jh2nl+I8?>XY?4QnTqbok1+1H>mpgN35XH=o zy#Il)L-hZ{43hP{`44B_|2kpv9cUZ3e!s*mrNEz{VXCirz?l;SLiv4?hHRw9F|cTa zdWULecho`!N?czsUMF*(B9t=l%mh6^ zkk|A_pr(1f(^M3SC&P6^VOXY1K30m*Nh+`=;Vrkp3)!Zh&=uAchfKZE&ZJ>268^6x>^&x zw(k6&b-k)?+@10284=BW7MvW6yB94D^JG+!>zIsEEnAc8ERdiLAwTdRX+zs}hFsHt z@d%U}RQ+m9-UJa?w?v`qhbwRbiXIN(4Vsg`i8R#9P|klV9{(!&e*}L zt&t+hV4#RBrG8~obyu=tPxF5$KyE>gChgqgzD9dN_Q5Pia3mt5ug3-dVHVn1Bs{u! zt@;Dgw{GpazlIh1Gv{uUQtjGBLt8wc%?Msiv1^%7nQFYs7v3K?uWtp}RKw>qQP-ok z8RSbC!$Fwx4AMo*vqXt%;zYiz<(xb`cE5{Et8pvDN<-%tAdZ^fgy;s+7_e$8E{~Fh z7wQKNS1F*%fi|;=!Cj@CI3uWS5VM1h1-lAMfnMCn6utEr^Fu;o5>+CTZxKsKj18lkEIflemMV#p>W1E z-_Bb?jgYdOM<-PA@Fs+5lXEg0;FXCp@PZj_YcmIo*wfF;vluGN$?doC+Kgd2Id4?3 z1qY&;(5$`~&B_M@VVkxlBha_hr{pD*SBWFZ62((lnF{h!{yYz3c|Xk0Li658K?3SX zNJ}AXKR&^K@n!BOld)mFz|I`@uYorU)1u4Ua?_Qo!xn;dT>ARwnI)qU5{;{_=v9Ni ze2FojhI=(o%7(~h)2x)itw!zUH*-#2i8^fE?A5@70A``fhLbO-L%}B%{%53Y2@*0l z$tdp!sy#|mu^xZ7N9fv_KUhgHPI3;}HR%)h(B_xF666}&eD@YjkT4Vu&Jf-z3W^l_ zL#VK_Xp}SR654{{!}3*UW$RiJB3H2*Mt_`k>F|EuL90{o*`ZYk7}dh0VyQ_k=gYudj))1$$QC0*E=wGt|tIo2tAX`D-s5FnSU=RV0 z!dl>LNnuU_b1-4UIf3^8EZBr(a~txgn;kAmV8K1(hBWyJ+C_%!ebX7sDcK;Eh^N>B z{Pa&)T3MczxmfPuLsQlSbTXC-%zEB~PSuFmUL6tK&|XQP1qOhW=z@!VzC`*}HjcdE9j|4kveoS&zh%2)A-@(EEG0mGY-_kJ5**US!TR8%rOzesn|eRuPbrL`Iy1{_A3fvTQy{PF!H5tX|v zMRle|-NvMaKk|A&@7G}$r*1!3G07jBHkj?*)n43nR}|oQXrYbY6#Rtv`c=_ur5K2l zvUbPwsY4(&lvXH|-TW`Kl>HC1#Q%$y^gTSIe)~FCGkt&2lIYV<>_HdqAGTcH6fNCL zY+@FoaWmHwbyvRd4-EbnTQc4JWy?e80yL5B722*pujYyK@E&_Sda64xy&n-+Ju^FU z6V_Z6=e3I>ttM&crmQPf05MBs1Sif3?JINrv84uJ&%05}2$0HFEz%x7!r zVrXLMVn}D@Y;X5JfnTa}f7~Ji!WZf!d4h#fl!l1B%4H1&)uxp)B#DY@4YRB)E_X~$ zSj9vyb8^WB&famR=fmf*r%xg%hX5+?M0rBzR!EyI9DrIE7I|`~$){EiBGZy-`R!D~ z=*Gr8o=O#>lOupOAe6P6glqi^1s2PEo6yu{E@JXyjs*|i%L;p7dy^_*MmHeL(2MfU zAY@gol!Ky4qDOFs+^{zz67{2Jb>SUd@xTmFD}4+YdI0034V{^4=(os=!l!Kynr~*} zWE8kDO79QA3k;{K^U8&-#n)s!6*JN;D#xz>NWK{ z39EoS@-bM%e*6X^g}}UHqDncnBw>}2XUfN3fl=F7-~DL%z?XdlV^-P45=)3$98TcK z;EW18Sg}@A3DZgLKe{ShZqN>i3P`-pTUh+Cm>vS9HR)T*dOoV}7+nWEUYkd%vO4Gfo1Jy`c zRt-$coYW|rW5*n*fC+>?;(NQjj6b!`2sUBnHpi3!O&<_1LL$z?gm=RwCmcD4rCF2K zuh`mLz-YGdeeT6Yp%6&|Jtz#Ia_pWE?+f$EAcDSO^}G&gCW%P&<>Ed`%Au)~NrcZ} zwQPP4LZtN_Kn(Tn;sF+y(r!6H6p;c=l;JI&Ru+JypfK7HcCk`=s>u6ymp9{cncXHy_e)pT7YiFM56 z%n48k-KjS?qiQ{O<76B5$KB16xcMTjjqw9!ZoAqq~p zQa6#i>kHo#{>Njh+895>5R#564);cRtNKw5j)8@)*UrzL2cShUeKL$Osy{|oYyjNsd z*cM8PJ0$-;Ijd{p!YBa(0)EIq*O!ehl#l+p!LmEBDkAbf|4vOEHZ6?~B=Tg7^jKF7 zi^*pEn`6(>=3AHRR_Jzu4cQnYqvMVwY!ta_(X&jnwEzC1{EjiJ*J$ei3>_LsUJPzp z?~BEU-V4cn&v~fJ4Tk+xd?hkhP#-*yJ33m2ZLc{3vs6+I`vLFv7|zt%((P>*>*sr) zgOUt_5$6+yBCcZ;yi1C2*jeai86h^>iz zhV+#jf(I1&YJur_K>X=A%e;T)-QS}Yy+&)Dq&BVETTKOV9R%-s=eX$r$7&Ra7M2wz>j(|{EsSd z3xAIBRlUz?I43qebJ0BOscF)BQYlul%T`~^MYULsn57uYf*+&~JQCotHSG|w=u&`{ zE%>2tHdN9!fz#U#75xlidb1_W=nf#t1IHc!wk2N?G(i&LYy1kFg%tq!)%rGdc`w-A1Dl0;2+!v~jr5LXI^P@1rjMz~_%i9&Kox!CcfgFfs0Q~@dQ|_|TF*#$; z98tL@HG`52fj#UtsdkJeSF0o4QmthXVjc|Gvxr8CYy z6dn@PvhWcpmsW$tT2y3`l*P)Zb?47Xnce@C$7^GYrTEQ zIv`~9b+~n8kf0$@^<4#Re3T^Uf%B9B9%MN&0*7jUOU?J`E`gj02MY6kju_iW_i97z$S&17SKN=ClikQ%;Q$Vv4r=pObLq$09>s6? z1i0vKXwgoF{3)qN5V06621e4#!Jar?U?=NA4wD@EQB#ewm0QVml~(;OSBmv)hYsRH zPFIba_h>z?f!qi=9QB@~%}$S!E6Bb&x<{p&xYChO zTQW(B=xws*(~jO*-dClaj}Qib?dK(R?&Hd9@^(b6;N~<6Ur4Rgi3q=E582Yg=9R@gA{n0ydGnf(;lQc6%yw3uQuSIN317NRX83I}RoZ#+A5}iuJ_9 zfNk?8pQN0E1&Tz6j3!f8*9G)M_YC(VV#!JJ3vP+*Ifj_HuXBU&Z&u*me;zj1*mi?0 z0^!~GY*X=&;WkRfsdMXBb8zdax53yK+-%};Y(W^8DYFx{T@5dC`UU)#==2~VaWD*`t-D(0NoTY44D zpOe9`$eqsV9S3tJtU{^njmci7Ja*H7dL_^8^-(VA+TcZ%+HO@6@uC}7V7=oaa$szs zR6hu001#6%9W>;Gp0W=Tf>S6w3PR*iTToSLscp;tynWl!A&41W>-9i+4Wl5o?c*xL zpJ+sfVog6RJ;QLlri^ld9zrS@0oOgoSoV_;j!tL_Mi2Wx6rzk#d*t`XJC*?XA&t;X zoc_)I%?O>vnWhel3RWenjBKbFCS=4DnP0Z;SwF#kBaTB5+fHu5xS8_JeQBq6`-~L0 z?qtQfO0sMme$|D({w~TJ6LZ#DPDsiC@{){{6~}a2kB_KM3Vvk}%0k&OK+hy%XA?!LlW=mR{ps3}L= zPjj4W^0hg-7}Kd;HH?)%{d$GRi~@O{CcQUao~FJruq3=VHJyvx5B|!e(@JN5#yA)UMQo}4H#uKHE6kZatZ>*X2fFwWv-eUSBUKj~d6cr& ztE_G7iJh!1kJL*`mm+09BrTJo3CY`dJ4vM{?75~C66u$KNlDs6bF>O76lI(u|3EFp z`IR|x>o?m`Y9RP0Oe!WiyK%Z~cuzF==7nj%fE? z(s_sP0=m(}@pGTsM(>nL?Xn|*2`@us24-uuyQKHb`gVN|7(4Dh&kddaCMRW}zZtEs zhN!}CD}3kOWXK_uVhNIpdi&ukL4p zOOuuCqoniA&0lM8>0BQ(95sng&ST~()!W`wguULtYa{|GCK;7g;Ijs|8Js-2>)2(C z@`d@j-+sIF^q%&>j4Y(62CR_Gek%Ymxa@r6@RsbmlsxMd7p5!nq?4Q#w^hwT_-NpWBeTIZ+Ox4P$2Mur;}9EjHhwZ^vRh5hR-9*=bYwt z9_N`!DY}BZDhBPH@Hh#?kX0ef&yFL6*3$$=v($_v8WV+Tv>>y?@^nH*ifJK>H2Og@ zCknvrE`!CqWU!N(d{Anft~(yTj(U#1(l=h(Ck(V%5W8;o#f=xgvENA=q!kEzVn@~i zd!LpqVkz4hZX$iGL5fEytZQhXQ%h#7)D%UYf0M)tUtMR21;aWAH#9gyNqm`Ns;8NP#Twtp={~&Z?b9Pq<_ghm?xpMY?ut(4v)K;<+kCakuG#96jKti!`xPX0n z70%+&|2spXeS6btnD0kc%^7)@-+a}bjY3rWZEo>s`vc}SnckW&~Qyfp%JZW5PGRs-Osd~NG=D|1rrRNd5p;X`h}IomO_9eye>y98w|8S2K~j-(X5C$Q|g#6M0F8Z7sg&(I$&Wyp}OiZ&Z}Gz!eHn)=wId_Iq@yPxiN zy4_9=gM9RXqAVkv5OY6p0h(o=yPTbk`e8(M7C zo>~n{vnzmxZ|{c8gzzo&W@gb>A^BAamM`xX&itgRO{?ZsY=tO|YmMrC&jcxi^J6yk z8fju(^gicMc){^K0XUR;wcL^j(*b@b-7W6=4L4`oD$b}iCc4JX*a`jHU`T}{`D`Bg zuc+CaP-8`-&?Za>HptExjp~~Ij%5m1`fWc~x#x1Lsp7*W7-%-7_4ZxXV&NToMVFGh zkBDN%MBnSP2&A3WyGrWkrV`P%!q+Ak$i3Qe?iG1U_Rib_kos z)}-EgkEaj-3t%?N9OMy|i&1ujtbNk&)ahY z9Weq`#LMrW!4RZa^w-ZMBda6GZ6dFqsY?nJ%2OS)Qrg3XNCtrXj(hYbhb$bsOZ)*g z!@*dXVdt`F>_rEy(Hmy_+;x{rh=8gCj!&cscclf3bkp{t@EGJ z;aotZbtnp=-X*MM(3vUf6Z(4a#ifi$*gpZyzc0hZ;!db$9=g9h^BxR1pGt`^L)mgc&jFfRMb zkQ0%F-}T~1D#&YilOc0lPigL9ZmDUod9eUcRh?Rp{2#v{8ySECgvMtTc(o-2aM)KG z^X3GQpgihfRT!fJg7}zbp#aL!q|qUJP90GUegZu{7_jje2akU>2_pcm2L~Nz06$Hm zan~43hX4FE=X;YYyV_wxS?RMz0L zwq)LhUa54|#)%X)_V3@m#3k@KoTZ@bKyLaQZ3wM!4$;VJ;n)#=al$z9lQn1Md zr9?fO>Dmc!d5gx4*Ldj=&~^4uH)G*D(S{Z&{H~o#fLih^>{F$RcfL*B3P%6gZy;a8 zp@s4&M1jq^6dC=Qr1?!!${Cl4pRsE{=^|rYMK69+A}4U{6>;b1jgR%mmp|Zxpc>O2 zs!CR;#M2ci2Q0}lXA7-%RZ#P*0 zaQpUHLddw~HO+|U`i6fW$@!0}5EuknKD2RCkv5mFK166n>)KS*kLl0nIr2l@?G58t zL~`KErtVpNRlFfWHu?TDT@sqP8e=IHS+z%sw$Vk#7Hl5@09~cOoxw15O6Vi~bsJAi zr~(+bVkecX7k`JRB$NKDh%u{ZFIU{t-F>#k1q5)q$QlI{Lp;{2sM8EHh90?>TImef^)ROW-2EavNz);>5}1Wog?NL-N~RKe+=IjNX~wbr6&gCEwSkxr`dr_9R8a z_L%ee5KAkzdUO9Jy{!NHbjX#XvWA?3JJ62YU!6T7rYS!L8dO{92Xs@UACwUxKXmDY zUDz*oNbwfy4W9?r(FjDDb<9u^nohVHGUDUP-QsTPdZS zID|MN5rddN?|ErtMU~yRp7YlPq!#z#ZSJOv)g<%4=}{F(8Mo5c`18#ENEK3%7Bi9A zj<6X3oJHc=%Toyl01U{+voRpR*Bo|Ja&RmJvJSzKKTj$*=SFw=K=yABzQI-83#UoO zx{%Q74T-C+>)Mb%yO;P)Wy~3a&Ovi|?wiZwddAZBmdnd%lRt+mO2G?&et2WKd@L`@jI(2HhcJnc>8X(H%FA&ftbI<+FETL zbTh95{~)O|-zNA=InZ9*i$ymV@Sl$^THygGfQg%c#`0|yIr4nRkT+5%ZXir#gtbQ}{ZQIbs{_Y@JRO43O8NRyB7L?Q?y4ZC$TniXY=D`G z4hufeYdTfRxCYZM=Z=hoUeRM;eBV^+j=Mz~2r22Wrx#ohYy~|{QwTURD;XgNm z=WAv@kD%ijbeP^At7@G}Ed;1QgR4xsgRLLbg!P3!=griPG;HM*1Vm=C-1(fSWFGIi zX8)=MJT=4ZQb6|)!1^kw`EUjsf8}y1jRdJK{?7|$`%@67@hh@?+puYv-L1M*z}&1_;boX$%crI@(b(o=@k61a6x7gg+5Zh8i0T( zRLaRxgAw;3pnIlGq494@u?hAez-ELW^Pb-IC%%U@eA}68pZMm@RPN^jK+7SjUXSVa zX(PI@-|ia=B|f|$f0kr1R6=AQeG0^LvrK25S${_Om3T>{HU^yNXyI(6zP+VP>xB}=-C@o9B)>zT|<{yeb(QZdK*;3*(ewGDCZK$BH^e58}V_j zUmK>sSB^^jE7fk3^W~%S{9-HLS?I!Fshf(Qv?JaOQXzRT$%;`sN~89iMWQC#!y7-CqDqU=)?QPHb&qv;Ii{~T*(#~*0BmX7@iHx%f^|-TYKH(`EBi4q(s=h5gA`GQDOa$^s zCxZEvgG;mEZc4qS*T@j|rFA6mMo$%3k>%KoZ+wc;m)wy3tEmI<&zE5+O=^vK4B;-z zs@bncH;HyYZXby20p8Jx8+`>SI1bIpE``mS@*11VOX33vk^u|ze8Uv13?JShy3vH#&rgxU? z3IRzYdVgCq4&6gAOU>;Omg{uzf(rtYp89@`#&(jY^LN>@gXI!~A3XU~g z+R%Fo(a?2CO>5(3-fvEcjZL)~J;6O2IRl|a=#%-6K(MI|G@=_mS2QlMQ@BmUEaC4e z6L}(D9^XnD`Z+~Qbj+lg6(PwTK4OIa>?6(nR%l0`BGh4?bL+}JGPz;tAMn%UH`E^T zZlo}OWGuw7b*~JL?tV`(6&hKmjXM1ykNoUVc?hFzhj?8DP#0ETlql4L#r*RBFH_M! zLMerv)0^jCk@WKa5K1jfZ5;knD5d#tgi_5X^`+StKU+j;DGFSoSQnaNmIc_Llz+oP{9bUtUZnNJ7v>vrdp+!H=`GBtJWR1i6E zaDV`jtH>n2e{@nXz@00TYgH?FfEZURsrxX%8+T_Q?8TU4@4?8MQHN1QC+AO)1~nMy zs;HbD3=LZhGg}NN^Io_c)WHzH!FqP&V(gQSgl<_@+dOOG|xh zOktGG1f|Z#hcMXg}0yL3vfarrym`DV;?+7>(D90 zxdb%=>dDBNhDbFH2Nl__b4KN zXAQqZK=FXZR0^kS>232E!Q_t#6h#GkMjks;zWQLIDzobzNTnBAgz6 z4fu?$d3^Zi@D;U+)D04w`Leo1%uKhnZajLspUt3B@$q0rYJB`q0^bOM@>K*==9*%E zyZ#Ts5#fd4ML!0L6vHPJ#M;P@>{!4_QWLLg(Q`@@)3Hc#2np_|1|v5dYS!iur3w3PKvv z6@MRb!SrO*S85RcgC_z-c*5)q5^i8+ktI$w-QkUHARi=&ksBH7J4vP}{&~pSbPj|* z$D=G7TkMf!V)2jwwjb-U?6n?45K7p7R0M!7hJi`LKrMUbu8E`8W#6+ZYB~7Cz7Vsh z$QU$G3IL^Nkm>PHf&;*_CZ7dlPS#=zDM>6bCdQUK#IpQL@)TQ(O;&HLSHOVdgwegVY)UsI0{Fk15QK_kM3VTnfXgn`q%X(O0yfY*%!j^ zEyThQJ%y@;7j>R^AdAOVj zZOY9k3A1&a8-}wk>p82eZB+rxX`m6;#j|XjRC5C8s!GSl>~?{o3`c#L)TsqlS446p zjsqU-Yko8BR-n36WO3d@9Y&&Ffhv#KN5wQfsqq20tb_6OY20iBeD2M25_J00(8T*> ziwbQ$hv)$S2gYbTwWvN=cd?dMPs$0qjrT(@==>)<6U+AG<28OPqCb!DimT^(bs{rC zlmW}0vc)JHU!^Oz8s8VD=_Np24=i&W*za{!Dv+zav8)g!#5!ejxO*e!5>SGEpYf0=G}V>uKjAXEip-D(Sc0I{rx?5^#lsC;KJbh(*_LS0?92NVzR9ufzrC zE+8KO=8$u095^@IZuk(qTR1S-lBbR3hYZF%#2${3tU{}gEh;CHLGmcTokDGYFI+|m zO!_$nJ{yNOn~5?=FO=B?MOF%Ddz%CKfcSxo0t>c2foDGU1Qn1YJqHdhh%I zcgzNMlH~7#rt$H7q+i8gBoz`GR-Ke*L(0ENLd2t)ER&`dlMh?Ovn=+9?i#LK?_~=( zbakk`o{o1gRbdt9q&0$oe*m)#U;9blBgpQ20du##hv~$5<}h6Z9qJ5+^Exu4f3hqz z-tc=iCPN>0I+=QEn@9B3&}(Yg)7gOOBqP!F)M2jQEPb!mJT~;)cd0<-cIcm7_PY2? z!GeW$(85Xr+6E+C%NV#)s$kZGPJdm1oKOv_d?>Mf@RB&pH+9#rh%HGlZl4rN7->@% zNw2zYJnXLIV&lWTj3r4A_<6nRU{s_!0{$q>Snc7Yr6^CDD|n@ejk%gqr4WG)VNNvwrJS~9DJTGH~hh?pl|nCYH6}P z7X0d}*GQd+{J7k#m}9oB60!8JWo2dg(R*m`A1`5fz#MdWSRuuB{}38wuTjmkDs$aiyB{kyRCghfh0o`JCp!cAvN7EzhG1Z z^`PMYc&Al+ia+}}kJ$K1Uhq$ke_C7c$g{DcV`8F21-a#t+{>Bpbz4g>_1`S??+@u- z@~#;!)DH!n9+cklwg84BI)gv@>=#bRF_QOw zz6?Yt$p;*N4XC#9d!%9X&(7zr?(&FjpFV zTDxeQdOM6M*-~U`C84M#aXb-AHQH`vqZ)VvvcZ|u;=(SME#pe*u~+AJ9DgFKv}XT% ziJh9x!bjWHCZHTx^g^ft0#M3$Y{C$9Mv@|9X0I_;mLI|Pu5lOYur?-|m```39D}QV zTB~Hf?xnn5x@nMfYsa+kU|#g#qao*ouEqx0j66t97ZqHjJRUwiOnGM@LdeGhxUh!! zW@UbLNM-XYfKQKlr3AD+ZWi}yWV9kDp}T3MwK5Ch$WV!9}4OgH*8`}{7}WJ=@$ z9Z{dqJ<#i#>{=Unu!9d}opX!E-e}P=kGk{*cd(*SJtR1pWaX!&HSptn!-uJJv8QL( zvjhwT$aMP>APRH=WSWG7_8klcc;d?`LR4A>(?jaDP&n! zv1faUud#3?bJ3;3#(xE~4tr&!pwh`J_p_dDdH+U!VEnFi{%(pVt8-(Sn#9SnRq~bi z-Ix>0KjG!}LKF5eRFVMX8E$RSmi%s0p|~*&h&w^{r299=+@d&ajVjjI11BoSVsExC zkp+WTTn2p1wWqT@CX}@4paeZ7c;gF;#s{$e4L1=}c4Ycl{nzp|jt~RgkzToU*{!Q8 ztiE}ECWj!&Spt#I-Wk*KU#+kS5Wcr-m#)#?>ljlPN2_g= zC=4p5GhtVGe!Sq8WJn2}o$T{)lvbQI?POC<*@HGqdDl~MAIaT^U1$K`HqoHyM$T2)E`v7Yunx& z3mD*)t#SMDkUDDm_eUyNOk=`DxqOf1>qy6hFD9l981*AGs>od;&!hFMV}OUigO0x@ zmH#4qaJQwt-Ff@=8V_|J`pPdvQ)mb44gs@iyUyCQi{#YnI%_pkW)QM zAYjoXA&|bj`|aBdnWxk5A9FsbD_M_(yf)4%h3pfVL&=V9=B{B-RndX+-YU=9n}~LQ zTZNnB=O^WY?X(Hj9V1L=VeH|SX>;;|RLW>JOqAYZ~|lB8=G2AE$2 z^q+sf2r6XpdEWe;&YL*Fi7nv3bHRDl)Vfl4;j*aUc>ZC$R{y%qJ_-|M+c#?Zd8~{x z(+Ue@lPo@X(D1+5yQk;M!*9{ov2EK{haKBCXKdTHZQD-Aw%xIlj&1E;H|tktowMuI zzT8!P@%{Jdj~$4;i+X>M6eJ}Qxo6=?va7)Zu@|J&uSEONsJG@3Zf9yt$5nKlmb zhow?rZ2Q9IP|$BO5A(!gn0pYc$&2GPPZ8QQ8o>};0Rt`KWDY06&Z4T#%zaEc83Ar* zJDj^=-_~Ra6v8et4Q@7aiAT)2U68=W0Bm$78@gX*H}q*}VVN32$6&{C`!vs}8iA?2 zu}3+w{ahfp=^1-GswvRBSH9P3r{-I;2r^Q(0<%AHwPYGJCRi<+1AH)FWDMH;G@_iB zI`7Z~VmQ)+$^N|Av?Af{J>KE;hGizp-5N{whUBpdzhW+zNBKg)5KPeX(u`YkX^wCQ zbWvrXCQhx+D+8szZF^pgqYeTE(sS=shl_YC6fSF&YHA3Y)*P6%vi=T0Skf1X3VW(&J|S8`k$tT|Cjk2`jMP_c5d zCyJw*nPEyr*V3TPOh zQ|mvdW7AR$%)!cd_GW->mu5D#7z7lM-^=CEwODYil@Kb6B+i%7m%=j?zj07XL0O(0 zW|sVEuD@KKNx4wLR9jrIbOktMN2Qw$;;suJ7QhTpu3niX9!-3s;`?#%<#@X9eHMG- zU4mvI)P!eX4u9XZW^%7t`qB{6!NwPu2GT>j4O$x*4fbBne|tMzw5tE)&wAAj8$jIE zfJ@bIP=sxf+s}|S6v}AUwB)a#Z(y89jV$SKqxB87iL$g7zTA#9+Guzhc4`fNnY^Gy zJD$O+WJJWxL43Z#!R87dqkCN{U<>D+6n6*7|N4NWh>SXkVLFGhIBun9GHD>D*3zR?|3a zG>KgctTw5ntwThegv65hw*3|&S{0|;#22bUJ>=*0qnv$W+~>#UV$q&trA*x!6O>V0 z98z-mdt56Nlr0m$I`R63QS>SDr)BJ72(_gZ@=IaJk}qSaM9s zQjjZEF~mEce9stekj?R@sSmzN^rk;HwQNWov^bX$RO1HHV~a5~&0!&agixiw`Yl+) z?Sb;|Pf(iNRtG(w*3s;XZzxE7Fu(TCkqQknhdioHQ@xKMws~GvLX?-_=b)#_>9zfl zmkqM0Pmmp{!o`q@`>yl5?<3dRuGR zVk{c!4G4Wc&Oc@8hKo$H_3?aoeX)i7r{21Jd&Hcl8%y!Ud{u{h1;5Do;@n`-x{)K&8#rv1 z+uMJ-Ghet#x8q2%>dfuA|3DT37-_=YHYM;gdYxeTbmCJDzgymr&9zHfAwolc~Ry;!Q(4f z+K_XDi_+Cm*!*;hgV38&-9vUVI!r(30Hj8|dUJk@b^5B)p|2#|KLZmED5KMQHV z1mykXy?jRtY1Zr2cvS%SIFd7WGBxFBJ(DV-<;xamL&RHkYUfoV@#&_e|0bd?XiqUV zdC~8Ls%~%YQ1xYB@Wy59Y+7&~E&uEUN!9&TT`e@Ntt>5QS6{i>?Wz^YF_*Qz61k9M z_kDXZ*fP_!2iqvLTuSyFhFfL-%Q5kc+6Ljsn7Kw{$w{AldBKpjA_t0EXasdJv>C67QWfxR(45LJkq!^7GPOUu1` zdlS&0zpU%H?iXHw`uH_Jh5;UJo;{~O+e2bmDYy8nWmWBL3P}MV5O}!96kg3R^~0F6 z^S_wr1?RGBy?m-ad6r{M==^!8;z|}g6yl+mM!Q>zd+@> zKVvT_o6M@{Mpa`_g4Yc9ndLVO6ZvkULy(_Z1}aH;(fEBsPAGrk%6nJT-t9F%L;IjB z>-Q+RR1QsRkA_yKRZZ`}F9YS{I}YDd2H8YcyxUq6jx$CN?IMtL`#vTA`ZDYN44}?H zCXe4_@07_{a$XH`68)`HiHCyVlT1*Lr7>aaz-jbaM1?>n!7}=C6ZJL3tG<73JZ}^I zK_^Rxdh6zuDNVjfbX%#c6(P`ifiE~<}k-9W)e=Bf+iPEvsa79tl0#uKc@~dggL4T0qM&pwR zPy1navJ!rDas1>0C?Q|g@#iIf?@ zQB+M3A`RSvD`Do%2X?H5RFjofudWD$3AF`Rba-s$92h7pbmN6M942@xp~@&%?&_xz zT?45?Z=tjy)Gc@Lia>2$#d5aiL7cb!t!y?`uM+T23UK}X@KEqnc$beG$=qx z;FsxDb`lJfd4ADqp-uYvg3lshyGfA^n|1k5QbH^5B7vQOuRa|Ndqp2wudl6nEU;#1 zCJU*jh^s2N>1Se_Wi?gVa{j7j9WtMrud2WJ90|1KG1PjqR7)=`QO#XH^oDFUYDACG zjf*W$21gqI&^0_D6BW8a%}5qtd4%=WKt&t0L-{4;A_Al~l`uyp?FqF_SZ|tPiAHo* zJbeB`>@|*`&azMv=)*$+X3*C-$_Vu`xhumyH~>gYZ550=!R@a#!6u$)l`5WC0f{;^ zYQSIe)HMIm<#SiD&ORT5nBKy0HGS&fLJEPVTbA?V6YX|(Y-&1!rl1U?U{>WbSPsPBo?Vrgm7h@cjX^-~o z60%XfK?d4&&OoP+udfm@K^!;K^`Z*Ov(^i`5zw8iU z*Kce9LEh{b%uv)W=BH)ZGdvj`t|P;zHNB0w)L@ytG$EU+;cFo!j7my5$9St0Vt-J{ zO_<$Sg6Ou;k2qg^U0gdh!5?^6gg-|C^+_37Z!F);G`Yf|!|G0r9~P&ccZ*=IOEP@O zhhvrefsA=ek#KxOd}sh;{@QQ?x;ELY0BWFKH7@&t*o=Fq99 zm#83g360e?%X+n+zRtIf7TRdXam<^KqRYc*A=D^=2ngmFO6mE;HxxQ;6|<(h_^#UO z59rZ(vSE(3zl=NZ9*i`u0GPdvaY;%um# zF$3k5WZWjL(Aos)xn3kM+)BK%^I(=2w3@y4O23R0&{x5R|5@9*`J%$wfns38FTCMz z06xPyuZexk92Jn4f@V2{a57;PGm{G-qztP&OlH3$yBe^ILg#JGDBFOi*G3g z8|)rweze7^Bf9UaYjuIv6D!hT~Zxh16%t(x=;@jnl^|C9aw&!+4D z3;+H9kOuzYzyI*xfB5e|{P!RJ`w##9hyVV=fB)gX|M1^``0qdb_aFZI5C8p#|Ng^& z|KY#?@ZW#R8Eu5TOO#XYZ z>VI>Aa$3VoLwRx~H%G`0n9LbUmD>?W5G;X2RG>IQ04XqpVN{6ZM*>EK|8D`h-2_W` zsU#rV6cR%oB9w{-MK%EeFtX&%ZoeMC=Vy-Dro0Td%O6cEnVPKcIX)vBlcG8zieNxQ zSI1|Epg>?>KZQUf&>gGan1B|BZRL1Asa8wH6VE|D2;HVLE;fw!@5)DIuhokkv(Eu( zmyQSP5V70v(o#V;!aYr8(*=b+tBhMVy{hg8@T^naEn1N?BKQ+1J0wr5wob~do9af# z3)hT@Y^qZ+IHrclb(4!00oKA{@tl%JrDb-g6AReF zx1d%&$VMLLHY~$`)XT90u#H!z`(lv>ThQ0 z<@USTAXoE6^FgteY&ka>*SxEeyMB!>ecGe3a#`85bwK?%MO$}PZuqkn0cwLfJqLj?K*8vWNsIO zD{`)Jr7-54ztMn3G87U;B|~#GCfle04ZLUKk1>={KQOntCXybTPNG00snhrhFI|N) zShbIWu=qyYL-b(Xcgkq6Kj2L3%Y(T3v-QG$%WVfUTt1xUMseML83-VPAwr*JuhQOd z>a*Bx^_(Rf37q;y7NiD~@xjL6#&lYltoV+T-Hly*Sg>CZDtho#mU^MtnO5zz`p{Xn0;mQqdlmU4bf1plOsES=SOm};qkwlU6r)Z29%if?mMBh5Te zG_1<6qZEochVh`o`fiejY%JJ?o!9V!J(%q^GVP!}028K&kV9!Ss8!uO1C6TvC7Uup zbnvqZhHR+yS8s`dbO{X4M@$8a9JI$5P&t_{d% z|E*ZOFrIX}Ed;qDu0>t12wz<5gx&S7$Rz2>H(?ga96dHsUnLFW$-lUx+Eg(z3DQiF zyf%L64t>PisbO*>mu9Gx$ndhV@Fx)1 z$Usbdf2>1t4d@bK;QX-TfiAQ!pIl-6Z*EKr$7JvoB){)1ysFet?8e ztAhxw4NvPSA)6~Bw;uSY+)EgrJ&u?)J~`(FX!M=0h~KrOp)0_dA0{k8t&kU;oYNvK zyi4Hu7M?e49T2^UwRk+WE=tq8Rv3@gua@zdzb$REb`hRPg|f=U%a{Q>xS(^P-A}fg zj!^43Jv^<33w~%`3RQjvCOE#j&&HpV*sczbKQQevqOYW}SPE(CMeEY2s%}f0c_7rf zxH^B8Ic94wImTWT8tj%wv6~TSGIEzwtLed7X)vj+R$F{BX|qout0cbOeHiYvf)KHp zZInh~52tM1KVdI)T59wQwFk>L^Vohrxo>}G)6-N>`f{^(rl_M99zcFLGXm2#P-qDO z9|=a*y9gpK3vgx(s~%b(`&MTql&ZKFS^{NAh;wFkSpdIG1^KA6oZu*X#c_$-QYio%y%XsVFRJ51N7%2C zS7up~^I|!u?eteAj!c?hq#5F1SI-yqI} zUXd$xwV~9G@UGvg{V?J?>v@7R8{AZ42)+}DFPlE?hp#YcUC_yHk0n=5$Rl6%V=qHg z1_Ra+H6aon%h%C~=h!*q;=1@n*h2iUgr3R+?9V}E1mU%nOKV#ttaOfkPBQ$`Mq7s= zXbI=46&J^pFD1m132zh^JX4N?s#QZCSZ5LIBvrAztwH^+KH7R?(hQV1Vs&`4y_mfs=lyz}|Q&^J>H>llgg5Fq*RWF+_Ul8k80Uw9L8+ z1Ea_B3$7o-nmkFF{g+8+FF1$Zbn$7L+!OkEp(%{H zJIJYBDAjv=~YyduxsgGKpVIqMOXBXSY>JCT#IcClGRy0 zY2X0n6q<6?!z%UkHeR__6bQvf#F8=QkcYBobE-x(K{K8=*bAmVW3A2ZRhT6 z8P1)|VT=pe441K*SYQKHjbycD5-qIG(gD9FMOg~YXKm1WIhzoyn!*sB!5Lg%tH34% z#;PP>_eT{~*CPfNAw6*I<0mliYgD2jkZiFh{c_k6G$Eg&ySctSf z0jtC1D6*_>Rtt3WTKgdX5=K_id-IL<{`}}ug98Fbbvt|@S(<*QjxAvd^fdl>SGTw+ zBwbQoWIuF@%Y_iiW=`Frnagceb&K}eurhkfvpgT_RrP-M5${pOQqA*Nd zV+zeQEjH(|&ELZOt3T!R$(=+7ep(i`oaIi>TqV{-caV6?8a{4|yg{%1p1$Pd3~2h1 zIC{fFX3CYTi>8hb`%7q$#89l?*>kI48rttxFY`zjt!%rX@)rjZ8}|@5_uv3x0Vg2a z&2$yJRGEmfJ@P@ z?~SssJFJYX#R%=3y9Tn5m*`R0uM$+Dop^s4{1Y@4 z$sXNAU(R=lMv7ws`1%Q$HxU_)XK( z3#5l|%{TZ@{oz(KHzubVPI_d9<>SUQ4MI}`0cNyn9 zMn#D6Ikot|(oIk=Gc?B-=l7WTT;cEHzAIzN^^bK$AHkkr61U?GbicgIgov80eXc3kPn4@kdLg2R3Ju-6h+)e$leYdkfD6y0`036a#Q z=Ymk8J=oqJ5O5S9kEAHCP=mIf1PQiiXohaz@!stD&*&_(hwN{EtCF2;?DVp$eJoy0 z-vf=O{Bh;+*&&y$B%Ky$0tkCF zj#hGx zEhwkU#Bh(ihbxzcbrQ$VoS|pX<9g9UgbF_LKH_oe-CgUDtWI}DCA$5&&92hwaeqx? z;|@bn&!Gzq<SL9osW`EH5Gm)a^>Se1Xn zVw^{Gog}2fVoUvfMZuY9B!sKAXevcP#UhIuT1`#j?S!s%ZXy)Ux*y3@2anyu1Wg57 z{3r2+KV1_+T&FN^3=C6jVln}a&F|6Tva}lk1aLI?Pob$!_ z{jn3apsgk;FJD8wM++=B|$o7}-p7uW$p=+F9xoErbt6g6#?Bz+O=&D4C?`WDUc7WKHnsWH1RhRgjHb;;g; zqw6~0G*jtNq-!OHMsGqH++Mt6)4k^_?eQ1maW>mC+4e$_q0cj^A!;8$FxIq2%|~8? zEt77AD6#5ckJzrUDj7H~7U`NXD1&Idb!#GmRu$mV-LMC5s2?<+ZL*MC^cE2Ni1eN^ z+TqTxe`a(lK6W5lZLthn2$y^A2q2F=40QExx`v*p&XzZi9{XrDa9r?9DK;`ccheU4 z;Zvyba!9DGp>AK-C9JEk$nOG5Y65>k1Et>6Y~zmH?H|*3HpFq&yqy01UtRccytQtC zD;s)hO&Dx1bo7kj^;l9C`nD!ExVS3Uyq7rnv-o+LXcd^km=>w)XiTmpW*F#7{4BNT zY>X^7xFBTZT|dsjd$0SV6*r^t7DQ5;#Zvb|MJ`T8+fd^V=fR{2KR;#W1AB45u!`*Q zs29a7zeZX9OZx@`{y8<**?}X+#;e~KkRuI$E3t)>DuM3UD+W;f{_(|;^A7RFgCEd; zW;S8}M;t=>f5xHz_#`Qq2wE?9`2Q2T|5u0p)uDfN=wBWBSBL)9p?`JgUmf~ahyK-} ze|6|z9r{;?{?(y>b?9Fm`d5ekZ>~fCH9Exq4fTqH1_U(y_e1{gI%I8U1h6*wPagW; z3=gGfcyK1`{^p;pZf!72zDOij8m~QUfn`o$g3~e{H^$~+ZIzH9^NK1V!;!3P_(@}@ zl;~rOn-Xs__Llk(^Za@Ke*He(Yc_JHBJ-vF^RMG&HPAG&Y0?h0QE- zEFnTn)mv8bia^>nshnd7cStGNR$ZVYci^Rf?;dTzRdMjR^rWUD)gYps!neLM#t>i)@IK6gohJ_SFIN zpSF-o$4EgI$GxN-#hI>uK6ipr6OVa~QyrviooVw!z^%vXAP39^>QJ8zJS?| zUeTV~431eH_?HZkpc6<)9acaGtddkpK^)ilt9kRhE$&v(MlKtt%=GxvyByg}r85iy zN%=`81ix*NnPNWc-8{a@?vc^3G^5CveL>8Nb*PE3I~Xc5%Q(7u(RPD?89}8x@UXF4 z7p$yW#NY>+u|E7{cpzvdaQ5E3E~e|em}o^&o|xM(y!4-Z4*RIe>f@BA$E20|GE?+SY@#yaFWM3N zl@?(+c;2vdVLqL*Pfbj{=GXpr&e~5x#g*HJ)FUS7T3P73uiGiuOjZ zU0)6FpXSEO!BZ{aBvuyDY-j~_B(3iEzoN7b9^(cCZ^)`S7H|71APTSZ-)~16&Ub6I zUY|Rdj&B5ZQY>*&b4_e0ee`cT`|#R;EtRL*+t}N(pR!!hupvYR$4K>y90jduxFb=9 z#BGW+A%3iv69yQv@H_Nw^>p|ARF4Tcox`%Yh)UY*Za@YhVmQDMSA zi-sIshIW`{{Kr^^6TKjqT5TGH-H99~dS=rRi()nWn=2VluQU3^j0Qzr+_6A|CzF<> z>mmPoN|hWeebd=o*Jwl1(;|`OB5G!dH-}N_^j)!>2O(BUxGoVMYu6uwlGMD=^|K4*}`JNT}dYuYbmgKdYb*HJek=DeBy)BQ>_b-%YO=!vB*V>pQr4!N04D+YV79( z5K5>g{)D3!`ky|?nB!50w7;x#k}RJIs!Won_e^#RN@K!nPhqode3eQrm|9@&^2oPd zN%$AS?Y};?KpH3VCED+`;R^fLN*@!HzdISUQ~|hIb&niUe`o|)ADzgHL|XaG6d|9F z9wdFSWqRaIm`h53p`QiLC#3dWdTGoetysQz`#F(7Sss=RI!?@^gkUSl=?8Gy zIa3DFM){Ro4pYl3B{d-E>YqL4Axpqo;h1f)0#@6s)n%MKpRwY^e&Vjv2JHph1|`f zRwd%8$g>UhsRe_E2%+U9gJKp<{FXw7Xne0LdGL9RaLbxO0?Vz1aSW4B8&hGl7Ys~3 zkH9z`8Ks{5Sc>b0DedtAQ9MLjW?;&Bx=eG?6}V$zs0Y)6BSPMpD$A%R*r$Vp1t1 zDiiF-X-A_6L~Ca`P^aOXL0m{9CV?-2_g){2M_yKyhD;4HyTK2ox9+y6*3G-_cNfJ) zPgolmWl3PetokLk0u!BcGg}w5War#f;K1r2__)H;x4m%`2Mu0f8B#zZubaxIS*1m= zZT4yB-QY2A?aEP8;K-ql+!iqC**I9*;PE_rPUu;PFuy$zXD*(DLE1^hJT$*t;b=)T z{-y-?aFQ0Xtc?Hni7X0S=XHdDTI=dPa~p`_sXA0Fg3+X^7+EoS<&@Z`<=2_;G`M;l z&G@g(kOw}=cmdUWd{$B#!OKPcMVV;Xkr_@xf zXNn^em;N0BwS?QH=ffe$(W5pSsRqJi zpgoIM$W7>)7@H_Q3B@9$#pa5<|HqvdE>hFlqEAPX8OvGu){WHu&HI=14F+q4iLpu_ zKeO|9hOMal>+y$FO_xNCpoJx#iqRUUmP&HNMDrK1+`M)d0fkp}(+|hCTAC($pEuQan zx$2Qn(44E-9CvW*lc3dX(@(zgS1ybLL8a(pxwqgdr-suQ+9nyn8I~u(1CW-rM(u4J zh0>91p3&y1PLGn{)2e&@6-8QZrxh>)`%w{CmE2K$xDK=YaSjuk2|qF@GqGet4*0i; zoj!cg!HWa~c&tq{Kk4$*yH~XK##kTLX4ybNkl}y6t1p>c$t#j)E_g#N8WL0raw2W- zmM@O{DqRl8$so&&&&9lksW-66dI8?DF!Y#u7!TGEzukpqdzV!VI!n&$p2qmdWs0{KED}37wAbr4#>F?1jOb`(yTd6tAGSm9vVBGX$+ChBW;KZC}tfNpz_@sjk zio_RKYZRnBaO-Yeq8S|$22Ypx80{1lPbU}Tcd6<{iMi5rP-Nvw&o00^sK2@{+%$RI z2^YLkzV*(yD9nV%MpZ^|FeN zlu3;#HnzEBhnVRAz29!FuH z)JE9ZE@=8G;|3v^u3EsH8?sku_&R2FZWO+TdRh@A+uhrP)PR*yDY0YF--F1ifyUG9 zu@66o#fCbe+B?RtMOS)G+e5UVYpMB%EBG@l-)D7JurFMfd)b}ZKeBz*)Eyd{OOvg3 zu$5bH%W%PvVjR)4yfjc(muK%)J7-50W1Emp z?Y|vqoVn-$x73BAsz{isHLkDEmZWw^;^Yg$Gc#Mke^JV1_4ePXKYOCS)LnzHGMi5- z^7}d$Jk~pelqVj7* zeiaQh;We#fBB~EKH^w?^SGBNj-OULzB#6!flBX$AJ=8orXwwNM;FOaN`Lh-;pXSJp4)5ppYt%L>U*2n2N#5o3kr^UbYEEq-J# z-SU$*)%*<4hCQgL@LemDpKy(^txThEGOQN{IWUDU(ZzDty-asQLWA?p^|^$0qxPWW z+oO~g!D4{Z{gW#@24J_|_EXXr>)L8pgTmK9=oZP)!@-mX9^F$~ zjVXZ=d$`DTf!Z6SC5kE;vxYnGh-3&#z3(3M=4dz1|~F$HGw@UB~LE|Vp|W$F8g6vBASTcBoiFkzf zGKRnBxS!Fqx8R3S=5B7e+Db%{_AVaRzzPNR$Hqod{bLQkcMz_)!6ORHlUPwd#%fUX z?M%p|ZEWw0CCNm!&Qo=K^)>eFzJx4XxLRAClT{Vu#lEs$Vd&84UR6}xsh}BZm%bRl zpqjTYef?78e)yWA%cYd;~G5*-VP5W$_Dq$utV+;f5 zKA@T4bvyfWR8&_h5r88XzzN#R)AZ6{j{}08vBD4mP*Js%=IjZ>)A4exG?wj#v&vmQ zn?~3Nf!7%RkxCvFbtsW&04^{5yh)3MLdLJ{TmD)}d^9$Bz?))^dD3M*fe5@YbpQ)_ zJNuG8u&=%psve8@6(Ph@;(>Z&i})e+1@Mhbe?06KAb(>G=1{?)*EGg>p1!`0%Xww~ zoP-DVa--}i$fNIbzsKmH9P*Ba6S5-G@sjh?Uztb3wMF-Ov#9txZ$3wK+lcpZE-ugK zx~9?v?f+P3(A&_f3s6*If*yr==KpzS?EffVXG{3iW82@blwakLHEnb8G4+}Z_=9ob z%>N{L_1vJ^5O9KT+KQwh;>%ytba?vhEC4=Za3zN~Ij1yAMyh?R5!Q>+lF(GF>_c!N z$sZ(>#a^xFCiY>L9r(<1s^>G6E5%qY2Oj4P!Y!>JaoU=;BYJA(~f3nmr*vD~e8(*&%Ir zn!DSmUhkA*AES9CmH6$&74#9KaKdX&*UtRJzWmI;W$OlKX$sWA~iHh#OIo#$&@3pZU@(J`-Of|g@8Nx=^p=k zV3KsZa{CTmd=+D`$73bVZ1v}Z?vV=8nE2S&r2I>2erdOdo`-YJ02)aJheVu~QHoFrc zeQtF8c=<0F7+<`K&hD7AEaa&Nxjdk{PN!^%V0RZif=VY~UJa*#n@#=r{1%Bj+^m}^ z;@GV{v$k%WkGg0yT&3haq3$BEu4E$xO5ZQfw1D{WOX$uOqgqzuS%6sOf_nLe!T4kS z`Rb^ylW4zEY`?>!U*?R~7p<1&3TQE?yX=cCVettpd75pMmXKJAwQ8@;qvg`Jl;a;b zvq#-`ZZSDKA4;WXO@Y8*o!*&W$!p)m%#7VRd)Hhc)(yJ87X5f-`u<&!dKxMxA3w`o zn$yL$s}pgZgKj2JlChO?O%Wk|&;byE4EgYDpA#wXer$Uy{9~rSKb9qKYS8;EQcGJY zevA~qd;|Yy1ns{fV~Mmkx(y}}(C6O|{=XxmovG>n-*#e*yP1lz;^LJgF;WLGSn)83 zQpz@ouBWmmGE_d168I^70d;pI2~nhmf)ogp1Ux=$HB&r0?h#C&U2^Lmf!PL z%M7sP$A?Ixvs{D|?4EI1th9&LCJ(Z!LK59SG32-oYd{J2H9J z4vAlnx(c9u)rrwd z&MIKF)xKoi@JOW`kIm(=zh#o?E04s_fOP04z3 zZ-uTP>yfIJp+8t*b%4sIqaFeP&uQ>jKyTENMF(Rltzp+4!UvYY+-3ed>R`uew-CDo z4d@^Vu4X#4Z*3nTWp^qijy~UT_;-$W^HyB?Y`O}z?D;;a`Vgyd^gg}<4AfD-7gjLB zr+3{u#)E^K-YN;P$j5{64-iUv7<0)0h1{IDlQ%-YuRjGcq7#kc^?b!p8qUA{Ve^EY zDgowgF?U?P$~Q5(Uqa^mW2jXt%=(J&aTrajAeP{{dz##YV3jyLtUgCC6VBB1Dz~6b zWPgg#UvfFjkW^CF00JeuT4+YB-?^a|94Ubi+&k3d%|)XE;ZSQ>K2jLRj=wI4!XvZ# zoIC6~Y-z?}VkX1{A?8|YJ_&H%!}suocoIq-qz3)>u$@(6V)Dh1h-8pIdA!imGXcmt zmBR#=i3Rcn>J!{h<6ve&WPnoBY6Ig?d*n7O!~tFyl`TJnZlwz;4RV|x5&oOz){K6H zK-*WI9;u#dOypKKw6O0qDef+nrz6c9FIe{U#L4oUCKS$RGpLVZ7&Ii|u&c-{a9_*Z>Fh#fEoF6(hIMoxVYh7%)hNqzbm#+i)prny z0>yHih6NV_=zKp}(KZi$J?G$qX_K^DQmM^y;s$6Aw{D0Agb!L$D)SaB(g+R!@Zk!9 zYNeMJPz|}Mv(%=`@eaKp!VnYKG2$Sup_ONMw?j$qX|^JEpeRG_IHX?#)irupbS6V> z(0@n1OwR?wWb){n_RTA3zUX22n4o|;ZE_U#Y7v2=1mm%AM(1Z775wqO~2M~a}s0);#+Vv5<B+}pe@tKFNfB?Ar)er9X5Kk?V zCSDcE$kq;$a_MIz;RrC=!n87$~O+Nvr<6?IY$hwc=Xq{qbbn}H6@@{ehF9lCL)xjXg zf$r9Wc)`)yhjMEf=BLo`K8vx4s>mY$oZu5+B@IXz_NjZr=^Qz!{Frmd{TF^=98dM_ zZL*4CYAK(b;|Tyj`{7s&eFMKiGcW&BYeb=Mm>^kbXZbJ+niPv#2bGkR>5ej_sx6Po z;?p*U#T?%DFYc{LI|DU+Bac~wd6{nKDrc{F(cgT4dEc#=KZE~tmy|Hl2b6hdW;LB> z9n4qnN{=v>9Yd~U`q*UZ^(kprU;a)!s`a)j zpb7tCqY^B!(E|4EM^rM{*89Zkwc2H}#gQ$A(id_;d$;rB5 zaQPthlnAjV(J8pq)n!((B>lk_do{Z@4M;lykWv^wMKR;iX$|Y0tqUGQ14pl~{WUN!)!0mtB{swU|ZOG@*Hva8YP*^S1b$}%ODw}D2!bo7C7 z`0DezcUsyd6~Yd6A_Ipom{?tSQLeO|KX`mm_9|wc?X)nuyYYG&sqKUA^LI zr+w7O2dvZ!kLQJ_bBe8<#Rc`kSK-iTNw<*tgNB)+Efc?6x1C(n z>oBXBu1icINITaf3DRcS%-FPky2}WzlTZj(n&^jNzN`b0MXDY@t8afQ1NiO=Xm`F+ zocnA7EEoE#tkvrf(g-|df5Pv6MBIA(eMBBD<1UZ7$@BHIfgt?T#S%WN%XAHSFEE&9 z;)ko7REUid@Pgv&txDg1gsCIEDGO15d^);mV!4rt9|NX8cgWsgdxL^8gYeRx?Cx+y z3y!(a7T@3Jv3wH|w5sraD1ERYC_#_NjlztOtH72l?%B>?T5?3o=n|ObKFIbYhEgiI<=hNt6#15x7A%hx#YQ+cqj}Gju8orOTcT5l1%ldF$9*V@ysd@aHDd z1v63O`5Boukoq#Yohs)DDaxSsYM(Eqw%BYqV3#a@{`92i2Q;P)(pi4^dL;KsIHDy} z1m-4ds|vE=D@Q!G2rH*FWsGg6_O+gG8IX<6`jjl6+UhTb)}MrNHgoR180LK$~oBOEg2+md`9b9M-joloqOc(!Jy^qM*AZ+M(q zSqg1ppf$kY)5QTZGJnO=W}axS4nPR3Ht;rmd={@=Xq)UZN#=#=yZH~llV{LYhau1~_+qJoemqvJ7G~w(QC|Ybe1TVy zvkw+EfHA*_$!|BBG-nCyrp$6evmuFndRP9p#0fl~b4#j}KTgNj1J0*bcMxj*FwErOnc`%|bfizl9fA{#;cUD{=l^9oH z^tE3|8PzA@@G#SReq7!4)pq-r-Pxg?ODc&0G|i`2`cUFC;p->YxbsSJgwy5s7Myfc z{r@8C9NGknwj`Q1Ds9`gZQGT$ZQHhO+qP}nc4pV8`+Khk_ZOVWT@kS(X7H1?d`Jkk zD(~>1v)?k$LH!)mqc{1cMG7&-ebdLT(Q<#ZtSVq4(tuU^eM9HIPw5=lFYoj^<0mC^ zk*aMv=C5BMH6apfP;NGwkDkv3{fh*MUBsU7kw-D|{bROHv^rMCc{bU*cmj$<1>_t7 zJ(Kj6UwyMW29XX|c%aCH>0aOzC{WsQWwpI_L7#uH7@rF8Sp2T2=B#nh7ETz#41`G+ zdu3wQ;>YE+?b-htFGYN8jbrA!oSrMu4!DC)p3>za{vC7>byF>Ka7*Eex@at@bj9r} z%6XG#c}~MEkYn?K0BmQmofxM7#k%0_!00%S^`q~ziPTAbrw9`lWB}dOPdety84&fy zSU!IUWEbl#FD}#36*4^q3dWZb;=DU)S!+(0BMbdLfpgT~5=+a?(VxC`vw!9qvHI6k4^mr z_B9W)3z12ia&pBTDcks4k2E6;bNo|J*MJZ87kw7Fqe!mkCm)%*YCtk2i1u_h#c({v zsW-_5J1?+Bb$eTX6}D$TgjY)7U?ue)-rZx`uR$BymXXhUmj&gpX28_fcz4TA*K65H zA$*KCh+KV>UX|^;Y!~Cy9ygFI2|i?_>QeTBkZo0eb8XGD7WQrAIs`-em&9Q$v}T~zNHWKYc4N!mpcg}-xWB^T_Ri^&7+yoHY%o})7Nmzzl8_uN#nrZPQRE_|>GmQ!ucF|?@WM+htUq_MnF zQHtei*aRuKK%8x?4JH=e%BVb?-XAJL$b=1V;-~|a?8>ip$I$yy^%LX|?Qo8N23AAg z+Qd(Xp`2}{FtM(T3y|;9Tc_9*kqOi=$S%X%)5=FBkT_=8rd?R9>J5)^ zjmUgWT@KjCqpwdbY>4%?UlFu-a6|u$HCdAYda2#^54H@M^IWGU&Lvz<&L0romh(R5h?_NG0Oz5Fn~L zU}<`W#@!_aOT*nRGGjsr1|BZ4610pAV2a_8Mylrl#3#{ZUVpZXdy5A-!nkJ>Y0cLH zuo!_u!P&a~4bZju3VB=2O~khSWA}=Ki$C`(qkjyf>Jmv1RiavKYzpet(xUi1?yAuv z*(457Mp_2|n;a|RG?JVrs<pIUfys**v7M0C;2>OD@rN5i7=Ly(xoIgzRXFgGgQ6@x*ob+j2?dis4$ z4PdE3ex$#^Y%b-zS-{+N_LQml2Sn;#`RPo&eOkJvUbm+L^^A|NDFZ*1UjihcA+?H{ z4Ky2|j3`p>)Q~{4bd!BykI2!6#Krq0+8jQ$fJA%fHV`>mHS=U} zRb30ZrexYtB(B@OJSfHUa=f%7KT1u29H*rr4G}a8W=>bRJi3-MXkO5+Nl*44v3Brj zF=Q)58IH{CSvBRjUz{Q z=zli+MW@>P<6J6<|2ObD&hVEYQKf~~KN8*Vls|Nk=sqv|$wU{ss8;!f1}`41SVb8! zIR(=n7)y!iWNz@z(FfvqTK=wSR@Nr(VsyFlME|RNQ_BAl2-P6?CNt@rvK;fn0}A`j zF}jl^Zh3dCqejQeb}WyWKzWNQ^|OyBg$yCrLFWwVmy*E_U-|ML&u zLBR1b$?p$*Z2n?*>~65qIu*pAP7^3xdY|T;Ragn5a=zk|K(JN5=b~PCE^myC=^4ZA z&)xbS8gnJXcwxoqf%t4%qct$H*%zx%k)%6WigfGZQs7wMTcSBU;NB^~ROYAXZDKc% znUnLp#Zx?UEFy&APq>_zP58FiC^XK1cN3|ZS)nap9-oO_*0sH_(Qwjr`?(5Q%+RBm zAH9`^UP8aV5s{5&9!o8milLS^JWSQAxu0^Q0j)N2;jl?My!i>?#xsdbKignZ(xWl3 z2BS<3#onNeS||}taaKQneY#+Oe$+g8zI8srom=Q?YoX7q&p*VK zo~KKL&i+jeoD5N`rmto*F(~<-tE+_PWNyeJo!7iN2*2xK`FV>4mZ6BrL~dXD@GCt- zi|l~@_CY3onEGOTpo^ZP8>qgO)oHO0r~tu~cYOI3>ai96kNN}az+mHINEX4n!vYL? zN8h4i-C+aw?l$|llgtt#kE~iApz2xe?TeHsC(&D}frUUAJSnv^-2O2K=5XsxNJC}W zT^Xbvwk^fNid0=LpkEei6Skf^*tZ9rU8xSL7o<*Uc~?&{c*iEg_z~&xq(KVr>2NBt zIzKmbTWPW^_$KEZ0($6a0GlGzq0(@K6$YcWCy3FslL!Ii#D zWETB6FGc7nn3cK`mr@UK(ny&Ry`9%t#DAfC-=b~X?(R+B2;R>ElfJ;b3s$L6oM@`; z=tzEpA@gagW%nmS1)Ch>RYy)TOCqD6o2UaMR<2KRGn8%l=8eB5xMVI-A)0k_EMi)O z9p7+TS9y#&lb&2fsbr9q%}F9$m;t?1`+TUeBu-@Y)^K_#k`Ghno|ze%mgJ_Neu`&* zZQNM;P;S1I8zDu{7kxAe!lj5dj0-Iv;?`5rnDh-(IJ+3!pFH%AU^`lN?$*%j$R znuxcHuN0F`1Y2BU%-Joy(_`LMT#8am)cDQQC%H*5o8SWW4iZwxr8Jv0@+Y`{Ynrk_ zd7O(TUc#4si`XIzKFLMc)GBVje_@Djg=kvxgH_gJJ{0|Uqn>GKSI-KNe!%}zvmcpE zi&n-00NDTc!Tg_QZ}T6LeR~<_RiwJnc6Xruhfdq*wgd+<8!pi&sVfFdE`q|Asonhj;F?XElzU8@#t%TST35b@SGV^CaFcqbNa&U4S+6l1vmkt?F7PJjXhh`B7hx~W#hypU z{OzGGaNf@}FP@&cHd`%CFgxCep+;h?Y|8$EgS}vhX^S_Zmq>MSiVlxonzo*RZ)cML<@r%R6MX7?Kqsl zFCQ{5yTJE?=!RZ70MQi{n}6$!&J?wNd#VH?w2P`U;5`hR3H$r-2k9Xmd;p(ut)PK8 zTXJR7&$W9ZmM3z2#0z@H?96)2T3la>7MO{yfj#W2WO!7v%21(V>?^2FsS|<$kt9BO zOe*T1Dj=;lBy|IbLNZcuSC5ih8^O;-rdf8^k4TAU1|FzXXg9^c(>H3+4nUxSGd8+# z=(+bQ)y`>uWzplAl$r;JoQj`6-Hxgc5h2A1ZVE%ks2w1(DIlezY4FF!+^N9YrRhVK zSiLASS$?T9!iyp3NS`juo!#AX_WKVVkuM0X1p{v#elTj?OPV#PLfqSRjyFcV#5?}3 z##fgwLPlT2d?@)}$f~g3tsle$kW6Ig8LmD+Wl>^k24VsLOj@NsL`>=51O&|@@s1o_ z8mc6)l{cq5p-ux|s!9Z1n0Hg2rTyDg&eRkfM%H$%IMQ9$#ZNpiuA$Vw|7P!C+<_6O z#s2c|fF+z3q|XWd`w0d2Y2%k*16$VbCmt51{7YjHRJYxHA8{XzXf^hw#q#|g@36+k zuD9jWRwVI?%;j;JWDsSq`F9sOj}nfG2=*i!e&Tq zqhBOPR8rr&p01v*RU?~nn@dvqV@D-5`VSFFed)mVViicVmyd`W*L6zJ9f~Wc74Qs7 zDQ{8MZk71`7h)@2#;)xXD!+=0ph(K7QXBT;|!g_^B&O6m?3(L8jlVu87PEVy(VS< z#1qz(!|Vmr?^{(3q;i)_{Bu9+E{bn4hdDW`ojTd@_^k({ z53{3%$%@g<2s8&>Jthus+k`bm}Qnz)O3@<-Cb`z z%KCL6I17ytHNpwp)9D>HJB-Q`dghFJY@cHi#0fUv)d>C#`MwJ^88Pt%kLfVwVIx zk+Fuo3{fxLL)+HwP)r10;%4Dw*O=w@FO$CJ-rsf-X zisW-VuE3~%tm3{h+@STaXnW6}beUEb(SP!*TxuGvJPcP|lLyidhKH-py`+HA&rfz# z&xGM$FaCO!rP0Bv`yAnG|T?dep1cz9mu4Eta(HbTJICtrrN^|j3W_=T$K=73$onX z978=J)dcDSFdeB8QBqkNJ}7pw3LJ`6l&*iECgc%plM6VE&J~{L`s>IK$GT|N(e*7i zk%+phN%}{P4oWFqwYoDLMovAB4bnBq6D2v&^-f6OZHs z>^46OraI~t1g#gl-52JCre1VvAs!EMAfFG2T_N&8h+4{e!4sKHp)Dq`>%^OS(U%bx zw3xXmH(q>K0fwxq&vm%T+!SWxa*2(2wITwBnDShixy@n5+%>ncnWUQ8=fe%8xrOE; zH@Is*VNwMgVj47Rp~hctQOmP9%=vg9DfY2LJNM%Av4cACr)%JN%()MD$(hIUxygS( zC#ErUHUB&bIUJY~D|D@^DDQMAo2D~ZB%ih7-d7;7fSyyA>^;`$s~pY{+)wx_7_y13 z4+0xt&02Sd@-eFJsXJPSy0rnvSoo%Br`jUmA-p}<1_9r|otrDPHE&3@X8R*8Qt>oi zm!10i7v8Gcn}hIjks0Ga(y+UG+J4^b3Pqh$)zs){HJolpGi7R$i=ZmO@*D}S4(24f z*z9cHE|1$I*wUOnI@O#qS%W=Nuv&{dK-WyD_3FKLW<6ZTL_*KP-?%+G(5sJj4;f29 zh-np8lfOya)*wnR*QpsK%Ml_g*y24RB;G@O=BsMe6Y8CgYyodCT;biD9PjZ{iNtY_ zg9zo)J}{D&iE6dL;2Gxtmso6@+kbm_hJPzd{O}CVvMwEYm(}^cM`P3PV&g5S=a#lf zkLEMZJW6iR_=E_w!Jm=$U~KQrN<~<6kP&Bqv$MvrRHVNE(b3$K@UxU}Mk}}%>n05D z99l~x7i_)|4$OEw(Q`uIJ}_mY=RCo`f3}Gkosy&@?PdulaP9tPWhnB@d7pl29GZ|k z(U~PPohmAoph>bQ7yM@7p5B7U!~Y21nA7z1@9}jPn;2}Irm6AOnI<&HL4=?v!mRfT zydP9;n^r6O1Y@_-X!nxiKrvj@C{UPO1!e0FvsAHJm$7u9S;M|yyWunANuN|fNl|C- z4T*IIp4R8@@_rUj98k!BtoodZ3JayJmE70qSjAgUY!=z?xAH#lSs+I|>XV$1Her6e z_-I}*$`s%!>FzZx`&8&r8@O+Jw;aH}`7;x3`kI~vq>x^p{0;oq9Gu%{>1As8W$rVp zBFu-1{xv=Qx-6+BFs%zoBUyE-q6)IDDgu4imH+l2T zYD`cL(`Le$jo>y9l5ytaX2RUjxlD92iw#+v+_-V?*@v|{-L^psCZg(%EARPyeJ-ZJ zLO`~%3zQDWY3^?id+xN_rxswlB^+&a=tb*mFYpMgCT-uyEHvS6%(QlP0~oCqhr$6N zHPFpMS(H9p+pA{4YLG+Xd^2*KUx2`N0L01ahgm^R$2?Rfw{t)4jsuRq-I*)`0(Rtd zhyV-WKA%AGaU@XZJ&S?@d|%CCkZS)!MDKjyxe61mgX%@S5xcALEjV{)f9MhzCf)bj zpzAhAxaN|P2modov}c(J*2$p9QR!m7DX(rm1i-LRQc;C%mJRc!a)8#o+o>Xo|K@JA#~C(;`ilqOFl#u^B(q(8WO{ zR7UZ{X&0(}OZHmVYo%CWp#Fzj;;BuwcK2~z@B?uYDMbow_92Kj?cwBjZAeootdUn8 zG1fQ@94J>=#Tai@UNa``rwr)}Q*pZZ4=%f8!JT~0tDu6+0D9c}VsGsXmiKh!ezCK>!%>!6=gaw)4) zSjhiIV>Lf^i*qQ`y-U1Qa%*GKZ6ZGwsZf&x7LV+D-knNO3-)cWFmtWtZF0ueTp2mM z)*CFA|MisESTSWPDmx=a%8d>*A$|o5-^z9g(7@cmh6IuLk5DcN=!_3RE_vzs>)O6p z@frN7o5SV|CK&aQn*xsU==vW)41Tz#S!4G>$7gJ?DJU!3{*sNRaq_>_*4#HaOLpw} z?o;L&3h7T+`MVK*8y|9^VlC83nYw1Yj_Qydz5UORZWLr~p)kJ2YIr2(T%Yr@*2R|n zvaqU+e>W2;K*&Okf~zI&>Xttvp0L|x{KUDuabv%?lOP=_-)?YwyLXA##Z)O?V@av@ z3adc#S$$mPh8&N0_0U*t)kv(m#ZdLi_IpA&8$!uW0)MN2A?q%AE}Rcx*~+G77VPv1 zN5KY_kjy~$2^)SwP7*w@^2;>o-}K}gb&V`pXSZ0bFW$C2xlC;LNnFQzY;_UB_@cJV z7PqU+1&sr+=t7op0^Q@=V*Df(&tzaS$m0G2`$obl_|M9D0VRMQ=(j$X>+k$tcCaZD z8Z3rb%v84)?y;<4cjB=jcG~i=RQ^6c^){A{X0{aw%bpGPB!+C}BwDR`4^@88q1;dY zS`}LTj<$ed-GIAXgC37~`)qm`GRP)xYf7?divf~+&>kYoJLcKeeyD3}Q%U6U>#KdZ z+NdA?n$&I@@h(u&vE`>IS}G@Ip`tku9Qna|uvmC{@7!doT>ItxCN-3+8|ZSvmihBN zsVC=VSTh})j&2~n{fzGx_bFAjtxc!cZ<`Nfx`Oget@k*e1G5{hx5#S$n(^@6 z$Hp?TxhwF1!{@dTUoRnfCm#q=5uAkoVg(g_y=50hU7HZ2@ z9^OR6q=K{JgZc=XOIVb|Z9!%tkK1Ak6R(3))wy?uuzg8CVW4ll9=}VOF7a|T_6{hu z`EXBmE$@i@9R!)%j04O{lE9$}uWz~Ya&;>Ak0f@{L8H&_xCou1zBo;qF;huW@F*Lb1$fo4(U)qS4ic)CY2^N_@?#uAe?#xxU*jN-4Zk3 zk%dk7{kbj5UU@UVyXneCeb8i*oPIkJfsLxc`(V5^oD$*TtNq$yp{`bnHvpX&o-_&q zeGNC_Oju*sj)7yCn*iHxgj#{O)Nd1`v)kg@edzT0$N z27RQX`i#Qo)E>idGaZYO%g=S{`pr)jcR&3bIg9roT1=q8a@w2IvLaC@Go8uqER-q) zes`{YK~`YY1Pa!oA)zf@6)U1tN9LhVTNGHaJyB?@Z0H+$>G`%vsM+yH*rYgsmFo}; zS(gX?i)4;w?zPgY%S?h`V_;b8`Ps)9ZQ$IZZ``C#0(<>tOr7(lA z8yfExnwzXEr^~W8+yn8f=P$BT2VKbi2E(Z|Mthn8|4|Uk84OyEF3)b?>JSG|GIB05 zIU2S~#)1z1h4dUG%JspqFv{4AFx%=1a8%3~F95fd9!y>FUrf20s=+Acv4e2h47~WjZ z7#1H>Rv9VBpGr-qdLUe0RPEADC%^s^4-_AjjmH#9MJrg-l^5a*+mP&$vo*^DJo|>{=QGpS4tXCf(Sc?=lW0JXoLw3;fg~ zPQmLy3R@w(wFJmu<|3X~d5z|X&FjCzm;_(qF1sc~dhW{9vrPG5k)Aft_4)HrerI9<%yzR`N zR%F3!dOZi^9zS+sMKD5(@pzN2X$#UJ9z^;Ps&>_a?Uj;svW95{bWC2myh{yhcdHU} zQMr<4G7cz0Xmq^De}sipUn_4mgylQfT@=_N!X$d0xP3BG+ZxXR%infK!~WuqGQ@SO zBl2^C2y52xg-`sqDP;(X5nANHXgqAHlLRtv9-;9E`(47lHD-LDj66-Yz$MY+XB;_| z5K|RFSE4qkFvk0aF;%;bqrJ|wE=h7AifXSEn+BZQ?_fIP%!85ShaRKlBz7MbgEO`8 z;I)Z_DH*2P(M2-^SQo$(#;{*mRV8E8+c%yhJG;w2A zMWn+yr!j-6_nnocQ1ITcU>H7h3FnSkx8uF4LQ``jke`e=GMo)_7zmCtTKyJ~Y+b}v z`C~2>&;6_79AM7MAtoIQ8Qw^M`hcK@!+qpcCd1ZW_@okwRKRTchK(^Dhb$_OZsL~$ z9}~u~WHD|!uXD2a$Fmm_-yxNr=TE**TM#avdmn}RFE&s9(_#oJjO(?|5^JYf*kp#Z z0Yhp7AJsQvwF+!!##CG>pL%8kilu4qJ;BSKw5&jYEOL@_YwhuEcd{qL^w=Mwx~r9o zi8lIwFISm)c{G$wPL^qX8BN>DlnN+Kcl*dS+-zikpeffN&o5d&KO9U}ur%1a>MKH@ zy`^Q?R>PaK1A+TsrPgGCuIB>K6?=<>xX1Hz(Mn!$kUH}l#4fI>VONpVewb)?!J%K} zDPF?UKG8}6Z?Tsijqh@vs&}r^4A)E4nf)>+fc!ypAy_JrK(jGg)py9ES z=>w$6lN72ui*ITOdcWHj)sWyFeZ*H+9mQ7JVSGHBGCafCUeg?j{Hy}IwG?>qFP5>@ zj$jz)VLKACNM65TWYf~fSj~?P1b3=;oGCiB3;h~oG9v~PI z`ML~bVRI0_YTqT|eDrCe%}axtC37>trETzO>t8=JE&5Rl#=_qc8POdC=lK-jDrPMF zt!6Ur3G!xMDFY(^B{)mO^=K;qxQk;fjctA+BW3Yt5|JNzGPw+#KRqZn?9FA}Gf%Pu zRriL*GG7t%*obDl-DFqYBWJl?R&kF}r_LM6s7jjX^tN_rF9EmvPGt(kMPA|Y`=J+% z?v9Y?Ki4oZtzYr0Ph&(UX>Afq7GmdUAaREmwv5JQPmaaCsH4NV+jIn-x1h*qAn>WO z>1tXJATKNhTc9z-5=}3J`HOS{>-@3{#pM>)&!2k04iPQR^j$&cvVXWT)~A2Gj)xoL z35{Jxj+R9;8$q8&|Cw4ireW!+v@dj*xUpl|WOXbWvyezRQym2$z^o6M~AL%vo$%mllH-gTJyfSJ1qTg$hO; zKFWJ_r9vTr=WY|Jb;%1_8=G7RklX(C}W8$2hi^?vHpS*;Lq;`;4G^HcY@I5t{& zIT@PL_7_XQ9HjwU(A1(LK4dU7JaVjl zJm5kvdEV+8tm+N}=ggaSXX>3|e#B(>W`1XFYkdbzuVIRAJw2Tf;VOWRr1Un`FOx%* zu6+ONn#S1dLCy>g0N@Wi008FyI&;o;M*2?1H2N<3=2rR!R{uHtwQ%$Qs-25dBiWQM z@kVyj8NddG(T{7Qv?6F}36O~nQ4eVuM+MNA<%x%K7R#fgg5+hKBDN@77s!oM&r9UV zk6NM&{s@tY4%o8$4%k+AukPHs-oCzb&$?E-R=*mzcU+|=$R_~+h$~!KmjmSWUC@wH zdcBFI1_SY*m8{)7hZ*|fiI>4aaC{q>bfgy4xO;m_G)b>;%{#R-I0rKkno84oB$Zc! zr;iFVpRwyedn_KGTo`vRpSlP650Ub{bA2977YtfPDRtVQGtNK9!K;pVSu*Qpl(#cG zEVxOw(-7Yk?mi6)S7t-L)UU@vyEdM>k}=DGNEcG9XZ(&jlQ1^CPl~_KFfQ``jbR*R z)|jEDz0zoJxdBmzO17Y*ySN*E3-NLeLD_wF4m5QU;vl7NgU`0Z_gRpASY2BScd}j~ zg^Lk7o&IY^>CWnk3b6{`?I*Y=Nuz>2kw-uCkbpS?!V=UG$rZt};^B#O49v^jNAIFS z^^r#y>C!A)VUSXfEfQ0P|CM--g1WN2j=%^=S6tnb78+aR3n$VtW>S%CvgK9{AN?6t z52)2(ucW*aEezUE>jQDkEcc7iaaBt$43{1{BFR{$<}&~_C7q6)B4oc=UyY;$uU^%G z-uAVl-vis(k389L7si_!rGx0zk2XA=;w{u7yH06kh?c;(|2mV7p$Q}RJCj?sRSz4+ zpa@A;f5E*Y_GrV$GhU%IZ)l){RcNO5e%Y3(tV!g$iVXF8w)a8VQs}$^VP`H$W*vF8 z|By+#2WX5b-%n%dotkn-S!Gz4>B+J5(R ziziwfnqbi|!kd)aej3Cy4BdsmSXpxkwG!8jV=hPWVO_Jlg5aUcSv|13ERG~+_>|w( zzc$wI>cN8seISd6triO@DiLBqr z0^gEGVG+AvNO6^k^D);t8jS9cDgFG4wqvs8&t7Ld;4}DYuNPE6R1uW|jh}^U}iMMc;)t4GaFC{PC zPs$xKw|rX+-sizYvH-`VA@ezW~8Mx)7gZ%;vl+T5!+{?4Jj(pYVL$2t`#7PqtgwVVxvPk*FlO=5U z`_rp{a?BD#c$uCD1 ziUJ84cfdW^q^j&wEID!3qSB@E(V^{?Z^_vQtaQS5kNgFN#l5nXmR7XU-Uy13oR*!i z>YYB0)j>~f-{T)#t!kdc)`4Ft$H!vC*1&&Y+V7suG`>HTszFmvsOW?C z%`I<5_VRaNr&|S#q}dY&dfE!U_=0~lzo~B39S(tHdpM}-OO*Q{mV0O0X>u?OVzN1Z zL({|uRqd^PEvmre8J|c%cJDO4(tn1_d_rTy<+5{ zcHsRJ^l>Rm71r=v2@8Y!#vW-s@Eb5`+=%V|q_s@E>sPn5_j+_Qv8^9kYv1yY4L+kN ziAx?GRpojv9jV?)dU{~kiZGM=3|8F`AV>`0BCTxVi}zFU_?rw zs;tKhi%WjdL8IUd*4@6<`yxdm?j2hp_TPyWjnZ*4j?HE7w*>y` z_+Y7QIj8g5=s`-cbaW;1+VNfhM85R^Cs&7PM&gYSLv=TG{*MWWkyz&1_Da)RqtyO{ z&K^q@qMl-Xm>8H1>i}8ZSEo%VciDbQ?GUaAhi3qr{;f@R>B0K6%I1`cp8MZ-$6L#5 zoIe`l=}eIGW#Z+ciaq8olQquRtP@6)EWUNS$>-Gh6exs)aid#1eJ|h`v8tFIF6<@j zo8K4g5O?ygXv^PAJJ1ERyCX0sVRg8+p)|**63WxFIZtlf4-smXwX2=*`5~-Dqth9{ zl9tgbIG=~i2sr_Z3)-xyxp_jfT&X{909_9bV@s<;+0&+S@Od(oj?N9`C8-0K$)(|O zuZ+dZ70up{5v#m`E>7(;ROcKvUHQ)ppEYA}$Gh2`bWlDTPFX$ri+q=DOeWG z=nGy12tl_EQInnjl^?K2HL>v}k6>a78=EhO6+!j3_LdJ~#%RyUQ{%UnNF5|VpVkc_ z&FNRTv~?7ER)54LNC!zTd`ThM7LwWn?@TN%5C1WtUTx5TBoZ<|$+U?BpyMNIO8G4Lp+tF+o zgnfSH#Qc6?nUB|RF;3No>+4Fd!Cm*RX~wm=#o7tgxpsln1g2;OB`(Qc{Qcf_XARGk zo=6k%Gd742|MGi+wJE5#%&{3Jr>x)~y?pm!>pp!Hq{1O-`bml}8JT5lR~U7weNudD zYtS`_kuW~0#s_9~XSBGm(|3W;q_peQh_SQ=7Ad5D8neFmn|pT2B+5v2$GAh7+@k10 z(9yUhoNRs09LsUA4-#tOEfj#LZ^Q@Ps1B3sfy9{NQ?fc3X=m@6m;%#bi@clHeDRIG zxI{L9MJ?*Zg7SLHq>c@^`v6;J@lxjTXgZK3-_tsfyr98P8U>Dt?1Q4W#^%az8&D1c$xDx^tb zxzGh&@5eX7W9j(prU+2X)bI5vT6rPL%`duVz78J2f!liO|1S_T#f$^M!I(+6tK}E* zNhG4v1a7#pO(7%%6sc(}fWoPC`12`yQ#d{qrS~}|+$Zxp71c>mXlcjak)S`v`M~Xr z<)#JztjLy<3GnZR2e2QYg9?r6f1tRex)6H_#m; zGPf*~l>YTWi_HAy{1J*z=>jdf$>jTwT6 z-x$0?R4_=#Q$oshx~i?2EZ{!>)^1#1c2#cC62Pd9T5wg^s9igp`rfH4pd>%|5WIg_ zQ2_x9ll;D#m^>c7Fd)CNUl<_aH$u;jxw@+y~z)P zv|g58$6InmuKQOF#bnspF?OZZ+Uk`(BwvFo1LF#zTfcwnJU$fFgnow z$F6|?*cJ7^+11d@*wFGn@}-mI|1V!!tQO9u{QK$qk6T{|5RukH$%Rr78>l|Va1He) zP)W1~aJ&)66NCwjsR}d7tk!MP6~iTspj%@L;!cn>8oonzbMJUgcN}LQyYyx+-Fa#~ zXSz=%8XI{AW*Za10s3t9Z7kpcKv->QxjzMXbTA+Q_LGCl;|;CmXXA^kV*P?*eo@7a zL4$W9=hZ+PC*Ox%P$bAw_hxd(U8<5&UY4VwLWFPDRzRe$U7A?D_C5+IrH{tLHvo-M z4v9j#n#Cqvwf)=z@-b=G&01?|r5FQvz^d={fUpcvSDVS6Nx4*;2|ZwVx34lXZyXNc5|V9fhtr_?H9Vs@j&pgoax(!o|>{StZn)h3Xt9)Ap`w(T~sOfBFG-#8;)m%gE}MX&>{noNSM021TPh(oW3upzg{ zVjOFb)J5bdAAwEOPs#I@xR%fH&NW&ES`^sbg1!fnE5jk=KY}HnH!bhdDSfmWSEo>T zTeZnUH4AksUUHNMe|S3Gh1jR3C89H$^aogwJn;M1KW+_&IzWPs&#ztegIu zj#m2n=~#Q?NV%qJrc$(VsMiYg8~FL8F_bUK zUeaQ-q6Vn2AQHcJ`h4KvoOb}-?7n+|7(3SJu_QpPTqF~Vmhg zu_@cx>AA!x>)4rFcPyA{ zV_|SB9AZV&EhPzKgkYSoL|baU6}0YbFThG*VV>e}OHiR|vKQh*9i|O_UY5AyYsKSq ze24)T;uTM2fC$rh?gMspZh@aomvXB`JiW8;*iU+4_r%&Nt zS5E16A=+lRLx143+6`vt!Z^C8r)||>bY_1Jtwo{b(@o18eMxLYpo*-*cDeQsT~s1e ztDtZ$FxY2rd#T5tQKVT-V(8f@VZqOYOm@pRPZD@z6+5|2JPZHY$stiW3_XXetDr@5 zOLIcptTfM35SSjBNW#W2iH#?l%XphV(KswH*%hkajloqJrabWM;*HrM(dO%~v3h0zqk;IIM9 zINq-@KVR&3*X{o@%P|o$jt#9XF-VZVW3+HsIh6ikQS{#`A=1$JW_$$m?Rl9$@)YWi|$q!^5Zi!&y( zO0pNlkZUC`AD2}C2M7uzU{n)*$~2+-_M@NmfO z@gwBF_YIFzDg9t|W9xZ)_%H`eM$u{pi~Q^8Mu=b$(7}ZOMGY-o458zSo)D_a?vd*X zm^?`9{Uz3f#r7Lv*WxHwr~GLQHI?st1B@H%T?%B9U&dT|9M&BVDO<1V$R4D`P>t!@3xi)4t)X5d4JuI4?2=i9vM*spfQ9aQ>qaK@hJ~dr>fTo zO;TRe-&Zbtankgu0dK&nkaf9UFHCY0t{eX)C861g#fQU|_GS!ui>jy@WuW?LD`m0J z`Qt{659i}Aw;5ZUva1q5`q+Fw!|q*NY&Xbe9$7H@Lt(2U&z^orkFPNoBSc%GL2}$x zj#e(A_ebC302BJfPtMFZlL-8j6?SI~H4$Dp>{(ilpFq3?vQr?gZJlnb8(4eD!6!PQ z#mworFrzn_4ih4{p*I@{H9EM#UvQX{FX-L$W?4B={z%4@eru@P?USV432yTj8QQQDmj(!ssD@?5IA z=8xLzLEpOkDJnVPi*j}QLmpj3x*bmy+o-7--g=f-95+tjbBw_Bl=jh?X^A8jLq)Q@wH$LZrr;@^>BMT${fE?9@zsD8rLge#)X7^2P$XFd~!%W#euaIPIZI;hoM za7-((Pmf)tJy+uH=OkZF;!nji9IQ}ckH|n`%Z1&`kydl5;hYX+Z0+^|&uRnP@_`>K zMp+)GZE~ggN7PfL+S`EVN*;u5h%zrHcZzba?wMO-s-{UUy~Y+cxsjQWHeaD?o4*Dy zVaDTY<#mM?a)qA;>>7WpuMM94!pIuDGt=B4)Ra(Bh!98?hQtUiNA0 zXUTfM0agn+L6~-+Zg{g6oG)$u=|N~89j_TCEz&PSJ%WLE92*2WMp->%X072($o9Sq z^FzFKTymnFO2yd zmoc1FO34}~(nQU6p~Yjn#5>vY21jqPp)hT3xv0e491?&j`I+%ndPTC)wi=dwJZ!l| z);W4jt1?e$!I#6s1~8&JMds%5fv%Hhg~ALnSk4mXqQYRjay?*d05&jh{J^fwwu?E~ zzT#}gtB8fMawdef67hNQ~yr9LeFX6aX3o?JuBq`#*f0L$5Ge zxTLpj+qP}nwr$(Ct#8}5ZQHhO+><-$bUNu@utsZ8^;Xr>L|bG`#uyzP$v04B=8Wtw zP1b;o^G|P;ZL)6m_f*zQeTK~G?nLIh`LVD8J3uq;<#Jg%E_G%ny9YJx)e1$Tc-jhOIdmP-DkUX?BU!N%=10d;R7}_yFvPLj(gc z9%Ih0)A_5kP5p&IH0uYPDJ0NfZFC9$j2aoZZJiaBHG}pOIR%0vgbj`#Byk7obua4m zpP#Ss)HsGAUC|G1ZMic?OEP^~StNJb@MkSsDf<*T%wE=3=pE57v*FT57DZH7!4*(m2wqS(S9vtyQ{fJjp>F4+( z5D9SG7#Ah!z}rvg#kCAngdMN|iuUqbc5qD=xJOh>bWu~@auA2=fubNlYvr$Dql;T{ zurGgzXoSE5o!QCsn4yyyuTlH_HVJde+XX-Yq-4q~87_&m*>_hQ&#>n|zAqhI;9p&D z=Y$D$!c_OsEV}`KS%tr~lScr!AwR$3WHJJl?wvw|;lPVD#84ZVYF}7`t4HCiMJtOw ziOrh0LNFYV@~-bzyJuax48~lwcxeCCLB(51#7~YJA{7s}E+GJh?rHzHeJhqDyqgtd z9lkjQ4Au4#kY|WnW@XqvD)!e&ejj&5c^#+w@9@upf=n+IovcAV*5a zbC-`NM1p~>812CXytJNI<_WqVN&-PkHheP1>D^}Pg0%8_pDXk&-Ha_lCf1sBNR=7x z2wm5ap-bn7D3oqP!IKtmh~76rXp%=%Naf0(@0fqe#a1B@Q(&s{m=yjvSR?Rz^M<49 zWc?qlV9<~Bp_eqePvJf+L~!-T>(WDp%eWU#Jm`KOaBzuk0uT`Pn-2e|#PKA;Ir+?R z?SSn&aWe8A4&6&YLdq(dn7G-kW>voFwF^Y$K0Z5_Eg?e>{drE*)~jgi8Jbv4F}%tD z@c)liy~uHpHXTgulSBmoxReC|fcsCY+E^Mn)0@~E+dH_>Ie7k8ody6_-GbFR{C_); zGdfq!TVhFnwS7iJsn7v3j7iEZU1O}NFPxKUSJxz_oNu8<3kV!Y4Pby6@S58ce_yZ0 zdH>x@Cw5OWqD0}$I=wr+{g!y)aq#edn=REu^T>!OSFbqq^Gq!1M6=i%J0p=PC)+Dc zNwZY9Bj_#DB3-{FqhuGNymHN)d>jbkMk*~QC)V`oql+oB9Tj(s4!kwdTsKix!~k>? zS6!*)v#8|wCai>Htt_0g*{WW>V767AU%)B5Wsx)2oG3SaBALdmbfXW&y1kzSO}=G9 zT2c;gve(f0b@X!jgCVec=_X}UcWbc_$r3#ryF3 zl|(5<1_lle4g@>tqAL+!N>}x%JslkCHHI}?H6ki9Kxxbv!UwrES1c2kg7;m%%O0Wu zsK_;S)(*KVU)g5ux8BwCR8$p1(cdCzuq_Z}1$^%T)1E<|;oQcrO0AH6;&N@RE!-Q^ zSbtI1up3g`nW&{SV-=P1=SF-tL(;Q56Rp257sK;K_`ph9EEZY%sQCh&rYhTO4p}wY zGzATnR8nQI5Y^jmv`%GbY!YB1gM4A$-;{PEMu=vX%o+f=P1uS59p``n-lJU_gJQW? zhIi`Ei8`c$--Az$4O3tR<1I495G_sQAA;o&z(-&C2Sjwb(}aE7l%vf^slok8vDu~$ z^A#M&)>+hJQqrqC~zRxsWyZiFlPRVE-mBAc;C z7dw(;9l@~np4KVczF?E*m-nY|x`+Ts^9~{e3TwB3QXI3U)W|35 z33Q}0Y*$knpR>(LykKSY$U=v`1SnUHvQDU8w9%Z{ZgE$4&@2N z$|_}$KAXp`W*_n&r7T$H1(@Bo4%<0*mg>w4MDg**dX9;U5A^MozY7d69)nqWsr*lS zMkE*OwiW1pu*O_QSw(blSexE#sFrd-AS{hDM6Qrh=A;PzoJO5KY&St4Ky8Lnec+Cs zJv*dnByI19{Q}*$dIoFw(#@Xw+Ws@Plfs;Y=s8MV3!MOyxeN1V-C1GPrU6rjr7XjC7#WNlQ!tc zw*$}a8`uUwmThA6n>fXF7=l;LSu@yf0mF_Vgh~KUBmvbks7IV*6wR{*@S049F=uid zusi8IPW0Frq)B1da5TM-21Z!EZh0QpYm3!D56}wtgn2qoA4(Lank5*tv{yfDr4Zoc z^aWp_!dxqFxGFSN=2XtBLfU(5Q(XY^6WV}DWoVP{?Qc)G?5K0*H7Y>m$4eK*%=-)z z(?-%|vO0w6{S8o-8^{`>T5h+u;BHRl<2+J>7=a+E4zf+kmm?ze5hJs=YC| zp7nbyk88sHp>av=`K*BC>&VZV@%veBdAm8Q@)=56`D@M7O8T4o{4}QXuihopx;eL^ z1C(l*^;26R$=_9-v6$<A+ zJ0jDh{LJhQ^kk)Mgh2xCxUQVwDVRtcJzE~4S!HK}J#o$LZ_l{w1^Wz{EWs2@Fyh1_Jm*{8% zs}4(c(1tzH7K`=G%qb;EO>}@Do^QpkRLgWbSVyZK-FX<8tp`O>p~x4Sa+Un3#p*(udix9Au3G7eM>NIY^Y}Ln`TeoUb^3ZG2{0 z8K6Y?0%3`Df%{C~X(*{A28lb@Pt8{ZUqeF5DY<~HSr4oux6^M}bP6<=Xby-J#?5-syfl4f91n|5G}r;y=f6Z^j=f@>hS1CzXTUh1 z0d%#UP)YSL4r%1t(Wr5H0fXSN6bQmvix}KLHn9j)+iK5Ob=87rB@2aX#=}B#1D%O% zW_ZQcQ74HgFnDK7aCzp7NqJu&Q!_yovmyf{Z7aB<>x=xYo1Xz(rxaLcu+Z$M!q46C zqK=nvk}fw6=l{$a2>lTz1+~g4zWB?XuYhLe1}?ibr+#18oIP&W`#wLs^e1DVQpqy0 z6cp^k;u714?gR@5k>DnxI?*_BzjtOZSAcExnjzNA!>#QRNG%Qtap4fLRzc;Lo8$*o+#Ykn`YIlAS-b|v?Rwo}Q; zpX~YH6`1kln*V%nLujV1bQp+-Y6FG+B5U>f1`Wy{2YLPEk$I^{j#_Hem zWaZ~gP00mUu$ZQBWgT_QFnLF&*~6z7=9L;UR_5i{wGG}2z&YZPF9qMkcO&4NX1Eop zjrDGUlVoI>5tk>|78LwjCP5eR6?b|>462FUqh=Nx&`T9U?8-^`h&hUT zw)pN}aec(ZXqkx@3zT3+J*CVR0k8MP(`E|Wh&wC@xE{AM4uMI?SS`ah%s{pghsbM{E9JLk<^poJ#+T;iy(zbd; z4f67DiK;LhTPEAO$dNYR<=Z+MuTryK4$5mASRK;h&)I;=8@m6pnYjOg2ss?9uHgU@ zxh>y_%sMuMD`uc=2|DX~b>r|U)V@33&?PNZjDK29UjaL8a|+Ic{Opst&#-GjMDUri z$G@28>yOAM4x1n2C-;&~Bk?Xcv)+VG;gw?qibFYCvsD33R?+Y3vS@o%Ny zzk1d4yYhRUhw)3N=fx#^7~)uTG!M=Ho(@)U-JJt@;tOl+&WPrQ6b0Q7@WxdW6+X~a!4@U$J+Q0zv3V4MQ-A1v7!5%$g1cR%csJ1%matV`*G;i`$f^bMD z>IVdla)~oS#;;-dZqT(B)(Z#|MD!I=6ft+heZYw3B0mq0wXhAA)oFpJa8@uVl0^zW zY(QYbz=19RkjXdyJj?N`4C4zJ1ePkn3xT@EgE<^hcde58R(-;XI*rK!n<-t16a#Yc zUhbkClVyBZ7%MG1L_gmUnI5k_Ex&@`jwrEka%Om5!%WO|N9A2P9z4QLU^)h+!3PRN zyIBahsh@edB$+N5APm6gy`$xv(dg`$(Mq)|Th)oDlu33{8!w_8(7TrT$NKacrLOOV z&}RH&M(!Hlj+LvygOsbQ7(bWRY>Zx(PFKb_&06`5Gx;!2fLi7X-QTW=lF75$h#wU+x}$mT7#v_`7qans10YkN#a@d;_8{2<1;^Dxq?kEE%1F z_Ti2B`(OVso?s@UNc;yuEEkZ(nRLd)ydpxWqe<->0cOqY4`dHZNJ<_o3+7-g>awzJ z7}ZSnJ6AGv=hkQT_5JA`|M&av;Y*b?8wjG-^K>BQ{M?O?o93K(-QmaeUE9+}XpVfd zqKizRW4SQU8ddMbDXDOJda$q+D<=w}-VV3q6BZ7m?IQO?!!hjf{*+^V?!rf2%z2zh zQqp-r(7Ph5jFV40U=Z9xN+~(mA^}L+ zyKJi3q10)qe$3v4+v&X3J%>6Ns)vmhALKC5{H+55;}J!$Rfs}~8y|630fE<=U zz8V%!k5qiFe+E5)?YFx+w!^HzX!8(?8BN0dI=nD>qq;3v$5wO`Wsnh>WS;;_eCEM^ zo@#$m6K@a>a$6UgCC-m2_N2&m{l|nWgwxH5S6Km>Geh>!0;q^O+ZDkHQUpH-a%hnm z9_~cF&R)vf*GiasgeL$Ab?HLB1SPiETfoS5-wLSoWqQ)QKgsySn1iSgx0_jY{{U9G zgbUiG(-pF%EPUjLT@_7;Sj-WAT6U!+*Zw|msC_g`S%oqqv?aoh$Ye91T%Jrqvy5dJ zW?q0;QO_561{$jM$PBD{I|$qQh2cF?)qAW0>>iEC9j~4Ir~A*o=)(ZMKGtJ_Jv5%X z#*d1(#IHH@-$~&a2ShX{L=K@DV$L=)w`<`_jX6hG8K&!&N-Sg6S(X!U4RUv>!M)`f z4n5P|Vz9UZ3`~9k{D=mug5l@|*X5m*m!L5b2rh2O^SUmw|Il6>rUwvGjtwTM8 zdiX^9mPJ?k14E@3x>FvRXJXs{jhp80NGy|-x8=6r%8lcR;&V3zfD*dTSiVQ-+?NJY{>yM zDr!%UxD{+%iIWljVE68QYU;zo{;uT9F0sPYP%7gPK=lQHI|n8{uSfF7%I^0tf8VDl z=k_YS-;c7F3~n!Xvco*8zme)m21G!{Srm5bfB{+SZ7Rt42_IW^=C*UeYy_)sAgb~c zeeXB)X-Hdj(_!2)46oH!|4Kl*C;wZ#w)=FX=^f*NCO|X}E2T=i4CQ)nEeLEwbxcNM zfRwT%7>gAue5aFR4id}Y-_!5@yxkeW7yut#M~8&nw@*CMP%#UwxNmUB76d}1Ut65J z{ZJXy_3x9!{O{@W%$-uqEA%HAQ_S3NO9FhAXlSpR`MscrpaZ(8@?>Is%)8v+Zh}c( zeXOM?>}S~-W}l4PaUDwK>vy+w=Z)}+sM(om(!`R8Q9!+jMi~rD?lq?P6ff>Jr1+Si znLM>Wpo2hTKy%m09nZm_MB~_qJI^pJ<}J3Y?v82Z!NDwO{p6#IFh+6Ewc_5wI{v1F zi{U1Ni;*KcfgM_}HF!msZ~+pz&c@AC@$-ofG5&fa9M?#G_6r}4b7NMYdE;Z7Gcmrv z+c6R_9P=zxN+QaT$3pMfiTGG~& zRZQ=Pp4W;s$Ty2DX?iv#Z+)^&KFQ~fj^-C+mKzvRW-BX z1^~d}1pHrC_5T{OmJWs{CQhc#|G}#Nzn<)kueUpPN5k3QCkn=em&7KDs1g$`by{QG zn4HV(a31#&N!OLDN0y25WybZX3;WBs*`4`b<>1%COeu*sPsfn=QG;ZG0tE_GsL(+; z?<-HBauV+bhNwU*@PK;+#fi1HPZv(CP)vtR_gyB9lDX z71PwlR5VXqx}(;so12@vyMCjmN{Vi)K;ar=BH!P^>RWeN|Q8Le@ zy=GD)zTMOm4JgzdeX`J>LVb&cZ`PP1CVq9J{6ioS60#{;3A5O8(FRR?G!dQKeH9B` zUDLPnz{loB=GjJ4?AViQ$L!HV2I-V)TKasMN!HBa0}ci}YCyOfV& z%7>TM?RCtUx}%-|dcY*5HLTaq?tXg8#y-&U#jUkku*IQ_rnZ}Uh1`NbBz9(XWEliRXK$ZRzKx3nr>CO zWqK(8g*E|rk6H2-62^O&fBy7F@r(aw4g631^>fOLJjNEX@F<)n;!r@!M03GslSeHD za-w7Ag8ryF!8Y4>%~1B3Jl>E-@%p-4H^pHxxAJ>`cxjuQ`ogoa_u}U%d<|W;OTrN+ z#RW(zjFlfuG`6ZRJK$mfz4zsm5Y)ZtM9XeU;Y5u*RL97ln`X{z5(VfDO9pzQ8vj2B z?d0P^Qy2J-izrT_8OGr>n;i;BTmwOuNfxj}wYI;KQwN1^T z{-^m4R50Fi>o2A`VlAE(+e-UMiaPea!MAXn) zFpe=F7{8Qy)dIwp-SwBK&mG+{nqdCNF8p=l4<%lB%%#*;6J|$^+hW|?^fs!M!P3Fmn<2e++sg0wbl54 z-C>;I!hn6RBGTP4mYg1x_sQ2`IKcz1lXQo20Vt(7ip(EFgzfTwXe&S335MxAMPc8! ziiCCU79@$f->mCPSecPX8Y?Exg`Guj1}@o#@1&z$vNpjikv3yUaCD)@R@0 zeR#fqpEvk>e~?-HIEQ`WmwWXxRM9UnN|ar1Jay{6BsEaBKto7M%X zNZOHjH#i_0ZH^r=QS$%EUnis>nkX*KSW#`;2YuN~-)Be;Nkix0Dwg$DU=5TB5~zcI z`)#D7!uaPA%dQiy&$AY(cQl$BeYaZh|npo~+eV`vE!rfHS8mD1{V0HF0Gg$Ee0;bK*G3Ht7qW3@EfRySjubK@W%dqH*_hR6 zrRO8@%f^M&bjnne;MgC5(q(>0x<)!I>Y_@#He?mG>sRB2%(3PoAUz~4P9wU2h(v(< zKH^|+MRRdDj34zI1{hj44Ar4&UGm;03va5emz9}};O46;Yujf}En#r6uZJMF^gFbk zk%9cM)n|L&Nz1@eO1v61#}sJL2&D?gw7eIMDYARqcEGlctasr%YNV}IHakmIl|Wc- z7|l3h4bD?I$Z}%02_a*@J)`&xq|Lb7*oD{{PVlU}GIJ^gacp43mifjJOD}?!pDU{?PiXQGsv}kljuUOVK;7>GHcNiQ(DvZ8EeP6yRDBIvV}yMV$kbw z;_Z_8B$V*0!Dur5Gi9?7onFU+w#A;PJ}k}FXL(_MdeN^Pn_XkgYRSzP!@XRGfJ-(p zj9nh5^0)X$s6L2GA!#j`)jZ-cYY3&V)mb{}o5{yU`QSR-F+`Nur5;pegc9m3rOzU- z^BK3OPcSPQi-|r^XpuXoKC7|=&U~Pz!u8a$N6`DPQKzn%rZ8k9qSd2gt)hW`%a$$Z zczLK<;Rs8V!VF`_a9_==c;GZ-rjzz9Ai@ZM_eCMAwM(dJ5A z5}CPK;9->wc!_pxa3M7BjNm`phUPZy8}VDd>4QeeC5*sCFc^Adq+&7#?|3I&rNE{! zuzuttjPi?_G5;bMIv(+w8FmFIH5Q}Z&s<~9APO8s(~O1Z7g$}4q#Uslo_D3Ce}Xz; zO2Hy%lY+L1i;^5*Oiunn7hIPb3`m@&A}-nRy&3H!r+61<{fI{((QErk!!g_8kcr z;P$pmwl8~F0WTV#Lx6>+sPhW~lT=H||AaNm^@H|Erd^dRAhZNpLXL~%=332WKR0>8 zx@VjvCHdNrz|SK)?vwuZ$Skt?t-<2z{-hT?(;_FCe%Z`lNIWT3r%zGH|6+1GPhv3f zLhw%vGGG@soP@`t8;mc?PSSdPe3A_U)ZeadY+%aPx}h?g@zk(-@Lj)n-}kANRY^R1 z@v416CSl+JCCZg?qK>|rZJ?-yKZfvne%+4o_kI6<`}g7f-N>Ka>Hj?sO{v$RR=}U~ z={@-{_(0h-?Z*cnJPaK4U#p6C4E+uq)USMCDA^3Mv~~OZ-ECa z+tyYrh5heqr>Ympytes1*C~oyCfmwS%rKi_T#Lr)z>pSuN<4s&q7Bf2_c&=Iw$;h! zh)-oinh?kiIq(U)z*-&00M$TC*-w7hskPu9OEr_3l4qm<_fIU`8Xa#Xu;qSYD55h~ zjQK}IX}}nPd)wHH#6U%lQ|~?GV6)QPq!ACDU>WN-kbcoM&=7}h#_tm)?4(*Jy}P?6 zcf~_l-6i5tR+x<%{4+KTPneFkyt47@FZ*|)a5LM2LtXZ16U&Hb?dmp|>&m39R_}v_ zoX?#btx%JwZ*8*n$jmCUyLM5=(p6fYP*CZivtR_n;#p*@fiku~G?$F6q24?dxCNst zLGww0^bqVqbMBp&TyWLHp(+~tqS+iBtreSIQ0_unSGvQ(7f7o3&}Pp7oF^ZiCN?8E zjhpFKz(^q(gB1<#?ply!8_oHk%+~Kxr9!(?N(7+?#!-Bp-1GhW_0ZK;=ifLp0fKUw z?3RxfZJ}Bo%0%b!4(|p*=>GmiqiuLkGq;MKei}(WD=rA#qwJtkcEvMhOXy;X(vk(Uo*%FWr?aP?J{&(@2YiBizVDcDPuN09d+>cv<{Ux!fZ~uX>329MrXXf z|M=t1R_b36D9|^zF^zHsX@QRw`1kb(Gel^e%fYPTx2J7d)w&vI1luL82lRVA;g3a1 z;R@5`OqG4DJA5AcnB+zkMkB2WXK6DhtN0UK{h7#KsjZbk()$nJ7Rvj2js!8raBPVc z6bwYQYMVyyy+)HXg@XYub2jJp`hZXL)1)4{qwrj&K@Y*)N%OYxP`Od-Kz$yA!=|8u zjNK?XJV-%X28Gol#3y?v4X9`Eq|_o?4;T!#zV}|w$MUuzU*u8WN4kouY{M05VUvg> z4H;|=1;_Ty+JgEp8)a(>sr#AC6K$rnoo*bx)G9N^`#s#7dj)tuHVV zk727$gp&Gw|9yPdj><&%l8rdk4$-d?mQlr3w)oA`fVnC*tH*KOV^|xLALd%1IN}+s zI4BL-Y!w^9Wp3mm4lmo(DHu)H>l%%cxjiiHW=Q~2UrQ)L3!Q_W|*`*L5z zz4^YHAU-jo$H~W&|G(gncEF$CI=;_!EUZ5cFY+92dj8x&8g;Ll?nJ_Y9pr^1b$T^S zS1-Z7tQ5@&9b);G z<=LnhYDK8g!FZyxGzhI6eJ^DPb3Nxaxik85hs2LsQ9uoHl!6$_Kqyu+X|Xikk^BSg zX?!-hJWuJ|KKi+bl2|e*|C_+Xeah`4SKNvxoH`JD6h*MYsbw>ElVFgD?is+h9G|obl%OJ+e~9X;D;;twEDnv#8q)SiXBT=jKEw{>N3ls=6?4+&dK8RxR9-L0Yc}{ulA?KiyPImt$k2i)t%ue?^K1DqTy?uw@Nc)Ti zZ6hXT`N;NpNS+r;>hvNsSBwKtj2H>EP=2O)$kk z?-t2XV0czDFEP1~JA)6HSkWH#wVM~5I2veYDAY)SN7AkFi(X1yq1uqyf5Ly?gpHGr z({f$m>5uzX){EIB_LnupOgxBHInB`2X{^AhK7^}1xS7U*e$NYJhnnJpX(r_qrOG2~ zI@u#k)5}&T%j2fjQM>q&3LAm#PFjZk=z@H*J^|^(ot$XSDIivnTlozLOaYUt& zZ550VD6llhjaesh`KL)IQifou#ktIpHKb|9BTMPIC36cxi#nar#iBGk+kE6vds8QM zQ@J~@W_hyV-s#|=Z;HBGfJk_Q^n~?QnPkPn+iZ;CzUVDO3{7Q?d}m3dyB$=KEeYjv zn%qT7UiZ~~wY4w6Rp6~%POlp!9X%a49sSSSA-7djv>bX}R$QZp%hK_(x7_3v$%4uP zpdBzHmF)acdNy{XP4HDN2b_N(WpJhQ7&AxOfgOz@`Cb6(_leew1$6+C%Fv0X;8_EO zw`R)sAZgvo?i@b0!<6NPhLwmg(8*@cR9T#EfNFnjou3P~XoyOoyb|g^#7gLv%V|l+ z05jc^npX3`>O|#i2YObu)GR#QdV{JDT6({RAxXXEIS`$$=z`Q$GX8;Zgopt{F6pf+ zriSVEG8geKREFT(FJxS|cEu-0i<#IdqfsKjp85h&X2mssR_Y=C`4(7Cfle(pVo_%! z$0xs-?Aq6Z9k11%dD9GnKl*Q8C^_qz8HhNM1^p|A?u-UaqxJSi1m|EL&h=5FKQ2Am`<@YOP4$Q2_KPXd zCk&tLHfuQwX5Q=wWeN%d)HfE;NS`6Pm7K_NY-_JS?`3SC_s`|`9DN_Yzx(gl(;NTG zJ=Hf<&ts!5Ys&k-3eEq9#d(LAcGY4?!c8hF$%8UfE!o}oMIs7z#t7n04@JihxBK?C zWcM;EVQp_{Ul@n-6L-6-X#OE=&Za6RRiZa!Ga2tm%gB@tp{XYrB|W1c!7@8YX&hX$^{8ry0@^2N3xN@xa?_VJ zv1v|(20k?D6HQFh>H>W$ux?t5gTdofB7YA`w4&l$idZYhd27wNtY+`1h!#4zSt;m^ za9N5DH43M?4|cZ?&9YX=7xeTje*_7@p0oy(1)8!~o$RH*vDFXXjKoWoc0-B%aD^>p z6y__Bp>^k1j@TD~ba+19;(v+<&t1AC_DZDQG2w9qAt2MTY>BE3f}RIx7(`FTbv+-$H@D=iZB?>!ktg9jh^}i$aX8J zTMi5GZ^b{tQ5MLe{)UlbSX}Wc+eiPaCc9g`h7=#uS}RW4G@&m#Y)qp2UGI&t-*od$ z4)A_QBU^4YV~5Aswbo3TZm;^sb7k9#wdsz-H&$t3Pyhv1ZA!n8w#Q$w@0%mGG?hWF z=SR8;b_|aPHw!b)r}@OESkQiNy%r5}95-0MR$VNf;^5D&2Z$O3SG#f| z#qVG5!Dp~%#VjY0d?!*c7%0n5B}$bu0~z~ZdLnoLSz5Vww{e!JHiOuZtEVC5PJlxP z+ZYk3y%@sRw~jWfd#~2n`keK`pa;O&`nQj7oRjnIwvPQs@sn^1^9^ZYIAn-cDMjE0 zk)Prg(u#+ndb#7?T^D%Gw(9Dgm~LW@8bnJ{l;v-IH16a;D1A+wJD!_;*G6A;^W^m% z-&C4qLa*kDz;%O#Bkm5GO1 z*+y(oWQi`wPKlLgi&h$7ALL%yV)1oomzLnKYFB{ACLwUQ998?kZ#ck}N6pnJ?sYa* z-~=1ige00D!-GTimpge)RcTjL@Qqg_m_UBqjx{p-Ym&-f%|w8^toBH0YjKDbb|uz8 zjh0fS+KNi29+rE{_s^v^C{^KWsY?Vk-Q{Dp8zHlbG4zJt%P)w#m})l{)EPq;`Rp%6 zBt9?SNon-(H`{d^{Yi-jXlPiO*mt+LodED{gJ~MHLSNxE&&CMsKs&cVRJQC`-hcA zz#W*B8@&`lNzBwRJeqs59xcznNKoncLLcVZDf~f?MYNOn!XNiDD|&Tn3FD4^d;FZ7 z96ZfoQ}TfYAI^&qChJ>n>=U;xcBN|D;;0XLA!q@bwuqW!7o7-py1rPUzTT18ou8 z*s%|aJSVpn7DpCj2H%+WJ&JsruG@trxq6|9gGJHPur0F+h1MB6m-^F;BeeF}a*j_H5WD8@?PhYr+1CN-ut9fky@Af2^mI{%B+p z#Xz~=CHJuCHzatjQbDt*KXC49ZwaIo*LfB(&LC4PALbMl-)j{w`*(jaYNdwDD`md* zA^``yT!lH@6_KMluwZkWsmOTDgMHfs^1+UZyP`D!uHsScjYE`o+R+_0C+lqTZrInh znl|V0>6RZn&?D=|o;@6WorP9`Tqg`0zZGz9ivU6QnEz&(C?Wy}`LnO>eUymcmk+|6bT8F1Z;45|c2(raLU9N9 z7^-w2jX;+U1h@eT=Egc3G7KVE04W;LFPdC!I7)PmjXHX)ocspiEdIWSlI#{t(m;-DF>#=~pwHZ~jL4S@Bn)1f zUCJuPP{n!)^TI=MDHgH4^9Fy~S-=drBOqF3H3zyXz~skA{_Vu(ZMBpE=2BN1Q^`g; zNmrXlE)O7oEGX)N5h7;8yB!9odDW9?SisaxDGA^1BXngz5te!VpZbxeP3`FEgMoTC z@Ih@{y(nw0kSnOFtdd4LT-PyV)a_F|Q z4o!l+sn>Nk`kMz2nBfM_De=#Kyz^TsC%*YVo;Mk-qn0GKF)jHLr;6t2$d(1y`Qt|K z@RCK=$xnx`ys7;SVA|ji-dEJx;98nD*}ZbVlFHS+OINF>$BR0tRysmdj4pA5$WR!F zW(E^r3eoYRwbo4cn@Yp1A@&LzxT+<+UeiDjD&+nUcJq9yjw+C!b8}ac5syfWt#+ia zf|J9-6hqR~#Bj9Qh^MLy`lCudy|)dEr+y+6=!_QKFnLID3vn>PyCiNuzbNC^qil5> zkN4~UAZc?Ekb$O)CTln2ZRSw~8LT+3=+$1kw>o%szfnz&Tj`33sit)Bn%Z&uT7l$R z`$wx#BwAt2oZD0|xoR*b=E)9h=J4K#vwg)V>{QHQ_Dqnu3BAZ8 z3FV;~W%{-pt5$|CC>GHCnNFSEPm~w`zDqseOFYcsi#_OneNpM#^TtR1eK-lRKt3IP zzkIPuzaShR{F?!uAo3S}6TyxWrL>;?bMO3Sit0~0G8?V!eM|0OM zNf_iqZ0pxYG4x(XMn5dvf9%IGE#Yn{S#=uaZmW6zw@U6(*D8S*y83pt`gNeYSO0+T^?U}vJ8St7IdU3u>z z?#sNDW3^B7e&xELl)*4|VIx&8^wAC@Z*xVg2|` z9x77<@%^{M`&qCUfqUg{xxkZU<2rx6p>FMnaKJEmLCu#x2RnSY5#e@cHj7Bv($P}TMd8kV8Y;PR4V4%HsDQih|sbSi96~G}> zUcV5i$E-T^%NP}gQN|VsT;+KN?H>T&OCj?3`*^}{N0%7?=Yx1cA9fG8J=m~&-M=D( z$pLC!RxYXxzq(yNf>t6g5)4k@z=zrUebR?r)c!b}a^TM{kt#Y0-J>PF3>`7~Uu*&S2RyxH;0@uB!i&sVTa4N*tdK{k~zppx9K1xUPV&i$%1ZNUVGwM{w-X*8#`5P zux3+NA7^!!^rN zON+r_VZWJ2)B0X;JsnuiXshD|1oo*tFNP#-2kPsHW1loagst`qqXQ);D_dq8OQi?YOWFc=M8xq^@L)dsuobHUgs@&owL6y^ zZz&I*MD!a2GIXQetR22Ew)Z5r9zd{;YL&@Y;#l*vaUFN1H0i%##hY zg?&$B-Z1ym585IpMMNXE4Nd`&1~%i=W7)ZoQ~LD*#tWN5PwvN_3nmNAFgCwtpa@SV zO$c%1WDz?#03kHTysym>b?ALqaiMg1-a>x>1sgNrm5T}%Lbi$|f%OjVmHajJqK3sk z@f^HW2#`;If4(^)>HRW)Qkn%xZxK_N_bt0Bn zsnNa4TO_`g#`_E2GRc`jdfCAF4{^l&8nbtu@bfkQ7h(QY<44V-1|`xdtAi8a#vP*v zc^Z5&J;)80J4B8VBOA7ln+f1`01^G4qE}%?(`xd;ko#3K-vB1aOtr7-KKod$ciqh= zDOu!Yy4`+JF$S{{lk0VRLRXUscoMUVL)49IzFP?>6R-iziNGTh-6~&dcD<=l_9?31 zwe)=oS4)@WD$o>^-}qV2&W-fAB6dk1{@bqw%c`V_PO~y9&GLkg#*xGy1c{S^!WJ(c zY+?;E4bzS`Qu~5~<`uS;<#NBbQ^y3dA^`##@+>gV#?S$+LIsvLEZ|aK^hY9^{Ky_> z$J#*b;rNY{4*DevpGefi*LxScngO$T*>|keh=_o7`Y%wiY}YiYf;e*s{jl~kFlHc& zQpqi-gVH`DkAh`S9;QcLyaxS(9O^-EGvnuHtwfY|-_Oc!nt{VVlMJb^=I`@lHP7!e z3Fj?OUB+pyZcEsWkoXS>UrtVdC6#QjG<4!0?b(5_oo5e13#xBbs7iyBT4I&Qf2=5y z$#RIg4s`SdJ@_9VaoBXW6K3`4Sr_-2DjBNoeQXKLh>SVqf}!u%qlQUFW6QV3$K(R~Q#A)L{8L zxaS>-kF5g-4h*<_K7PMV$0KS?8lU4JBsyj%g(Wb$1yx(OAa#l=DSKQ9j(qI8PcS3E z-|iNBtlqr2WJ{q$c}%#`w<5>?A?zDtJd3_9f92}3ZQJZJx@_CFZQC}wY}>YN+xGNi zGReGoFZq8s$<6(=lfCag=bp9KS|CL(ruB`;1W7FgY+%2@+|pi9ic_8Qp$|MESpj}z zDudKxZ0GU4IGtpaffcE&~+_eFs{?H(R|W8M~o`?E{V66}FNyzaJWUzG;vJzAge%Fi{w} z*LhTu>ReU@=$V=FjKc{u@DJNwU|_ybMa(}F7#*96&_J6)Di*gWec2qcIQuq6J>hWoQp;#jd}M$=<0FwWMl_Dza=pnMBTMDWX=j7I zm<0LbHRtR1se9|HQeE_!paDKrkvG+FwBZtw_H>y}YMAVmL4;u8_l2Qz**Jio}W>7(Pu! ze@+-F&UaLV$6C@Twk*{9T;_K+8fk@9LWHj`;Bz7N)MK+rxeG_>^~XVP&%pN+>havH zlt+NMIW9H4h6mxYuYzLvv3;cg7KK1>NuQ@eYLAvi>^~kj4*s}iaM*T6$xoG*I|#D- z6KxApBkJQw^Ga0ikfsRL@w9cp!Y6}y0{>{r@v=H`@Q~$i8|3sp z84=ittXc7{l6hs7f26N#HXST@T`~T~WNf*sMv?HAJx8*q?+4X&_Y0tP{Qw;cGl5V4 z`zE%(b`OtR0X8OkbKKmuY3C+7#*WL5;Z#)*5;1?5_^J_{hY(w)ngRV1)v!Y_CW4wMsa&Z@^yXZ z{`+IX@9}s^ZMn%mtb2C>*&mwV`^P(Y$~0pNW)&M065>EE5D1Ui1Co|nK6{+^OULjQ zNDJTbBmCX~2yH_2^aZeBh%emVfSdOU$rC%j`9?}^D&K-dXe7Q6-m)c^n-uNIH+cr4 zNBLmh0=s)ocH6nk*ArRLD^_egvMBoB)cdEx!hIspYys!GS>QW(3}+|YF^P}V#|yds zP|`(rF+?b9>mN(=Wc-RzX6pn;m}N=AVns^yvB-FN-rT0wy1#_h3VeyYN6W3#n$gE| zI_k!k1?9)2Kgbl@yl$k6Y4k{{*0pb;4TB8qfVbydhf4y4Z&PXR%>yxyHd7M?_g(4y zI}*v@IG4hhcuz|=Y7Cvhu=TP#`E9CH=4RLRLAvgIWwPIzE2uBAQZ1PgnmJ1n7%O7r zB9X-;)A7DI#izK&g9;TP{E(p8de%UAZ^O81IqF73k9r(3q zI8*|iOA?7c+H=CsnLi97wCoLl2dgi1!X>~kpndg=Tj;Pv9$oxLfOpp z;x!Rm&%ufXpX3LZvu+dc!ngtY>1mSy4mlk^6UIH9>HM^Nc6nAwdk0=?|o-7~ii z+5j!S%Mh0XCMR%MB2vaeg&6U5L%vJ!-6@lY^Vww*<6cofI{Z#YU%yV*lREqc{q%Oo z=aefe^G%$G(eDGc66n3GLi{D{%wPv@gyezvTOWB#^;SM!hmND*MZy$q(Yd?(;7Sf1 z94M6VQSO1uUACrTzsq1hS-kp-9e$WY{4+rT72=Yl|FdQ_=~=`B+ULcVmmoEoi8fKy{V{@zwa#q z%7t6WHg^#qRFXUlye+s8vQ@!f2SUnJny&pWA$JaQt!L_~)RE8APA{dchO(0hyc^pj zf16`V@%G|?PaU`s)OHNcB@gR_tR3aBIHkVnt}xxmuzcJ}yD2^qIs8|rG%QcI;BS6Y zpMjSF@DaBTZ9&=PuP!BxTT|79#r`sCJ=RG3&-`Z_U)ADCBmoC#S66qWohUEh`(h*J zU72%ZC_=*hND^t|eJRQp*>gr`8<&WuM}^Mi&Yat0N#ZjHC`IVVtDH**VPZ;>>*}g| z82XgkG0Hy-iFQKA6Hzv4&HmnnllHPH$5@gZ3ft$$prD}&sLSY4lWr+hVJzS_$htM`4B&WX?YVaQN&1!Fe4WA@48sW5{WVOZb(8vLN`;;7d| z%>F#>%@RR`>sxXZY(hcSH z4co3RgB)&1$|VfW0btq8RX(*`I&`I~5q!}b)u(fbdM}w`^U|S1=<082ugg?vmpJE0 zjGh)WcKHqb=6rf+US>_aAyzY?cCNC5u>1a5qU5vq14OoK)U2ondv^{_gL?DNZHV?)7%&7g#(>&oAQI@GLSIpN_XE(Bu>6CNYJ&BPE-F~2}N$>1G za>DX!EO$nBms$vJ<(qGYh2!qiJ0(9!4W&L5Fx9N{a9QR}LRBs;?O-icCHii3;v9@q z!Sq`63Q}YrBU01zb$B3!A*AL2!^3rA%@5Q1slw;-;?G?uKlN6$E-9r?8eq+E%v!|W z{542YNNv*SX3#oRCL;4wRV~y7IV~SYLuw0p0n*0xW}8(u1O&1NKQTRE+CcFg2LB^(p!gqdw45 z)*|3ri6R*9x7HPl5a&l8)PhNB76wS9D=0;w7Uon8_h4qB`9#|}ObOKehe1}GuIchC zN4Ml23ElZ$`0bkoEI{CDm5j|;!ZgajvalbRL<}3C!s5f`;QNH^aeMvVl|78P<|w5Y zEDn694szdqE<2}(e)t5t&P{n~^?l#q+Bt8S;@VlaRTyLGfy+9i9hwD5YeeYF!4A1P zv*;M0`H20B@`Ls7y$z85@Zo(S;_Mv2E2=(RbEXxniWsJdsnX6l4=cKtz7y=rTm zJqm!b8(ZYMh1aJkrG|2n&X?#WE#NdEge~N9t4$c15a%9vrKX3nw)QcRTK;p_JQmig z;@d6;c>)Ew`y4iCSdsb1C}qg20=7Tep{^r>1l^%?y&i)PSx|JgKyc$b5d^`K`Hc_% z*PG!GuNPLVfAEvu91gDYW#26#)KvQqDqi0>Ax%OiQ>N(!ETXi+l6*Su8KO0Z>~?0; z%hr0*6*ZCVb8Sd~hQI#MU@T-y8FpI*c59zrsi=)xNxI=2*R|^=rV%J9Erlbd(fhpI zas3vTVETk&d}s*M&g=jb$pdWm+j{&Yc7%rbo+_M?4!g#(+?F=l#%R7l6mZ(fhWJ$4 zbdL;%qhXd$AmdL<5F@+DD?5f`=ANz^wwCekSalJAAKeyKoc{~0&Ai#pvI}@?u`eo2F6Wdm&6aB7%jmNAVH4nfI+<9 zUc=+bW|!^#V`E;-2%cbH?*HH&I=;}Ev0=V#Gf`0!BuRh43eS!n97%*TzRWJWTQaXsf*DSGyrdcd(tp{~C` zaSgw;(MpDXqmLM^Fot^NEiljtsos7D^$LuEQ=w}gZwSM+g=GGE!Sj>RFi|hpZ{ZOX zGZy;3+d_7dqJjtE))C-_;r78@B8okj$;I{Xa%4ins=uoD#Db_QpEF)sSHkXmuY^3* zB`kP#0qng9yxH(F>5yFaF!Hx1OxXhVSnUV&7-|LMn!=5KiXrz@Vl3@|zkVb1XFeKc z{<@DO3_92j^nuGN{fhtmeQPo!`AILuG-w!LEz6=l*ok(eHNLcUZ*+t!)mc1kl*vQ} zj;-jIe`q_j};mZavRqRk(xz|-hnb@{8Gm!x7{25R{7Cbl(-`T}?1Mpo!* z4}QteaS$5EgH`lBbewE}RoABct-SpBLVC0NO!e_$>JA*J%Uv2Qrvv2NIQbpfrJVdS z#(DZ^f7-I4_TlIMajW~^DvDI3o3H1%06?i5008}eRTLe~-Tnhzw^IAZaiclmN81-n zCY?QALphb>tRr1!i*rN;YwMvUF*)_|o*O43h-Mk3EH2Ob>G=C)gC6ipf#hju+KC2u z^-IsSPK`zY$(vN>VCna-Ycz?+&TbBmhvzBT+Y`P)2+XfDxg)=e)DU~ZOvhmh2-=aWZ}U|B zKs1^Fc`P{3s-ss=HdzI^b}1 zIGjjj#=&+rk4(lK9rPcaARyCd}}= z=++#qFGnx7-^g2u*c7f1`x9>OXXg(}fT6=fhxgFdcM2K0AA}za-5l7#(~Bn~Cr9FH zG5}k5D=&U*o{N{e$M>6+*IUOcAS+c>(Vn*(Ll(%z<l^BMc(U;rC;Lm0rZ&10q@n51XLx{v=Z#j&fRr{KU^CaI&(L5Z~qZmd#58 zl;ADLZ8#^#kRkBOVQ4p~terlY$tfCw@-o8{k-f0b3mgVlwmUG~4ab9&akvu>BF$WE zukHdz(Abe(+rr$_1I@h>PH0&fB!Nsam4ThH>QFdk$wjAll`7LeHN252{uodXF0`%a zIC7utv+^IU_|5^2wvQ@kEBIMBylF4nP}?229Y1ir=$W!CQ$k937R%X9X$49ap23JW zoB%QzAyS9wnRf zUVRUtGaA@wI%`59@8(?=s7`Qo0HZb>;V>!HP;lYO*MhfQhj$A8PZ!e9kj_;|?Dg-V zCSuf^7=T96KvsDz=;`c57i!Np)pplaWbUA5N-YCaV9b(b*f?X*p*jWQFufM!u33-U zHZgLTFBjX>;!;+P$8MiJu=Tmd1s){333yP}~y}x^9ijfG+=&N6A;8%bAW)P*M z)~}&e!6hi{L-bEqhmuu zqb8QoGUSNA$uQsoyXZLSMD`aJg5Cp@!Lo;nbt$E!0?%4!x0RoI^O`voe64?-X|&P` zZ^lXfquIQc>m|_0kyC)y-urub2`BDifYb$Sr3JMe-yfldqhC)Xn6&d{_d4~oAjXnR z)|BnuGoYb2_0AjirqV(-j7EdSV9UU#}GS?;=Ds{sRAu4aMXfH z&mjuA4pdMrWl?Y^PoE7bGqZ`s4Qro7;;b9)US|`1)_o){-i-3t$DcAOO=7R#i>KY^ zw9pDbrb3eNW!_Af(F5v$nQvf|D^6cTiy zYXa3GqcJa-tzseJPN{U9XB*-1eCPzqEk_N89D)SS@ zyF&(+F74A>6~dF~9Ine=&0cV(=;a&|WMWeSe~6PK>{d-l0X)viJ1_X5^wKEA!o;#? z!$v(2%~?4Tu^lV(R`I0>)LNx?entM0`4-<{J6XQuCP8w5DJJVnI}7pZ8euMkYq$Yv zEi&_(b)v=?RQ+Ymud4(PJKt#Ley|~gVinbk6n$AzNp1(^9fD+rTgr9$mQ)777mJ|xqf-<= ze82H^qDkF;ZJM{@gudE@_S3$&(VGBWQ?UOJWZX$r!fK*<;e9yv))?)v?|ArY!7m97 zOI=u!nF)q8=clV#PYuLU|K9K(%&nQu->aYTLdd4=kVlCRJdvn%HNdTWKLJkQlFpdc#aRxNJ()80c4@h-2|A_6u z@F1ssVp{WAn&%ux^RR-ZnEd^Iu|09Y1sX3z*U6t1X$?b{;q(yXAD znLr@Gr<5^o3>q>Rpzmp0<#AZ~g=Ch4bPU$#fq3t!L1ZOaLB)if`OV&B7tWrdrSMk4 z*euP=6zP`rv%Y!hn5~qogj(}aS|=4%TVO{z;5t2Zn5!mGb(a{uW{gBwex%WzNy4>A z*GKN^Q^=ybJj><V{Xt%7Gc8Mn4^QT0B7nWM#?v0wlc*n=uES~cd2w;$J6U8_Ws=kz{Ia*k- zvANT>(M&(nrAT_QR$#;{mNObIE(Z^-S$uueN0xt>a-MO=G&1{4*0Atz*5+U?lWrpS z-ZMouy=d9J32EJvMV4zx!yEZiFd3IKm{M~dgZ|? z?57A(|IKHJ)3OP%0ljMC_R{4BkH_aLZp25M1d%MdEY71g!Sw&BA4kUs)1_SqWa#-VEtd?l>)naX!l(b`5nIvIS*EO@h7ob~DL z#nE;F+7z4iJafIRLiag08moKLLv?K_cg}|6JLaUjF|&5lZrLeI{YMbj+v^2v11x5Bi7Ltv*66ot*3GD!O=HP<<;PHmD zb%SJ{?TuF2-^LyNG{q5ys9%5lxGy%l261mV<>WD)>+?SO5OY`B$(~XVR&VFCMZ;Y! zGx5@CiHX4VFl___nn;OL9zOPuL$q1Hp~r^B-vlGQ0C895RewI3l%T%RseGKD1p!+ zDnJCQD^q%MzrzgyU{A^&`r&?))wU(f4Zq_oNaf766p6^3iB#fG7NZyo4OAh>yB9nY zSvyCt8P%z%xWOAZ71@4QhirAJ-UG+e#pVgiy|y_W^Tfbujbj@ACnr#gE#i&0mE?Yv zB5rvd=wLpzks-}4-eSv}OgPy?9u0y6>%HmA9oWc{N57PI%=OPa!wx?#IEid%kPf}pH?34Kp1|~x3f_@Qlf{B6&)$g=B}(Xg4S}Pz_7;|Fku8fg>E*T+;oK$U6Xbb1uVqWXMOm4vFbn zyDWYDH}j*Aw`h5HwV2`v%Ek*cz(3rzSL!it-+lE3rrFk@!wzg|yd7W%v2QD``Y9c^ z9LT#q@J+SW2cL%Hm5wJnV}Cks->!oF8?$8(wb`Cn-asOWG-1P;(9{&_(;zf+uYB|P z;opGCRk2cW8}vaswgr+lf5d)8eLYlP0^J3RA6ciBLNDElc^rC%5`{9$sa~r6*z{N5 z6aH-#5`?bfNMOQg$0_;J+<@<|LepqI*-R!;db!L#0y&|evnQ@skUV8NP4F35Ay*My zmduHiZ`fZx*_~^3*j1h!r>(eGPK>OrBhHjB4(}PyIea`Zr)~uO{?Eop52_l?xfwHS z^=4?M@i%FTIv(u?ih!-&z^l3WV}_b{bTP z_Kbd6o$A#dwP-?D%h*WEqpDmu%F56h?}|7CbG{*nSikoSQR9T*!K2&j6sN?+Ryp0R zrx3+dRCyeqf#)-hY8U>=?Wqeo6YEu}Aw2n}M#$bQQ~}G9{grikT9dV8X5jo~mp?PF zAOk*{KZp2uX8Ksg7dQJ7=DvEqq4ish)v-2ZRR4EvfEsNk?rM1!&W6USUtYgqaHk2c zkkTG4kv?-paakk)qw)Ia_thTxJKrYX@(@?=U8t}yN(!GLc2{Iwwr=7QA?Tya78{_r z{9pvP>grR<_<;}f9&xGOdW1I+4^B$k>Plm=Qka>iWdn!AnHhu?#G5nE8Xtv8R3U22 zN2q`EIqZ^^VA3XfL}#FHbJ^_jH%5p-4bYhRGe%MtsQW#JDGVHYBys~mBzKEnXWR@e zF)l^zn-@t%W@YGWPHFT2k+r~lyY&E(_?6y9$QsDqq_~t_E(XcQo%!GAfuG@moo1&x z%y5&gj3;{B`$+39y6zT~ugB$X^9c*iQs5b0Exmq#Z&`oVZb8E20rF#j819~?vlkxG zBAo4M$;#K2Pz&E6w#AmBSp(q&;_do%pimyjHTIW|#Pqlr$PSVor$twdCG0)Hg-y8;phFz+k)p(-ChwxF}PQYvMorm7uu0jI^p#84mV_3 z?z`eW&$}$D^M(1tR z4c_sdl)6e=NEJ}HjXO^!tVo05@J~D2o9p=;u6^4ynef81y(v>YU@c#;xsyHMBdN=` zn+H1IZ45qgZCC`ZJJ0J0fg0VKujOSl9}bZd^E!S<^&jpBGC64@?Q4JsB@~q)lvP0q z{)gwN^}B{9g^q2zveLX6h_^oJYXu$1JBe8Sqf;ufty;kz)g!tm<1$Y>Q?%jc?VJ@^ zL-=PRg519+YNF8hcrkC&IF+%WE}ya_*2|BJ67=RE`6f$=DQwN5d6K+?wRdXFj>GvH z>ZaGLm3DzaHM(Lj2yRKtx#oXOSVbr1ZIGDv%2>g4Wv9k>(ad%D;EA|*i=r$CCuW?+ zl(W;wsUp5a5z`S!^yHt{5p?TJK0mgy+K7Mcp6Xc%zZ5Et5~{eNmac0bJ%!t2nVcW zy?j=wx29CZm_X6qDYQ7^zd}<4)c4)yLrj(`2>6CaC3<^REMLwyiZK9zNG$p^>wj@# z*_*pPQ7}uZ;a393tKLV=_6?fxvaeM*8cC@)44hbZ3U1*-quzQMU0V?lfd* z?xqqh@OM7;nEJIV*8c(oqfX>TI_#B%De?1DrM+c)zy{;n(<6Ahr-wZnaOL5O5rJw} z>x@q?G`Br6V9l_pW*+@JMxXowH{|Q)AU4Tp%%Pr_2Hx625#^6O327aPL#Y16zy=bD zU8?Q+Z~uh)x^4OrVPm{M*ct=;DS?)VjGKBA-2%RyL&cgJ8I=MVr%oSx)Rle6L~)6u zisYP#0@xeZMjncxT=5AcV~i>XsaqTFf9YXD;sC(6#~WQ9RGK(k%g3WvrbZ(U^bkC# zydFrf@EJm`yaPn$_r(GHBk5t74EZPCzK~bU)aBuJOyh)N{Z@SSkM`%5bou;e&kUFG z6excS7{tvjphYS+%nkuw$D_X7JB;Keqsh776BQQmS?qfE--=~kuqS+e=vUje$9~97 zS!FN$+aQ}UC+&!VSFD0Q1DS(*2uTGx)WH-h6aZW7?IqpPR=>D7koPs06K(Ha>C5vSmKze}p(M=hr{AuI>PL)s0q zO>6|yH&z0-Z$d}xFD5RxZC9ci)*U31SCNIO?^%q7J)-2>%}w%pYDKD*#W$DYePMb^ zY3r?UT(%5t#b&MFhgsUiT%Rq0<<#1OUSb_K6QYm(?#nQAp}DE_jh=-+1+-WaRp}d6 zik=gT3T*UehQ%;ln-J;+wX_DcQDK-n^)Pnr*-{xAD}? zIZZKn%I-N=lI$fo!W{gFwB*d??~DzK_G98|vpTvb6wu$FB|>D7{>?eBb?0HC?XW-m;zq zE`(>%k=ANNuz9-tMQdZuWx=LHX=q?Q6cH>=cNp(&GI)Nm?qtn7GoME@cG3rrX&vMN z9Gxh>gB&6m`Ptf$+$O*ve^VgN7K0;qb4D>wpG?3P6LHcN^{az2X<;hV{ccNyaKsXq zxQK`pm@3_@v!e~9v~zhv`ulrSa~f}v$ViOZ<#&e-C|2iZaSHgu$3S@E=mRGAY)ZyP zd0%Iygl!*zm%-L!V!IXFO$l|Hps zyqb<2Hh2F@<(Ih9K)=>LINKQ|WW*@k#gq{8IQm?QW`SXdKHm@0lsc~gQ?^a!H7qAb zxEl766VB_xF6wFHfm^q&7rRu`sMdR>m#UW7ui3A{%q^T8Wa+k=MsWuug}2H{w{=xW zOh5FcQherEzZ!_juJ-ywfn9829AfinDEXcs*rhd$wj4?zn(fD01eB16L zdet&8KPkM1R1HCqo6^KdXmBI6|3=#HG-+pR;eEbL^0Ts}VBA6iiQ6GUvry^-wOCp2 zswtg!#GiQM<&H4^K#arq0hNltv#JGpE6~@e>s+(Y_cR;lExHEB19M`r1f_{&>4u~! zn}kWq)bIyZ5uUK>2sT>0l4eIeKy(orQSAI89G$01Rj0d9e1fpz0;0=jP>kEFy2DJT z)BNsu#()HNokgo`Mo5I-Ikvqy45l{AK>6Za@LglhjQ_cx2|AZ6x$kY_cz&9^K~#@! zTH~Li;e?^V;2YacZtaY-+0Y0sD}R@`D6BH)p>{8y!SpMufm)%|Yw2x|^aQ#|@i&27w`banp&c&w;0yELyX zHZ40gDcPbxK`Xw{1PHe)LOnX6Ivq+aLPIq@KA|)^Mmt1LrU+^S2lIUYpd>+~9vnE_ zKWGE|SJCONJE>@XpnuVT000>OJs?9{YinDZ{}4~GLZ8GS147pc^)P?_&^$bXhnf*O zJ=G~4UP_VE24!@yxU_=P&-P!F4JEDY0R)rn&dCYrqNL67>O^2Fbz&GSOFiIrf9z$) zAem(l(QHJE_#mauMJ!%~o%4H?i34gCvVVIO46PKokgb9t}}3}=n{jW4u-n){pdGJ+-b`^9%cVl@ZF^(Rx> zT-0Z9m0=1O9GL3lgmYE<2~OS3a-eY6R$6B+tjkHLCaTM1RcsHlc*ZVYryjiy$2Vi1 zoExoe?zYcPtcMt~k6SP}=!?H^3vEBvh4C?k7r*ln1S%D0QsU_UYexEXlA9y{C1m4& zE)f@F2S@Y&m=Z+=g?)$V8EWy#NotkRNy!QNacP>d$r(j4sd0K*d5SSHWifFYaa!83 zNqGuMS}JgfGkZ!PR{P-pQ!Yavzdha{C|9X42!*-7dWlTz;sGNFrto=Tgo2u4W`42M za$+DuIJjUaLI_&5zcLuM_`T0P&OOxM(%rGz!ojeHNdG_<=_RtV{{Qu6X77J61^Vv; zfC2!}|69Eo>pMCbJN$=oi&n9=-C#rb{x?T$S1T}$vr)gm@+$>MAk*a{<*!-2b1wr) zl(421sX|d{>wEo9_lfX0{jc9reuVdK^qnWyobIu3&+rti>GKnc7MuIKX{2*{3}H5o z%8KUo#c@Vx(B_s%jY%3B$q6V;iD)UtOB@)Al-f2-8W@s-EsaXC3X0UhxbliZgzpq< zg0ZLT^~G-za^5Q_5@tw4^J+);^?0uN#L6nezsG|TWs;d9uCImVH@D_6zgTbUAc(QF zvUWCgyjne9K5Tokbgh3?^KE{6eZ9ZW(9VrO`)I>{#}wdFyGa$0o5W2OXmf=f%cB@O zAS%Rq+wfjBXdmsF|MPxF_VFa(;iZ;GE+GR-W+iRYnjc@CNy4N(%P(q4b+XasIj4yx zGo{MgIjfR4=u!GrmUfzD}oncm|5;`)bvTVRB(3E$3&yMjgM%n9|+#DO`<2UmeTrzl>j}HVjl8pYR ztkqgWyo`hS-JJbCmTU2yl!79NaLR?#s37Q-sq6|F^2FldD6EpU+VNJ#bz7Q@F}?{T zm{Ri1Kex=&+Go*0(=L^&6-%p6PFSY72v8LWoYEvLT zZ*{=RMSQ|@qtKSo(GU_JSRP+}vmNV&q#3(al=Td3b&~z!5l_^M6?N8ehjD|Fb)eUW|vGT`>;P$F_=y;k@CW=p}{DR_N57>cEaPb(E?7qA484n)ca(VVu*z%9Qx_FJ|yK!&ECSFZl8Zm`C zHe(y0&%E0GO8xb`Qw{9H{qY9ug{zz7yi)>53Po`3u+??4u%Icn2nOnxhDfiOutJ0E zlja?1FR_cdK`uq^=6-E&uAFye=pF%6nPP%h`AZrhN#GgCCzz*{!Pfjtsnp8r_>EkB zQITcuTo*|_eQ4ZsZozVO`_NEyIM%s*Z~&-GPGj@<`mvmhR5M3!5&C9nYlXRiVfcpr zuf4xqmnNQ_3IO;R{-3&|oxX$Pf9#Hv++U6xY$-h#HN8{|h{+O3hm9-IEz{XE;?3qO z_GB*f3m(i!(t>D~5r+tWQ9VmOT6R7FVgdN|nG;jhfmu^Ga3bYMJD79 z=~G)!mdENm^_<&}J~sKb*6>7anq~3kCx>9;bSdUCqbv|TP>N2DG}3hb*6Uuu-U-Jx z>9)0GVS<%C+UE}F2UtM+bG;u_BnOnOkrR182d%@xhEd#D=cs{IpEu(5*plu1OmJs% z5IQOa4>*0GPK)ZEb3Dp8s_n90c3k`>aCe|lRUZbH+Xjkgwv`Y+OIny$pqPk!{Qw;^ zMu0(>IaV+e2aXit{#}`$&Q7+$f>^aa%C`XSdq zA-({6{Aw7Z6)$y6@M1Z*K)^HcmcU_W)ntC|5>=dKP1yZX1V>t+us;cfTOmJxSg0!z zU9)P~BDt=F5-704#UFjW2)`{k`EZnO+eD5XgnE!tML=d3g~I+gh=(Pp5sn`6r$m$f z>xcltu|AR~BElaaE-#d@3Q*z3A_);8uU*lF|7+Kw8~zGy+gf`VQvof9wLb zXBIDnVGe*Zg>nQZIyvVOVB4o>?BUUlZR5(N8o#Z(#hGV^*2d&#Q)dUqiwjzriB!<` z-uls?X;6lbn+uU1wig=oRijWnwAu4Gz+{?kduBUFyE6kz#2iC~`9%A0h-pN>GgO}X zj_ucBYfuWfMZ}_9H827wt89W8Vo^$lursLaHf|5<&Fnfth84R-pz{30XY@shj@0aT z8*RT;2!(W8bq3xf`po9r!%!a$R86Uw3b4~c)%B_9%`)=I9$R#&-w3gcoQSk5)H^hi zu7GF`zW9o4bHh$vdP2ibUO;+k$fHThgzQ`8uPPk$b^ZCkBL{6iy0Ie#{w)$AMZ|!u zlnDyZW6yXj7$<+i_O~eoW1l5SF9x|hUILWy&T*0#bh6@HM~m;{sGScT68Uy1$}!jD zp%sT-RHfIkq`ldcH*G5NeX1z`xp#<&i>Arb)cGkbc_IY=wC!zTZ@wM6)m( zSTVdARdp{KP%!^o=~luv9Y}42rkOiv7?I`zL&EfIn-e+y$iSUndB7BqPcWmB?r#YZ zOB^OU0T0b+&~N`CSk&$p1Kr=n0e{LhtS#~{_)m^2pkMtEINDFV?Idj;g;*=;G}rWM z1T-JGEBbKyh%u!3oekx-9*QAOqVXp?{5|Y5j{SDkzJh7V9Afv31&y2FDF;s&u_v+;h!(-?=AZdbSu0GkYjU# zVD0z6deO5HJ&Mv(6XvG}p;Ri81af3^gM9|qqGq=m5jnrq6pK(+1R^kU=VR%_kydf2kNj4%YKzwV0q z75Os`A$GZ0h$qOF>mcWRTdgCPgUX+Nzg7gIa(TV<9%uhgzi%kpmE8L-D z{c@JfiSt(-$3&tF{W(2@FN-Fa1ILcMzOwACFxnc{8xWE?K0Z+*4&bZ?cGIw-s$Lu{oF~)uQNPZ6K~ylncbf1p26VgYiU+ zdQvH`41tAscAwr@IB2sAuc%UL>V(&^&pRPZQ zwCj_=Yd&Lj^cmz;X)oPY>Zk+f;(^PryDFiXGTN}tT2W`>hR^NrO`R07or?O~!ePGY zV>JmZNB#U!8CBstGc{bqqWGncP1H(DI9oX^GbKn20HSki){iprh@MZKt7n;*d$AN^ zrgn^L`d@^dLzf^xwuH;JZQC}xY}>YN+vu`w+qP}n#_PA7GmFU|kh{!0H!>nVoy2*r znJO11*AO;y{&-B=%Jz9YVSiOnV&r_Gz1VX08?v7H&V<#RiwHU_G=evC`N!`(<%f>sZ;&qIbq>OdUM<`4TCLovP;id!pneZc|QkhMxm{@J2WC z;h5xdk6plt^a&u-U5Lvh$_kPEK?KIT7VovxRwdw{^k4?^o*iO`Dt;FmH!tOH19g^Q zMY3%=i3=mk!7dLADAiu9?KFg7I^-7$LH%#vXbKE7t6U0yU?LTsiF_J6sXlzgjoCvw zEUHmYc1#6(Ahfb8(0?FnVu!o+>;pX$xu5N!zRSehOq@J8q)Ex)m$62Ov4r`Vt09g} z8&DsiN8sUOir^;7?lv6=-E&l~43PmM)H=g3lOeOr0Js)kkI6aGXdXIiKTaL*uSB-P zU0L;$I7GC6s02@{QWX_p=`nq6auT>Xl1Q#RMp*(lR*mz7=x*y@N3=qv*q`6EpV|zn zi%GID2f){DL2I%h54?J%Rk1Cj{*jto|CrO|Tj+ZKS1%)4nFR#E{Kf=s%oyyd$Y^RC z@EPro;_JseP(&=zw8uEr{>=K}*n-L7{ZTefgCltZ_zbH`5g9XgBk)!llXBxCSwe~| zeAk0173K`FGt~hR7Qy@qm%Owp*4T3b!a8AaNUNtxTKmfs1-6Y8SU8qBsuq?S_}I&< zh}rB@i4U;Dv41T%02|?>c*)yHi;R&Mot@rELkE4|B+3bfIBA66=)=cz#eV{kSfs-6 z%Om7%&J@bZ<`l?6S0P2Lcm&TGNCx-iz1RM1gageBg|%oyt4&f9q+XwB5<!t+$g9z!MDO##FBH*bV4-NUH9? zcjzkjKVk`)Loxuxln6*=MkZ?0rnN{@XjGPF3Ee7;^4s=$RUgzIwal5Z@x>$lzVcv zMD)cVy|SkdW}91IEBg;_Sq0&MGHo(uavfy5w&ohTo^m91qs>*TFQZP;i&ks^H?Vt0 z>o0(1?`-b+`^1@-?oM(l2;9zm_DCBnA4NVMME*O(D21fH`47g}JCEiHxJ2|lbX`_E zh{vhPPXg8oA^_1pDx33Ml0JXv?S(yJ2yy>j7x$2MRsIDckWCZg^#Ip6`u0;JfN=J-8v$63O4^VWEz&=4MTfUI>#N4mf zB>Y7!NQD3n4VoYVAcpldM68Gzinr?#K7B|_D@9`{TBk3i*SSw*KSR`AZPq#lAgd^8N%W-`aL*BHxDM>=K|9B9w_6QqvYHeH^ z=H>tSKKYW?R=(j;`MEz`bZd&3a0TQid%H*fN2pO51ymvu5Bxgv#dukts zr_*M~ru3X`X8xFBZ&Q-;_I|!7O&jgaB4(PoOC}ry7IEgtX|j%D?xHZCMaQdXodK8V z?jzn&x-?WmD3VEdR`bjbQHR9qR+-75xT9$Jkpzu_!BY-7O=SlH7uUvdY2l-*DZf3y zvbInQamql7=u6Bj6@fjk@H$b#btmCv-63mL2gd6b(3Qlm>=RZqsQI$5&}isal+Iz2 zTlPPwTeBN%8#8&X){!wFEX7vdO+LSSd)lUaJwxQFji_RlE+=56_3hz!f4;h=UeJGw zHSy!^?i;NYuDQQi{){?gw<`xTC+Y2ad%k+Ud{jffd%^F0HKk53KM%i}Dr)HaDqxd) ztoqWbmzg}qgSk>Q?Gmt`pNPh8HsEW^x2~8$8^K}Gn*Ul_3~er3H*CBvhr6;_d2Tsx z>11js(dZoWnFzYH&f{FPP7(s$O1-fz^jMabX7KhGJE_#kH-=fF=wCgFhgY|f4iBIW(*g-eO)KZQ%y z+8jjDiyBVDqr%9$322dTnhP@JrCEzoB8M_xpvzaoEQs7LzsBp94n(wd#aZkyczHN~1wUuf2$6PDf?D0Lc4aGAI=Cd>9ATfXaVy5D;HX~rT^O=EwRx|-E2DD5HeBSC#hY&UdE+oL zY+YC?wx}c_HL*O@{`YNQ%2oUVa;`b7!KY>MNQ#`_~B=+4-d$Cz> zQe`+4Q!qxl*%nL!OQU^_4p!iY+kDSB9N5(pYq%IyRwm{}sCu3Y1IHTwmK18?Tt$WL zwm(0gUsq~c|704rd!cIz7@CI&n2FF})Ec~O zZTrbe3)ieT;9dxzAZP}e%jF!&4V=Flo~`%?2PcmRDpf5pcy~TRxrh}WdxL>(lVHqx z5_ysA#g8F)-p<&{qIjF*pyr!N#u3BwOf;C-4z4a!?ukriGf?-zw|~PLS%DA3?ks?W zP<%UVp+p!S7Zs7QdV0oPguElgxHFweYpM>GZ+T^4 znW??U2H+_`tS!dkp>vXHh116y0=Q0mpkE^Fm8=RkQW61T1Ny$oYO$sP9)o?7;vNN= zotcucr2=?qSJ@kFb}`@B z=cEWQLMX8y@@X}eMu6<}FV(M_4*iaC9HljE72 zY07f3CJhr@Mo5o^vU0H@(`Y;H1Nr{z-MPoSyH=ubq^6#WEgtm|T%#x}49$?i6lqn@^w? zD?RKut*HYFHid+b0Eu7giDWsx=<94)r)i`Y?sHiv74c>fq~Iq9FDJbB08%l1yT1;c z>BRyotfpk+prvuEvP3_;gar_>z*(_KJ_KFVt!bNm+r-_F)s~!iUyoFZjrhf}KuMKf zyX$As@5Ql9Ekp8w0sbSwTfh!;))y?E@$5R_AKvv6F>{$P$nW+l=;S~*cMfM`(L*Rj ziSOj=uWp+Tke&4ez7k-bT%5NnR!xxZ;4^|s=f%roP2dv-YSS7Zia^qwowL`tU}|d| zj?cgNCZmPZ)~aBx$5kZw()hv{WZfemmz-Hm60u`17B{xKKq=5ZAWBs+#!{B3rxhBr zyFUtgnBArCsOTVYu_Z>Xswq1bDd3{JBb`RORa9Yyen1-?A|e0brhy^`cPnt zCgHL@eovQZo@J*u z6s-XVpjni9-P=xZm>p*wy|Ot|vS>yB+{H@3#S2*U83iMiSFqUsMK#M&WjPjXZ_l#Y_b>?h~TSUthto z)AmO0m!#tWE=)MTJCJd-Uw8UF9DV2Z_u4c)+&tv1sDe4g%KluTVP)RzT|pH-MYO+AJpJ=BTN+v@FOKw9WkE+!KeaCD3+@<=Z%onzR|Q zhfIJm0u2Wnc{_{T&*|lAd-sr;N5+FfRZ*XxouryHxE(==^{NhuX&D*~4a^&mxlID~ zN~Nb9xM$uVrdeYn85C$d+lbk)4+Cq`zrnS!8k!&vXVyM?O&`2y;9M;etrvZ(L?@eh zRn&Gc`TA&*wu1s2=BzfUJFWRv-WW9jfjZUeERKTI>vmxQR!zCSWcL6*qwW*b)Sh9; zn_5K2w!*1y#2DmG9 z){Wo0OaOLc>Cth?sv<6ivyL_U*i?&pz^WJ#=I{;MUHdp>yC|pOTDjp&Xm;j0e=7bo zyQm~veLJ$O6>6fp?vhw!OL6mvt4#_l@+}tmYNdJs8HVInI_xHJ9tN_ptvhHG`_v7# z#95d2T;H~x4ju4fAjPrOl{?rV`x#zuw(9i#P{<%t95*gC0OR37wB#x$K@6Vb2F7;S zH{PtNf84ItP=vK5^b19@S-i$DOd#nT=to=t^KyR9n09@N__e84QrJvBAp3< zkBDI_imr^0l-C_MtWV?@OfmEH69Xx5S>KiJp67h#kdM#UR+l2dENm_Q|N6FC;WHOJ zg%~K75F`34qtk$3qxU#zMfKw$X*3W59W&vB1Yy*wOBlSlI2w$o=fM?qCNgk>Aainy zcVij3JkH&!nX1*IG+oJJUFvrj%}iRo-qDPeYLZjZl%0l;5Q-$@m`-#W0P!OdS_CvH zli=q*0pUW6Ih4_-MR3F$LOtS5=5R(wH+0-IZ532`38b$F*nE8umEG9EY?oHg7j!s-8q`8X=rcz_Px9m;aJlLpQQ-4Axi`3Z0SXtbhJ zBoYkEEJ66A7V%%NjvIXF_ZeoWvxU|&9J30&o{RkyTW&Z;bzH3ts}7U_@Y!;qw(M>I zmpfZ-s~W5V6QZmttS52{<;4rEy;#JDf+Ab22gZ6$p2-VMnxBSiRU-*@DhkT2iYBU} zcmGDXMM(}>D~bR1GMv}Ddu2Vm|HH&No}D_U>D0A2L5Ys9zghH@^^BMsg< zbov=|OjB}HAi#uYqX2qQC!x#W6zZN2mmvjOIyHN<(CLW@h7`?4=J@zrQiGb+aHx(c z&(6e7p`=@uh({fX&~?mkoYVq1LLQWbx~jrUj^$7Hx?5liK}a9UxgI1N=69GI43#b* zEhL$GV!f&Su2dcMC*$lMT|{*snGD*~r8y6a(A#*5J>v`?sVGiY58lsF89B6`gX;2S-X!TCcugHjt6EERek=Hru}^5z9X-~ zhXt+}0VSR@a47Wt`g(pmkS;wh%9WPd?Z$RSi7q&YkO7qai;vVw(P0}^Ywh6?RLzb* zROW~}B2I-VFjF?ysYuQ6V&E!|`!YZs!Tqh;cUSTBaecZn--1P?C1Flsm?7l&oU%4j@c=DADW!pxSiV_wo&ZStf>943HYEAHdoHQS91GP z#^Y(p0qPbcQMD{nZ+CYFOhu8uron-sjeNu@b{cC>En!SDyqA}Zf_U`&A~(Ufp#{&>iFP=Wki{h^cn;a#?B((6QCNz-MJ z3eh=Le#wwkNT#)jcjZD^I$%V#Dhswo?puT5OoV4?)N!b@o_E#AM)ZmL`jAUMd-dpCM^<2p z_s_sg!xJ@pN9UhJfrTJJ!%GTD5aIpLr|=3qc7G$ID*a!ani`7-S91a5g6 zlN-r=4Cddq`bHkb?Fs_wKn~U-M|FrveTlah(ds_!#9i{I*S@UKc5MrM66mBW=!6A8 zB?BFcYQnclcba2IH*IeW5DC%SqC>Yg0O3!3!ig_#ZVEg@a8AdPX^w$vIjWXT;%%%2 z284tmrR);wg1dFPe$qd2lavz(gTXKsu=l}UH6_oXw=`KOQ0^%dKt-2|)5dg;?ojSP z$Uxx-WgnyDsL7H}H6}6?>0|?fiuOetc+HKOi6+kI>;&8tApm2PE=j=2@vGb1bB*dP zzqpYaR{Mn2qL$|!siG8YVI^c0T)4&_+Palx!}@GCEOacd z@hzPhHFkZO`h4I9E8Hqte0*?hIx+!^Qig~>vBN2Az0@_Y7&Kp$>I6Q1qLd2RxJjNs zh9-Upd0COl$ffBdo)SeVBwP{&NHIcPLC{(FL`=DZ(&BbwJPljTA!jrK5Jd7x&$NE3 zrmkr#uN&(F^uvDIJ=>g$4kg~;_K4g=2O-*vZ@m?tN35a>L8V3v7E#ZR6n8@CFkl52WQM^T@A z-#BkPdS}dDSJ$5_)Q3X6V1d@wgGlaE>bO6C;P*4jw~5mmb%pMFmb)4HtA%`^VHR!G z(bVq^wIL}V^kqV`cdz-^kitePkN3L)D{IX7kpQRaB5aN@L~9auSsTbku1nw=__y@r zCWm3c930zv7C!)f3J6#n_2M(gP^8>npIM{4oE-0P+gIS%8 zWDxOss?l+5b=mHhtqN}Ao{9>e;r8QcxrVI&4boAJaNt0c9Z*4UZ9@^0S@T?g6}hbe z;<&h?zsBLfn^JvU;tJiAODNfxN}yC@E2`}+Iaj$miyAZOad>+ed96B*Uw&JSj#UPl zCx~EaP+izoDH?(7iL%x-s}a_S)pP_|x>3HjK{TUk)kv?{T%%aXn3TBk~c znzuXUkO9<$af6uZKmXW$d@Kb43?YBT&OP$m0^`JkIIOO2IqsF$cx(*rU83HZ z{$o?94wJ*=LY!0t~NG$C895?N_bzT*Zwy!QAFU@X5kNNtTQ|9zb*o~{1OXVq_*g&2duf1F(TJK6$%4TVC|)S@IB%V zlD|)$E9bDlp~`6N`LhS+UR~@wSI?RU#C7o7+|FvpjUeXFO4fjX(8ZTO%U)|)?_S}^ zqxmGgxMxitH}gQT&oA2CY>g)I6c`=7U}C2qH7oe2=0p(!0C|NUw7-9oeF(1dH10*95cx7=5nK|GuQ=i*GGf4I_25|QfAuZTI|XQ?cA^}@?ru^Y z{OZHB$*sZl+ZEif%Vxe?_6!JB_k`4Xva_?(_`lpAZuMq#bGtk~2eB1n4NQggZ6a)G z0hCG30*UOs|P}{_XA#$z)&7EqtuXz((YAuXVucB5kyWw zGid=eBI#?<(Y-O1C55bEEM<5z9r`2sWm1$8+py69++GK`*&(-WLT+4xUhN=M{RMK4 z+K|qR0N{I7v%aZa+tRCV|3{mtZ~uj_Z|~kS*bFY%Kr&w|@i)Ng{YR{v63W?tyGX{z zxPq<{K^0&?J+T&MU~qA01p{eWK4#eIYk~Ml0s2A(|K1?mTRqX&(*pU}AR0@<->dvM z|H$y~ZUMhA0To?iAQ(suB(!Em5b{I_mInx~2H{^*-2;}J``6ADSUpTqcYtWG-sX7F z70gW5|AfdiYWpt`4?pbu3{@$jA)k)}e4F}n#%djikcR38l!)U#$^#lD0 zej5HeY^> zxFHHFh+%|K;jHp+>q#k2kSm?$9Sn7+4m3_UHnSS_Y)ta#Ucbi&>n$vftVlan(tO>= z>f^m~e(3FyYyy*8@+Re&EzMByS-9L@4yP+G-fa}yp-t;9$XaTF@PLxH;n3ltiP!YHjG%*+-_MLJp!u|I)7bawxa2(=f1H^`YRC&+CRm62(mLwQrIul&?oqE!FR}0N-ymuV+V}w@`Bqdt!Y8W&T2*51|vG}ks>j9uHidQXh{zF z!6PtEi`1CIYSm79FN3@~9y{>9Sk273E~aimKP!3$oRDo#u1CrPT0mdR#PYn5Q7H0Q zq>>SvN`0_zD9yU(4*GgN0q6 z2I<;GJ~92<_3k9BFs2y9>FhNLFLMPU}`tl zu7sw0UKI=wbg-Af40d{8U6D1cIFx$9S^NKD4;Y5OFve(*D;MXqI<|gnwIzOxs2d8c zk`cW+ywK1nL|CqJQxf=;UVgg%1$VUO7g$OtFE>+8 zGg%idJE!kL`PYx;0N+G&@_SI3<)f~~lof{39%qmm1D3cJ&XlDJ6}I*x%Gh+LcQ$hR zmBUC53Xw?J+|`;VA5*~QOT5t&Q-dWOs?{sGIMv7>>`>yJzW0)W5^eupUT#_TtOl=} z)9WR#(xjPX_!T&JpU-Nv%ZL($d z&g%8M$ctpwv(`UeY2#|om23k2HBKl(#|i99vGJ@DOVyT`iPk#u+r1T3EZWH#zS#ye z)3=r&;rFHYrB`&4lb#_rOsOe6`jEtloIb+jsh3_ca4o?v z^2!Ji&CIrGa3*&(s7LLv>fk?_cX1q%@o=uxDkzFyWzs?!?Vf6XCYwU)BUshB(}jgW zt8{LaLS7^}K6P>D;r4nqrP=vqLc`Y`xRo=yKisT$e+BySMReMx4x2oviz_b0b8qcg zE6M;cMoI`7Z+^=8_*q{!L>##{1l;D2Wx@;-eG;uP(GD)G$LRJ9+P(GbzlEni{~-VR zxu^B*^%C6ejpqCJfL0$c%!UB>OQrRWtL*D#L%v0e5r6pfrr5FvTp=jXr5ez!0zuH_ zN%f>vnj=@|;qyqaKgsXZ7{dfoKrF~)`k-C1Bp7<2)CP`634F=iq=sE#S!{`MK7Y8l zVSfQEc*8HC?Ak;b`nh;`I5{EvQzV|T0g&n07O0=3eHzuvBu#Et-{4tC>3n^yf=+3T zk${T;0lh1E68DZ-(W;k42W#f!D0%H1oFI)ceMs z&rRc3RmP|h^dn4Mos}qIb?a=*5Fh_vP9U)i;Z(9%0!d>qSrecgxOzr~I7^XWV`uqY z^2!+iOLkMKFcs*N(M=Gg_-pK?+w)LI+Q-_zavVn9 z3${XU=FmU#&r0$9v`sKwNx<9f6M!u4id0tV0RT#9#LKKv+PSeJ{*+#KeH+%KeVpWF z!?Q5TXqoB(R-Nph%K0-QGzt|4eQ*|%`Os8AA`B!FaEQN!2-XGM|0V{|N*=G!hRrb( zSBOR<6B|UoBz2vRv+ks;P-S9AB)cS*3<9)h6gKx>TvxAwX!AQ@a2RTk4-EDAJuqnd z4bYB|LsHsHsc9T78PrUELi!Z_v072e47WxcN4JCoHtJ0{p-;YOHGOet34mxB<5XP7 zYU|hgexF0!kw`@uQJ-=~|8TWn8=A4U0iaMV(S8~P`V}j)@q2F%&V00vpggSK_$_bU zF(0}Tk`v5flPRv2sEW%%)j){}v~GJpsCJgFFijLEL)E~R$Uq_`)u}@NGvY{xa+?C8 z)zI)Jh;t%M768?K`=Av-PtgogN70)@vY7%r7Y4MH6j$P+{XZct@!rY6k?4@tz#${kYmIy@Fa307H^A# zMnOr2@%;c3V=-;9egJ$a3$ysKDh0%}{R?K@prkafaa)9L)c}Qg*0SPMd}z9jWXELE zax1oAbH+pIP^<9Q0GB_QP{KQ*7-p5E`GD^5BZ1$bx-xqYWHL9xzAeL7;?xfMiO3!5 zlQHTv1te5x(DZ5dV0UySkE;l|2g}j5I9}$~c6@$$#MoUztOI&BaQB(%py)0DMN%OC z%MkP_fp?3F23VuSKu|J5f`vGE%PB}!=zu0>hk_duboLh9QLktM?fGIHM3lD*_T zyA#W1iTIub$6lNlghmB9(ux9NU%n9iYbXgc!ZZx}@x<<}8;<)hMJ25V^iDX}MO`__ z9v?lISd9!oxi5Mguah)V%yv&30}-LAY_#O3>=n$zKhXo*OdWhh;CSH>HE@_@MglUv zYetgvtNmk=BK`z(tQT;ZCq(YGO*<%T{(>jb*s26AAP2a{Zj>~0+kl3_q~dV4f0_ts zx+qrrv%nWqG&KCt`DAzhWH4K+;;QbOjW52&BT}b!^s_{uGB0iU7gQ~rKq&nHCYg?X zNxx(?Mk%>*AXVE!QNa;LOpT?E;hxT*s#9GQ=OH9LQ-yW32ch$sub#scB*0253Z3UR z^P%vU(LZ|L0&KI8jGet8>dO~>%)DCp8*c@R5`)^PPl4$(I@Q|~4A{PtSQkP$Ai!(D@L}M0i~oVL7csIafk$*8U20eG?nG z2QiGKNVtUJF&rW67Z_tsfm={@WJ$$qf2)bYjh|MhXM*S;kOy3_eEW&cU-y|RA{3u& zt?N<%hJv6p2_Q|JO@0Wq8geR?s`x0>o_BK*56)HT*erz3`b*_*ud^hh)iBZa!ila_ zsxs1!1HyU}%9YU}vTI$aZpkqbkJbrRSlo1Ks2f=MY_S|=IhqgjUMbltMO%;RJ+wzo zgV2uWFf`fkKgoy3Lk^j*dD~%)vKsXC9nwM0%Z)yp!{a$;H{>4vJqJ@R^`L7cQ?tFc zXcyLh8l_q($B#}0$%!tx0Bqr z2;>AT#sh%E&$R;0Rdar5xo#A6*bj^@EM_Kk}g%FPNQYJ5T|yL$VPe>W~xzD)W0i9Al9Vxdt!(2O~auYB;} zH~7xtlhs4hfs_)o>x&3BhBl<_)60pt%e{rakpBsty2ZHcR`cq$F`%??Ze?44aQ!WT= zk?i1qd96=r0Pk{SJKJ~SWt$kYgA8;58_9Cg<{hCgaBSHRZJof~`fMmKysFboyoA~E z_&bn66J6gKW$Jc*n}y8B`UiQWG#=w7C4t;EVQZ*_+K%}iihXd#3wi^z?hN{ z&`DDpv~`6f2N28w;*|tg)&NYV`g1_1WSu51BaqU@-M#<#amezlIwgF!FsX&sqSP=6 zY85>DiIrYbZ4<3DbeX3o>m%Tb`;ED%Bz`nu`R+6*3*+88B4V<{&b9_DE$`q2FW=#s zF!5DvYoKmp$y>S^6}Ie5^O>omXfzF>nq8mr`~7sere37ami8ODsG9OU0!M-DE)0H9 z@S1*%Iex2E)h`RPzQMR*)|kibU#QWD;zUxwZ7Gq>Y}ZEO3KGNLM%)g1qt+yx=!9>^ z5=6Op0$XT?Y7LIjVAiy#H-&+(YUvvQ0VR3t7wLoLX=0?qWDXl3iZ#)(%?0&slHCAR z@t;MR)ly=?MshssKv;r-P6yUr8M%NR{_ST!z`^=Ap$$^f-|>C&Dv9bIO^;-%!fozgU$ zIk_2cY~LBb1uSee!k#UkzW&Si$24k9;$oz$+{*kqXyCJl6yN<-t#(y5z@hn3kwau941lJGympC+9Q)>l*Q2sbkqu{oper^4{?Mh(Rm9rQ4UpldsVAa-M#boFklDgwFj^ zn3QC08lS`X{VN1H$AA&=oU_L&jCsgSTzn2|-^okXkYg8d4iIapJx={2i+suid04qH z2~T@~sN4|(*E~rWc&CU=&oXXxTv^CakD3~P_16mggNhn6uJYBkWWCbi*$)-g%Oa?2 zLlsNI4;G_Y9@x?0GOb%dM%AMcU@ObsO=|Yu`)fdC%6IhQd&)=6W?JKG#0-Z?Hn?BQ!^aE4nY8tTF66R9wStoIwP`0aiLL2mDBWBVg2^+CQ6n070UA0JxTB_`x(^m_wXQoz(23W)t1jKC01lM3}I0YgF!bir-e9Ph^y4llDFa< zc~>8hbZDmhM3@7Ly!@k;8-yiMV5PSyCW(T8qdHp`+qhPZR=8YdY0NHz#G6TNTkNbz zlYM1oCf`FInR|}*Y6LwN#Z5!PgF^I{(s$h<7Y1Z3w?%lc*sEYr6hW^jBSBZsRXMdY z;`>l2yUKZNx8&S++UiNJ>N8`H8xbH&qf!5mUgrtTKm=cFqPbO-7l&dcTS=cB1P_Cb z1mPmO!g9Sl>uO;upjFG{@MR+Hd>V5ZGayq!Ghy=Ue=BGq_?DBfH)LrF0+p+g)OI1u zHK%Mt;i2}a=Rb|zpLClUOs^2U7LCm%|8W~~M)Z9h6&ZGsN9APW4*v?jE!@MwT(m=| zh^cNoZ5M-xYBZsy!77xsqbjxMuWc{rNfCaYlzPTRs6TC`P|eO|Oq!RPss5`n&=FZa z++uxpi&XJRw+|TKsNZd}-h~&<(@yR#P;((YRqhkxXmvaA@2>icpKHcG?dmUie(Nv) z15-)DsZ#WDA1YHF=_G`BmRp9uJe6?!#^)M`TS`#DXU5dVSF|-{>~0fYwP$>`0>Pa$ zzUQv;88;4@P{H<;glwohDlBbDcObi?AAXImImuZc?IZ+x3OD>W>4J?s&04l*1!kvR zyToFv!~Tp`=Bojysil=khW*>rQjb5|#`PbPy~0lsRqWYy>3$j@T$N>Mb5k}K+lz}Z z+BYb#yEKCRqm$}%Yj^(P=sUZ464$@tKK9#3ikuCk#;Gh8Zb`w8XTE+@c%dQspp4^T zKBjlEcM7S|UvC&7ES}77jHcL+qGWkX^=q5ZRwgyFD$(Gu9NjZU$V{gL@E3lqhhmo& zPjM0FC}+xnNY~}mkeR~087$Murki+Nn)@^@G}^G$B=nrQ`rDoARfWh>_TeRVd1ow| zc9s!7ebv!y>>QMr*)Zf}GsM<|aQ zFv}&Tq5g%TDtrM21a_r&LN~_kFI!@iFja9pVyq3Awe%dChdu`4+-V(#gWJbp#+ah9!H`2z!(+ zwagiWGnSQwxZ@zL9 zq)cB|19bXtR>3RZ#g^9$yZL;Za?%O z)G*|iLTYys{O_SwKJC|;KA2@xDTm_bJLb2Q|~*1iDfAW%O=wKfCsmR|OPjw8?X?=Sv^;uHmcKfmBl`)x&#X%e14?T3*$I1ztz2VI58>&i~G68KkJP|*F z%~{8$%G%q_=C=80`s1Rk2$3_{RAz>OS(ukC<=6K!fSo~DvBhaNgG!5}bl#k$13N|x zcnzsj&ULs9!|eSzUwtWQ`}Qs^W_o%$X7R6b^08rNqz2;%|FCglYRVrGR;iLjJe0rF zr54#QB8hRsHky3l5{k>b3H!H=EVW5o)Q%Lb3dA+eO%#(X`2FGnY7q{Mngq&RXc}|? z#)nLwj2R{G9F)VKxxOg;TT9Phcbj&%H#Z*|nsOha9^W>cnESoorELi zMWQ~ncoi`*9o`&U2zSyGhGeD^KEy|tm-Ft#-T1|inq4J&v6BrHw0ja6(eZ>SI)*{I zD(l@JjF`J*eTC2@^yN`VYmhV@vXfCC205x&J^a+RN--A&J(P>aTgWDfdY5QhMdM#; z8lt~IA68)7guC0t=cNu01c{P9U6K{fMn+O!AYGkO6F44e+NjWb(p+IXO5K!b9@#SG zi{hZ(re6)gB@n%K*4o9!szAr88kn>n16m3 zy{Mc;e*M;X#C>s+%x4oXlE$d+fsT&ykrsj8v?DtZ*!v*nVih!$mv4lj8lt|k_`*Fj zO@}dpZ>IYnPwir5f55cM(DSge8~fjrg8FCHf8LY6Z{23#-Zquq8e5%SqI-Eq?F>gt zGIJZzVeW8$-*cp3U*0bD33_iQZ%^fPof87h5(6z%mvKcAyVieu$aiqA_WgjLGlR>R z&mw}lZCg)&*}}hCc0rYEWBER4L5sNMhvB|KJGOe~cW2=AvZ#&e=E3}^w>#e^$i2}8 z2l2t54o5cWB|kSI?(K9g_7^`3Tm5)LSF?GKEaZ5?dUpqR`}uxet?_?8;eIypar*q^ zatHkAa}48nf_~xddQWHDjeJCA^WJxF35mXLF%3U${lgJ9m4;pp01ydVfWL0v8*fJF z1#*gBVWI$0y3Qfp;avh4_`F&eWlIP4xqn8ddAwe}IlY;$Pw=f}vv6T%x@}Xu*?Kt> zD?A0eH{Q;_?|(hKo=)CCBDPGC>$j0N7ew~N*%03%q(OZ3I|b|)==RJ^&|3tDxucqIF%Z28c<$2X38II9@KF zlbe|I*jPuGNEA;yj51B?;ECBk4fK|>>xcJIsVopsYw^+Pi;O{Ih?FcI$R7E7)ZQlJ zlp;GgBphq_ILwzXoEMSb)S1g236lt^2FtMtg81*x)eD*=s+7N(G3gYs^trJ4Nk7DP|E6GggfDs$<;oR5&(JO0UWG^Z#<~->-d8;i9sfAfd5J zMrdg6`s1Rzv9F(jjRb%j$R}(Dnm`_^`;Xe|><079KH!MmjT7NZ)bLA8TtfZuygP^G z()6UY&ecc&ryG!V-Due)$}j<#{DVvD57IX3`La5jI~2MW#JfaR`jr-HCL$%ER2aS~ zF;(+$=A+l7Gx$6KH9vQq9}hQS_y9qi_dO{%im%~)ZClPr+QO@X#X~3!K^9AcFk+t8r=<|#g=e#)dTN6lQ!)FdiJ!cU$shd`HI^Dc_ z^J^?$xt_B_^{aaQ&|&&;Nl4kzDpBcaaLzH03z$&DLW#!Ys1_K^pY4K);bUnTEWl`x zUb&z&3x0OUP@6?P`z+my$Aji!og5;Ws#Qoq*+<)VP`$no)r1#+e;}6VHZO z6*NTeuu7*~I+u)seLeiSGy}{b#8P6_=&hP~s2HKU+S9VfE?FN-lL`(>^SP@zVPR(7 z^}XZ8sI+w4XnMYO?f%FB+w~opP$J0BMYNbo5ZjODOWXn>n;|&$ilf$NNU zN%G+1kw1K>Zxpnp`Nlx?$oAj!g#;y>G4pVChLBjg61|HDpBNxsAj?szR(Kpr zB+#X!zkxfLiF>+4V}O)KxGRl9tZBfY7o!wIFWoyU!Qcr9ovPd1cY^Er^F6ovRos@u zzZcj`yQ9R5+Hp*zH&vtWD!R{)>RH9H1aSl9{^E1r5gIY!Ol6y>g#iOC=NdKq3~SKQ zNm=3w&={soLc=Z*l9XGC(xeabg3kxIZlTBhE2~!sjp(xXR7JXD=5)8{qiPu~cF|@_ zX=em8bW+%-^V$yLw~t4JzPIP%Qpn^?uAHH^@-#PzjhnIagx8$&>bY=Wise~g`D zj3`mpX4~DjZQHhO+qP}nwr$(CZQFMDZTH-nWRjWp`;wVd&fiK^Qc0bC_Fm6Q8>+)X29{6emJh)QO9W+)JBr`tXKr|9pwC;8a6tJ(dK`}6^Cm?u&YxBunO1DAadLIx%&v%_&&)!F?sIgOW87(z1P*-^uzKB;i{PCB@0m!LaL5604GLf+= zQd_?r7H3n{Ma&&qh^(o~fpC;)Ic)!Jkp{E{~pBGwM&hfK`zR>G;l1QJ6?$C4UQ^Vs>Z2xLB9<^p49H zStehBvDD(B$;!U8&Ia{hsYgr!v1LtUut`F>8gu7@@?`_>>DtNCKdTo--nx$A#d%1o zJ_}t%+s2>KwptzXQ^rhzq!r^}16U*3Vw&>g7NDT~6gVdHL`WXBdKvoR)F^}xL1yBh z!jzQr@$!ikVA^g3SXc4eeC%?X{+I=ucF%YyYaK>urp*1^MRbz`nyAixWR&`yu&`Q# zlUKRPXEh9!-xE?1EkM3-40afEL;FW)nlz~fPZCv{;YkD#|6y>5)M{0)F*tO)<%j!juevuu8Y`wWy!n2yhqyvB00=8!oWY7*OYx zSdIh(H5e!s9D)-r>JPhffrBr?Cx#;y1trVENQmtg^Ksu-zH(p5x+zh`-u=}u$KtTm zJ>bAGvXr!yG7&M*GPJIGOp zJ{toEySYI(=Q3!ef@Dze<>p-R<@IJw3mx`@MS@ zq2uf0<>7rFTZkLOe3M>SibGsQN{%&};V8VHBS$j9xet2j&(qjv^z~xKH8aQW2jZSj z7CJ?qq!$UO_!qG?2`4paC23S`d{@Ph*+mMggqx|1C~ESA=%9j(U(nG$;ti=Vv!uZ4 z!GDe4sPA8A4+3DuS#@6|iaKFE42c^F>SY}jnbHOXMLUMTGm#1C&e|5AfO6$v6Ru1^ zCXMe)a?WkgB-CjB-o$`TBVWsT%j_)V+TNOgf8wrq|z!#}BL>P#YG! zkHZ+QQKP&J5WH7HMEQK&Nl!x=Cys}fv-1#GltXrs1Op$R*7xm$q(9J)seGoSI^?Fw z2`3~LoHi}z;K^$t0wO>~h(Vvi;gY6v~(>FRZ&;SI+)-n z5r{)h$TR&#q!Y#l=AYR*wK~$PsAL!Abh(L3C(LP;(HN48Qbv?S3hkI>y~B_c1iQ!1 zsUqBy>@1=~WkoSY;-cm#Qxw>R;9dxk^&X0}$)Q6D) zNX2Xll#x+|UBGme9tm+L;!;&1{fJ7V5hA9{s~kAtrdSoKV8cw?5vGuYn>geBYbY~w z>v?PC#b~DTjW`n1%}@@`gVEyj?Ca)J(<;{GGo8537i1>n8=Xmcmo9nFI(>q72m6K9 ztSf>B=IIP_c;3G~w1&!nH-69t*(-gF4(#_J70U4}~UAICdxbAQ2jOw7Gj>*ZchNk_{%gjKQnO-?~?bSoTw)DB$p zLyU`-uef`P6cKiL3bjPc;FKtLyM^%jPYdoQ^P`Ns@k@3$0U0%OSBq-bNHEdTY891g z;{a2(qqE)~St*#ZnZ@-2f`npWmMoS{TkTwO9_j1#n6#I@V+1H2OHQ;gyVQt=1R&50 zNred4db=%4TqnIKCxcn^f2lsLG|x8ei9ISyEE5_;DLA?c0)Hqy`?~RxbsG=RktBoXJ zIt)nAMb<&|Z*`=@LjrN7{ftxtv-0?6+PAX516Hp>9XRTJ+lYLNy`-F)zxM<5B9*{r6pt-ZiZ0EBnlVdU)6ceho9*Q9NI}Er zWD&6f0Z;)Zsf1VKncrA44F8gM(v!9d`?Zy+JM$&ZGE0z;Zc{$=wzOxXbag|c(K z^0IutY(pzgpPjb^q1zW?;TMXtw>aoxEdrC%s~lj8rUm2aJfyzZCW2gAbJ~K133M zP2J749(^O*+-|7Z>m63865ZBZiMP#ZFDtT>=yg)qffmzkZE~b$V#38`gJ5l?H>{g$ zLp6Wnl*3r;>j>|bY*ieb)l`%0ck*4iP5*h8pJBRrj+$Cq{l$>%j_VZWXo-0vBq5-U zAoC4v9P0jo8)CDMgMz;*($=66O`np#q7Kf}KW2rWRFF$Z(_w;`f2{q|XBOdObfjfUxoVqEGutF{#JF3kl?Tge_|J*~kW{Ie za^*U-)2aEf-Y{Y0ZME6HMK}g4K^s?6*`@vZ%r|QW+RR#JGN9sab6G#ha=-Pj4M3~s z+SL$1xt|^E>RyI^Vo#S{x{*qo+e$^I6h>G5zG;gBMb%B0dFhSz5>>G=s! z6yYo25VmpYrq_)1Hr)@K)sxD~_2>41pkN0gcoVNzv-;meY`ap@n1E_CJr!iHPMFG~ zQ5CRR2I{0-b1scTw%YlX8G5_!@kU)#^N6`f^ZD-eR1*hBK%VYmgTNGf3uP-F#8#-( z_aA9)ian8#{bfU_87%VYysLEW`hLRCLEP8gbPpBPz$~;E#_8Pi1)0PXoV=Bucs*9| zR_Cut6tgvlD5$1jjV(c^4wYl&HGN5zbTb%?hS@J#ba<`o&~E$cP-FRiX5=cn1E*S3 zS3syVOpv1!X6%fA|9-P)RIp-+KQ%3MvlTN@-fH0a5eMk}GX}1*pOuJkaH7zq7q*jS zP?_^BEoLe<2xlyDRU)BTzLs`*`7;!gSURL=2*9C9m087u>B%t78Fs9b(X2L*og$Xe z9#-^BHvH!1x5t(m#tKZki(M(z&cU<3jJQe{>bu?8Zx1eci^k(4z8lvkZ7TWRH!g_J zKA{MV;97EuXbv(K;DJ)oO>Xmr%%)sHVlqsudVSuDUz%EO(jmm2U=toV95|pi2}(cI zuBWMCW+_3;K*Q4NOBuYVda9Q8y~QK%i=<}>tb7qHoO*pLfG!IY37K@h5f59rUXCe0 z;y5aVZE2po-#_y)QWCf2LRlb%La~`HzxYW?S)Yma^&Lx8RBu{!U9oU<4b>Oe@;p@S zV2E9m2(M+4^wrzyU!DbQoA%;WLr_VuNUBjipl~$}&?FskBMHhE_P-ZIo&h`rUyJm} zlI`WUiVZ2Htq>ROvc&nf&k?BHJrhXZtPDMwv%{`5O<+qc z=}R(0+-pkf@W&em#Ucw3PUl90fWE!&6nKctil193#7p&y3~8cjiPxd8Lc7%CaSl#X zjMUoS+e`*)Tvu4wv=0FT77}OpYREP)XEGCMt~3Q2VG25xg?`P&Z>4@Vt3j>q%}HqD zhkaU6y;*Z#TJ%w7LF*N0;ziUJfkIzaeZ&uK651BAbw|haGH3%n3l{ga^Gfrx0sq3b z34|`gcBm<{9xuvZ8Z3`$T9Q)ut3F`w!{&*i-Cvg<6@Ut-=`)TGT>zCbR-Kt z{(Oh^;Vo5KDynqTY3AtIy@%l1-ntFfC%Ap5o}89Yw-2P0?T#Y$hHM&$ zo)`AaL}TXWhDOh|OZZ?$`fU&mRA@GRzfs-a=ZgA}T+J26X!c@gM7ywd1hf0TZjO`h zQ!cdeoOT#Yx^|j+hQ6QBFGBMaV*zo+?Y%JQ<$m4QF#Dv#lZ%!6eYgd=gPGSL-DypL zo01Psin=d+wj|NT@o9!kK%}7xyCCXJ*BsT+gml8*?L887bTP2N(1}vLHzApyJ0xWO zqc;njsVE71e{E`k@ehx?i>GUEhK4KE7Ofq3<;gkb$reJ;WQT`QBjb1Z!@2xtY+3R_ z$urWC)!0CY0^7CKYwOz&tz8?;^nq2ms|7dtSSwk-u= zQ#N=DYlsPhyh+`z@M0?$FTYFQkzvhMDdsCHESGA5SR#x0*wX%E6@n@U7p6vWCToA8 zZ=t^#r{GT_m@Uj?N54${d9bTImwF{>}MG<8}q1hY2q8t;L49-?2q-Q zIcDG|nohY<#>ILfnVdA>Su2naa#I2~b1)A9Q#QFJPEH>L&hjb+r@PLIpGYYV!rTf+ zcU^kLljHO$7x$J!ZmCgKj2sr))bUOiVg-RQX5EF{x2TDQmSVwP z1~mfOveQ(vZ%Rcp9XzcdZOhTv{DiYM;u810ay zc<$?9AZt{$5FA$_DVXpO?rTxvXO9Tm9jLOQo2kK<2aZqjIS)+(etbop1kFMh8|#e) zA!P6KM;1V4vjqDzW;zr2+B&dhk4&kM?K9OUfGT5H@lBcCw#!wS#Wr*l3wjXW1~inC zttbb%F!1nnLM$b`NEGGH`H_FlRfvnWYg8z3o7G5AV5<`GdMcI48JuUO{ajTe95L;Q zpceAeOX^${l0ezSiYjIlQ@8Y?Id>KUgev(oeyk+PcJ*IAo?+1y?JS*agOvm?*>^P;woj|BQ#rd2>-l z#nIgX;0%1C&NVu%WKjCClhVJXSNrw|K~k&hiZf459*h%Mi8i4r*TV5z3j%{WsVtHb zw9U655P%C-5&t$em#6%MU$D3e>S)`AA8|tudr*5Us58c)wp7~KmN;TzF1T^J3&6yh z0Yt2k$d_G1OY=x6Kr~oQ-Wdx_h5A8kLjv-^Q8#3t~rGR9!%Km)i3>!Uvue$1>EpUOxya&Gz|ccqS5GTfjG zDX!~bnYA?mna;ma>B^P_em_V!I(b`SyzUH8zG2x_6oL^3Ra@`%1GUawQ4p;|X65EF z^vsN$OIH?LwlQr~vv+qEsP6?VZNr|eB7lz}-g2HPEV3$@MO7>VzPpe)Zr6Igz2?~u zRdP#K1o7Fku^x?|M+=wOCji-jX&Np)vR)UeK8D3Yk+Bb z9kK=16BU~kf%KdjvBJ@M&D!VWyhx{h+^WkhV1_0{g69$ zh7hUWVk{FPKNlH^pxm4oSZ?OyS|QeGL-7TfS%h08kgN5`q?c73XxoG;zz( zjWo-mx-KC_7JMTNTVHPvKP^RcWEcAra=y7Znby!I0F+h8%{p!AW#}>6TxkDuIqACN2vN{^?+%`XB@l)2p@(W-TKsR|rvy6s^LvZpS*Ku2e)?vsLlt{rcAF zdd6zQswyVgtxRw^x&ip;sYZf*4eiP~=f<(8KL&%%=YgPa{(9ow9qq^=iuCG2xOlnX ziLE`lPaiTAC14?;T-00_-b3+;DR9h9Ih#!L(1*svX$FSI|J*TS363cHI?Uckf`b>? zcB5Z-{4+ocy4m}!dX~k#AQOqO@-J)!4mVik;V^W99%QB)-HcHxQFSsjFOS3){7;{G zEj#Z_;5nGTsdY7Ta zvcJ&+-o+K#sg$`>LkcQqzM&1?*Q_9G>b#g!X6RG#;ERV3e^X{mf?8PKvd*h_Y{P7X*^le4w9()1_t-^+}@!6hCmx)Mow87szB0Ar|5sPvvcNhz0C z_{_BgkoiF#4MSO1C2{JlT(=!oqStRg{@fT3f)&nWVfLvk#j;WKvV-g;(*`)$y?aig z86dmUGHm%~fbcY&AO56yt>-`aZsE<-c+PnqdcD~L{PI)p&yWu^h36@X>}M3pAFryY zB~l!?>?XVZ{72*3hC}5vl?;M$OTtUKhPJ$)D%9Gw-_9(M(3TM9UV(UFC z>l(=^8Vt^Qd|!G(It>MC1mo8@(gXS(gP@)MS+u+Q0E){>5zjrPcNHvqh!A!rtK@zW zZ>cAn!E|Zg7p|G^Jrdd@P^qAic7MRmF(@^uCLi-Y)>TcVKo2LbI~hTkZQ;-M?M??K zqaQNYM9xEX($dgtf)0v3oi=45Bkml(>-SoM<8T4!e7aw3CrEp2x4qJJ%`ghI4H6Z( z*n-hQ6QhJ{dVQ>T-xV>2&-o;dgC%Q4SN;jLXB@Wa8o+?E0VY$glHL4jN^clK6E}AS zM51xl7B#YK%WwXIeNKIoFIhZty$$&mt=h$z)!TU8OPSc_n680@D>=M0a6Y9Xm`D+` zbXy@8hG!pTsjiAP-?~ee?9h6rKLXuzB_bJW@=rOUu%jjOt%UJRA>#GUoGv?HkuF&jVIqOZmj2Sc=)o@~o!e)DEu^L3wzG_Ud5Ma|!98oQ5 zr7(({&SL)8);JEI4tgjFNvhXrbm_egHDzfGfVfd(NCA`EfZx7SKhCeJQdb$)?~c{f z=^?U#+!+)eE4lIlx%q^A=rEpn*~ydY0z<9Xz21d_yBZsu3<&Iij%4KHXpM%gM?fvX(W*2=5pOgf^^Ezo1B7= ziJi^|uO~A8gpZ^2mH0L$zbvY2ce zld`k!tA^t++*9*q8h2VnZ|$Ifc9!hTO9TDa;Qf2B<_;}HJ~7zyc^@sbjkcd+!Xnz;~kO0+e}~**^biq z*S4{YZSH1awBsy{UH{KSu&GXqi*cA?y5FOi%o#5u>eu=a(r!$q{)M8g1nmr|@h;N@ zlMJoR9GeV{)?s>`)v&YUd=#3u7Y?k{xfrs3Cxru8T}Xwi1?R1fxmBo65B0ROdZFma z5Ahx)ML4!&pOiKW)TQ`Gydl6g0b+#jd)+4_`F-ruc3Vk1kBB zu?j1%zM&KQIK>%?-ayn2*g0rjy+7CH*z}d583M!DqA!l*xva)s=aa96cWuL3Hy-ga z$!vm+kh5h_xsdZz>G~UKZe8Z*(;l59YuX@}d~T!O9M!jPGL#98!6myK^Fps`GfOF2o}I;@EZhd%GUs2ZF{^h`QsymZZ#?r_W}VHbDlF4 zA!4gtOX;BEZF|>%mDqPZ3imWt9OwZ+yJPP%#y!t-XpZ>)potY+Io@vbF~<`e#|_iJ z6N~k)>Ykxj5Ol6A&dBXP9!rG`kViEfedY(LHks~Oic^&%iy|;%>KD7xBF z`PkK@c3OvG+1;CNSVqkzgG}g-Du~O27Tz0%QrW#;FSqi98!MOnNs*tdGtHo)DOT|r zEhi=<8U;QOeC(zL7(_YeveJbT)EG27{klmRhlxi(b558B%^V$+sQRs!>{9m{LSPRX zVz3npR5Y$Uy0{M($r2k8H;LnI?OKNrgXJ;ZJ-ElHq6jxeWE2wr-~wH_9l)y5w9vuj zvI^cdT4{h*d`ThMYw&`th&B+JmQVYO@Wv7RD)Jr-8TVFW2OFKzs0%sLZJ{KQP z=0nNPn1ypsauf!31_-`)FtY2Cnr$;9H#}R*UB01!x>wn5Ul_=@!l5~&Mg*O;4$)%K zGyLCm2Fz$yfnZuVg&e>R6U0gtv|h=31@R?$xMkW*ciB@~IFNG~$F<_jiRC-z<2U5! zW3mF5AEJ4@P#3-N!bT=YoDc#7PxW8+U+$VczoDUpUA_MrrpZcLALpxk6w2^TmnOvsVXpX7p2FQ@14!3M@M3&A3Um)&|o58>RZMZsOVC-8k zxQMZuW%1!lt>VX}fC)-tXpExZJJn>Nsynx+_KC?!uvuu163 zCnO)z&qU8IYb*&_%VN$Dfw)+IpK>ar^ay#cBBMNnOao1N46uz>OY7wWp+Kxs#=NZJ z5{jCTF)cRzA`gL=6ILc!MFx<5F-Ht2;f#N&cT0I0Xe|$#GBzsIXfG9Tv7hu=noRV{ z?QtF?^lI8xy2hxrFcP%E(fC!7Eg8EEV!F5*XLwGmXh|An{EV#D4iT|xJey+f)T~;t z-1%VWG26q&chN}PVT#)I#^#F`!mF+>n3<88Bv1gzP87=^c31YB;9yyL#x=*Lk(8yb zxeu4yq;$(WSqnA`eZNoV7I610?m)pg<|0H1B-HLjgT!RQQqMKJ1SUndaPYt&#^m~=NDsarySY|sd;8_$@PHd135`RQLJ zD~4#)1sG;aCJiMieJSkN#85)Z`z-UAJI&HA`&2D!W?LDMh+sE@qrU)C0GIn7ms=ss z!z*ecG1?}+7t*=k5QGlo9%lk!T8$}_d6HmF-F_@iV|IEHtDRoU7C>l z=W3c1PB*6$KqMEn)AZ}f>k7Pf{z~F`}sk;F67LFDEE2I<=%g7F_>I# zP2iafPeGVyA{E+Vt01IW(_iMCJZPdR$W{-nL{PVNDn!z)A(Z7^5LXAeTl_97viNT) zbkB#LJWEMu0n3R~xl7cW^|`ww+~&_3$NC`y*};Qt;L!UJfkvIstX(%UWsrJJUnfz( zkZ}f8gvX6+VCD#@k289nYfm@mNAWeTpKckbCBKbTuvx{WNlgAwi84`m{z=UKZgR~& zomAEU#PI#1LY^`>F%It51)Bp*%1zni{S7#rYtu+~P-EJi!Toy3Sw z1f6D0QK7ATct<@>q4I4!l9ctN9ZV#*l6&1!_bJ9oP0&V&QbB3ZGISoWHy`=ngP`gH zNZCBYdPJ!nLGN7nAnhdnsR?$n2y>jMX%RPzurASAIfjpGsBo}X&~!g+;3`b3{oL<8 z_MFz*HPi?NCr=eeJyn(D8-)YS&zAhiZ+JwC4pW959hz4n2DMYT6=945JNI5R?>0o5%TyjI5w zcOs}t9il<|2oU{+415?g01(PI%zvIv?VsPr0I(Yd1n=l(9*yb&fq+QFH`>2UfD2H{ z`$MZmhbG4iyxR?&-;=w}{SANz#$yfXy*{Sr8wv;h@HTxacXx22qVDOkoH%t_Jd3N9^?#{O4 zz~38h#*V$K(S#N2(obUxCidmPj`D`4jYr=$cy+fpsPdcEDV=Q0R@iu|=j^PoyZNXs z8$m(0vrns9?x@Onty`?qtw(ioTn0@+ml>?d(0#y9HqabdLpEq?m(KgCU#;<|lyc2M zqhI)*lh?%#W^=Tu#ADO4`-$Yn7OTcKer%hmy(w4l9=oWa_T;iBGwf=Lv3FZ&@tl;JzPyo~0br=4ko6Ol?EkG0OE3<8NA`j5L{m`R z+JN;b<~nBZAMNhaj>UiWwfA*xzbcEAj|IPN=y6&L-@Fi&1Ac<3I{e!RSfrw5`~xPrJvmPg$X4InKgc+z`Zh_eL31#4?ebsgx5E>FnkUOYB0lSyl&1fRf!=#Hz*z{W7a4(HMYs zV(e@XR$r>IYl?URxFTfi1C@@lW)-m5>Wq=knAAKo;|xB@62Fya>>js&;EGlT)1_m0+zo$^}o5m7Z_55ca*pAooN} z1^o1Ew#VIZGt3C-eBP3T$x+PrJ%TM%vqSEotp`omX=#6REw!y&*wzt*;=<*i)VFJI z5fS}S&k9B&^=Riza3sF-vu-ajLaA8)Ez{CN(Oa-8N_Fu?j zI%vs>sx~CWtTB}GSow)plDYWHeqKp?Ia(de=|nzxUt(&IA)wB$Cp|_3kPktm4Py?- zfR@_^P^0gJSuInvWO)h02rc^9-mtICYFqakdJ6{4Ec-Enq8pzx!zG|uMTh$c0NvT` zz9cZz(s{A~;m~7DdtTM&!z?~hT(<&-IJP>^CNh2;arPEgVS5S(Vh$j7jbc;v;dAC?0sqVQFou4KJ0Z?C+i;s z6JYUyEwpETIHZez`H&n!PnSJ-|DcB5Wb3)64J+oP2)RuYfgMGg*j6QYblN|Ug&DdV z?^z6o|D8=PzAUv+W6ew7GqMNCI(r0M$Xu1oXV{%ZIt%ZvwCS~tJUazMP3e8l%@l_b z%)vUQh|I`8EltU}8E~7VP^S4~r+r`t-^ZDo5%B`r{G{m)8mn5~mbSsB~a>?Kk}s`Pqm9afJ2vs1M*z^#mr-J4w+Us84@Rq_hTxoM?wacb4^89FJMf6{NY|Ly!< zpsH8|mUR4I%6NVb$czrqcM%duP3`}X!OVn9s6a3LiBWLX9`(8vfnx-;VkA>a!ydugsepb^0?tGg&RFovnygcNr z7B6HYY$`Rcw!Hs0yf-786f6!60I*660D$%1zRiEN-5-?`YPz^X0RV!$00IDj{EI{b zxY4xvmuQCgbE_xduCTtlzPZzkw*8KXZ;^QVSc1mvrM8U{BCXY2Q%l`Rh%)whWoPI$yMQ`EAR6C7;>cb%*DZb}d7D1T*XZ4rmSTGM^K_#B&vS9rsck_4bz+M{*{k+y zI@&V-F5B*P`#1UEH-nrxtnRNzM{3Z(eqUYRCz;pkHm05&SP=7xNJ6RocUVF%-MehD zN5*ZOC)Lzg5e3$tb#3D!ya0aE)#@hG=)Q!h3Ge=WCTv(eTaONeYTBoiX^^Cr-L=e< zl2mJtWx)$dIyQXyiCqMkS9g9bn45>-9{0bgHR0l@)gO!ob}UsW+8~lC^DZiwfl95x zz_8jKI-%Lm)ayhzLCc*oGm$H6z%&rnY- z8d+4Tk~6(2CHmdd=iuor1?z>G@JRUI{dM((hdNFRy592a+}UQ{ zbpk5K}Wq0`zCr38@n4fe;QK*g03>Jv{Q9|M>|F{au*}b z*aAj#a_*mM6Y(CU{gurZU1WU=L|RU%kh=`EE4-Bo&)we)1C~*tLcdP;v4FA%ket4# zT9ZAeQh^}Qu^w3Fi6PAC-*eTx#iGYlMYO#4MQqf$ z2H@XVb{R-PJ+RgOR4^2lwKjsi(10T8W9{E(0`6qRqX?0j9&vSoaRUFO@kOMNy25UG zw}6JS3SwDVnvGF(cysosf4%m%p+50+k#4 zgaH3DTBUq@!QWvy#UHp^Zj6L9NM4>)0u&v+KYcsM@|{A}3I8=2faPau6c8?J0H0$_ zkYVudskgT*KPGl~T-bci=8?@MUh9FiB4SyRAbACKzexYW`V9g=3qc%J6%CIC@{Z04 z57VmS5dshd-rfT^+8u`622L~CZ)Acv@kw}691~a)PHTu_%Z-7kMqp_N3w zlEB7T_b8uJzFv~LNTCkxXv4ot>JE}ph%Ga#Rw+&HL zj#-mwko04a*Bzw~2LlC8_t6hpQLVnMZv_M?>Zh(KXNf(kv5vOv!6wRBr9*`f9F5n9 zgl)zj9k^)@^b!?;h#-)ftC$Cu^%>~ucvNoDRTRiXD zaqtjZZixhpi(xAzmxM&91-6q85c`N4%dwwP1G!o?lbzR$l=fYjys!kih~X0|UgXefO$- zuD%UY1_8q)L^px#&7u!!0rnu<1#y?Ex&#(Nv82_sMVnHWPeh}xahHnTK7TaXsR$s2 zZiVS(B?hk{Aw$X^_>9zos?x|S>|nx`E-1qZ6FLc;@}e*(#G9fFz@_>w44dPBV_8Dv z*qXfc2)E9Zo=8M4R@@ijW@@}=?g#EgUHu`=W&;q&?xO2IefP#d*m~-bkWFbkf0P7~ z(4}i9STdh&3tydX$7GdiP6CQd9f;|ReOssrrsmciN1F&Pi%ThmeQ+h4zm%gY{?`Px ztGmw~>Tg~xq~J?W140byAU1swHoS4+q8VA6@#e6V`U|gk0Wx?WK1B3ij%DKBWl^$z zX5lSzX1G9|-IPcBh`s2plzDv*A-BU$im3pgzNY3A+_C)m^a~=_!3?pUAeotay)@b`#9r`t*p_Nh%ciYzS99f!gd&zOR1TndH|7o!CQ8fA2Wn!y+8F+r7L5nAK*(zOE< zh67?Du|}X==_u_BF~!CL-pOl-ZQFrnfm~p3iPJ@VrNN>~3DJ`C?MW|NLwu?-k`n3C z2B96E1@61nr6u%X^taT5-r{cj|N0_v!P}g&T+4}N7cVUwGC3J4PYFq${d)h{|y`D{e2qnMZ&IyEL@yegY2yvodfl{xZb&d ztv2gd@rjpF*vUS<#FpYSmoo=2m}(M$`ctmkG9U+%Nnk=XzZGyelnt?^E_b88BMbWM z69Na=Foa&#Qv}Gz3m!$6QkxHxA4-gl_GYTVA_Lz_BetoWI?oDEu?}s|-$Ko^FD#bW zBKp+l>6cZXwuOC6)X6^yD}N+>jkkp$P`=p4sPrUimd2hD{5I#3x#@1l=K~!Y(cWn= z*%Bc(Ky{sA%8NNN#`7lgOpT%sROZ$1wI4GRzj-wv(^M*Pd>R>-mu@GDBoz-2tSpLw$N} zMF9o)%H>SP!i-k2AZp&K{4p%~2x+JAKdTb(dHEPTrL~5VCr(7S1gaj^ppBpi&{u-d=Ae7&OWlDpm}wSE-IO zay30=aSU8cz##ZTf?t>p{K<)3iSL!5s4=NP9FQId&Qwvpisj{G@1IIWmta7~50oKd zQ$UwaUwVXKw!qr?n+qK)SxfJ$09(e*g*ROyOvg_$BuE?kR^vCz$Qo}>x^#Dfn=69v zqr24bzJBbF-?H2eemh28=;X6iFe1!WL(MY^9i4vacsmQlc{U=M_>UaK%$_MoluJW^kn)Za!W(M3x^z0syhJweZ_;~b%&ndk50 z3`@tW6+Gb!ne7**+o#RmxXmxO*Gj_dl}rwSg8H+ZJgC>P8+g@t5qWcPKE8Wlya7ZU z_u|qj3s^1A+V|(8PmuBo$s0lU@Uld*;KEns42nLIv2V$;?#p?zgBMkQvX=wb1BzY|JA6+hNd~CH<(v#rYFFRoi^p@Qzq?g*ZijWF>f?fi!xNK zoG)H}HBcx5e2Zo42G$oZwWA9%LGqA$KZvi+asmnFpuGJIR)Rq5xG&D=rg!&HEV7Bl zjK+HEtBQeZ%prEl38k?^lEyER@Nuqhi`q_fx#krf37LQOm(|UFa5VmoIz0xPD3&`G z?;N$bPYuHYrPl~dFSA^e;#dN{4Br9`2jXGyQJ$~mI@UH$Ry=qQErLVgFNhTdIK zKyr0CQ4NG|0Kl*Cf<@_8=Z##AE~Tj;3;NH3ukv6t@|z9-AaUfsFZk%3J^#;Sk^inP z@v(B-5^daf`;OH8Fb0)Gey%^7AW!(~`6b@G7Kg2sJH5FU77QUT2n~b{usr1T+Goe} z5d$W%kvn~zdmurLcwT#3Tlw#*t?eayb$uOfmVA0VRHxqB*oAvDwxUP3&e1uINmsjQ z92aKEGWmB%<(=zOJ1KqqB$6=G)F`vrO^LNYJy#~O$P6IboR%Rzo7E~?db9d)`0AcW zY7?q*^y;KLTNz<)ho(V2OWTAQIryv02K<)NE9Gj;wQDUhWtxFJ zLZdPvXb3vb< z`IdHy^OXkSOH=u@7Z6Tgr%$@PQ8XJ zrcyImMT#6<`zTq27+T*JaMit)5*vvW#XT95CSPsHsQDsqEUH-cbiUgHhc6B^lA$o4 zWO^A5p3)=`2!ON1f*{cfo*Q7Z|8$`%es8`>RGQT6g)vK7n3t&sXW-~eVqyOYGRz02 zY2(rcJBliP65l_Gd1mp*$N`xz8ZIzAshrF{F|Y?o4ndSxS1jpF0yr7K;#a~2{34$c z&SYu2P9;ZgKiNN_ga$TB153CDEG@Y$(6bfuqS3P3vf09_-I{y$hZlFM0iLzy0AMvC z$8lbdzHG_@RUslF+_)j8*I}?IF!^$*2 zz>-It{O_(%WvS&NEm0hjOP~6L@#(^YO-PRo(cJRJ2WI9=S0Nu!sW|iPqETe3s+R^$ z*{CNI-RAn;n$-L^2giUz0oXir5*DpgCC%Wvgr`^CTygyj9qBOKw?X`e@almvJNbWN5aDRCD)a+ZSHj7q&L(gz`9*xoRqi z9tdnIEdG@!X6(~U4KLPvJd2%8%uE1#SRAV13wRlO@OGetIas_8s^)!uEApxem2S?v zqH7FHcu^xhy{c&;t?}>ytB3OiL%D|!5w9`|UzbnA1PI(z0 zLRz~V!@xtUwj@m{s3QW%F)_Uqb8dxkt^uN8V>R|Bj$1PsWYx3`ag{yMARQNNd1T_m zRZg!%c6BR~6W6NLS<+K{i0|`J*ilNEmr_mAGX^4}RmIF%CubU9lv?!h5p-1~_RgtG zZ5@(BPe?u?5PRpFOygIkCVsOu*85?hBRSy!RQEJ}g9Jm5mDY6U*yT7MQP(ll^gj51 zv(xI<@-_cDpIy47`T*(A+Y{>xw79Y3XwI$3_YZiQi?`8ct5R@IQ>Cl4dZ-p((Ev*J z6+$6GO!k@>Oe=Q&6p6(}>p2^9kJv_}X6M&82#4-m&QQn2!ol6d#fpaQ#>L*mt zgw<=lYCgCAKAfDdzl;Fj$HJ`)czJ=lW4qkN0>t&4hu_8uUM|zMNeJHTd4TR7eL1q} z3q}*DL0hHNGz0B}dtgj$SrrCJ6@DS?o zT~T_8akwh;CKJZ{!{J~L*h8xyG6s!O%C_DuvVi{WAb;hACc%4Jtz9+;^3A}nw~D)b z&U~gX?&vtFtFgfQ@jDj6X{C{E3zr%j896L1-w3Vr#kea6Ct}DK0rMqbh|x=YeDp+6 zCliF^XF=~ycRDUjiRaxAg01Z~*X=jfpT&n&avj&}y~{Q*K2$TC`8z-=I|Yw_yG2O< z%GhXHW#MrqCrI1jh=%6Spl)n}1*jm`V`ct6Q`S*$@#@Y&Mu@*HxAjxLz%}K;U->sAR z=L)|l6M2PwxrmQ{3IHBBWs`dEvu||n==Xu zwY-tAQ&MsRoH`4~21)bb@|mE&-y@U(^{r(lG1<*{=8>_&&SWU;ba-HfjeMpB@~&+x z3oRP_a@BoZb~=f>y8xfL#KZ!f;sW=sLxnL#|9#a1?0f1jcw<*6kk5h-v8yX@|HEsc z2Fa-f`K1XraAZIyq14$XB8YHV9oc*^oOCkXyd!B#ns@=oDoRWr3)kOndt9>bNSL?J zed7iaaQ_0fk=gL2e#&*&keBfDh8hNUuydH}7L^<$chFIAOv%nHLkLj!sU6g!>qey4 zwY^;^XVFwe1{lS0d;IFsn6ALrLw1z$NRI>(JhNGKDZ7eh7LL%B*G$ znoLk?6SLOHZEST}SqFH#pxAh5Qsi~igGf%k3~}naodTTfCgY)VY30W*mzNKK!F|c- zLPQRazc;$4A^}BW?^(x30+v*;GeFHTH5kGm{4z_T*c`5u?gE*bsh})B`E**Y58VBJKR!5Z4J`4gkb7QZcw!ybyI z4=Q`s#3FADs9;}$fqEczPQ5MLyNrWe(C7ZnG(3`$s4qr&`{nkL(>?s&znZA-<^m-D z?ilCU^ON!M1A9WfMxaXsCYWv_BSGne@%HE)&yKzt8Ij@=dofZ3-@2Z|oZi z>4nZCNx8xROi0QSyu)0(m~ZuM*UYwt$~D~3}XOZIHR+6V#m zw}PKA`y-;kbV+HG!CQ{I0YLErn87 zBbHgZeW2mq;BXlc08O%zL`=!PqTssML-s(<;<0XaE=Ht&88u3o9$L{MRut1#dAn6d z<#ZhsMtgF|!x2!>!80RY#-CvzsPXmP+8>Hojsech)k-B4%Sre)vPEp+S^~GOlJ#9C z%jD0wU4kqIywag6uA)&3h!EGHY;8G=UFtL5%E_^nP!}+g42p^e1JWuBrOv`?go+cR zfI&K`OGmeiO_1w9-Hy=FD5!AraQA7ZlFSCUTTyjyJQ-&sU>u)ly9iuJ9ifnm9qWJ; z*l1BJi!t`SD+${^Fj9bsOC1~i`&6nkIC?S!xNo>H zaS1ntxilzXMp5+bMYNfdmKwzq>wrRNrr(CIibY!?8vTD|z}JZF zycCs2I@Tg57hI3F4gM`B$~4lb3QgCT;Eg5HTI1n3RP&is5|)N`7*nh&ZP5L4QBF^L zM7`OYSO{-%+DM9PSV$|%_$@#lVDKfyEXX26fK+L7fX-F2WBYB=GuPwP-^KO`5~R(h zv)FmW%MFbZH=lqIoAOi?ssxlTaktafS_*mcN*7JGzsNPx^`NT=1nvt4)(lj2Mn95a zdel)kEH5!V&kz8>Z4<7ZuaIK+Ci&xCMOOdTt(vwXWmor7My^PRbyWlW#q9S)<4p5O zoam{sIFH6MR;U-X4`d@z(XmzX4zwo}dBwdS6jzq{dRcG${RcX|n&S3iSncQ_sy9z< z=noyGz7UKnsYolSl{FU|JG1vN>JD5`b-;A^(+`iou&RAd=_x$OGC2U(Tqv#J z?U^rl!>`s9t+^l3+Ib&MwVjb4mJ+|9OQ)5z&%X^*0!C6IVXm#$%aPUHowhiGnj~W@ zqvG)n^hlDcd1EKMNBB7huS3{y)wM&`8Yo^kU#kc`{26v^oL8=y%=(1Ck_7#mJ-__m zyQL~C`tHVzB~H@Q588oCpXM@CfU0;P?KA@fqfK^mQ!nuN+;59{_}+3vc9rd|)hoEH zFpv9y5c}kby>7$bK?Q5OVWTx!xODeTu0^v?n$fmIP{2uvAH@ z<~zgz_3Px+pci&NFPxV>`-gcQv_9|m9lzL*7161BV0O8ME6kvrZ&e54r~ZNaeH&n5 zmSh4VW`tB@863O@8HM8u46#s}wUP>z+OEefWo=nxEAF%3`uM)?yI^=<^1vpQYh_`{ zr-mFBVdIE%>ZB%}i2qi4uQU0}gOxy=l2vL{;2lYIb+ zdwS2hgA7@`<`~5*dL-i*jp5uXh@N+16ccK)$U@A@&r|s$u?hxK->S`CUH_FL3yjG` zq6Y1|wZmhvR8U7`RSx)U&?#vTEEgx(#q0GA4Kd-msmnw*?BXZ|9*%&7?hV+05g%~w z5Wm;DjAXq;1r^LcxmaNfR+EPY3DYgpyg!#xq6r2@-J5VQ3WK(#0c$FJB%Wtm{)QF0 z^i2;YR~Ef{%wJDWcF?e1(aETu>hRJ+vJ7=pqD0RaiIRrRPf7ga7_fqzsMru-#J!2X zE81w?!P9E=?KFmT=~E~_=r#&<#Ay%Rxuk+7r*>3LN zhrw;Yk6i%LhE`uBV;YYqqY^vB{cbE*FU;Xg9|UmwK^1HWRCa+}(hQ4Vz|oFU8B|Z>JJn!R zek78je|QcRxd7wcKHtyRLe|5{ZaLtJ#C?PuLAVbpvOu zA`vEz|oa>dQn1xPBi zwjcqq&MAo6q)_V+Q;!*fo--l#Crs$hMl!f%rKoXQ`uHdvs42}FO)$a)@Jxp|1?3G? z-7y@+1~Q`HG-~LJ*ENh9RXD~Vq6(2 zH&Kol&0vy-6yIo={E9;Fk5G448(tI!k(W3w?``ERZYI1vIFdGUiAH^quks z&8cW(Es*C9@~$ATkdwjr$$+AeiMXAD;d^8@qc}5?92G0-mbgqZxeRbQc%pU1!LnOm zCDw<3i#u?B*!ze0-iG1EU`em^+j8%}ZkKR(|G0!zZFZ}Cd&)Y${YofGr-9ODUb9zG zjH5K$7pFV8q(ff8nqY1(V{{|Wy1`;F!pnMI0pG^^ro1%yhpx~4od?Q|VKt6@=<)yY zXLp_6nOR~We}^O(NaS$=S_^s^#;P(#_RLM>CR;wO;c5B~aW1V!(y_9Z3b$qSrzes9 zAP1!DhMSMYd(-H~K4?rDyw`(Q8GFPhG)=;o31rKq>I-jj`CYjzEJ{oD-P zGfILSJXz0c!J>nu)h19zHJpGc3G2`ceFYgk+d{dRz{aRT9zcu5{Y;~YlrwJ0#oj|W zsRG~bFkvki5n~?r*`$|e2)v4kjeGXGuxiGHLqWJYzdE&yLz>hVz< zpJ`;H3r00v$ob6rl(|QY%M&Bs*P!eQ3<^v^HzkF4U0AbWsfnuNt}7=N*ca0k8<*C#nV)B;Jx&&whbi!d^~6%B=SQsI0?964JXg=WGAu8Y)=lotC>#-Sx4fr zgxS3f0&$|cZ3yMpK04m*8mAP5(zml&R?$ta@i1ETM-Fa&>L3bZq~ZJOdi}+i@rwWH zk&JIdex9{cKg-i+$B5b_zP#UEto@wZo?U?1m%o=zDrP-ljfb6`mt9^#(>70OYPtyx zx-F`X4$Lm?k)s2aN1MCZfq+Y&MGgy2+$o>0ou8Q+t2Ye4oeuW~&&DdV;3zd{@q#h$CX9^P ziGPED+yAIgm_zcb#S439JPWtV1vcu%nS4&|J-lN3vBYmFmh{ef7VUM0;4k@>?lk}&2qbC2}J`EmFQV%+w0Q3Tf#gu_xcP7KH~8Fzc! zOvz@FQ2KJV_TABSr}?XSI3&C0kzATT6@;0LGpsDW7!Q&uHx93{=##s`X^50``uA>V za?9)8Wq5|djJHeE_!Km^C0#weNz)Y5oHIq9KBFTIS}nt{-!c+!^wvH(B&?mnaS3`r z=~vd9u^2@&Zhz~$e);g!Iy+;PYbsM>1~EYKzF7)a5ReRmrFQ7oVFX&2TF@!_%fa2f z)L>(b^Nvh-BdID70(rYvxi%*k*KB%y)?p5=FUlxRc%TC5=;*{;eYRyeqyj08mVU@f zqgxgH#+rfX4h=9KIc6PJ_-Fm_@V@;U z2`;-bE<5)g-q!B{tv>D2zNRA;<(QoqAXIHzf#60Okr7(rDGNdZtqr~Jzi=r%heXf@ zdI*%`*=10=$O~=?ZJbcD2t(f1auyYp6H&}s>aZi!KJDlRf1HTp&^x;Ax+01%mdOviv@ETqJb^HQ^kIEh?qvWXFDq`gXwe zYufqRoqH3M`&}+h_iq&==!nao`D+_S&Q7Vj?KEX^O>HcxkJ#QL$>6yd2sA~S*4X2* zG$j1$-k#49asnK?9ESliGI46`e2CG8zM;2&GPR{mX zbUisX;AU~M+rtI7+*#7`B%}dnpjYiu=uc?z^Ikq0EE&k^Aqg$3C|y!JICVGVNo%;S zFUz1r7`&_n;ZZKw-!WCRWXOq^C5n~q_sdfvu%#g6lO$(S#KE}JhdNHBbpzvGS5zHu z!OHPhEw3JjT*ToakQD({I7BCS>5^eDIb_6@vVSW(bprHD(Q#=nQ(IirbdUJvQ`K6B9a0eMuu;@uNC4ja|H~ z#LvfPQf6%RW;Au~S|8%QcO>^6a})N5 zZF7qc&1xi1i7THdh=}eVvQi8AdOgWzxNl&S!UpI!%4wuX|re>TH%Ji4a2B@}NqbB}ICz1hREG*pL~0A5F8VT4XTm1xqDTd9F!VtD^Y%$qol+S+Oq zQJTP0By0%_i``Gx`-TtU#AfH|Mwnz6(MCt0mdCt=ORHuXT&P~9Qk#~68_@LzKBji~ zeQfN$*HxH+{b-&Plf1;65u#R$9m&`9Hz}ZV9foYBuNT(0Z7uXCjsN>NKGF9hs9xEI z4bK-?D~KT^#nMl#JG3HFS$0ya;1%3c3h0NLkjZqDr+MGCXEtLbH0d3kDoN)+p$-3- zaM6vB{Bi!h`pyLkt}u*h?g>f=T9A$I)IM00W+8{Fxi-P{Q;2J+uhzW>M2{JLYW>Dx zk?n&_g}hC33;aqY*%hU2&(YX~eJH{ftYPA%808(Z?D2nh%{_ExInVP4^NcM&0&=}T z)KBUD1ZqpE)!5B2(;v7tf2E%8=>Du{OH}V*v?mn>_76CJzmGgE;4Q^Cv52T%qc(Mu z9oi{C?~&Cwk1yna$eVTkh}f#**XW>1X?9>nF-a|XL1dn7KxpaqH*+82;%9LPlFrv{ z{mjUshG^PTNhx!N#n&?iLB8!cI1Wa=n0;V+VV@nC9>YD0REAQQt)UjX7~PP(8Y!%= z!;i}7Le4P+)ayNP31pQf@Y+8^S+~cXHie&$b^x;DLYH>73{~9x?7kN;b9Y0YBI^q? z+S|3U;Z)thBtDM;a@Q~O)Vl>&7UAgZ^!f&Xc@3@od*OCs-wh8;$=YWm-VhnrhV7!X zd;uH=l}jy+pc7L~+qD27hV)VgEX_uR_b%Y%>s47jC|mIZ-0i#lX>0Njv%M#y_dTer zQn8k*_UKB|f&!tvjY;1M$lhxQR!*%g-^*2ZBz!zT>+f|?vDGrmAs>WRnIcUAjg|Lu zOJ9TWdMi3Xcii7sBp0F7mD#e~o};^P0nXsXrwhx)s~+`9JHE<9(0Re_81`1YSuhyX z%+v83qO-w;(~+bGYFA6z^>i!Qz{SDR8RQu5^YmuYg?5zpZ)bL83o0JgUTa}OygvHY zahB?o)GiB7azKC*#f1rRH|3(T2&rMCIah*!1ImvMvc`{OhORugM|9`x8z61y7M?4= zJ9dd7I=ur49HqkBqVvurGP@i5w!aSy?d0gvGa*%F_xTnkGRv|Og73aK%1lwSF>Aiu zj@|?^rQ?FmOiA)sRjn*pToZomFV_yKYJ|2n^9-~`fqj<=+^jlofFZ7B16Ek=380VC zd;kZ1rrTO;`)yB4pdnFueoA*EH2@6-{Dqw#<3=DAPtTD~BtCd@G&nkQ3=6jO0iA(} z^2{XH%?5&}JFoYPn*(;Z8Ta=HYDMa=iAgT=C{)Db0Al}1IZ3lbR(BZH47(x)8KBsN zn4f;4LQj#nZt|H9!rHpOb3x^e-`xn7QoN6F{lg8Qe?bbgq^;Zw?wpewk%Et*lErCP zujirg>46xD3M)D%BG#5FvosZBW}e7fnEWmWB^^~kP1z%m>gkbz-}@z*2DAOYM~2{c zPD3Q+tcrHgU2DI??Ki-1Eq|8i9qSBmn>k=ZDUT={OJ3XHHnAeSr%VFcLEvK$5k3mQ zU=lR3x+joulA!3eCiO>l-SL7PcF{9;mK%X&TY1jj)kjUvMpzSC;muVg5(j_2fN?vS z{hI=vT7Bm4E~;&D?C|QPS`E zvGMZJ2N}6r=UIdJbh-0T%@T!GyupMoRR4v3o8R_y+8gBnzq^?0{r;qn-L;la2`k%s zoks{8?#VbC8pr}0kVv=yqb|J=$uji|$ zU95gN5xMH7d7s>4s z0^)bY&|156rd&7gg1MR;6HZlSo_?XP9@4p$Zf3KuzWyTAo(nM*LQ%0~cDmf?*f0t^FN-WHYz!RvVKuUam*&l^vgl(vwk$nWFY9h+(@ z9O#glnarpo{72@cPV*b5@w_IjF?<=<;z4Yf@x)3NJxNu>bYmvA*DR!zMB?nK0u)8s z6Vg~R($^cf?Q?-R!$XyWN0m}M5?EX7;ho*-Poa(i#RYrF-ZzFbGcJkS#EUI$$D5Q> zfDj>Jh`Vy(BiWYyfS^t|u%;U@Lp=wW!$z@h@tuj3oTPR}_nJ9qVFmr0ThD5M6T(A^ z0(xg->G7*y<9`XlH^vdT=#prQ^^*OBV#LUl>9Nne{|KM(B)U<~T*J^go;6-++GOBP zcug?Q(G@V`u!2p9--7jvxQc@)`Y82S-bpmzn;lD@C(m!$3lG$hVHnFxc$9d6=gR+$dL_M%p zRik|>p6msWzT02|6zi(9bEsz1yjUNT}8_UP{^kCL$2%-P%? zbpLZV?5PA4BJ7VEB%1o@@M8bsXYtpR@0Z~g)A_P@x2DPKoDdAy2{DGZ+M1PxZDw&%op5?*Gf^UgZP+GT1rj`zPR13_ibIUkcZ$Nhr9B zn1giOo*E1TWyJ(=Nlxbj-6KN+PaVZWimx-8KaR}^jFoN+_8))zHUtpz5)F(}Ohbwq zG7N8+toh&$nrAR0=KW0Yi?Pbv>B(~~JH|}q{Ctx<)J_1I;DJeaD)|)f1{Tok z>;kWMGYysM&`*tGgKwu4T%?1cZXdfnDp|P}wQHP^x6`oE_2Dn}DLxeQL?78O)(8m6 z&u`%yGRpK?aSG|kS7M>E9(2S2|>KA3eBQ5Ea}lC=!B)JBHoApEq-SW&k2Mh8hincX=S(5 z<#i83)66D^pEsXo=BE^w`yG>8O}~A!Ah9}9M>1jgSum>V+Tq}~-a?ICm;C70|=P6R0R?j3{SA-V*I92G)E!ZXbZ`esd9rAG232 zbdgfcDfY$*lJAuo_iG2NygAy&`Vx8v%t=PDoEQ00>eMq?M_m!h)qTZE8sNvJw5b=V z1vJdd9U;WP59?`Qt<6OGT?X;1_p@P# z{|bq#P1M@X;V3mBO?R^qOY_@q-#x>Y@=6)taRPyq72=pA;y$;qY;TcAMRtz%wU zC>zqfQ5oja!Zl_oJ8x*s&D#q_wo>U^|@Wh2u zE?rHJVnJPbx}=Wh0KqaqR(5uF?vCHR&oIA_{aLENmRKK@nwNsoPR_p1i`qUbAeLdg z-7D1}!Dh(KEek&`F!rBomsrJj?&p#5JAtttbijP7$QwX5RCp;sUyV(}PtTz1GCNJ# zLOtKsnMtVAd?PN04kUR5Brq4L9^tIcav|mv)5O}9d>HDx4$r!(c8t&_g zLFmS{ZC%EW$kJb#y)tC@+X&%WZ6!G1-bj6VU<8S$aH%C^ zZ|yV|fP?(hU?gR?QXF>{4E%t&-UhrGozyuA$Rv+uz~ChrIDD9QwI316k;6(sf^d{w z9edcAq1mNP-|Z^y!KVW4un4KjX^_qZsj$6#J%Wx%MhLVvti8W-c-Ix=s}DW&^@y6} zCv8R_r5H*{t|yJH>2_YZt7_iQx+~jl`ocm(<_;i1`!44@Y`N7{e_!ps9F#4>w6RUS zJ*L(~7Ddh8;b}+Tm!S+|#>{m#i^6`pH6fp0u(&{6;Nd3}YMG<>DQUV&3+41v=e1<> z(4AT_ICa@okoK&cXQzB!A?I4-0|dpwlVcZfn-bL?an|kNgY8sp!KIgv6&D%X*SkbP zNh*RF^0BD=llcCQvel$xJ#8XRduN3%lj0&L`iClNzUrYLLs`1ea%tqH#Wf@*6KW|h zN`1C0DDIe3FET3FCjUl^J6&i=I=r6p;YO>oR%YMtlz3OteGp2KRah+*1rF!Bzg%9D z^{$bnc0>H`DWsAqqnMnrpbhfMv}*=gbQtsAT&1E!O-Q;zR=x*%LuD%l9WzXcN;;mx z5!t5;vF_zrr^cOoqxm>3JQ!G(EVHEsTW-rYa=A-;6F&twDCL=5@;Ic-#%-P)^*cDh z{u*De{DS^((z&~aW3U<)03d`K008~Jkha&uUAR%l^9nXWn4u!4y2EjO`lB zvAyLkc*-X)W<0#j_}^`k3#n`{X4PKCkjKEb=kMT-jj}f{mIr@#M_&SlFGYf0~! zVD~nYs^FQ7LrSh$bELp_u#JB1y`(z+?8Ynz9LM8mf3?Q=aA$shgWG6zNF^O6~z-jaD=1rUTUvXOg-!g$dcCoUa#LI5_*jj#`XbEm zn!-&lFIUD)nAse{u5LH6TKL&*K^?6l8z?4fB0>@rY0z+8X#KT1;aZqE(XbVBZY)~J2_(r5;H6d8_H3BUo{!Y?R-y;w9Mjd-q57&dgV- z#d6+~3;6ugd2%ivFWc^pKjY4tWPs_y7@7Q&>0v=kEOOShFC{D3mbBHE8q#l;so^x+V-Y^l8ElQwMad?yDn8KIRv0f0Y~&`@oeU3NYW)al9@rE(`VX~ zUi#~I@zjcV5ofW8J}{19XOIj$CK{vxaECIWfw91Mh9;;G6o+%UX~lu-U$aNK>820F z!8F7UrAo~I%=g%+4Kk>C7b>!cuk7yIK5Ah0Y-@LaFD8P3LQyZ$xa+e47FRf@gKYQ>9K!&K0_@XqG)f~^2k#1M#wt4%(}sx zzI*{$EG2Xt-{>?PVhKutkh^}{|MAdMor$U0FADKCsb)l+fW+_`n%!N1QC2JFB!^g* zm1jyhp|uQKaJ1i1<^U?>4Ha`ShC$u~A`}@bHht>ll*H0JOTTIS2i~U_IKgm@{vqWk ztzz%UfW+m>oAB~E`;OiF`&SuWp6mCF-&#F_)dpnQzu*eEdFRBJcC?K-{x4?{xW4+0 zxrk4JFbt!1Eh&vFLZ~RhW7~Q)!4Aw%9l!dS*`RijaX=^qHg>9y&9!H)aIp z+G?;1kz(aB%_N6UPk6{vQRFsZZ1Cdw3unsl-vtCd&V87<_ngG}upbkVBFdgj<_9>1 zZHep`Y^);R%*>Y!F!c+iF=2%g-xzh#0C2=0bg0obZRM0)_wf8|QcD`y@hF6N{s_es zXM|@r=12-%zl(j%wE_i0Oi48{oDv{gNro&TpIJed6=PVi)vC#<%GfAn>-wn%lc ztA1}Pi8fTAvFf;M@(elzmOYq147K1ouFRe&6u3m)-jNPFKf)=&2My&^6_)}?2(7yu zl0R*NU#sH2CtE|@avl79MRwF29k+45a4Q(WN7ix@A#A&OB32N#xIs{S&BA$Ny_VOm zrTgQ|TbP^-i;>aBmza+`)|+*BM6%i zts~D7d~3z}L(u9mgj4ZUbL`38Zng>4l~%I#7Ccwl&2i=iY)egp4hCT0oC;A6R>tnC z6(yl~9%SlO{FQUAHp7Ry%_~&x>k-(+r!eiMU^h*1d+aE3hG+qG7_*Um3Ro!j#0~l% zI<)dDYUuelYb`%#T~wk%aJ8An{1vki&E_?yc4)3DgO2USmB zwMDhfhpDH-@z2phvDDqJ^M$UC#4LkykbF8ZM@$I;bO4Ec4Hm6Ffm)F zeq~UOa{=b@pAn)pun;c}0+Y}_b>V&+LeumBKrozRHWfxGgPKk-{@g1#_4QUQxwt%8 zU4bAgXn5Z)1<$F~(kD`B-tEmggfgwLklB1as$VpYY&|hHk4z^I{6uu}$PCHT)%zoL zQH}4R?tp~1`sjHRp(4e4?FI7oKSXa6Vyt9@Hl7c0fa~-84Py(SlS7q;s>lZvu_v0l zw3fJyv|fKF!$@-bb?;NqO9HZ)p1HtHL=hGmO2%(MO&i=pU=i@nC)`#y(=hKdR&Nc7 z;s;BZNxAjLpwDYwpY@<@On}kp$c7IQ%f2^l9_|kg*s|Z&TzQsp-E5NtAl)S4fh(fr zz$P7AW%MC~3{d`PPP8Dj!Tl^@s99ZMf=UUz7Vw}Md^WVyRLWPnjMkg$tzcSSHLg?; zI9;P*GKrcBQp2^hrb+4Ly`tmwtMoxHyuZAKrG;(kf99BRac! z=KT_O`_e?CW+j#wH+gB)zc*aTGjlN0{kg zi*u-h{7H3_VdU^&dfLs43H=#ATV8+98XO;A7q{XLgVsq0+tM$M;W#xon2rLMTS%rp zKlbK|tzpWnZb_>=t;c2brCI<*xVpXZdG5O1g1u>b^`3nu*V{^q&cT9FzUcvjPc}Q& zXL0V!VX>;>-btB7CKsE&uGXMHG@5QxtcbdYd-=K83)x?hg>|?*LVMyR_zRke9YQnb zG2KRE?f07ByBocxDM=Po>hz2SXT_wTuB?c4XUqb{*fO@#M2ON?4qh>XzGag{2SMvX zXVT{C{@o#_l-_03RQ>W z1q)aH#Rk-k>96l43yk7Cu_(-{zOw1$XipR9${hG`WMszU%d64J^RqwR$LsR=@fN0l z!S`cIu1lo}EBwtuZdtQBTQxhO8X_XScwd#G(<**_jKwITAAUC%GOE&#os-t{ z;sO>*cmayN>T>r3>!e+!4`l-1=oLpQV^&~<5BvH9-0PCs;)&>(5!s0MI69SU-ex84U|uG3RQ!DvaK=OgymEGr4GhpU1KB^U2E9 zcECNw`WGTu>PvK^nFn~Al0K5!<$m?m=h+uVRyj^9d|75UVVHi^B}0J!YD&9p z^+|FN9J`?>^({hegxZ6HA|f};u8vRIH*?F zu>zra#avW$WZqw0C0`Q9UXj|lGN-PDCXb!-IhEBjNK=cJ7yoCI&)3b>H#+w2tk} zH`xHAcbE$CVLSbBak0iT0%nvvpCx9Mmuamw?!(DuQsoJ~%Vl*ZtUOPx+PbIf zt?R|yf_Um=ps4X$ zNC5)^Zp&5?#4HO%22G?>eXL1%-P(A8q{97r_~&)zj&xjg;p&k=)0#NZ>D%@rOR}vmRsHhHqO@Ov&|Bw zc5ovyqpLWyLxgtl6aO{zJd5kKBYvPxuJmNGPJ2l)$gvh4gdQa`LugGO&Rihzh@<+F zn=I{U5W)qwSiddNsQ?xg6k7(8HeKk8h%W6t6f@FvUurlNwsvxUl=%Je=H=q!WPADg zD~$?)11geEo*F%6s_)s_1%sqln`dfw2LI&!nZ_C?Y}6q!JK=igZ^;|&CmznGwZLTJ z>edyLBNZ%>sf^KB1GiaT8{lVed-Uy`8!O4=h(ERM$cAVTBB^nsW|Cy3su0l2k>ezY z#q6Qc02N^|fmLM%1Ld=o5+fYeXp)BDo?1gB2*Ejr3Kb8@>1iC-*Q8y4o?)p1;StI8 z1t$lKL}GDy#R{)f#b;R&{VXa~R^YKmrG`$SF56r-gd;Q|pYY`F9zj>yS-vhyMw)*Zs9a$Pk6o12=XKwkx^wdfe8N1K-E;EddGIQsbLk>q zs+dh=BG5+o@XN-We~Nyg<3T-iw~lsa^iA+72SA0Xfk#=b8;vE)kh2OX4>v0Fyg3k; znDBwKN_Eelti0Wa>DpW{vpJtF_vV~pyAP~)T?9oi4n{b!sdQC+7d@Ejnx&ER>L3&19n4-;{(+uRkuW)TR3NO5CW!iSnoy{8Fx881$fd0Noig*RUJIl^WPB$NrqyA{wf&9 z$w}LT8N&dooIbqC4!rrr%ZQXWRG&iaEc#z%^#8w7Nvh|1m_ zASjrIr?GlNO(Z9uekP~U;K)iuf78G=uHV#sCA;s$zIE60iC}|EW!CwhwswVHtZwQ#CC7wo)bff^Zv{hGG5kbO)*`6kgGUHPj zFSWh|*`BrWLW7+TWksoa#wZFj<&O$B;EJ>10SF3Noq^Qv+V^19Ui>@;Nw!a@KdYi` zK_6;o?^J|2aCjSP0lXoAL90*B_~5H@O9M{Uq|F3ccMlR|>yesG65#g*RG^CUf2Y$;#4zWEkULjLF(c6Q6eC@lKC6^+1eyy?=oQ_X6tB z#i&o;B#NR9C|Z-cRt`D5U8F!jZB`AW@72cq4SmHm$@n4Xk|7zEP5+j%{$h~jnjypU z`E4cE6NbL<4Ggd=n1x2o&{-i|Eas#x?uSYDb6G3&7Ao zQ6q>Tv<#pzG#Hojri1CsEwni1vyq7 zoU5}bz=pLP!9`L2ntWZVeQFyW@sf7dd{8uxvaAkx3C~F=-TT66;|rLrIUWr`S}dG91*BXj21Wf8d;u|0>5Zun zz$Gi-9=RJ6V4FUP{$K$+-j-qCr67mW(50r;VcAEV0d<%e`Nf95zMXYP0Z&UAAr8wq5m=ZQI5!+r}>2w%Mm2`k^E4&4>I6 zD`u?BF-IIG>l!JBUQ{>|7mh@a<0hL}j<}8Y_QBbb{MM1tsU)%tP)Z7Aos4sML@G1{3 zyq}imrgQPG-qQv)FnbQdeF=0&H<`l*2U`o}5N!z6(kgtilm{Ig;PdX}5E(nqRYKx* z(`h3P>4BBCQDBn>COan{t6416OjGBm2cnKwq|k-_K7WgkeCWlM?5ng>Vnk23fiow;$nZd$a zO%)mlRBaPp`+ta0d^v8Ks@tzG(7?dJ=Md*N_9eLgUFQs`H}(lPH{$0v|DCLN{QO&= zo`4!Hi~3KO`qsHTWbJ2B*jcI&?d^AcO5)L*4rgs`y>d?iDo<|?OZlYq?e&_Ewl_QTl zo4^q;q6}4=4a~W7#0@^Y9m8sC^Pwb*Kxh$S2MGQjlS!e+r1lpJ%B*4dw|mm-gDJ0Z zShETI^;`yYN?Mcc;T6@^^0ayLjv=l1<0(Fdzwo;ryWOwphzf{^k(_w1h;;F<<(JXXHr2ugnwMK@ zVSTRlw;M!TIkR>48#|)Ajyt;&d_?-Wc_;+ed6Nq6!hJp#F(Sec_FLQm?0sL~I*ypD)8uO*78-enwd{6BagVuUedsl!PQUD9aYiDE^FM7^t*q+UL( zV8OpWu;{pntT3S0r;ENEd%G9HW9IzIz~eBoUS2!>e3iPN8o0oB+akL}bMtp@YFQ3O zW7K#f;z^5tlzd&|teki5ydQ5KcaxZ0aZ1^SH;!`KcgX;ry)DGG0Y{)cy}emGFvR@0 z3AaC1`u%#jr+3l@48NZZF{=2fRZTuFvqR5IZ;JclW~tfFRck8TY0WsIJTwRI*GG&s zdrZtHW|P?{PY1ei+l(_}5Z=6-|l>>B>v&Xo{Q8 zjZ%0Fs&}D^Y%~$h0-dasR9=bT;B*NGgN2*VRx!-+jDD@S8*Q{Wln9IyIn2A&+3aJ4?Q7O}6zuI(C^5QnC=dGCC=N+8lXa;nkEEVYK6T*paZv7hx%a7Pu%}pN)1cCPL=n8qscUY7 zM}U6kgG*#FPJpvn-&=Cw!v|qYbfH@ZdxFq3+IxH9omv~zUa4&AcHlaOVIW~*OPacv~OBG?=W==k$;%3Id3X=&c7?BeqJJPA_ z;*Ph6BpF-;7rK*^6>*pIYTXAGbbJX5OAn_;1=ig-i>2ks)HKy=*lIwb9?v;ON;DTi zuFM~z1=r2G?_>}#7hjI*qW%|#99bqh93E+J$bZO$o^+F&lwDNFKS9MCyP&^pbc8apV(d+;I%ZSYX@k`qAuX;cJPeFiS$>loZ1#2Gc&( z=zp#;?70ujlw#j>!NX^f0^pjGL^CH5;lvy%j6NS(bV;%Ay5JGAOhn=yMU}-krx5YP z92xXKUjd>0&BTcA*_bHQGo}U+Q6Vu`x6NTo8E5tcfMT&&oblXqiY!^0tBd8Zb&fOJ z0zwo_+Z&W^#LI{xnHI*GSpcAHO`8o|c|U~+CMrG{EA}~T$>Yo%08qZB%?hr(fkFh- zC0Gn~N5NeU0BF)$S|Kr^iVC>8I>lBCTuu)E$RS>bgD#^Lt=<%h#jt*PexpS4U^qyt z@<6M%zRligws~i)6ieP~f=1zANmgDY&)bjt4+4K#B({!UFiNWrU-+MQ6cePqTL|y3 z#=SXPIB8EIU?G=pE*~XbA_!bPkyELx#lT(O9hZ}S3!;!CT;kuLe1v~xZPbv)G(TOS z^|p}!_`@&y$6#SQW{Lo5HX0;1+brWd8r;lD1ctmcU)J3PB}Mg04$kaM9`H1qIa7RF zb#3u%9ARhm?e(r${TY+#Rh`_BD~u%yT7wX`zI@~{d2j5Gk-U0)WV$a?!6UJkm^#wB zhbs>6+3d82qr*;l>XV&UJ0U&yG1rBv3d zX*Q%R{#8TE=J~5HNDGsD9&}bMcs}&ktKo^pFi~kH^Sg|SznkZF^gUeb1y=x#l$;rX zy6?qRrqh6yPXLjirT)tkYK(xJ#vsH>gEKBNic_ar3$(G?0r7PZ9| zwI&v|hZeP{uomoPEA<*?wM$`1=D8e{I`UxPZTQuvuJlap9)G^KHL>x|Flj$KvJK|o z#5+0zZorDSx;kEFK=Jj-@qB{a=mwMJx3aVB%(bPk%`JFOVQzB52;SkepUm@uIJv#)d8rvzy8!;w zh!e_oUt>M~For1S$Q5vYIN|{7pE{;*;ng$%d-;CLVf0gEw5L0W4ha&0_wpFo)kOGf zvPOq_mZ6rUG`y(#;{D+{Uv;lsf>qWAA~6a}Kqd;5ff=--$dL}#O*70UeCkNv!BGNd zXo`p7)?vgNq-K+hDgeH7903+@PUZxc1R2}N!4qfPB`X*aex}j#>lp+R1%f;j;QmN- zZqC`&iEy|7PW+(;eD?2anecMBj|OEHhrq)PW_tK_>Lj&h2E`t3*9GWLJVlQTB?)IOp36 zIm98KX|_WimVtm13HsqqTY_mBd;H(049KYuPv-E=Uo+lia8oF+Uyu6^<^#0+2&YApUibPTDbqmMkkLEgRmiuC&|CB8h`UFd}HO zO=(Ms8IN|iz+`OVO5MJNp-6C&3BM7V;CfXZ@>Sq#Ge!7Y)8Q8QL?kg8n1Fwa(|hov z?OUk{&O`NoYDz*46vu{5rSb8Ad#FBNVzP9kua|{^(v!zgB_OG>Ck>@|-~W0*005Eq zhx9;2+21eH!$*o97K z8tq1Im_OGIOG*MZkCi3Y(SC9|v2aI)CELLH^9|K+pF2h_Cly_DnK!MZCxx>9syqU6 zQIB5)N5kE%nblv}Gk~_(;7bKDt+>J4^K;JK$IUv43V8&a1PUxmk|tLK!j!P?fjSII zVwi}C#d$3VkMd0iw^@z|93}Zu27hy&%yPof+%Q$Q4ZNAIu+F5Vk z2vp=quxohD1#eYI-<$1-2%B5;$m(^4xdjl2A2H0(ivXSNRuUi1tAMBAvUffB4=jW( z%eLZOa6f1Rc&KVXoPCnLM!hbjzrUXx+6+elLSn6Y)Xow$v8CUfdnYXdE_C#wj4W08 zAT__B(d7d}-OdY@?BADXDK}e}_#O$2Cx=9<9$;RUr&dZ6{@FgV{<#O)FV2sIlgAfs>Bl#mI(Y;%R!11b;Ik<;MQ~z( z#QK}FS34eommY|B`P;@@i#xli$qtruHvF|q*6Vn;Vf;6#k}Hcdl}M=NBoB>`umwfKxXaHe1uUoW@bm2IiF`!Q!E21}mycTc5A1a)1N8OVfsZJMEGbBc zH}%d#wQ03}D8Mu%GkQmt)_@@1#>`|g4+MGzK7`{hgBN%dPZb0#MY;Z}35J|GdE5>< zd0au`mc{=09a9-0*W#T!vzeD_jwyTM9t_sh7sr)=aRF6dz&fwhxoH z<$yXj2@?x~{Qh=}>OJc}DbK9gR3BcUs~o&~iTWtgia)8p?%oRS`;vj~meX5Pua5Tu z3_qv>g`vR5TF9<}kH}yBfFZ@!+xLpLc=t1Eu0=RK|J9_^{NrN7X9?&IHO*-5!MEsO zU!jMWcaHK@y1JBoh48*N{Ay0lw1nsoHc_JYc*zfgEbzh6!tcAI!mP|euU`fdcGNHr z;p&XNiOtUO!+8CJzT@0UoCrOpL6y-c@?miD;b+R>0kTm5`8C>9|x4gnB@fE|zUjfFoM9at1(K@x39B4T<|fM`M?VoDrsNGxJX9&H%=9oA(J zFmEhvn<-E$c*-Tgj^xijq z6h|DN66C1Yval8j^0j3o*zbYw^)8ZSZ*r*zA+#VEs{SX+FDT@pK_ak6d+4qEpR~yK zVU01Cqh<>@Gc_V~YVQ3Zr~oD$2$12o+fJxU7K|p{MG)OuFxWC;;0Lne0#GVSLjdR% z`R`Rw;5Q_x09@P@#|%>Ql0)&Ip?tM3CNPFiHi>C@9dRF>d2pmYECchqHp6|%zS5sa z-pPhUS|{@V<~LPa`Znb1Od093s(s zRR6t}Tw^%7b97wgw%oRb_FR_OlU7t_F>gVZeWH#U`~~odH3IkZG_7 zH_r)ONCb2EJB2juc87Fd5ng8dM`Qrl=^?@NZ5}1Z zF|jS*DJ{q&NqSI@@4BPG$4Gsup~HOcw#7FpH$k> zSYm_akS?2LRSq}K=|JIStxeXYR6t3Kb4T?C2kz$jGL@1&g1!DcqW2v)>!ON+@vZOk z!}Z89!~~8&pP`YuA0o5Wdw>Gb5t&2g+aa3*RXYhs;(1N2Iik(wwf5{p0+hHsEN_Vi z{D12eQq@?SrEiWemQKdTf- zJ@ErvJ)Q#^cIW}m2oA!RfuZ#CoVT8?d5`1t_fhl_x!>R#IfkB>a_scOT;ptzb-WKz z@!xXW^zVOFo~J#xW0bUvtg&j|;N{IN%EHm9s+U|eIQ3!9d8Oe>^(z6vP`DL2avcfw ze!iJCDu`~jCJ^)arcdaYraPJF=f3Swv}4NdxR)$!2e_FL%g0ov^~h;M&T`Zb;bgkT zR?zP+qZBA`G;dB4e{x>OSl*0n6Ph!XMR^5#>bDgH$JvOE$njq;8VR=2_XC`ziq~5sc%*Zd%y`G^9DaIv zvr$BfOyNkoNo8>7)03!lnUg@RXb|Y8K;p(=_)E>Fa>0Bf2LfS8>AnL;t78OjR0GLd z$wyEW10l)s*3!7@8RJZu3_Qpz1D?dlqY^ha!PFI#dCZx_@#2qil6WS6T9wA$l|P_k z<+0;+djeIeL?@M||0;pd+v=NoUrl{$m^gtsw>;PxxhV^#B~&FuMgNN_Ca)xCM`gwk zc>jkP9z-POa|@Cm8PMvs)ql!(J3b z7RV5GedF%*tlTvgp?EyI18iyMPr`3WCO4H#SELN2IFXJg8EOZwoR4)tnj(RwYLHZw zXOe{fjy4PVgaK!GUZUTu5LVr^W&6X`OoLk8$)B?eoa%Cd!XY?48Wq^oh)F34Y@Ax#BL; znS~$88ltkI6PzzQ9n_AfDJU-$9N%~x_=9Lp4wuWdf<*ZBt`|xO%&5tiKWpjeh2`Ou ztdWPCbnQb6gsWS;Y+hh^ip5d&$WAikdi-`9rG697pm~$4_v=P{GfWS;R|KJjf~jIk zz*U%NjPzW0R%WSWF&fg7ew;cWPV*sQBCk!IkE4dX-3NJQkxAA(up7*4Sv=b>X%>N{ z`gMEE92t7&*iyyoITHu3S?$lDq&R?7W$^fG7~4y#)vEE1y7QDu)e69Igr)RqnRIhw zZ1yjq+zcTXRs6M=G43o)qZG=NdXXJg?J~q3xiw@N;daPj+txJZkB)`-IgSJrKzv!B z;c!a-E0fK(Q*`oa*EF3s1Y0L84~;;NMEMQfuNtERAa%035n8Pmc3MmM=U>%jbQ1y> z7x`Zvh3G$!$Hsmk$>qMH1`=Ph*R_I};_|@Bba2yAl2e_CVr9WNgX4BPRc6X)TPJyNMn6bcOD(ww$e|@oo!ArGf9i2gbzRgLw&Z1{4FY<2M^q`$%xTxJE_sKf z*(eHI`ijzj!UdrQtTRG?>NAW-WRDxxYRXX^7T~V2~9&O8GDm_yFtW;?#Jr5YUD ziuW3Chbi;b=L+YJ$WhrBSKs^qXJx6!-4vw98EqdD^+r0lvc$18m|Qs%EE3awj;`A@P3~j z&Evk?#tlJczUh@D%xH-+kTdK{a5SVr`cf<8aq8jSfEgpnu!z3?^uVDMb-QohDlM|RsiZ9*hJU}W)NCQ0-$_IrsugTCi-ga_2vsKh)sL#GF+ zbY#uxuk2hxdSm<%+GGu5MVnm0KgF)8Z1J~I`@a$*+fMS-d+wYoUs=sD^yaJ>cE!4=y6ff+oP}4M6cg774SzO6c*F`T&;8I-MGm!vNm=c zr#kGQ721@B?+hcn0bb+BoA#h^OlwwwDkYevEK_chr=8fR4RnAlS&436)^%^mZ@)RM z2L(H3p#&BT&cWiG%Xza`=;!IzI$xRNao-uDw==XIB!0j8O0m+u&Sq&|8v>qE7IC@B z>UVeZ&J`I_ey|nS`rZVd+QoG_&Qfakj8V?&7EgO@R*U=8dpX*RDL}F`nmzOT%4X!k zN?m8$*6w}%A=H)UqdTg{xH%*CvF22biIw0mr}i1~3lBoa1`p~dX_ z?nO>Iq;FerC`G6q-UO|K;>MQ4B`!P@fc%tDr}ING-!xV@&*!c<;CGqGRqyMF?Nu9D z2im%wRFG${O$6rtU?^JKqr$_fp;^nNt|sM0&d_q*eIe5grJZyjrk&jB)#2bSFKg_f zQ!QDS#?Pwr!VJJaU#PR#_IFm^G*-^V_;Xkn2$PnO|T1ws3>GB#G z;xqHbW=6ZLZss0TPa+^7epoGUJkCPjggg@Y2*nXCYs1%Mw7SZeyMUJ(NQ3=02+e zEPnI72v=nsBcZko}VBE!$FP&Rilt2ndAkD zzgXZY6D7Zc@NN}=w3P#~&;^Zw$Up=K6DGF41xulRQKL8z*qR_583ZYSOicyDL67ni z(4Z8J2FMvIGQ^FI7J!K1kHUAWQ7ec~d_XaEfzy!VqJc3WT1LW@%d^u!d#b0WY6 zNmNvhmjfYxXfUZ3nNID(uj8hHBwRqjaM&{8Xptrbxqy)oMe&hX1-F2LUV!HX1gEHe zVJL9KW62}ZCE3CxP$J8RGheoi0!lTEXGt}Hh2f##iCO~ZfrSyFK#5`knT&qq>@j#m z?14>b_dO8+rt*f#{r96TpaY;_j7YwMcc8>Tp?l1Kp9|gm6A&jxKizJA+IU6>w3~IW zS@VXny-PduYZc4m(G7Sf4^3qbN2W4=4QD~tUbh`keWTe*5ND-8ps5kQTq`W>qAI{? zFWMhJs%oVztQ5`gIaT<@HrDa;`WP$dH!r!)=D5E2#Fi4NkG-jv{d6jO^xv-2UGAGy zedtp6)At#V?W^7BKb!iOug@MEkUTgcS)~(L&$1CN0<0;REGOkbDv{?5y3GF()LVOK z)m|WyTU2i@GvyGLeDsXIX(K2&25RdVsrU*$g2Zp1FSci5-oxtL$UIbrac4(~ZFia8l(D2Y_1+8K5LWo zBnDmoC9)Pw5w^SqbiK;Q;O5!#6ClYJ_!mSn8*qt9UgS2%7qo^#Q7(-Zeyr}+UR6Su z?O}N;{W~A=Vgrwpq({*Va%k^TECqvwJ53j(7M&&5CeaW-ZrncQgAn@kd<5$G@I)KI7M`xMrw`1H|bwrVm~ysgLJ5Fgv~0Tv*3IXbHM zyVH|}aB?n-{lUR(G;PaqSwK*_=kZDLdOoUn-i^RjLBMuU`>nDQ1lc#GF&eHnqK4bH z#uHUloU#=4pI98HKKPOU+XJafkDGEk3&QwV%Igk-KxLlTPmRe*)0yY3D@qR!$L=s| zXYBz{Z+z~D{{vS3#5!VSd@HK573S_k13uvEaEOn2`>P>WVC4_`a_1H8_K>Z^Z?Bt>n&xB-131(n4? zY8pM${TRNCORS$xI#`a7Y)Yxu-LtU|E}$mLZ?km5;YtWIQ$F_ut1Fcrc-yfuJVv2oKwKMjVMbI zy|tiLQjK2tx}N{|KG%eE1!aRtvx&0So@7Wr>g`S0Y+9x?gJ*LEZC5_bja;teSE567 zKLruH%3qM$mq_$amyT{LJ6B7yQapAR;Cdu9;pWOpa0sZ{Y95V2Nr}Q(8>DM9w5~V-> zJtF!`!z0KcGJ^NcY2XljXK<=;TSCbbzPoKXx{$*S=u^4C5nIo}H>|E#hvLq`ev zxcHq$_!ZV_Wh;FZGS(v`lvr`gOR`T4EkjNa`YUqS)*Q&Zz=xBog3%LC2ZTKY4>rY=?mF$NHZKXQrryYm}!o`+>5{(8MGB5XX0%hwka+s#twGc&2>H&*m?I$KF zmW|>kZ1L>m?irSA6e}z|VpaCN3VE+O8j{>@0qGg%t^_BBU-m(*v&GdS-yfYx7l$5u zoju3e4X$03I^S4Ak0_^F+i7_&yo)WvX6wb2cnVGU-}{+DHKjyoAw~aRs{fQ-mgfx5 z=85J2zYjM($qO5$bqG(ym8w(I>(ViVy8Y_OE5GPBt0BULy7PCYHVBlSiG3RbDVc?( zXw4_r)%86xdTkm;m{J@>bnuPV5<!YvA4P z>qA`BrZK874?A(TFAt)tPqNGxWmr4!*ka4yZ0wznUEtNZ@;~Z;$hWm+*dW<83^d*f z*)|*PMVYNV$yNI5HyjC=wlKi}WlvuZe$+uqxbxC9y{)A@|K<+Wtv=9PwYxW6T|qr8 zEG~OE<63kB>;3n1^0dFlv;~y}{0EE|s)7cK^ONz3xYyw_-}sv5dQfbV@91Wz2GL(H z*<0!!1X!T~sd?g7T@cVM9iVCDSK?iILs^c&MQ1sfouJ(s75#DVA3M`Ak2ZK_LGVfg zk5X|)jx=m=Wye4G8NaJ>_QXhflvFVJUxC!dX%q#|xBXpx`=vv+wtg#F^C*84BZ*F> z5PK@@-J&<@DX`7oMfPE&llAV#(}^^XAqeLrpQ+n~BV_!z+Vv)ZBjh(O zXEN)IGqkCpWLd9e!8Y}&l-IS^Hgaq~XDWM`RpI2qxbTJ}jSPXCa+SNRVuI3A#csT- z<~@N4xOjMso-Z&~EZ_3`peQys$Ym)c7D=AB=|AG*m%83oFL1a;%>Q*?^Nm-ukB|0} z{F||y&Y+U9=$kSeQL61uDO%~Yn_F(ZRH{~bo7`ONfZ_+S5w*+DfHTYB-+!3lDcjb# z%9?#>re2T1wLF#IKlOLdQHK4&8lj7*J9fv&hN`Py;rDx)OY42(rVi$q)n#|cVW)m7 z!$74wT zet+1t=ATDvG^a-1;6nbqe6$c1;AI4M z=u&kHAj*Rw0`ji6+db+erQX`CDOJf6O<3Jjb35o*O~%ZMKPie(oH)Tch!SKlXN`hLq(+RIDDb~nKC3sC8hIIeo~Q)1+Yk1S3Up;FbS*2h3O(im9Vv(;0-XUCS|lLq?GjR&>G1cv5gRZ>P;TPFBv zF`aL%VeXuRjlE5F1?_l3`K0GN;QYR(-2n0ck&a=%BE5Z7edL~`TC{dRz_4fXzkG&G z%s_ICXK@rbe5F7lxnEo+QVS<^EQ?f_R?j8?7Ex6|z7mjQddt@IOp_ zVn>?h+oq78r|u;00nZdb-=2GZA>6N5OFCZgb{_9{>whdX&wcpaiyd-n29GX-8zZPa zsT@03l&Z00JFo@Wfk*i!E5KO8LN;dXJPe!_E0Sg0jpbrE_cFZ#;Wo80TmWzt5t z<@r1M_Jel|3z~1ggr*#R4Dy{bWbY6MzHHb9zVc%B=OSho^vjyFaNYk%h(oGGnxnJ$ zRl4}fULfkLw_-thtg@)_m&O<+!?&@RI~p-u#LKW>nBNZjzV;@wsUh+k55hu~ zpI>)5q(bLjXOJW4y>umq@`#`JIq*h7JI`P)`Yznp|LXuBo4{}$K{DK{Q*NB(M?J*r zdFcrvX0Q|5HrUBH@D$wUAvo>%LYTN{ABuFJn~0jV<5Q*O^!>1o1k*}iuJnA@q}>Wg z;S2v0wcCp$ISQ|!aFqB>e#VJ0W9&@7T}IK#RVJZ!t(0YSS*O9Svdn!WIl<<#VPo$X zU7!Xfkux*x-g}Q+z0s)V`hBr~hfcoq_i)Y7R09HS6+5fcT3qmC?gEok)DnkO5`|VW z2$@Dx+jv0_hyOywn(Sq+FTaGS_|Se-@;#_Zsh>``_6^0NgoQ@#wRL+p~v}ca+*8t>cRB- zF-gnoJY%=dq_)U2?XHXpXX|Mt`GMSu9`pW%a+a|Xu7HToHIcCP1^N@C?_07@BLB5% z()|KeCsvEc&r^EXhQr{mMqR88kw1KR14eJ_2h%)_)Ax27W_R`zB)+^+94P_^>=sh2~M{lp&Ft%70NKAqRTLBoR+tf&gu%=NK8 z9y15-TY%^9O%eTLLEkqKZ*c-6QnSybnIp>8j>FMj)VM?~($LjZSmD`cJM=<8^3rS& zXlzLT^9`|syrY+>7|~pkOC9XvOK<+w)`_)=zVMOY~4?H#4u z#4J7k#zn7oc7^Wq%%##6Bi29O*Q^y{MEy4E{4rs;*Gtkya}&&i5)1A{8hCbBk0l!I z>=oKvKfw~rpeUEVxtAsyZh&wlat;0Io@4Gc)}D&?^hSHm6n8E(?qYf*mPhhfAf{4E zUinnaN^kYvS-;&$Ulk^8LfJj8WE)mcD*bz-PInXfZDq4uNkWefT!i2D5^HtN3znW`Eb%dRnp=h$j9X>&C)a_JEJKUaq3QrThc;6Ua}A2UiKhZNAHij{}mGYF*N= zaIodBq6(Fzcbi6b&QP_G%{1~dD(c7NWenC$P0HH(lSls4^y;FVfeS%O>v(iwrbh#Hu2{-iMIE#|;{DyyQ&H`+OR zr^VsyM&wUwFb7iiU4tobOH3Q9r%Gj*Kl=wq5RzDbvAGHaA<&wB&QHSTgjUw?|z~AqxHsZ(`M0aTk88 z>~A%_xIjSarn$d+jKTm10t3VCFoK64&UMFv9}KdZGOWn%XUw2CX*683?1Ke)+{Kcx zE_);@kEoRPQjrR`-n@gzNuO}=vt8~D{fK_n3 zb;s)VjmH#=MiaWWiLfgK`JADF*HHEIg9m1NgTvewjmQP{QOoxMHHQH4BHQ4bZkF2?`NV-2sQa27tpA6o8?bmb*}c1%LF7M@Nu#8A{iN zlCt70jWn46H(?NMe%TP|UqMvQ#JNvGO<#U_JhJRTRj>l4!XQ0ug|F@P1^k4@kHO&Y zU_b?^=)vKfz2X7D1`NSH``vUH1J5;kQu*0i#p5oN-qOaV|83nH##}=rM}?rugaLY6 z=6V--HMAjI4hFy!Nos8@->LUewkD#DkZu|13k710V`An>oq!pCaJO!3l~Tk zk84gE40J~iC%nL?9w{*(am#NmfV@Zsr7I#_oW;N#0Xe~Ab8Yt!F?>|3c z_Qufn2B)>22<})G{TKhS`tK78DpFbiOH#%3ZJJ%bG5e*hq_trnoi)oxy@L7n#U&_o z7rz{&0Y(#{b27gZZS!Jrqvp-4qC@BI@CBgc89hc?zkR;l9CN?N+;Zav#v7t854)A> zeEr51HC}8Ruh^;vFKoBMwXJ?F_L((n9C1aO8dySyeW%eKFI&yIv+pb48uf_3XFGd4 z-e5)PQ|{4-0bk`mVh|Xsx%cBM5KfNN#G`h$wtpAgh@7+|J4K`)+EFVLar~cl_S|qp zz&mDCXF21)hJ)!!w4gUFw3~Z6%W=ppKG`O2EK1RHq#qMY(|n8dlyBLh&_D>zr7VK9 zdZ~Qcg3?-kQvWrUSh=_jyf+;8;e4!Mfkul!#%sHo(i-Y5F~G zGM~*sQa6y1#$4s6ZaM#kt`L(*`3WUSu{E$w`=Gu9dgEhXvpan*WaeG`iG&9T!Ca{= z=_WNbAvzc(J1Yl0@u!2XfW;Nn^L+%Sp%7hJc0Uwf!cr?Mz7{}LN2jk?VfQ3 z;Y9XeiInC`{ZW7;i2~nBVUmT%{Qw~aG4Nr6=`8Spl$hu5f#N1m=;1?nRN*<33Li>w zR5zfef>f%(C02V(>$`b>RB4B@746Lxm`MbG;Km85O@sx29^#Ey60a#+lm%Bz-7!tR zf^o1Z;j@XTUtBV3ZsrIsIEelN@%#5n&`E@TWU`1~kP`jkP?&soMMxXFqGmyjJLgkL zRT>MBEXyQ8!Y3aCM`08!14VHdnu0+XtBm@7r4UIG@X3mAbVX!AjH?9N!jIJ6e|M z9Q1ZrX|oNAFEUGXa*+%{8I`@hKVMZY7=?$2g|}7fg{O$h0s`X0%Nf}F-${-d*a8g< zN(gNH&*}3+dMoqx|CEk)EXwiLiF{>O9yCQ6(LYCr#AXdoipTFX8HAn7Jx$~XS(Z8T z@LRxhaEjv|vhHZ-ngtCuX-Df|H&5lY8t#Itv4%ilqB_1?qOnPE%4nqQ(s0U$kRU?X z5VqH8q^Jb7z23~fn-obUT>LCPy^OQtilOoN^RoXtM4buvy-}Bt8g4W(e}iVLV|DJn zcLO@MV2eefjFl@>E5?YQbxJ2aRJYW1_c)4`&M;P;9WI*$%W!Ksw$3pRplo+9P*mc! zdRn$8vbs;OKhWfF`pS*+cG}bLsLG^e8Os*g{;8aLvnwOps?=v)Xxz$h3fSNA-NUqI!rdQZT8jiUX&`?a0pA!kQH<$q%}ypiu*lEc-0F-#}_O94sRyY zdCsIL%)PVuvf9`@NI8VR0-NgJoOrtHHNEJlNuBX7Kq@{|P7I0i-yaWcUq>kVKBNuv zk8mOvg)6BcWa$B9E!)!{QR=||=B?Q;R{ziYrrJP$Afc)xA@f^p@ApnpczC$dFloU{ zMi3O=^zR3#A`?)ldG$@w_T6U_F9C1sob24{HP~8)Y6>mM_a>tv>mW%#OVGyHbv%6H zg~0nR4lZ#-&*`Sh!0KL~s^k?`usVB(#^U_AP?RUbFOm`vvG}-ogyYlG@F#f;W)(Hb z2dbLbu=E-h0kqU8^R-s%;hw_U*&3Z_-@1^~@Fx(PxwQ6uzGDFjkZMhtyQaf>A8(o0 zfm@5|0V(!{yy!sF@L&^5p7htSoYQQCsp0>H-I;^!25)0XeP`A!8oujzA@8iqUBKznBO4_6Ayg;Y`v>SfO` z-JM$~K$OPk;&-X5Lfs=flEc!IMxzUstA<}y+2JSRbx72%YJKrX7?jLXj^JkBXJaaI zlAErc}l8|g~BY=`iU4SEhN z|1kl0$Z2Oz`{`Rid|~mi;i;G zUVqwR;+5!rf=}OJmik(;nTX8`r{zgPH!BfW4RZwu8OyXjZv8ppA>I{V+js6T?6nv> zBn!>)R}<={kD@ryUc@yg!}nwx(8D0C9lhZGlW+2PrWDFuRpnpTX!q7k4-3yO`^wQx zhcT@EKpPSQ!=d+60m%aQ!vM)9o0^$RmlQhkLILpu12F(O0tNm7x&rP;nHZl=u{7T2 z&;^#FV)|w6PXLK2VF*xW;x>7aWW=#BWja2A&_-cb(kJV~tFr(&G4Uip40v>R;uyH= zkY|4B4hLUHLTZy0TRlFXiT#MCZ5^(mG+t@~e#Q+Ev|Z>6!=H;MMJTs;e_0{ih4l4( z5I6Az=xy)rx&DD*jryYSu{^p;(G!D$PwN@_VA4@4E zksY*d{_>7*_XE+<`CUu2xI{Qpi9+d95BB}+4o#Lxq>VaobiQAkh7+i`H2OH6G)m_TkGgUdVDKI>s zxAfzE&{@Cnfl>Q-y_*HduPDUJvAW(-Zln$#+ekw&s{!A5D{RQJHZ{Rc<6PWePijxM zL#0pE!MiP;vYnUi?wI1Hvi>9Yh?uIL@EaNxmwW41mV2A3o#LJLm*m?j42*WfdUaO5+ec^PHxKeOe{0<2{Q0QepI6kL z*zbZ~x0Xp?o&-X6Fe%ix^u7rWR7r&!Z8GjY9!`_?C_IeVl+eUDqo&%%r= z!fq3@s=8(vR5o>f>nhH2T4^D|L1Z)hM>Dtb{njl?F~c zpR=O_Do`x}#=p0BL%+Q#jSZs@eT-&YV)hmfQY{Dj8^0%6w-rB)h1zeV@zKJFt;yz! zjyxjb@zXNo0@$~W>q1%%JM!X2&cfmM%Nc_`)pFsMFRB#07NI9zjEZH|zzlrFz05ni z=$rzEJwT*OHc3268mZv{jETd)n?%oWr+n=7P!@kr$u*}}V=hw2MwYGh zpcktAqL1AW)hs_ESI<5oZ&%f8{tp04K(xPOw0>&{-#MVDai4DEaNOudFlD32SG1^A zr|>AVRFOeBIVFEsCbJ$oI@FX_ZG1O2>6{*OYAbZW?7aTv@n zp_gUS<=)h&#s2rj$^9zCM6 z==}SKKjPYexi4DJL6+| zlVsC9FSTSePxYgH!`F*hlN2JgYiORfKM0);8?Ih*o_aCTIk}JR#MOgEQB$uukyCK= z7ey#*oMJ?G+Ry^_O5UE|yTjXfrwxc^nz{%!n+y2o+J9tzcG4kI7mG*l3_lH|WSjYS`G zMELyu3bN7=tIfRjR)>eQ5%|ehoGMB!d*iF}K$0urob<VhRKw*NlZh^IKBacuv zJ%SA`{(`mcfwd0AS_ca)9fGSB5m+!7Suq@0F&bGh9$7KT4NYRj&d4pz8-=J4ufF>u zpM^wkXUg~XiD)$Bg)4oLrYIO{*j(>ar`q}F1+BT`#t`S z5Id7RY7mA>`tYCP^{+$(l*a#+9{-j6bjgG7i0!PyAuSbE2tM1L_y|YC35UZ|2VA0$ z4)bvS7LdP&Jhuu*1>{U&?{s6Bm01j?01UQo+{G<{e|h?mF(zpIet%bB5yP0e+&$z@ z{vE4u{ozTt!GNdg&1f~+h+P_H^KLr6u&EU!c z#wd}Ej*6Ujg`Irud2JI%f6Kq(>A&KbC}1E$*u!}J_NDkK1d69$7-Q%*j19_({sV}7 z;^PntYAPj=YEfaF!egjoRU%FIxZz21HHU|;{mlnmHWL4@dTjEb%}Tc_xIj{FAv3#mJQD z?~vcGI01OFS2T$S%E&WCoaKCA4rI~f5Vx#<2X_L6CziwmL*$tr&T=<%U5Jq>aqp0R zaNPSRGH*PI2ad=yJDlasFEC^=y+eXXWAR!MQtK=UxBtmzjV5#!(sWy;?50U{bs7ovBQVUi&pS^3V0*y z=Dkc;s9hzs(`qB!X8^*f1m?FAYtyY@mpmhVxN1jW_RpiGQ;M*AD*dVl{u zjq3FpncA4{@@d25`LB|*$~0P9Z(u(WBShuaZb6sFbUqaiX>{K!UQ*j+MsoBVN2^-Q zG}h|q?3Xc{4|N?!n;5`$t3O_Jo(#&mgZd)Bq1SPOACWwEUSb577yZXp-h^(ooCnQp zvG?AD&et2G8~F0i_%8Gued-0)yPOXZR;w=g&)ZXcFFkH_e~(rkL;Bht3oSNfPj*kc zfqswsZSN2s_PhQpko6wqVVZ2A)RWfF=ap2Qtx^y;?O14xaPhUoy+8C)X}~8uDC<_G z&RhSqblLIDEY_w++wArF>QKPf{4>+NyQO-auWQ~DoUhRUmr-4cLRFPgz%!r8$RcFL zGvKPE*E=f9L#9~TYCVzS1c&W-K=b|Es1AqNxHnJEUNYVAaZ__wGI-6`B2X>I2FBf^ zJZPhp1QSF)LPO<-ZV@)aWJM9>o<(u_OS*6#W@2Vg z(#p)Q>XN=)ZDxc}b^gZry#V19o14y>C7pG*Mw`Z|NY&HSy-`L*yliDvuTs6TQ@sRWSeNSEy}s{H^o>yEx0Wh<>Ic(inL*0Ltysk&8fZ zoN3k9o6zlPzGn3u-_GSjOJx(B7eO72{-zDmNQN;YZ_S7{*Sn}rCsX>n8&hlhJ= zle`e zs@etpDK1P0&6Mai%x+=ebLIy3-eN+%(0J+sQPlC+@@gtWW%7mYa7fMBl+oT0Xo8ME6W%#?;B zfJ2*%L;AcJhh*E|5|?@l7#@dU7a}e#KxFt|kc2sfc>`<%8X%U1Rmhp9KA1umAP&Jw z;m5+n3SLEVKuPfiepS?lB<}>k^gvs~(vMOVga9BEixeCDg*-0$3*r}suUNufKj;J4 zVYDEQ5$Ygjuv+|Quq767z8rsA6S6{zy@S<)utEj|LQ}{Bfgva za6n1xY65n{R<9fBqu|21wPdDBPnlm@H?+iBw;KdWCzSGaZ9K0!H+;sGFwqKf45=%B zwJlA$=l+%->g=2o#ZRaE=1I&jI5J2x-6SN z%vj(TCbym%F|{|h7p^&Sc|Rv1FiINXpLBc0E|T zHffb%`>$W<-?)^${*0+4;(A;aP?T?4;Obz)jeefD|^?px! ztwiGNU&Zh0Tv)L*|Fu5ToFPz9+Rd@|g5hmBAHOh#E?co()m*u4Q}J*hM9|!n$}zO! zv?%Xgu0ge`EC!R|M|d(BG}-r*YaoMe9qGQ5uSL-+xFb*5|?9S!zQ}l-sZlG!$}#%=5mFs($^SI zD<8qFSt3NePQt+2GRo1tao|k7qPBHX(v?SOErt^N=8h*&_$6iKX`BX#2|1^_s={KJ4aYAOJTnbt!s7$CJvu|vO&P2B% zbS;Q>y<5UsV4 zc!!Fg&Jjb3KZuK>>Td>`0gFWvcSJbPH5O4^3th(!&YS<3(U)r+{kWD-)lxpe8srMS zbZFJvm}#q)N}s!*B?t!nzGMTXMe+To1{nP~Zj@@NjzMIS3!nzxMwNyRD1iPLRsfUd zv_@=TAs?VYt_Or25WYY}0g?4NY4`T&y#hPWsROZEi)#y0nr{oUJYsVY??*Vx@kf4A zEBM&E5BhQJKzkP;{*AcG9{-hL3>! zG09|x{0V-B!b5z95(p|FsDYpXg7z2F3>}c^fnWfF5eOzF7C}o)%w5yK0<%10`UiZQ z^b(wEh`Oe*@LFWkD0IwSj}G%nAbo5v!EuMKyMUB_{RU6@4xRn^aKnP|Lp)Y^_?6=} zj5NBq_!H%Zg`Jpq>K!Vk(TtSpFKH?zRLaVK1+OyC zVe`?>7^}2;v?FDhk6B{baeF1N4F+B~nMTIk4 zaRJRYd*FV=RP6Ss0FQ?~mB8a^$;U}lA5&jRagT~EvQvHlx~FE1+mHp1{8>{e105j(qTX00~WPf~&{CqVJ1Bt6-txU1BsIb`oAepQCyn%(I+* ze?i4L@cWxj{UrEi?WS9(C0OZTwx&C-Hp+N;;5>Qp;sZQ7K31 zC^?yh$|VJv1^%J6$OM+l;;+ogJ82b;`b6#X2aBSUMf<`w;w+1smS?rHLu{RR8v^}A zZD-Kho;JR|Y~}mN=&-B#o#Oq;I@NN4e4Pguy!1nDzqSuP0q3)pw&vR{7Y7W6ToPWog=v3AaUFd3O)%I_HY|H)N2n_3hwWt0+UT(#+vI<9jjOIHu9MJZnmyyC#ycXq25s)m#}WoAy~6 zo4Vpx%ooBVdD-4ww&dY*_wa*qO`$@6Z8Acr9$?4X|l}K_IzBVNkBMZDdCsJ^-1`#x^4l=(B zbClUzH(v`GYEk?ZE`;8y%zE5I;^8Ec

kq)-fzvvv@tOzb2FsC=%YRz^ZgKP`Fxl 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

mp9+jvSFpf0yt&f?Q5|XESPf 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%0DsE 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¬U=k5rE3D!CB)R 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≧f2a&nNMx8AL+7JSl2JVZc=P1C%)k<7zsZqf_H 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 7723923..1073596 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,42 @@ -# Alfred Fakeum # +Alfred Fakeum +============= Generate fake test data in Alfred for testing. ![][demo] -## Download ## -Get the workflow from [GitHub][gh-releases] or [Packal][packal]. +Download & installation +----------------------- -## Usage ## +Download the workflow from [GitHub][gh-releases], then double-click to install. + +**Note**: Files with the extension `alfred3workflow` are not compatible with Alfred 2. + + +Usage +----- - `fake []` — List/filter available fake data types - `↩`, `⌘+C` or `⌘+NUM` — Copy one fake datum to clipboard - `⌘+↩` — Paste fake datum into frontmost app - `⇥` — Specify number of datasets to copy to clipboard - `⌘+L` — Show generated data in Alfred's Large Text window -- `fakeconfig []` — Activate and deactivate locales for fake data - - `↩` — Toggle selected locale on or off +- `fakeconfig []` — Edit workflow settings + - `An update is available` / `Check for update` — Check for and/or install an updated version of the workflow + - `Notifications` — Turn notifications on/off + - `↩` — Toggle on/off + - `Locales` — Turn locales for fake data on/off + - `↩` — Show & edit active locales + - `[]` — Filter locales + - `↩` — Toggle locale on/off + - `Documentation` — Open GitHub README in your browser + - `Report Problem` — Open the issue tracker in your brower + - `Get Help` — Open the workflow's thread on AlfredForum.com in your browser -If you specify multiple data, e.g. `fake Name ⟩ 10` for 10 names, the data -will be separated by newlines (`\n`). +If you specify multiple data, e.g. `fake Name ✕ 10` for 10 names, the data will be separated by newlines (`\n`). -In the case of `Paragraph` and `Address` types, the data will be separated -by two newlines (`\n\n`). +In the case of `Paragraph` and `Address` types, the data will be separated by two newlines (`\n\n`). ## Supported data types ## @@ -68,51 +82,84 @@ by two newlines (`\n\n`). -## Supported locales ## +Supported locales +----------------- **Note**: Not all locales support all data types. -- Bulgarian -- Czech +- English - German -- Danish -- Greek -- English (CA) -- English (GB) -- English (US) -- Spanish (ES) -- Spanish (MX) -- Persian -- Finnish +- Spanish - French -- Hindi -- Italian -- Korean -- Lithuanian -- Latvian +- Arabic +- Arabic (Egypt) +- Arabic (Jordan) +- Arabic (Palestine) +- Arabic (Saudi Arabia) +- Bosnian +- Bulgarian +- Chinese (China) +- Chinese (Taiwan) +- Croatian +- Czech +- Danish - Dutch +- Dutch (Belgium) +- English (Australia) +- English (Canada) +- English (Great Britain) +- English (Thailand) +- English (United States) +- Estonian +- Finnish +- French (Switzerland) +- Georgian +- German (Austria) +- Ghanaian +- Greek +- Hebrew +- Hindi +- Hungarian +- Indonesian +- Italian +- Japanese +- Korean +- Latin +- Latvian +- Lithuanian +- Nepali +- Norwegian +- Persian - Polish -- Portuguese (BR) +- Portuguese (Brazil) +- Portuguese (Portugal) - Russian +- Slovakian - Slovenian -- Chinese (CN) -- Chinese (TW) +- Spanish (Mexico) +- Spanish (Spain) +- Swedish +- Thai +- Turkish +- Ukranian -## Licensing, thanks ## -Icons are from [Font Awesome][font-awesome] ([SIL OFL 1.1 Licence][sil]). +Licensing, thanks +----------------- + +Icons are from [Font Awesome][font-awesome] and [Material Design Iconic Font](material-icons) (both [SIL OFL 1.1 Licence][sil]). Alfred Fakum uses the following libraries: -- [Faker][faker] ([licence][faker-licence]) +- [Faker][faker] ([MIT Licence][faker-licence]) - [docopt][docopt] ([MIT Licence][mit]) - [Alfred-Workflow][alfred-workflow] ([MIT Licence][mit]) -[gh-releases]: https://github.com/deanishe/alfred-fakeum/releases -[packal]: http://www.packal.org/workflow/fakeum +[gh-releases]: https://github.com/deanishe/alfred-fakeum/releases/latest [mit]: http://opensource.org/licenses/MIT [alfred-workflow]: http://www.deanishe.net/alfred-workflow/ [font-awesome]: http://fortawesome.github.io/Font-Awesome/ +[material-icons]: http://zavoloklom.github.io/material-design-iconic-font/ [docopt]: http://docopt.org/ [faker]: http://www.joke2k.net/faker/ [faker-licence]: https://github.com/joke2k/faker/blob/master/LICENSE.txt diff --git a/bin/example-data b/bin/example-data new file mode 100755 index 0000000..e1b067b --- /dev/null +++ b/bin/example-data @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2014 deanishe@deanishe.net +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2014-12-29 +# + +"""Print sample fake data to STDOUT.""" + +from __future__ import print_function, absolute_import + +import sys +import os + +sys.path.insert(0, os.path.abspath(os.path.dirname(__file__) + '/../src/libs')) +sys.path.insert(0, os.path.abspath(os.path.dirname(__file__) + '/../src')) + + +def main(): + """Print sample fake data.""" + from workflow import Workflow + import fakeum + + wf = Workflow() + fakeum.wf = wf + print('| Name | Example |') + print('|-- |--|') + for name in fakeum.FAKERS: + ex = fakeum.get_fake_datum(name) + print(u'| {} | {} |'.format(name, ex).encode('utf-8')) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/bin/icons b/bin/icons new file mode 100755 index 0000000..2e358ce --- /dev/null +++ b/bin/icons @@ -0,0 +1,137 @@ +#!/usr/bin/env zsh + +set -e + +# URL of icon generator +api="http://icons.deanishe.net/icon" +here="$( cd "$( dirname "$0" )"; pwd )" +root="$( cd "$here/../"; pwd )" +# where workflow icons belong +icondir="${root}/src/icons" +# icon config file +iconfile="${root}/icons.txt" + +prog="$( basename "$0" )" + +force=false +verbose=false +vopt= +icons=() + +# log ... | Echo arguments to STDERR +log() { + echo "$@" >&2 +} + +# info .. | Write args to STDERR if VERBOSE is true +info() { + $verbose && log $(print -P "%F{blue}..%f") "$@" + return 0 +} + +# success .. | Write green "ok" and args to STDERR if VERBOSE is true +success() { + $verbose && log $(print -P "%F{green}ok%f") "$@" + return 0 +} + +# error .. | Write red "error" and args to STDERR +error() { + log $(print -P '%F{red}error%f') "$@" +} + +# fail .. | Write red "error" and args to STDERR, then exit with status 1 +fail() { + error "$@" + exit 1 +} + +# load | Read configuration file from STDIN +load() { + typeset -g icons + while read line; do + + # ignore lines that start with # or are empty + [[ $line =~ "#" ]] || test -z "$line" && continue + + read fname font colour name <<< "$line" + icons+=($fname $font $colour $name) + + done +} + +usage() { +cat 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 +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2017-11-14 +# + +"""Common workflow variables and functions.""" + +from __future__ import print_function, absolute_import + +from collections import OrderedDict +import logging +import os +import subprocess + +from workflow import Variables + + +log = logging.getLogger('workflow') + + +# Default workflow settings +DEFAULT_SETTINGS = { + 'locales': [ + 'en', + 'de_DE', + 'es_ES', + 'fr_FR', + ], +} + +DOCS_URL = 'https://github.com/deanishe/alfred-fakeum/blob/master/README.md' +HELP_URL = 'https://www.alfredforum.com/topic/5319-fakeum-—-generate-fake-test-datasets-in-alfred/' +ISSUE_URL = 'https://github.com/deanishe/alfred-fakeum/issues' +UPDATE_SETTINGS = {'github_slug': 'deanishe/alfred-fakeum'} + +# Workflow icons +ICON_DOCS = 'icons/docs.png' +ICON_HELP = 'icons/help.png' +ICON_ISSUE = 'icons/issue.png' +ICON_ON = 'icons/on.png' +ICON_OFF = 'icons/off.png' +ICON_LOCALES = 'icons/locales.png' +ICON_UPDATE_CHECK = 'icons/update-check.png' +ICON_UPDATE_AVAILABLE = 'icons/update-available.png' + +# All locales supported by faker +ALL_LOCALES = OrderedDict(( + ('en', 'English'), + ('de_DE', 'German'), + ('es', 'Spanish'), + ('fr_FR', 'French'), + ('ar_AA', 'Arabic'), + ('ar_EG', 'Arabic (Egypt)'), + ('ar_JO', 'Arabic (Jordan)'), + ('ar_PS', 'Arabic (Palestine)'), + ('ar_SA', 'Arabic (Saudi Arabia)'), + ('bs_BA', 'Bosnian'), + ('bg_BG', 'Bulgarian'), + ('zh_CN', 'Chinese (China)'), + ('zh_TW', 'Chinese (Taiwan)'), + ('hr_HR', 'Croatian'), + ('cs_CZ', 'Czech'), + ('dk_DK', 'Danish'), + ('nl_NL', 'Dutch'), + ('nl_BE', 'Dutch (Belgium)'), + ('en_AU', 'English (Australia)'), + ('en_CA', 'English (Canada)'), + ('en_GB', 'English (Great Britain)'), + ('en_TH', 'English (Thailand)'), + ('en_US', 'English (United States)'), + ('et_EE', 'Estonian'), + ('fi_FI', 'Finnish'), + ('fr_CH', 'French (Switzerland)'), + ('ka_GE', 'Georgian'), + ('de_AT', 'German (Austria)'), + ('tw_GH', 'Ghanaian'), + ('el_GR', 'Greek'), + ('he_IL', 'Hebrew'), + ('hi_IN', 'Hindi'), + ('hu_HU', 'Hungarian'), + ('id_ID', 'Indonesian'), + ('it_IT', 'Italian'), + ('ja_JP', 'Japanese'), + ('ko_KR', 'Korean'), + ('la', 'Latin'), + ('lv_LV', 'Latvian'), + ('lt_LT', 'Lithuanian'), + ('ne_NP', 'Nepali'), + ('no_NO', 'Norwegian'), + ('fa_IR', 'Persian'), + ('pl_PL', 'Polish'), + ('pt_BR', 'Portuguese (Brazil)'), + ('pt_PT', 'Portuguese (Portugal)'), + ('ru_RU', 'Russian'), + ('sk_SK', 'Slovakian'), + ('sl_SI', 'Slovenian'), + ('es_MX', 'Spanish (Mexico)'), + ('es_ES', 'Spanish (Spain)'), + ('sv_SE', 'Swedish'), + ('th_TH', 'Thai'), + ('tr_TR', 'Turkish'), + ('uk_UA', 'Ukranian'), + )) + + +# Workflow's bundle IDs +BUNDLE_ID = os.getenv('alfred_workflow_bundleid') + +# Script Filter keyword +KEYWORD = os.getenv('keyword') + +# AppleScript to call an External Trigger +TRIGGER_AS = (u'tell application "Alfred 3" to run trigger "{trigger}" ' + u'in workflow "{bundleid}"') + +# AppleScript to run an Alfred search +SEARCH_AS = u'tell application "Alfred 3" to search "{query}"' + + +def escape_as(s): + """Escape string for inserting into AppleScript.""" + return s.replace('"', '" & quote & "') + + +def boolvar(name, default=False): + """Return `True` or `False` for a workflow variable.""" + v = os.getenv(name) + if v is not None: + if v.lower() in ('1', 'on', 'yes'): + return True + + if v.lower() in ('0', 'off', 'no'): + return False + log.debug('no value set for workflow variable "%s", ' + 'using default: %r', name, default) + return default + + +def intvar(name, default=0): + """Return `int` for a workflow variable.""" + v = os.getenv(name) + if v is not None: + try: + v = int(v) + except ValueError: + log.error('bad value for "%s": "%s" is not a number', name, v) + return default + return v + log.debug('no value set for workflow variable "%s", ' + 'using default: %r', name, default) + return default + + +def savevar(name, value): + """Save a workflow variable by adding it to ``info.plist``.""" + from plistlib import readPlist, writePlist + if not isinstance(value, basestring): + value = str(value) + + data = readPlist('info.plist') + data['variables'][name] = value + writePlist(data, 'info.plist') + log.debug(u'set workflow variable "%s" to "%s"', name, value) + + +def run_trigger(name, arg=None): + """Run an external trigger.""" + script = TRIGGER_AS.format(trigger=name, bundleid=BUNDLE_ID) + if arg: + script += u' with argument "{}"'.format(escape_as(arg)) + + msg = u'calling external trigger "{}"'.format(name) + if arg: + msg += u' with arg "{}"'.format(arg) + log.debug(msg + ' ...') + subprocess.call(['osascript', '-e', script.encode('utf-8')]) + + +def run_workflow(query=None): + """Run workflow with query.""" + query = KEYWORD + u' ' + (query or '') + script = SEARCH_AS.format(query=query) + log.debug(u'calling Alfred with query "%s" ...', query) + subprocess.call(['osascript', '-e', script.encode('utf-8')]) + + +def notify(title, text=''): + """Show a notification.""" + if not boolvar('SHOW_NOTIFICATIONS'): + return + v = Variables(title=title, text=text) + print(v) diff --git a/src/config.py b/src/config.py index 9304a61..b4abd12 100644 --- a/src/config.py +++ b/src/config.py @@ -1,7 +1,7 @@ #!/usr/bin/python # encoding: utf-8 # -# Copyright © 2014 deanishe@deanishe.net +# Copyright (c) 2014 deanishe@deanishe.net # # MIT Licence. See http://opensource.org/licenses/MIT # @@ -10,75 +10,134 @@ """config.py [options] [args] +Show and alter configuration options. + Usage: - config.py --toggle - config.py + config.py locales [] + config.py settings [] + config.py --toggle-locale + config.py --toggle-notifications Options: - --toggle Turn locale on/off - -h, --help Show this help message + -l, --toggle-locale Turn locale on/off + -n, --toggle-notifications Turn notifications on/off + -h, --help Show this help message and exit """ -from __future__ import print_function, unicode_literals, absolute_import +from __future__ import print_function, absolute_import -import subprocess import sys -from workflow import Workflow -from fakeum import ALL_LOCALES, DEFAULT_SETTINGS, UPDATE_SETTINGS, HELP_URL +from workflow import Workflow3, ICON_WARNING + +from common import ( + ALL_LOCALES, + DEFAULT_SETTINGS, + DOCS_URL, + HELP_URL, + ISSUE_URL, + ICON_DOCS, + ICON_HELP, + ICON_ISSUE, + ICON_ON, + ICON_OFF, + ICON_LOCALES, + ICON_UPDATE_AVAILABLE, + ICON_UPDATE_CHECK, + UPDATE_SETTINGS, + boolvar, + notify, + run_trigger, + savevar, +) -ALFRED_AS = 'tell application "Alfred 2" to search "fakeconfig "' log = None -def main(wf): - from docopt import docopt - args = docopt(__doc__, wf.args) - - log.debug('args : {!r}'.format(args)) - - if args.get('--toggle'): - loc = args.get('--toggle') - active = wf.settings.get('locales', []) - is_active = loc in active - - if is_active: - msg = 'Deactivated locale {}'.format(ALL_LOCALES.get(loc)) - active.remove(loc) - wf.settings['locales'] = active - else: - msg = 'Activated locale {}'.format(ALL_LOCALES.get(loc)) - active.append(loc) - wf.settings['locales'] = active - - log.info(msg) - print(msg) - - subprocess.call(['osascript', '-e', ALFRED_AS]) - return 0 - +def filter_options(query): + """Show available options.""" + options = [] if wf.update_available: - wf.add_item('A newer version is available', - '↩ to install update', - autocomplete='workflow:update', - icon='update-available.png') + title = 'An update is available' + subtitle = u'↩ or ⇥ to install update' + icon = ICON_UPDATE_AVAILABLE + else: + title = 'Check for update' + subtitle = u'↩ or ⇥ to check for update' + icon = ICON_UPDATE_CHECK - query = args.get('') + options = [ + dict(title=title, + subtitle=subtitle, + valid=False, + autocomplete='workflow:update', + icon=icon), - locales = sorted([(v, k) for (k, v) in ALL_LOCALES.items()]) + dict(title='Notifications', + subtitle='Turn notifications on/off', + valid=True, + arg='notifications', + icon=ICON_ON if boolvar('SHOW_NOTIFICATIONS') else ICON_OFF), + + dict(title='Locales', + subtitle='Turn locales on/off', + valid=True, + arg='locales', + icon=ICON_LOCALES), + + dict(title='Documentation', + subtitle='Open workflow docs in browser', + valid=True, + arg=DOCS_URL, + icon=ICON_DOCS), + + dict(title='Report Problem', + subtitle='Open GitHub issues in browser', + valid=True, + arg=ISSUE_URL, + icon=ICON_ISSUE), + + dict(title='Get Help', + subtitle='Open Alfred forum thread in browser', + valid=True, + arg=HELP_URL, + icon=ICON_HELP), + ] + + if query: + options = wf.filter(query, options, key=lambda d: d['title'], + min_score=30) + + if not options: + wf.add_item('No matches', 'Try a different query?', valid=False, + icon=ICON_WARNING) + + for opt in options: + wf.add_item(**opt) + + wf.send_feedback() + + +def filter_locales(query): + """Show list of available locales.""" + locales = [(v, k) for (k, v) in ALL_LOCALES.items()] if query: locales = wf.filter(query, locales, key=lambda t: '{} {}'.format(*t), min_score=30) + if not locales: + wf.add_item('No matches', 'Try a different query?', valid=False, + icon=ICON_WARNING) + for name, loc in locales: + icon = ICON_OFF if loc in wf.settings.get('locales', []): - icon = 'active.png' - else: - icon = 'inactive.png' + icon = ICON_ON + wf.add_item(name, loc, arg=loc, valid=True, @@ -87,9 +146,77 @@ def main(wf): wf.send_feedback() +def toggle_locale(loc): + """Toggle a locale on or off.""" + active = wf.settings.get('locales', []) + is_active = loc in active + + if is_active: + msg = u'Deactivated locale {}'.format(ALL_LOCALES.get(loc)) + active.remove(loc) + wf.settings['locales'] = active + else: + msg = u'Activated locale {}'.format(ALL_LOCALES.get(loc)) + active.append(loc) + wf.settings['locales'] = active + + log.info(msg) + notify(msg) + + run_trigger('locales') + + +def toggle_notifications(): + """Turn notifications on/off.""" + name = 'SHOW_NOTIFICATIONS' + is_active = boolvar(name) + what = 'on' + value = '1' + + if is_active: + what = 'off' + value = '0' + + msg = 'Turned notifications ' + what + savevar(name, value) + + log.info(msg) + notify(msg) + + run_trigger('config') + + +def main(wf): + """Run configuration.""" + from docopt import docopt + args = docopt(__doc__, wf.args) + + log.debug('args : %r', args) + + # ---------------------------------------------------------- + # Toggle actions + + if args.get('--toggle-locale'): + return toggle_locale(args.get('--toggle-locale')) + + if args.get('--toggle-notifications'): + return toggle_notifications() + + # ---------------------------------------------------------- + # List actions + + query = args.get('') + + if args['settings']: + return filter_options(query) + + else: + return filter_locales(query) + + if __name__ == '__main__': - wf = Workflow(default_settings=DEFAULT_SETTINGS, - update_settings=UPDATE_SETTINGS, - help_url=HELP_URL) + wf = Workflow3(default_settings=DEFAULT_SETTINGS, + update_settings=UPDATE_SETTINGS, + help_url=HELP_URL) log = wf.logger sys.exit(wf.run(main)) diff --git a/src/faker/__init__.py b/src/faker/__init__.py deleted file mode 100644 index 76e3a34..0000000 --- a/src/faker/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# coding=utf-8 - -VERSION = '0.4.2' - - -AVAILABLE_LOCALES = [ - 'bg_BG', - 'cs_CZ', - 'de_DE', - 'dk_DK', - 'el_GR', - 'en_CA', - 'en_GB', - 'en_US', - 'es_ES', - 'es_MX', - 'fa_IR', - 'fi_FI', - 'fr_FR', - 'hi_IN', - 'it_IT', - 'ko_KR', - 'lt_LT', - 'lv_LV', - 'nl_NL', - 'pl_PL', - 'pt_BR', - 'ru_RU', - 'sl_SI', - 'zh_CN', - 'zh_TW' -] - -DEFAULT_LOCALE = 'en_US' - -DEFAULT_PROVIDERS = ( - 'address', - 'color', - 'company', - 'credit_card', - 'date_time', - 'file', - 'internet', - 'job', - 'lorem', - 'misc', - 'person', - 'profile', - 'python', - 'phone_number', - 'ssn', - 'user_agent', -) - -from faker.generator import Generator -from faker.factory import Factory - -Faker = Factory.create diff --git a/src/faker/providers/bg_BG/__init__.py b/src/faker/providers/bg_BG/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/bg_BG/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/bg_BG/internet.py b/src/faker/providers/bg_BG/internet.py deleted file mode 100644 index eee8647..0000000 --- a/src/faker/providers/bg_BG/internet.py +++ /dev/null @@ -1,70 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..internet import Provider as InternetProvider - -import re - - -class Provider(InternetProvider): - - user_name_formats = ( - '{{last_name_female}}.{{first_name_female}}', - '{{last_name_male}}.{{first_name_male}}', - '{{last_name_male}}.{{first_name_male}}', - '{{first_name_male}}.{{last_name_male}}', - '{{first_name}}##', - '?{{last_name}}', - '{{first_name}}{{year}}' - ) - - @staticmethod - def _to_ascii(string): - replacements = ( - ('Б', 'b'), ('Г', 'r'), ('Д', 'd'), ('Ж', 'zh'), ('З', 'z'), ('И', 'i'), - ('Й', 'i'), ('Л', 'l'), ('П', 'p'), ('Ф', 'f'), ('Ц', 'ts'), ('Ч', 'ch'), - ('Ш', 'sh'), ('Щ', 'sht'), ('Ъ', 'u'), ('Ь', ''), ('Ю', 'yu'), ('Я', 'ya'), - ('б', 'b'), ('в', 'v'), ('д', 'd'), ('ж', 'zh'), ('з', 'z'), ('и', 'i'), - ('й', 'i'), ('к', 'k'), ('л', 'l'), ('м', 'm'), ('н', 'n'), ('п', 'p'), - ('т', 't'), ('ф', 'f'), ('ц', 'ts'), ('ч', 'ch'), ('ш', 'sh'), ('щ', 'sht'), - ('ъ', 'u'), ('ь', ''), ('ю', 'yu'), ('я', 'ya'), ('Б', 'b'), ('Г', 'r'), - ('Д', 'd'), ('Ж', 'zh'), ('З', 'z'), ('И', 'i'), ('Й', 'i'), ('Л', 'l'), - ('П', 'p'), ('Ф', 'f'), ('Ц', 'ts'), ('Ч', 'ch'), ('Ш', 'sh'), ('Щ', 'sht'), - ('Ъ', 'u'), ('Ь', ''), ('Ю', 'yu'), ('Я', 'ya'), ('б', 'b'), ('в', 'v'), - ('д', 'd'), ('ж', 'zh'), ('з', 'z'), ('и', 'i'), ('й', 'i'), ('к', 'k'), - ('л', 'l'), ('м', 'm'), ('н', 'n'), ('п', 'p'), ('т', 't'), ('ф', 'f'), - ('ц', 'ts'), ('ч', 'ch'), ('ш', 'sh'), ('щ', 'sht'), ('ъ', 'u'), ('ь', ''), - ('ю', 'yu'), ('я', 'ya') - ) - - for search, replace in replacements: - string = string.replace(search, replace) - - return string - - email_formats = ( - '{{user_name}}@{{free_email_domain}}', - '{{user_name}}@{{domain_name}}') - - free_email_domains = ( - 'gmail.com', 'yahoo.com', 'hotmail.com', 'mail.bg', 'abv.bg', 'dir.bg' - ) - - tlds = ('bg', 'com', 'biz', 'info', 'net', 'org', 'edu') - - def user_name(self): - pattern = self.random_element(self.user_name_formats) - return self._to_ascii( - self.bothify(self.generator.parse(pattern) - ).lower()) - - def domain_word(self): - company = self.generator.format('company') - company_elements = company.split(' ') - company = self._to_ascii(company_elements.pop(0)) - return re.sub(r'\W', '', company).lower() - - def domain_name(self): - return self.domain_word() + '.' + self.tld() - - def tld(self): - return self.random_element(self.tlds) diff --git a/src/faker/providers/color.py b/src/faker/providers/color.py deleted file mode 100644 index 5493736..0000000 --- a/src/faker/providers/color.py +++ /dev/null @@ -1,83 +0,0 @@ -# coding=utf-8 - -from faker.providers import BaseProvider - -__author__ = 'joke2k' - - -class Provider(BaseProvider): - all_colors = { - "AliceBlue": "#F0F8FF", "AntiqueWhite": "#FAEBD7", "Aqua": "#00FFFF", "Aquamarine": "#7FFFD4", - "Azure": "#F0FFFF", "Beige": "#F5F5DC", "Bisque": "#FFE4C4", "Black": "#000000", "BlanchedAlmond": "#FFEBCD", - "Blue": "#0000FF", "BlueViolet": "#8A2BE2", "Brown": "#A52A2A", "BurlyWood": "#DEB887", "CadetBlue": "#5F9EA0", - "Chartreuse": "#7FFF00", "Chocolate": "#D2691E", "Coral": "#FF7F50", "CornflowerBlue": "#6495ED", "Cornsilk": - "#FFF8DC", "Crimson": "#DC143C", "Cyan": "#00FFFF", "DarkBlue": "#00008B", "DarkCyan": "#008B8B", - "DarkGoldenRod": "#B8860B", "DarkGray": "#A9A9A9", "DarkGreen": "#006400", "DarkKhaki": "#BDB76B", - "DarkMagenta": "#8B008B", "DarkOliveGreen": "#556B2F", "DarkOrange": "#FF8C00", "DarkOrchid": "#9932CC", - "DarkRed": "#8B0000", "DarkSalmon": "#E9967A", "DarkSeaGreen": "#8FBC8F", "DarkSlateBlue": "#483D8B", - "DarkSlateGray": "#2F4F4F", "DarkTurquoise": "#00CED1", "DarkViolet": "#9400D3", "DeepPink": "#FF1493", - "DeepSkyBlue": "#00BFFF", "DimGray": "#696969", "DodgerBlue": "#1E90FF", "FireBrick": "#B22222", - "FloralWhite": "#FFFAF0", "ForestGreen": "#228B22", "Fuchsia": "#FF00FF", "Gainsboro": "#DCDCDC", - "GhostWhite": "#F8F8FF", "Gold": "#FFD700", "GoldenRod": "#DAA520", "Gray": "#808080", "Green": "#008000", - "GreenYellow": "#ADFF2F", "HoneyDew": "#F0FFF0", "HotPink": "#FF69B4", "IndianRed": "#CD5C5C", - "Indigo": "#4B0082", "Ivory": "#FFFFF0", "Khaki": "#F0E68C", "Lavender": "#E6E6FA", "LavenderBlush": "#FFF0F5", - "LawnGreen": "#7CFC00", "LemonChiffon": "#FFFACD", "LightBlue": "#ADD8E6", "LightCoral": "#F08080", - "LightCyan": "#E0FFFF", "LightGoldenRodYellow": "#FAFAD2", "LightGray": "#D3D3D3", "LightGreen": "#90EE90", - "LightPink": "#FFB6C1", "LightSalmon": "#FFA07A", "LightSeaGreen": "#20B2AA", "LightSkyBlue": "#87CEFA", - "LightSlateGray": "#778899", "LightSteelBlue": "#B0C4DE", "LightYellow": "#FFFFE0", "Lime": "#00FF00", - "LimeGreen": "#32CD32", "Linen": "#FAF0E6", "Magenta": "#FF00FF", "Maroon": "#800000", - "MediumAquaMarine": "#66CDAA", "MediumBlue": "#0000CD", "MediumOrchid": "#BA55D3", "MediumPurple": "#9370DB", - "MediumSeaGreen": "#3CB371", "MediumSlateBlue": "#7B68EE", "MediumSpringGreen": "#00FA9A", - "MediumTurquoise": "#48D1CC", "MediumVioletRed": "#C71585", "MidnightBlue": "#191970", "MintCream": "#F5FFFA", - "MistyRose": "#FFE4E1", "Moccasin": "#FFE4B5", "NavajoWhite": "#FFDEAD", "Navy": "#000080", - "OldLace": "#FDF5E6", "Olive": "#808000", "OliveDrab": "#6B8E23", "Orange": "#FFA500", "OrangeRed": "#FF4500", - "Orchid": "#DA70D6", "PaleGoldenRod": "#EEE8AA", "PaleGreen": "#98FB98", "PaleTurquoise": "#AFEEEE", - "PaleVioletRed": "#DB7093", "PapayaWhip": "#FFEFD5", "PeachPuff": "#FFDAB9", "Peru": "#CD853F", - "Pink": "#FFC0CB", "Plum": "#DDA0DD", "PowderBlue": "#B0E0E6", "Purple": "#800080", "Red": "#FF0000", - "RosyBrown": "#BC8F8F", "RoyalBlue": "#4169E1", "SaddleBrown": "#8B4513", "Salmon": "#FA8072", - "SandyBrown": "#F4A460", "SeaGreen": "#2E8B57", "SeaShell": "#FFF5EE", "Sienna": "#A0522D", "Silver": "#C0C0C0", - "SkyBlue": "#87CEEB", "SlateBlue": "#6A5ACD", "SlateGray": "#708090", "Snow": "#FFFAFA", - "SpringGreen": "#00FF7F", "SteelBlue": "#4682B4", "Tan": "#D2B48C", "Teal": "#008080", "Thistle": "#D8BFD8", - "Tomato": "#FF6347", "Turquoise": "#40E0D0", "Violet": "#EE82EE", "Wheat": "#F5DEB3", "White": "#FFFFFF", - "WhiteSmoke": "#F5F5F5", "Yellow": "#FFFF00", "YellowGreen": "#9ACD3", - } - - safe_colors = [ - 'black', 'maroon', 'green', 'navy', 'olive', - 'purple', 'teal', 'lime', 'blue', 'silver', - 'gray', 'yellow', 'fuchsia', 'aqua', 'white' - ] - - @classmethod - def color_name(cls): - return cls.random_element(cls.all_colors.keys()) - - @classmethod - def safe_color_name(cls): - return cls.random_element(cls.safe_colors) - - @classmethod - def hex_color(cls): - return "#{0}".format(("%x" % cls.random_int(1, 16777215)).ljust(6, '0')) - - @classmethod - def safe_hex_color(cls): - color = ("%x" % cls.random_int(0, 255)).ljust(3, '0') - return "#{0}{0}{1}{1}{2}{2}".format(*color) - - @classmethod - def rgb_color_list(cls): - color = cls.hex_color() - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16), - ) - - @classmethod - def rgb_color(cls): - return ','.join(map(str, cls.rgb_color_list())) - - @classmethod - def rgb_css_color(cls): - return 'rgb(%s)' % ','.join(map(str, cls.rgb_color_list())) diff --git a/src/faker/providers/company.py b/src/faker/providers/company.py deleted file mode 100644 index eabb4bb..0000000 --- a/src/faker/providers/company.py +++ /dev/null @@ -1,24 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider - - -class Provider(BaseProvider): - formats = ['{{last_name}} {{company_suffix}}', ] - - company_suffixes = ['Ltd', ] - - def company(self): - """ - :example 'Acme Ltd' - """ - pattern = self.random_element(self.formats) - return self.generator.parse(pattern) - - @classmethod - def company_suffix(cls): - """ - :example 'Ltd' - """ - return cls.random_element(cls.company_suffixes) diff --git a/src/faker/providers/credit_card.py b/src/faker/providers/credit_card.py deleted file mode 100644 index e5df94a..0000000 --- a/src/faker/providers/credit_card.py +++ /dev/null @@ -1,187 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider -from .date_time import Provider as DateTimeProvider -import copy -import re - - -class CreditCard(object): - - valid_characters_pattern = re.compile('^[0-9 ]*$') - - def __init__(self, name, prefixes, length=16, security_code='CVC', security_code_length=3): - self.name = name - self.prefixes = prefixes - self.length = length - self.security_code = security_code - self.security_code_length = security_code_length - - -class Provider(BaseProvider): - - visa_prefix_list = [['4', '5', '3', '9'], - ['4', '5', '5', '6'], - ['4', '9', '1', '6'], - ['4', '5', '3', '2'], - ['4', '9', '2', '9'], - ['4', '0', '2', '4', '0', '0', '7', '1'], - ['4', '4', '8', '6'], - ['4', '7', '1', '6'], - ['4']] - - mastercard_prefix_list = [['5', '1'], - ['5', '2'], - ['5', '3'], - ['5', '4'], - ['5', '5']] - - amex_prefix_list = [['3', '4'], - ['3', '7']] - - discover_prefix_list = [['6', '0', '1', '1']] - - diners_prefix_list = [['3', '0', '0'], - ['3', '0', '1'], - ['3', '0', '2'], - ['3', '0', '3'], - ['3', '6'], - ['3', '8']] - - enroute_prefix_list = [['2', '0', '1', '4'], - ['2', '1', '4', '9']] - - jcb16_prefix_list = [['3', '0', '8', '8'], - ['3', '0', '9', '6'], - ['3', '1', '1', '2'], - ['3', '1', '5', '8'], - ['3', '3', '3', '7'], - ['3', '5', '2', '8']] - - jcb15_prefix_list = [['2', '1', '0', '0'], - ['1', '8', '0', '0']] - - voyager_prefix_list = [['8', '6', '9', '9']] - - credit_card_types = { - 'mastercard': CreditCard('Mastercard', mastercard_prefix_list, 16, 'CVV', 4), - 'visa16': CreditCard('VISA 16 digit', visa_prefix_list), - 'visa13': CreditCard('VISA 13 digit', visa_prefix_list, 13), - 'amex': CreditCard('American Express', amex_prefix_list, 15), - 'discover': CreditCard('Discover', discover_prefix_list), - 'diners': CreditCard('Diners Club / Carte Blanche', diners_prefix_list, 14), - 'enroute': CreditCard('enRoute', enroute_prefix_list, 15), - 'jcb15': CreditCard('JCB 15 digit', jcb16_prefix_list, 15), - 'jcb16': CreditCard('JCB 16 digit', jcb15_prefix_list), - 'voyager': CreditCard('Voyager', voyager_prefix_list, 15), - } - credit_card_types['visa'] = credit_card_types['visa16'] - credit_card_types['jcb'] = credit_card_types['jcb16'] - - @classmethod - def credit_card_provider(cls, card_type=None): - if card_type is None: - card_type = cls.random_element(cls.credit_card_types.keys()) - return cls._credit_card_type(card_type).name - - @classmethod - def credit_card_number(cls, card_type=None, validate=False, max_check=10): - card = cls._credit_card_type(card_type) - number = '' - for i in range(0, max_check): - number = cls._generate_number(cls.random_element(card.prefixes), card.length) - if not validate or cls._validate_credit_card_number(card, number): - break - return number - - @classmethod - def credit_card_expire(cls, start='now', end='+10y', date_format='%m/%y'): - expire_date = DateTimeProvider.date_time_between(start, end) - return expire_date.strftime(date_format) - - def credit_card_full(self, card_type=None, validate=False, max_check=10): - card = self._credit_card_type(card_type) - template = """ -{provider} -{owner} -{number} {expire_date} -{security}: {security_nb}""".format( - provider=card.name, - owner=self.generator.parse("{{first_name}} {{last_name}}"), - number=self.credit_card_number(card, validate, max_check), - expire_date=self.credit_card_expire(), - security=card.security_code, - security_nb=self.credit_card_security_code(card) - ) - return self.generator.parse(template) - - @classmethod - def credit_card_security_code(cls, card_type=None): - return cls.random_number(cls._credit_card_type(card_type).security_code_length) - - @classmethod - def _credit_card_type(cls, card_type=None): - """returns a random credit card type instance""" - if card_type is None: - card_type = cls.random_element(cls.credit_card_types.keys()) - elif isinstance(card_type, CreditCard): - return card_type - return cls.credit_card_types[card_type] - - @classmethod - def _generate_number(cls, prefix, length): - """ - 'prefix' is the start of the CC number as a string, any number of digits. - 'length' is the length of the CC number to generate. Typically 13 or 16 - """ - # add list() to copy prefixes - number = list(prefix) - # generate digits - while len(number) < (length - 1): - number.append(str(cls.random_digit())) - - # Calculate sum - tot = 0 - pos = 0 - - reversed_number = [] - reversed_number.extend(number) - reversed_number.reverse() - - while pos < length - 1: - odd = int(reversed_number[pos]) * 2 - if odd > 9: - odd -= 9 - tot += odd - if pos != (length - 2): - tot += int(reversed_number[pos+1]) - pos += 2 - # Calculate check digit - check_digit = ((tot / 10 + 1) * 10 - tot) % 10 - number.append(str(check_digit)) - return ''.join(number) - - @classmethod - def _validate_credit_card_number(cls, card, number): - if card.valid_characters_pattern.match(number) is not None: - return cls._validate_luhn_checksum(number) - return False - - @staticmethod - def _validate_luhn_checksum(number_as_string): - """ checks to make sure that the card passes a luhn mod-10 checksum """ - - number = 0 - num_digits = len(number_as_string) - odd_even = num_digits & 1 - - for i in range(0, num_digits): - digit = int(number_as_string[i]) - - if not ((i & 1) ^ odd_even): - digit *= 2 - if digit > 9: - digit -= 9 - number += digit - return (number % 10) == 0 diff --git a/src/faker/providers/cs_CZ/__init__.py b/src/faker/providers/cs_CZ/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/cs_CZ/address.py b/src/faker/providers/cs_CZ/address.py deleted file mode 100644 index 5e4d206..0000000 --- a/src/faker/providers/cs_CZ/address.py +++ /dev/null @@ -1,190 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - - city_formats = ('{{city_name}}', ) - - street_name_formats = ('{{street_name}}', ) - street_address_formats = ('{{street_name}} {{building_number}}', ) - address_formats = ('{{street_address}}\n{{postcode}} {{city}}', ) - - building_number_formats = ('###', '##', '#', '#/#') - - street_suffixes_long = ('náměstí', ) - street_suffixes_short = ('nám.', ) - - postcode_formats = ('### ##', ) - - cities = ( - 'Abertamy', 'Adamov', 'Andělská Hora', 'Bakov nad Jizerou', 'Bavorov', 'Bechyně', 'Benešov nad Ploučnicí', - 'Benátky nad Jizerou', 'Bezdružice', 'Bečov nad Teplou', 'Blatná', 'Blovice', 'Blšany', 'Bochov', - 'Bohušovice nad Ohří', 'Bojkovice', 'Bor', 'Borohrádek', 'Borovany', 'Boží Dar', 'Brandýs nad Orlicí', 'Brno', - 'Broumov', 'Brtnice', 'Brumov-Bylnice', 'Brušperk', 'Budišov nad Budišovkou', 'Budyně nad Ohří', 'Bučovice', - 'Buštěhrad', 'Bystré', 'Bystřice', 'Bystřice nad Pernštejnem', 'Bystřice pod Hostýnem', 'Bzenec', 'Bílovec', - 'Bělá nad Radbuzou', 'Bělá pod Bezdězem', 'Březnice', 'Březová', 'Březová nad Svitavou', 'Břidličná', - 'Chabařovice', 'Chlumec', 'Chlumec nad Cidlinou', 'Choceň', 'Chomutov', 'Chotěboř', 'Chrast', 'Chrastava', - 'Chropyně', 'Chvaletice', 'Chyše', 'Chýnov', 'Chřibská', 'Cvikov', 'Dačice', 'Dašice', 'Desná', 'Deštná', - 'Dobrovice', 'Dobruška', 'Dobřany', 'Dobřichovice', 'Dobříš', 'Doksy', 'Dolní Benešov', 'Dolní Bousov', - 'Dolní Kounice', 'Dolní Poustevna', 'Dubá', 'Dubí', 'Dubňany', 'Duchcov', 'Děčín', 'Františkovy Lázně', - 'Fryšták', 'Frýdek-Místek', 'Frýdlant', 'Frýdlant nad Ostravicí', 'Fulnek', 'Golčův Jeníkov', 'Habartov', - 'Habry', 'Hanušovice', 'Harrachov', 'Hartmanice', 'Havířov', 'Hejnice', 'Heřmanův Městec', 'Hlinsko', - 'Hluboká nad Vltavou', 'Hluk', 'Hodkovice nad Mohelkou', 'Holice', 'Holýšov', 'Hora Svaté Kateřiny', 'Horažďovice', - 'Horní Benešov', 'Horní Blatná', 'Horní Bříza', 'Horní Cerekev', 'Horní Jelení', 'Horní Jiřetín', 'Horní Planá', - 'Horní Slavkov', 'Horšovský Týn', 'Hostinné', 'Hostivice', 'Hostomice', 'Hostouň', 'Hořice', 'Hořovice', 'Hoštka', - 'Hradec Králové', 'Hradec nad Moravicí', 'Hranice (okres Cheb)', 'Hrob', 'Hrochův Týnec', 'Hronov', 'Hrotovice', - 'Hroznětín', 'Hrušovany nad Jevišovkou', 'Hrádek', 'Hrádek nad Nisou', 'Hulín', 'Husinec', 'Hustopeče', - 'Ivanovice na Hané', 'Ivančice', 'Jablonec nad Jizerou', 'Jablonec nad Nisou', 'Jablonné nad Orlicí', - 'Jablonné v Podještědí', 'Jablunkov', 'Janov', 'Janovice nad Úhlavou', 'Janské Lázně', 'Jaroměřice nad Rokytnou', - 'Javorník', 'Jemnice', 'Jesenice (okres Rakovník)', 'Jevišovice', 'Jevíčko', 'Jihlava', 'Jilemnice', 'Jistebnice', - 'Jiříkov', 'Jáchymov', 'Jílové', 'Jílové u Prahy', 'Kamenice nad Lipou', 'Kamenický Šenov', 'Kaplice', 'Kardašova Řečice', - 'Karlovy Vary', 'Karolinka', 'Karviná', 'Kasejovice', 'Kaznějov', 'Kašperské Hory', 'Kdyně', 'Kelč', 'Kladno', 'Kladruby', - 'Klecany', 'Klimkovice', 'Klobouky u Brna', 'Kojetín', 'Konice', 'Kopidlno', 'Koryčany', 'Kosmonosy', - 'Kostelec na Hané', 'Kostelec nad Labem', 'Kostelec nad Orlicí', 'Kostelec nad Černými lesy', 'Kouřim', 'Košťany', - 'Kožlany', 'Kralovice', 'Kraslice', 'Kravaře', 'Kryry', 'Králíky', 'Králův Dvůr', 'Krásno', 'Krásná Hora nad Vltavou', - 'Krásná Lípa', 'Krásné Údolí', 'Kunovice', 'Kunštát', 'Kynšperk nad Ohří', 'Lanžhot', 'Ledeč nad Sázavou', 'Ledvice', - 'Letohrad', 'Letovice', 'Liberec', 'Libochovice', 'Libušín', 'Libáň', 'Libčice nad Vltavou', 'Liběchov', 'Lipník nad Bečvou', - 'Litovel', 'Lišov', 'Loket', 'Lom', 'Lomnice nad Lužnicí', 'Lomnice nad Popelkou', 'Loučná pod Klínovcem', - 'Lovosice', 'Loštice', 'Luby', 'Luhačovice', 'Lučany nad Nisou', 'Luže', 'Lysá nad Labem', 'Lázně Bohdaneč', 'Lázně Bělohrad', - 'Lázně Kynžvart', 'Manětín', 'Mašťov', 'Meziboří', 'Meziměstí', 'Mikulov', 'Mikulášovice', 'Miletín', 'Milevsko', - 'Milovice', 'Mimoň', 'Miroslav', 'Mirotice', 'Mirovice', 'Mirošov', 'Mladá Boleslav', 'Mladá Vožice', 'Mnichovice', - 'Mnichovo Hradiště', 'Mníšek pod Brdy', 'Modřice', 'Mohelnice', 'Moravské Budějovice', 'Moravský Beroun', 'Moravský Krumlov', - 'Morkovice-Slížany', 'Most', 'Mýto', 'Městec Králové', 'Město Albrechtice', 'Město Touškov', 'Měčín', 'Mšeno', 'Nalžovské Hory', - 'Napajedla', 'Nasavrky', 'Nechanice', 'Nejdek', 'Nepomuk', 'Netolice', 'Neveklov', 'Nová Bystřice', 'Nová Paka', - 'Nová Role', 'Nová Včelnice', 'Nové Hrady', 'Nové Město nad Metují', 'Nové Město pod Smrkem', 'Nové Sedlo', - 'Nové Strašecí', 'Nový Bydžov', 'Nový Knín', 'Náměšť nad Oslavou', 'Nýrsko', 'Nýřany', 'Němčice nad Hanou', - 'Odolena Voda', 'Odry', 'Olešnice', 'Olomouc', 'Oloví', 'Opava', 'Opočno', 'Osek', 'Osečná', 'Oslavany', 'Ostrava', - 'Pacov', 'Pardubice', 'Paskov', 'Pec pod Sněžkou', 'Petřvald', 'Pečky', 'Pilníkov', 'Planá', 'Planá nad Lužnicí', 'Plasy', - 'Plesná', 'Plumlov', 'Plzeň', 'Plánice', 'Poběžovice', 'Podbořany', 'Podivín', 'Pohořelice', 'Police nad Metují', - 'Polička', 'Polná', 'Postoloprty', 'Potštát', 'Počátky', 'Praha', 'Proseč', 'Prostějov', 'Protivín', 'Pyšely', - 'Přebuz', 'Přelouč', 'Přerov', 'Přeštice', 'Přibyslav', 'Přimda', 'Příbor', 'Rabí', 'Radnice', 'Rajhrad', 'Ralsko', - 'Raspenava', 'Rejštejn', 'Rokytnice nad Jizerou', 'Rokytnice v Orlických horách', 'Ronov nad Doubravou', 'Rosice', - 'Rotava', 'Rousínov', 'Rovensko pod Troskami', 'Roztoky', 'Rožmberk nad Vltavou', 'Rožmitál pod Třemšínem', 'Rožďalovice', - 'Rtyně v Podkrkonoší', 'Rudná', 'Rudolfov', 'Rychnov u Jablonce nad Nisou', 'Rychvald', 'Rájec-Jestřebí', 'Rýmařov', - 'Sadská', 'Sedlec-Prčice', 'Sedlice', 'Sedlčany', 'Semily', 'Sezemice', 'Sezimovo Ústí', 'Seč', 'Skalná', 'Skuteč', - 'Slatiňany', 'Slavičín', 'Slavkov u Brna', 'Slavonice', 'Slušovice', 'Smečno', 'Smiřice', 'Smržovka', 'Sobotka', - 'Soběslav', 'Solnice', 'Spálené Poříčí', 'Staré Město (okres Uherské Hradiště)', 'Staré Město (okres Šumperk)', - 'Starý Plzenec', 'Staňkov', 'Stochov', 'Stod', 'Strmilov', 'Stráž nad Nežárkou', 'Stráž pod Ralskem', 'Strážnice', - 'Strážov', 'Studénka', 'Stárkov', 'Stříbro', 'Suchdol nad Lužnicí', 'Svoboda nad Úpou', 'Svratka', 'Světlá nad Sázavou', - 'Sázava', 'Tanvald', 'Telč', 'Teplice', 'Teplice nad Metují', 'Teplá', 'Terezín', 'Tišnov', 'Toužim', 'Tovačov', 'Trhové Sviny', - 'Trhový Štěpánov', 'Trmice', 'Týn nad Vltavou', 'Týnec nad Labem', 'Týnec nad Sázavou', 'Týniště nad Orlicí', 'Třebechovice pod Orebem', - 'Třebenice', 'Třeboň', 'Třemošnice', 'Třemošná', 'Třešť', 'Uherský Ostroh', 'Uhlířské Janovice', 'Unhošť', - 'Valašské Klobouky', 'Valtice', 'Vamberk', 'Vejprty', 'Velešín', 'Velká Bystřice', 'Velká Bíteš', 'Velké Bílovice', - 'Velké Hamry', 'Velké Opatovice', 'Velké Pavlovice', 'Velký Šenov', 'Veltrusy', 'Velvary', 'Verneřice', 'Veselí nad Lužnicí', - 'Vidnava', 'Vimperk', 'Vizovice', 'Vlachovo Březí', 'Vodňany', 'Volary', 'Volyně', 'Votice', 'Vracov', 'Vratimov', 'Vrbno pod Pradědem', - 'Vroutek', 'Vysoké Veselí', 'Vysoké nad Jizerou', 'Vyšší Brod', 'Vítkov', 'Výsluní', 'Všeruby', 'Zbiroh', 'Zbýšov', 'Zdice', 'Zlaté Hory', - 'Zliv', 'Zlín', 'Zruč nad Sázavou', 'Zubří', 'Zákupy', 'Zásmuky', 'Újezd u Brna', 'Úpice', 'Úsov', 'Ústí nad Labem', - 'Úterý', 'Úvaly', 'Úštěk', 'Černovice', 'Černošice', 'Černošín', 'Červená Řečice', 'Červený Kostelec', 'Česká Kamenice', 'Česká Skalice', - 'České Budějovice', 'České Velenice', 'Český Brod', 'Český Dub', 'Řevnice', 'Šenov', 'Šlapanice', 'Šluknov', 'Špindlerův Mlýn', 'Štramberk', - 'Štíty', 'Štětí', 'Švihov', 'Žacléř', 'Žamberk', 'Žandov', 'Ždánice', 'Ždírec nad Doubravou', 'Žebrák', 'Železnice', 'Železná Ruda', 'Železný Brod', - 'Židlochovice', 'Žirovnice', 'Žlutice', 'Žulová' - ) - - streets = ( - 'Horní Stromky', 'Vizovická', 'K Brusce', 'Mírová', 'Rašínská', 'Boušova', 'Pobřežní', 'Dolnobřežanská', 'Černá', - 'Šůrova', 'Červenkova', 'Nad Mostem', 'Libuňská', 'Chotovická', 'Petříkova', 'Pod Vodárenskou Věží', 'Na Fišerce', - 'Ke Březině', 'Za Lázeňkou', 'Nad Šafránkou', 'Na Laurové', 'Nám. Republiky', 'Vlašimská', 'Nad Rohatci', 'Tylišovská', - 'Nábřeží Kapitána Jaroše', 'Lešovská', 'U Podjezdu', 'Průškova', 'Estonská', 'Máslova', 'K Otočce', 'Jižní', 'Švecova', - 'Mongolská', 'Kalská', 'Nad Rokytkou', 'Malešovská', 'Plzeňská', 'V Hájkách', 'Úpská', 'Ambrožova', 'Pikovická', - 'Neužilova', 'Na Staré Vinici', 'Vstupní', 'Nýdecká', 'U Společenské Zahrady', 'Ostrovského', 'Bazovského', 'Lešenská', - 'Na Štamberku', 'Na Svahu', 'Výhledské Nám.', 'K Lipám', 'Za Stadionem', 'Opletalova', 'Nábřeží Ludvíka Svobody', 'Komenského Nám.', - 'Křimická', 'Domkovská', 'Pyšelská', 'Štychova', 'Horákova', 'Nad Zavážkou', 'K Prelátům', 'Vašátkova', 'Benákova', 'Náměstí Prezidenta Masaryka', - 'Mílovská', 'U Hostivařského Nádraží', 'Jihovýchodní I', 'Hostivařské Nám.', 'Zbynická', 'Heineho', 'U Dobešky', - 'Doubická', 'Ke Břvům', 'Na Záhonech', 'Kloboukova', 'Kostnické Náměstí', 'Pelclova', 'Smotlachova', 'Pod Spiritkou', - 'Hůlkova', 'Matenská', 'Do Zahrádek Ii', 'Dobrošovská', 'Lovčenská', 'Jasná I', 'Škrétova', 'Moravanů', 'Budapešťská', - 'Kojetická', 'Náměstí I. P. Pavlova', 'Bajkalská', 'U Větrolamu', 'Vlčická', 'Jarešova', 'Sámova', 'Kotrčová', 'Musílkova', 'Ingrišova', - 'U Nových Domů I', 'Dělostřelecká', 'Ke Hrázi', 'Mochovská', 'Rýmařovská', 'Dolní Chaloupky', 'Za Arielem', 'U Rajské Zahrady', 'K Šedivce', - 'Březová', 'Doubravínova', 'Mládkova', 'Tachovské Náměstí', 'Lehárova', 'Severní X', 'V Tehovičkách', 'Bermanova', 'Grammova', 'Spojovací', 'Verdunská', - 'Závrchy', 'Čerpadlová', 'Vítězná', 'Nad Plynovodem', 'U Smíchovského Hřbitova', 'Nedvědovo Náměstí', 'Bachova', 'U Dálnice', 'Všejanská', 'Maňákova', 'Rokytnická', - 'Loděnická', 'U Pumpy', 'Michnova', 'Záblatská', 'Poslední', 'Hněvkovského', 'Za Křížem', 'Nad Návsí', 'Jablonecká', 'Súdánská', 'Mazancova', 'Pod Čertovou Skalou', - 'Weilova', 'Čajkovského', 'Nad Zátiším', 'Moldavská', 'Juarézova', 'Žižkova', 'Pod Lochkovem', 'Nad Vernerákem', 'Žherská', 'Prusíkova', 'Výtoňská', 'Na Srážku', - 'Šachovská', 'Nučická', 'Novákovo Náměstí', 'Sitteho', 'U Vápenice', 'Na Kuthence', 'Čelakovského Sady', 'V Závitu', 'Na Vartě', 'Oválová', 'Machovická', - 'Nad Olšinami', 'Vajgarská', 'Kulhavého', 'Kodaňská', 'Kralupská', 'Lednická', 'Pod Velkým Hájem', 'Hvězdonická', 'Na Kozinci', 'Semická', 'K Dálnici', - 'Trytova', 'Vyhlídkova', 'Pohnertova', 'U Nového Dvora', 'K Vodě', 'Nad Libří', 'K Matěji', 'V Kotcích', 'Kohoutových', 'Na Cikánce', 'Chládkova', - 'Slatiňanská', 'Pod Kostelem', 'Na Spojce', 'Na Zahrádkách', 'Nad Obcí', 'K Přehradám', 'Na Náspu', 'V Nížinách', 'Josefa Houdka', - 'Na Pěšině', 'Hnězdenská', 'Za Statky', 'Kremnická', 'Čestmírova', 'U Rakovky', 'Kodicilova', 'K Lučinám', 'Nouzov', 'Krátký Lán', - 'Anny Drabíkové', 'Kadaňská', 'Stroupežnického', 'Jírova', 'U Dětského Hřiště', 'Žofie Podlipské', 'Nad Šancemi', 'Lošáková', - 'Roblínská', 'Mezi Sklady', 'Na Pomezí', 'U Mlýnského Rybníka', 'Makedonská', 'K Dýmači', 'V Zátiší', 'Pohořelec', - 'Jiřinková', 'U Nové Dálnice', 'Čuprova', 'Vraňanská', 'Severovýchodní Vi', 'Petřínská', 'K Hořavce', 'Sádovská', 'Pod Průsekem', - 'Konžská', 'Dřítenská', 'Pirinská', 'U Hřiště', 'Kukelská', 'Moravanská', 'Koclířova', 'Žilinská', 'Ve Žlíbku', 'Veronské Nám.', - 'U Větrníku', 'Svojsíkova', 'Izraelská', 'Staňkovka', 'Na Viničních Horách', 'Čankovská', 'Na Špitálce', 'Valdovská', 'Rudoltická', - 'Ke Strašnické', 'Paťanka', 'Panuškova', 'Pankrácké Nám.', 'Budčická', 'Šermířská', 'Medlovská', 'K Vidouli', 'Horní Chaloupky', 'V Americe', - 'Dejvická', 'Klášterecká', 'Šárovo Kolo', 'Mladoboleslavská', 'Palackého', 'Lumiérů', 'Ivančická', 'Za Valem', 'Na Břevnovské Pláni', - 'Tichonická', 'Náměstí Hrdinů', 'Mistřínská', 'Křížkovského', 'Tanvaldská', 'V Padolině', 'Před Skalkami Ii', 'Na Křivce', - 'Nad Zámečkem', 'Nad Krocínkou', 'Podlešínská', 'Nad Popelkou', 'Oderská', 'Jeruzalémská', 'Smolenská', 'Lebeděvova', 'Libichovská', - 'Na Šafránce', 'Průjezdná', 'Záluské', 'Branišovská', 'Spinozova', 'K Betáni', 'Machuldova', 'Podohradská', 'Cerhenická', 'V Brůdku', - 'U Vlachovky', 'Pod Letištěm', 'Vlastislavova', 'Klecanská', 'Žinkovská', 'Maltézské Náměstí', 'Boršov', 'Mukařovského', - 'Josefa Šimůnka', 'Suchdolská', 'Opočínská', 'Heydukova', 'Vršovka', 'Thurnova', 'Mezilesní', 'Za Pivovarem', 'Uljanovská', 'Panenská', - 'Sladovnická', 'Plynární', 'Kozácká', 'Vlasákova', 'Javornická', 'Ševčíkova', 'Podle Náhonu', 'Doubravická', 'Františka Černého', - 'Chotětovská', 'K Háječku', 'Pod Výšinkou', 'U Šesté Baterie', 'Drahanská', 'Augustova', 'U Balabenky', 'Boční I', 'Jirčanská', - 'Na Šubě', 'Brixiho', 'Klímova', 'Kazín', 'Fügnerovo Náměstí', 'Na Příčné Mezi', 'Plánická', 'Africká', 'Vratislavova', 'Olympijská', - 'Na Bojišti', 'K Nádrži', 'Vokrojova', 'Bořetínská', 'Kováříkova', 'Lánovská', 'U Staré Pošty', 'Na Poustkách', 'V Poli', 'Meziškolská', - 'Pajerova', 'Habartovská', 'Mlékárenská', 'Dělnická', 'U Štěpu', 'Družná', 'Klouzková', 'Před Rybníkem', 'Nad Košinkou', 'Spolupráce', - 'V Humenci', 'Adélčina', 'Březanova', 'Pod Kesnerkou', 'Kosmonoská', 'Do Dubin', 'Nad Lávkou', 'Mezi Lysinami', 'Na Topolce', 'Snopkova', - 'Severní Viii', 'Okrová', 'Třebihošťská', 'Mádrova', 'Na Lázeňce', 'Slivenecká', 'Nám. Barikád', 'Nad Strouhou', 'Jindřicha Plachty', - 'Pod Srázem', 'U Waltrovky', 'Bratří Čapků', 'Onšovecká', 'Machnova', 'Kostková', 'Rožmberská', 'Zapských', 'Přípřežní', 'Výravská', - 'Podléšková', 'Štěchovická', 'Poleradská', 'Jilmová', 'Hostýnská' - ) - - states = ( - 'Hlavní město Praha', - 'Středočeský kraj', - 'Jihočeský kraj', - 'Plzeňský kraj', - 'Karlovarský kraj', - 'Ústecký kraj', - 'Liberecký kraj', - 'Královéhradecký kraj', - 'Pardubický kraj', - 'Kraj Vysočina', - 'Jihomoravský kraj', - 'Olomoucký kraj', - 'Moravskoslezský kraj', - 'Zlínský kraj', - ) - - countries = ( - 'Afghánistán', 'Albánie', 'Alžírsko', 'Andorra', 'Angola', 'Antigua a Barbuda', 'Argentina', 'Arménie', 'Austrálie', - 'Bahamy', 'Bahrajn', 'Bangladéš', 'Barbados', 'Belgie', 'Belize', 'Benin', 'Bhútán', 'Bolívie', 'Bosna a Hercegovina', - 'Botswana', 'Brazílie', 'Brunej', 'Bulharsko', 'Burkina Faso', 'Burundi', 'Bělorusko', 'Chile', 'Chorvatsko', - 'Cookovy ostrovy', 'Demokratická republika Kongo', 'Dominika', 'Dominikánská republika', 'Dánsko', 'Džibutsko', - 'Egypt', 'Ekvádor', 'Eritrea', 'Estonsko', 'Etiopie', 'Federativní státy Mikronésie', 'Fidži', 'Filipíny', 'Finsko', - 'Francie', 'Gabon', 'Gambie', 'Ghana', 'Gruzie', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', - 'Indie', 'Irsko', 'Irák', 'Island', 'Itálie', 'Izrael', 'Jamajka', 'Japonsko', 'Jemen', 'Jihoafrická republika', - 'Jižní Súdán', 'Jordánsko', 'Kambodža', 'Kamerun', 'Kanada', 'Kapverdy', 'Katar', 'Kazachstán', 'Keňa', 'Kiribati', - 'Kolumbie', 'Kostarika', 'Kuba', 'Kypr', 'Kyrgyzstán', 'Laos', 'Lesotho', 'Libanon', 'Libye', 'Lichtenštejnsko', - 'Litva', 'Lotyšsko', 'Lucembursko', 'Madagaskar', 'Makedonie', 'Malajsie', 'Malawi', 'Maledivy', 'Mali', 'Malta', - 'Maroko', 'Marshallovy ostrovy', 'Mauricius', 'Mauritánie', 'Maďarsko', 'Mexiko', 'Moldavsko', 'Monako', 'Mongolsko', - 'Mosambik', 'Myanmar', 'Namibie', 'Nauru', 'Nepál', 'Niger', 'Nigérie', 'Nikaragua', 'Niue', 'Nizozemsko', 'Norsko', - 'Nový Zéland', 'Německo', 'Omán', 'Palau', 'Panama', 'Papua-Nová Guinea', 'Paraguay', 'Peru', 'Pobřeží slonoviny', - 'Polsko', 'Portugalsko', 'Pákistán', 'Rakousko', 'Republika Kongo', 'Rovníková Guinea', 'Rumunsko', 'Rusko', - 'Rwanda', 'Salvador', 'Samoa', 'San Marino', 'Saúdská Arábie', 'Senegal', 'Severní Korea', 'Seychely', 'Sierra Leone', - 'Singapur', 'Slovensko', 'Slovinsko', 'Somálsko', 'Spojené arabské emiráty', 'Spojené království', 'Spojené státy americké', - 'Srbsko', 'Středoafrická republika', 'Surinam', 'Svatá Lucie', 'Svatý Kryštof a Nevis', 'Svatý Tomáš a Princův ostrov', - 'Svatý Vincenc a Grenadiny', 'Svazijsko', 'Súdán', 'Sýrie', 'Tanzanie', 'Thajsko', 'Togo', 'Tonga', 'Trinidad a Tobago', - 'Tunisko', 'Turecko', 'Turkmenistán', 'Tuvalu', 'Tádžikistán', 'Uganda', 'Ukrajina', 'Uruguay', 'Uzbekistán', 'Vanuatu', - 'Vatikán', 'Venezuela', 'Vietnam', 'Východní Timor', 'Zambie', 'Zimbabwe', 'Ázerbájdžán', 'Írán', 'Čad', 'Černá Hora', - 'Česko', 'Čína', 'Řecko', 'Šalamounovy ostrovy', 'Španělsko', 'Srí Lanka', 'Švédsko', 'Švýcarsko' - ) - - @classmethod - def street_suffix_short(cls): - return cls.random_element(cls.street_suffixes_short) - - @classmethod - def street_suffix_long(cls): - return cls.random_element(cls.street_suffixes_long) - - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) - - @classmethod - def street_name(cls): - return cls.random_element(cls.streets) - - @classmethod - def state(cls): - return cls.random_element(cls.states) diff --git a/src/faker/providers/de_DE/__init__.py b/src/faker/providers/de_DE/__init__.py deleted file mode 100644 index 9bad579..0000000 --- a/src/faker/providers/de_DE/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# coding=utf-8 diff --git a/src/faker/providers/de_DE/internet.py b/src/faker/providers/de_DE/internet.py deleted file mode 100644 index 3ac50f4..0000000 --- a/src/faker/providers/de_DE/internet.py +++ /dev/null @@ -1,42 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from ..internet import Provider as InternetProvider - -from faker.utils.decorators import slugify_domain - - -class Provider(InternetProvider): - - free_email_domains = ( - 'aol.de', 'gmail.com', 'gmx.de', 'googlemail.com', 'hotmail.de', - 'web.de', 'yahoo.de', - ) - tlds = ('com', 'com', 'com', 'net', 'org', 'de', 'de', 'de', ) - - @staticmethod - def _to_ascii(string): - # ``slugify`` doesn't replace `ß` and normalize - # other glyphs as single letters - replacements = ( - ('ä', 'ae'), ('Ä', 'Ae'), - ('ö', 'oe'), ('Ö', 'Oe'), - ('ü', 'ue'), ('Ü', 'Ue'), - ('ß', 'ss'), - ) - for search, replace in replacements: - string = string.replace(search, replace) - return string - - @slugify_domain - def user_name(self): - pattern = self.random_element(self.user_name_formats) - return self._to_ascii( - self.bothify(self.generator.parse(pattern))) - - @slugify_domain - def domain_word(self): - company = self.generator.format('company') - company_elements = company.split(' ') - company = self._to_ascii(company_elements.pop(0)) - return company diff --git a/src/faker/providers/de_DE/person.py b/src/faker/providers/de_DE/person.py deleted file mode 100644 index 923a9ce..0000000 --- a/src/faker/providers/de_DE/person.py +++ /dev/null @@ -1,496 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from ..person import Provider as PersonProvider - - -class Provider(PersonProvider): - formats = ( - '{{first_name_male}} {{last_name}}', - '{{first_name_male}} {{last_name}}', - '{{first_name_male}} {{last_name}}', - '{{first_name_male}} {{last_name}}', - '{{first_name_male}} {{last_name}}-{{last_name}}', - '{{first_name_female}} {{last_name}}', - '{{first_name_female}} {{last_name}}', - '{{first_name_female}} {{last_name}}', - '{{first_name_female}} {{last_name}}', - '{{first_name_female}} {{last_name}}-{{last_name}}', - '{{prefix_male}} {{first_name_male}} {{last_name}}', - '{{prefix_female}} {{first_name_female}} {{last_name}}', - '{{first_name_male}} {{last_name}} {{suffix}}', - '{{first_name_female}} {{last_name}} {{suffix}}', - '{{prefix_male}} {{first_name_male}} {{last_name}} {{suffix}}', - '{{prefix_female}} {{first_name_female}} {{last_name}} {{suffix}}', - ) - - first_names_male = ( - 'Abel', 'Abraham', 'Adalbero', 'Adam', 'Adamo', 'Adolfo', 'Adrian', - 'Adriano', 'Adrianus', 'Adrien', 'Alain', 'Alajos', 'Alan', 'Albain', - 'Alban', 'Albano', 'Alberto', 'Albin', 'Alec', 'Alejandro', - 'Alessandro', 'Alessio', 'Alex', 'Alexander', 'Alexandre', - 'Alexandros', 'Alexej', 'Alexis', 'Alfons', 'Alfonso', 'Aljoscha', - 'Allan', 'Allen', 'Alois', 'Alon', 'Alonzo', 'Alphonse', 'Alwin', - 'Amadeo', 'Amadeus', 'Amandus', 'Amos', 'Anatol', 'Anatole', - 'Anatolij', 'Anders', 'Andi', 'Andor', 'Andre', 'Andreas', 'Andrej', - 'Andrew', 'Andrijan', 'Andy', 'Angelus', 'Ansgar', 'Anthony', - 'Antoine', 'Anton', 'Antonio', 'Araldo', 'Aram', 'Argus', 'Arjan', - 'Armin', 'Arminio', 'Arnaldo', 'Arnault', 'Arndt', 'Arne', 'Arno', - 'Arnold', 'Arrigo', 'Art', 'Arthur', 'Artur', 'Arturo', 'August', - 'Auguste', 'Augustin', 'Aurelius', 'Axel', 'Balduin', 'Balthasar', - 'Bardo', 'Barnabas', 'Barnard', 'Barney', 'Baruch', 'Basil', - 'Basilius', 'Bastian', 'Bastien', 'Battista', 'Beatus', 'Beltrame', - 'Beltran', 'Ben', 'Benedetto', 'Benedict', 'Benedikt', 'Bengt', - 'Beniamino', 'Benignus', 'Benito', 'Benjamin', 'Benjy', 'Bennett', - 'Benno', 'Benny', 'Benoit', 'Beppe', 'Bernard', 'Bernardo', 'Bernd', - 'Bernhard', 'Bernie', 'Bert', 'Berthold', 'Bertoldo', 'Bertram', - 'Bertrame', 'Bill', 'Billy', 'Birger', 'Bjarne', 'Björn', 'Bob', - 'Bobby', 'Bodo', 'Bonifatius', 'Boris', 'Bosco', 'Brendan', 'Brian', - 'Bruno', 'Bryan', 'Burkhard', 'Camillo', 'Camilo', 'Carl', 'Carlo', - 'Carlos', 'Carol', 'Carsten', 'Casimir', 'Caspar', 'Cecil', 'Ceddric', - 'Cedric', 'Celestino', 'Charles', 'Charlie', 'Chico', 'Chip', 'Chris', - 'Christian', 'Christoph', 'Christophe', 'Christopher', 'Christy', - 'Chuck', 'Cian', 'Cillian', 'Clarence', 'Clark', 'Clas', 'Claude', - 'Claudio', 'Claudius', 'Claus', 'Clayton', 'Clemens', 'Cliff', - 'Clifford', 'Clint', 'Clinton', 'Cody', 'Colin', 'Collin', 'Conan', - 'Connor', 'Conny', 'Conor', 'Conrad', 'Constantine', 'Cooper', - 'Cordell', 'Cornelius', 'Corvinus', 'Cristobal', 'Curd', 'Curt', - 'Curtis', 'Curtiz', 'Cyril', 'Cyrill', 'Cäsar', 'Damian', 'Damon', - 'Dan', 'Daniel', 'Daniele', 'Danilo', 'Danny', 'Dario', 'Darius', - 'Dave', 'David', 'Davide', 'Dawson', 'Dean', 'Demetrius', 'Denis', - 'Deniz', 'Dennis', 'Derek', 'Desiderius', 'Detlef', 'Detlev', 'Dick', - 'Diego', 'Dieter', 'Dimitrij', 'Dirk', 'Dolf', 'Domenico', 'Domingo', - 'Dominic', 'Dominik', 'Dominikus', 'Dominique', 'Donald', 'Donatello', - 'Donato', 'Donatus', 'Dorian', 'Douglas', 'Dragan', 'Duarte', 'Duncan', - 'Dylan', 'Earnest', 'Earvin', 'Eike', 'Eleasar', 'Elia', 'Elian', - 'Elias', 'Elijah', 'Ellison', 'Elmar', 'Elroy', 'Emanuel', 'Emanuele', - 'Emil', 'Emile', 'Emilian', 'Emiliano', 'Emilio', 'Emmanuel', 'Endrik', - 'Enrico', 'Enrique', 'Enzo', 'Ephraim', 'Erasmus', 'Eric', 'Erik', - 'Ermanno', 'Ernest', 'Ernestin', 'Ernesto', 'Eros', 'Errol', 'Etienne', - 'Eugen', 'Eugene', 'Eugenio', 'Eusebius', 'Everett', 'Ezra', 'Fabiano', - 'Fabien', 'Fabio', 'Fabius', 'Fabrice', 'Fabricius', 'Fabrizio', - 'Falco', 'Falk', 'Falko', 'Faruk', 'Faustus', 'Favian', 'Federico', - 'Federigo', 'Fedor', 'Felice', 'Feliciano', 'Felicien', 'Felipe', - 'Felix', 'Felton', 'Feodor', 'Ferdinand', 'Fergus', 'Fernand', - 'Fernando', 'Ferrante', 'Ferris', 'Fidel', 'Fidelio', 'Fidelis', - 'Fidelius', 'Filippo', 'Finan', 'Finn', 'Fiore', 'Fjodor', 'Flavian', - 'Flemming', 'Fletcher', 'Flint', 'Florens', 'Florentin', 'Florian', - 'Florin', 'Florus', 'Floyd', 'Forrest', 'Forrester', 'Forster', - 'Foster', 'Fox', 'Francesco', 'Francis', 'Francisco', 'Franco', - 'Francois', 'Franek', 'Frank', 'Frankie', 'Franklin', 'Franziskus', - 'Frasier', 'Frayne', 'Fred', 'Freddy', 'Frederic', 'Frederick', - 'Frederik', 'Freeman', 'Fremont', 'Fridericus', 'Fridolin', 'Friedel', - 'Frye', 'Gabriel', 'Gaetan', 'Gaetano', 'Gallus', 'Garcia', 'Garfield', - 'Garin', 'Garnier', 'Garrick', 'Garrison', 'Garron', 'Garry', 'Garson', - 'Gaspar', 'Gaspard', 'Gaspare', 'Gaston', 'Gastonne', 'Gates', - 'Gauthier', 'Gavin', 'Gene', 'Geoffrey', 'Geoffroy', 'Geordi', 'Georg', - 'George', 'Georges', 'Gerald', 'Geraldo', 'Gerard', 'Geraud', 'Gerd', - 'Gereon', 'Germain', 'German', 'Germano', 'Gernot', 'Gerold', - 'Geronimo', 'Gerrit', 'Gerry', 'Gert', 'Gerulf', 'Gerwin', 'Giacomo', - 'Gian', 'Giancarlo', 'Gianni', 'Gibson', 'Gideon', 'Gil', 'Gilbert', - 'Gilberto', 'Gilles', 'Gillian', 'Gino', 'Gioacchino', 'Giorgio', - 'Giovanni', 'Giraldo', 'Gisbert', 'Gitano', 'Giuliano', 'Giulio', - 'Giuseppe', 'Giusto', 'Glen', 'Glenn', 'Goliath', 'Goran', 'Gordon', - 'Gordy', 'Goswin', 'Graciano', 'Graham', 'Grayson', 'Greg', 'Gregg', - 'Gregoire', 'Gregor', 'Gregory', 'Griffin', 'Grover', 'Gualtier', - 'Gualtiero', 'Guglielmo', 'Guido', 'Guillaume', 'Guillermo', 'Gunnar', - 'Gunter', 'Gunther', 'Gus', 'Gustavo', 'Gustl', 'Gutierre', 'Guy', - 'Götz', 'Günter', 'Günther', 'Hajo', 'Hamilton', 'Hamlet', 'Hampton', - 'Hanley', 'Hannes', 'Hans', 'Harald', 'Hardy', 'Harley', 'Harlow', - 'Harold', 'Haroun', 'Harrison', 'Harry', 'Harvey', 'Hasso', 'Hauke', - 'Havel', 'Hector', 'Heiko', 'Heiner', 'Heino', 'Hektor', 'Helge', - 'Helmut', 'Helmuth', 'Hendrick', 'Hendrik', 'Hennes', 'Henning', - 'Henri', 'Henrick', 'Henrik', 'Henry', 'Herald', 'Herbie', 'Hercules', - 'Herold', 'Herwig', 'Hieronymus', 'Hilarius', 'Holger', 'Holm', - 'Homer', 'Horace', 'Horatio', 'Horaz', 'Howard', 'Howie', 'Hugh', - 'Hugo', 'Humphrey', 'Hunter', 'Ignatius', 'Ignaz', 'Ignazio', 'Igor', - 'Ilian', 'Ilja', 'Immanuel', 'Ingo', 'Ingolf', 'Ingvar', 'Irenäus', - 'Irvin', 'Irving', 'Irwin', 'Isaac', 'Isaak', 'Isai', 'Isaiah', - 'Isidor', 'Istvan', 'Ivan', 'Ivo', 'Jackson', 'Jacky', 'Jacob', - 'Jacques', 'Jacquin', 'Jadon', 'Jago', 'Jaime', 'Jake', 'Jakob', - 'Jamal', 'James', 'Jan', 'Janis', 'Jannes', 'Jannik', 'Janning', - 'Janos', 'Janosch', 'Jaques', 'Jared', 'Jarik', 'Jarl', 'Jarno', - 'Jaro', 'Jaromir', 'Jarrett', 'Jascha', 'Jason', 'Jasper', 'Jay', - 'Jean', 'Jeff', 'Jefferson', 'Jeffrey', 'Jendrick', 'Jens', 'Jered', - 'Jeremiah', 'Jeremias', 'Jeremie', 'Jeremy', 'Jerold', 'Jerom', - 'Jerome', 'Jerrick', 'Jerry', 'Jesaja', 'Jesko', 'Jesse', 'Jim', - 'Jimmy', 'Jirko', 'Jo', 'Joakim', 'Joao', 'Joaquin', 'Joe', 'Joel', - 'Joey', 'John', 'Johnny', 'Jokim', 'Jonah', 'Jonas', 'Jonathan', - 'Jonny', 'Jordan', 'Jordano', 'Jorge', 'Jose', 'Josef', 'Joseph', - 'Josh', 'Joshua', 'Josias', 'Jost', 'Josua', 'Josue', 'Jourdain', - 'Juan', 'Juanito', 'Jud', 'Jules', 'Julien', 'Julio', 'Julius', - 'Jurij', 'Justin', 'Justinian', 'Justus', 'Jörg', 'Jürgen', 'Kain', - 'Kaj', 'Kajetan', 'Kallistus', 'Karsten', 'Kasimir', 'Kaspar', - 'Keamon', 'Keith', 'Ken', 'Kenan', 'Kenneth', 'Keno', 'Kersten', - 'Kerwin', 'Kevin', 'Kian', 'Kilian', 'Kim', 'Kiran', 'Klaas', 'Klaus', - 'Klemens', 'Kleopas', 'Knud', 'Knut', 'Kolja', 'Konrad', 'Konstantin', - 'Korbin', 'Korbinian', 'Kordt', 'Kristian', 'Kristof', 'Kristoffer', - 'Kuno', 'Kurt', 'Kyros', 'LLoyd', 'Lajos', 'Lambert', 'Lamberto', - 'Larry', 'Lars', 'Laslo', 'Lasse', 'Laurent', 'Laurente', 'Laurentius', - 'Laurenz', 'Laurenzo', 'Lawrence', 'Lazarus', 'Lazlo', 'Leander', - 'Lee', 'Leif', 'Leigh', 'Lennart', 'Lenny', 'Lenz', 'Leo', 'Leon', - 'Leonard', 'Leonardo', 'Leonce', 'Leone', 'Leonello', 'Leonhard', - 'Leopold', 'Leopoldo', 'Leroy', 'Lesley', 'Lester', 'Leverett', 'Levi', - 'Lew', 'Lewis', 'Lex', 'Liborius', 'Lienhard', 'Linus', 'Lion', - 'Lionel', 'Lobo', 'Loic', 'Lorenz', 'Lorenzo', 'Loris', 'Lothaire', - 'Lou', 'Louie', 'Louis', 'Lovis', 'Luc', 'Luca', 'Lucan', 'Lucas', - 'Luciano', 'Lucien', 'Lucius', 'Ludovico', 'Ludwig', 'Luigi', 'Luis', - 'Lukas', 'Luke', 'Lutger', 'Luther', 'Lutz', 'Lyonel', 'Maik', 'Malte', - 'Malwin', 'Manolito', 'Manolo', 'Manuel', 'Marc', 'Marcel', 'Marcello', - 'Marcellus', 'Marco', 'Marcus', 'Marek', 'Marian', 'Marin', 'Marino', - 'Marinus', 'Mario', 'Marius', 'Mark', 'Markus', 'Marlon', 'Maro', - 'Marten', 'Martin', 'Marvin', 'Massimo', 'Mathias', 'Mathieu', - 'Mathis', 'Matt', 'Matteo', 'Matthes', 'Matthew', 'Matthias', - 'Matthieu', 'Matthäus', 'Maurice', 'Mauritius', 'Mauritz', 'Maurizio', - 'Mauro', 'Maurus', 'Max', 'Maxence', 'Maxi', 'Maxime', 'Maximilian', - 'Maximilien', 'Melchior', 'Merlin', 'Michael', 'Michail', 'Michel', - 'Michele', 'Mick', 'Mickey', 'Miguel', 'Mika', 'Mikael', 'Mike', - 'Mikel', 'Miklos', 'Milan', 'Milo', 'Mirko', 'Miro', 'Miroslav', - 'Mischa', 'Mitja', 'Morgan', 'Moritz', 'Morris', 'Morten', 'Nat', - 'Nathan', 'Nathanael', 'Nathaniel', 'Nepomuk', 'Nero', 'Neron', - 'Newton', 'Niccolo', 'Nicholas', 'Nick', 'Nicki', 'Nico', 'Nicola', - 'Nicolai', 'Nicolaj', 'Nicolas', 'Niels', 'Nigel', 'Nikita', 'Niklas', - 'Niklaus', 'Niko', 'Nikodemus', 'Nikolai', 'Nikolaus', 'Nils', 'Noah', - 'Noel', 'Norbert', 'Norberto', 'Norman', 'Odin', 'Odo', 'Odysseus', - 'Olaf', 'Oleg', 'Oliver', 'Olivier', 'Oliviero', 'Olof', 'Oluf', - 'Omar', 'Omer', 'Orlando', 'Orson', 'Oskar', 'Osvaldo', 'Oswin', - 'Otello', 'Othello', 'Otto', 'Ove', 'Owain', 'Owen', 'Paco', 'Paddy', - 'Palmiro', 'Pancho', 'Paolo', 'Pascal', 'Pat', 'Patrice', 'Patricio', - 'Patricius', 'Patrick', 'Patrizio', 'Patrizius', 'Paul', 'Paulin', - 'Paulus', 'Pawel', 'Pedro', 'Peer', 'Pepe', 'Pepito', 'Peppone', 'Per', - 'Percy', 'Perez', 'Pete', 'Peter', 'Phil', 'Philip', 'Philipp', - 'Philippe', 'Philo', 'Piedro', 'Pier', 'Piero', 'Pierre', 'Piet', - 'Pieter', 'Pietro', 'Pinkus', 'Pippin', 'Pitt', 'Pius', 'Placide', - 'Placido', 'Placidus', 'Poldi', 'Quint', 'Quintin', 'Quintinus', - 'Quintus', 'Quirin', 'Quirino', 'Raffaele', 'Raffaello', 'Raffaelo', - 'Raimondo', 'Raimund', 'Raimundo', 'Rainer', 'Rainier', 'Ralf', - 'Ralph', 'Ramon', 'Randolf', 'Randolph', 'Randy', 'Raoul', 'Raphael', - 'Rasmus', 'Rasul', 'Raul', 'Ray', 'Raymond', 'Regnier', 'Reik', - 'Reiner', 'Remo', 'Renato', 'Renatus', 'Renaud', 'Rene', 'Renja', - 'Reto', 'Reynold', 'Ricardo', 'Riccardo', 'Rick', 'Ricky', 'Rico', - 'Rinaldo', 'Robby', 'Robert', 'Roberto', 'Robin', 'Rocco', 'Rock', - 'Rocky', 'Rod', 'Rodolfo', 'Rodolphe', 'Rodrigo', 'Rodrigue', - 'Rodrique', 'Roger', 'Roland', 'Rolando', 'Rolf', 'Romain', 'Roman', - 'Romano', 'Romeo', 'Romero', 'Ronald', 'Ronan', 'Ronny', 'Rory', - 'Ross', 'Rowan', 'Rowland', 'Roy', 'Ruben', 'Rudolf', 'Rudolph', - 'Ruggero', 'Rupert', 'Ryan', 'Salomon', 'Salomone', 'Salvador', - 'Salvator', 'Salvatore', 'Sam', 'Sammy', 'Samuel', 'Samuele', 'Sander', - 'Sandor', 'Sandro', 'Sandy', 'Sascha', 'Sauveur', 'Schorsch', 'Scipio', - 'Scott', 'Sean', 'Sebastian', 'Sebastiano', 'Sebastien', 'Selim', - 'Semjon', 'Sepp', 'Serenus', 'Serge', 'Sergej', 'Sergio', 'Sergius', - 'Servatius', 'Severiano', 'Severin', 'Severo', 'Sidney', 'Sidonius', - 'Silas', 'Silvain', 'Silvan', 'Silvano', 'Silvanus', 'Silverio', - 'Silverius', 'Silvester', 'Silvestro', 'Silvio', 'Silvius', 'Simjon', - 'Simon', 'Simone', 'Sinclair', 'Sixt', 'Sixtus', 'Slade', 'Solomon', - 'Spencer', 'Stan', 'Stanislaus', 'Stanislaw', 'Stanley', 'Stefan', - 'Stefano', 'Steffen', 'Sten', 'Stephan', 'Stephen', 'Steve', 'Steven', - 'Stewart', 'Stig', 'Stuart', 'Sven', 'Sylvain', 'Sylvester', 'Söncke', - 'Sören', 'Tam', 'Tarek', 'Tassilo', 'Tasso', 'Ted', 'Teddy', - 'Teobaldo', 'Thaddäus', 'Theo', 'Theodor', 'Theodore', 'Thierry', - 'Thimotheus', 'Thomas', 'Thommy', 'Thoralf', 'Thorben', 'Thore', - 'Thorsten', 'Tiberio', 'Tiberius', 'Tibor', 'Till', 'Tim', 'Timmy', - 'Timo', 'Timofej', 'Timon', 'Timoteo', 'Timothee', 'Timotheus', - 'Timothy', 'Tin', 'Tito', 'Titus', 'Tizian', 'Tiziano', 'Tjade', - 'Tjark', 'Tobi', 'Tobia', 'Tobiah', 'Tobias', 'Tobie', 'Tobis', 'Toby', - 'Tom', 'Tommaso', 'Tommy', 'Toni', 'Tonio', 'Tony', 'Torben', 'Torin', - 'Torsten', 'Tristan', 'Tycho', 'Tyler', 'Tyson', 'Udo', 'Ugo', - 'Ugolino', 'Ulf', 'Uli', 'Ulli', 'Ulric', 'Ulrich', 'Ulrico', - 'Umberto', 'Urbain', 'Urban', 'Urbano', 'Urias', 'Uriel', 'Ursus', - 'Uwe', 'Valentiano', 'Valentin', 'Valentino', 'Valerian', 'Valerio', - 'Valerius', 'Valery', 'Vasco', 'Veit', 'Veltin', 'Vernon', 'Vicente', - 'Vico', 'Victor', 'Viktor', 'Vincent', 'Vincenzo', 'Vinzenez', - 'Vinzenz', 'Virgil', 'Vitalis', 'Vito', 'Vittore', 'Vittoriano', - 'Vittorio', 'Volker', 'Wallace', 'Walt', 'Warner', 'Warren', 'Wido', - 'Wigand', 'Wilbur', 'Willi', 'William', 'Wilpert', 'Winston', 'Wolf', - 'Wolfgang', 'Woodrow', 'Woody', 'Xaver', - ) - - first_names_female = ( - 'Abby', 'Abelina', 'Abigail', 'Adelaide', 'Adeline', 'Adina', - 'Adriana', 'Adrienne', 'Afra', 'Agatha', 'Agnes', 'Aida', 'Aimee', - 'Aischa', 'Albertine', 'Alea', 'Aleksandra', 'Alena', 'Alessa', - 'Alessandra', 'Alessia', 'Alexa', 'Alexandra', 'Alexia', 'Alexis', - 'Alice', 'Alicia', 'Alida', 'Alina', 'Aline', 'Alisa', 'Alissa', - 'Alisson', 'Amabella', 'Amadea', 'Amanda', 'Amelia', 'Amelie', 'Amina', - 'Amy', 'Ana', 'Anastasia', 'Andrea', 'Andrina', 'Anette', 'Angela', - 'Angelika', 'Angelina', 'Angelique', 'Anina', 'Anine', 'Anita', 'Anja', - 'Anjalie', 'Anke', 'Ann', 'Anna', 'Annabel', 'Annabell', 'Annabella', - 'Annabelle', 'Anne', 'Annett', 'Annette', 'Annika', 'Annina', 'Antje', - 'Antoinette', 'Antonella', 'Antonia', 'Arabella', 'Ariadne', 'Ariana', - 'Ariane', 'Arianna', 'Ariella', 'Arielle', 'Arlene', 'Arlette', - 'Arwenna', 'Ashley', 'Asta', 'Astrid', 'Audrey', 'Aurelia', 'Barbara', - 'Bastiane', 'Bea', 'Beata', 'Beatrice', 'Beatrix', 'Becky', 'Belinda', - 'Bella', 'Bellana', 'Belle', 'Benedikta', 'Benita', 'Bente', 'Beppina', - 'Berenike', 'Berit', 'Bernadett', 'Bernadette', 'Bernadine', 'Betina', - 'Betsy', 'Bettina', 'Betty', 'Bianca', 'Bianka', 'Bibiana', 'Bibiane', - 'Birgit', 'Birgitt', 'Bodil', 'Bridget', 'Brigitta', 'Brigitte', - 'Britta', 'Bärbel', 'Caitlin', 'Cameron', 'Camilla', 'Camille', - 'Cammy', 'Cara', 'Carin', 'Carina', 'Carinna', 'Carla', 'Carmela', - 'Carmelia', 'Carmen', 'Carol', 'Carola', 'Carole', 'Carolin', - 'Carolina', 'Caroline', 'Carolyn', 'Carolyne', 'Cassandra', 'Cassie', - 'Catalin', 'Caterina', 'Catharina', 'Catherine', 'Cathrin', 'Cathrine', - 'Cathy', 'Catina', 'Catrin', 'Catriona', 'Cecile', 'Cecilia', - 'Cecilie', 'Celeste', 'Celestine', 'Celina', 'Celine', 'Chantal', - 'Charleen', 'Charlotte', 'Chatrina', 'Chelsea', 'Chiara', 'Chloe', - 'Chrissy', 'Christa', 'Christiana', 'Christiane', 'Christin', - 'Christina', 'Christine', 'Chyna', 'Ciara', 'Cinderella', 'Cindy', - 'Cinja', 'Cira', 'Claire', 'Clara', 'Clarissa', 'Claudette', 'Claudia', - 'Claudine', 'Clea', 'Cleannis', 'Clementia', 'Clementine', 'Cleo', - 'Clio', 'Cliona', 'Clodia', 'Cloris', 'Coletta', 'Colette', 'Connie', - 'Conny', 'Constance', 'Constanze', 'Cora', 'Coral', 'Coralie', - 'Cordelia', 'Cordula', 'Corin', 'Corina', 'Corinna', 'Corinne', - 'Cornelia', 'Cosette', 'Cosima', 'Cynthia', 'Daisy', 'Dajana', - 'Daliah', 'Damaris', 'Damia', 'Damiana', 'Dana', 'Dania', 'Danica', - 'Daniela', 'Daniele', 'Daniella', 'Danielle', 'Danja', 'Daphne', - 'Darcie', 'Daria', 'Darina', 'Dawn', 'Dayna', 'Debbie', 'Debby', - 'Debora', 'Deborah', 'Deetya', 'Delia', 'Delphine', 'Dena', 'Denise', - 'Desdemona', 'Desideria', 'Desiree', 'Diana', 'Diane', 'Didina', - 'Dina', 'Dinah', 'Dolly', 'Dolores', 'Domenica', 'Dominika', - 'Dominique', 'Donna', 'Dora', 'Doreen', 'Dorina', 'Doris', 'Dorit', - 'Doro', 'Dorothea', 'Dorothee', 'Dorothy', 'Dunja', 'Ebony', 'Edda', - 'Edita', 'Edvige', 'Edwina', 'Eike', 'Eila', 'Eileen', 'Ela', 'Elaine', - 'Eleanor', 'Elektra', 'Elena', 'Eleonora', 'Eleonore', 'Eliane', - 'Elisa', 'Elisabeth', 'Elise', 'Elizabeth', 'Elke', 'Ella', 'Ellen', - 'Elly', 'Eloise', 'Elsa', 'Elsbeth', 'Elvira', 'Elvire', 'Emanuela', - 'Emanuelle', 'Emilia', 'Emilie', 'Emily', 'Emma', 'Enrica', 'Enya', - 'Erika', 'Erin', 'Ernesta', 'Ernestina', 'Ernestine', 'Esmerelda', - 'Esra', 'Estella', 'Estelle', 'Ester', 'Esther', 'Etiennette', - 'Eudoxia', 'Eugenia', 'Eunike', 'Euphemia', 'Euphrasia', 'Eusebia', - 'Eva', 'Evangelina', 'Evania', 'Eve', 'Evelien', 'Evelin', 'Eveline', - 'Evelyn', 'Evelyne', 'Evette', 'Evi', 'Evita', 'Fabiane', 'Fabienne', - 'Fabiola', 'Faith', 'Fanny', 'Farrah', 'Fatima', 'Faustina', - 'Faustine', 'Fay', 'Faye', 'Faylinn', 'Federica', 'Fedora', 'Fee', - 'Feli', 'Felice', 'Felicia', 'Felicitas', 'Felicity', 'Felizitas', - 'Feodora', 'Fergie', 'Fidelia', 'Filia', 'Filiz', 'Finetta', 'Finja', - 'Fiona', 'Fjodora', 'Flavia', 'Fleur', 'Fleur', 'Flo', 'Flora', - 'Florence', 'Florentina', 'Florentine', 'Floria', 'Floriane', - 'Florida', 'Florinda', 'Floris', 'Fortuna', 'Frances', 'Francesca', - 'Francisca', 'Franka', 'Franzi', 'Franziska', 'Frauke', 'Freya', - 'Friederike', 'Gabriela', 'Gabriele', 'Gabriella', 'Gabrielle', 'Gaby', - 'Gail', 'Galatea', 'Galina', 'Gazelle', 'Gela', 'Geneva', 'Genoveva', - 'Georgette', 'Georgia', 'Georgina', 'Geraldene', 'Geraldine', - 'Germain', 'Germaine', 'Germana', 'Ghita', 'Gianna', 'Gigi', 'Gill', - 'Gillian', 'Gina', 'Ginevra', 'Ginger', 'Ginny', 'Giovanna', 'Gisela', - 'Gisele', 'Gisella', 'Giselle', 'Gitta', 'Giulia', 'Giuliana', - 'Giulietta', 'Giuseppa', 'Giuseppina', 'Giustina', 'Gladys', 'Gloria', - 'Glory', 'Goldie', 'Goldy', 'Grace', 'Gratia', 'Gratiana', 'Grazia', - 'Greta', 'Gretel', 'Gunda', 'Gwen', 'Gwenda', 'Gwendolin', 'Gwendolyn', - 'Gypsy', 'Hannah', 'Hanne', 'Harmony', 'Harriet', 'Hazel', 'Hedi', - 'Hedy', 'Heide', 'Heidi', 'Heike', 'Helen', 'Helena', 'Helene', - 'Helin', 'Hella', 'Hemma', 'Henrietta', 'Henriette', 'Henrike', 'Hera', - 'Hetty', 'Hilary', 'Hilda', 'Hilde', 'Holiday', 'Holli', 'Holly', - 'Hope', 'Ilana', 'Ilaria', 'Iliana', 'Iljana', 'Ilka', 'Ilona', 'Ilse', - 'Ilyssa', 'Imke', 'Ina', 'India', 'Indira', 'Indra', 'Ines', 'Inga', - 'Inge', 'Ingrid', 'Inka', 'Inken', 'Innozentia', 'Iona', 'Ira', - 'Irena', 'Irene', 'Irina', 'Iris', 'Irisa', 'Irma', 'Isabel', - 'Isabell', 'Isabella', 'Isabelle', 'Isis', 'Iva', 'Ivana', 'Ivona', - 'Ivonne', 'Jaclyn', 'Jacqueline', 'Jacqui', 'Jael', 'Jamari', 'Jan', - 'Jana', 'Jane', 'Janet', 'Janette', 'Janin', 'Janina', 'Janine', - 'Janique', 'Janna', 'Jannine', 'Jarla', 'Jasmin', 'Jasmina', 'Jasmine', - 'Jeanette', 'Jeanine', 'Jeanne', 'Jeannette', 'Jeannine', 'Jekaterina', - 'Jelena', 'Jenifer', 'Jenna', 'Jennelle', 'Jennessa', 'Jennie', - 'Jennifer', 'Jenny', 'Jennyfer', 'Jess', 'Jessica', 'Jessie', - 'Jessika', 'Jill', 'Joan', 'Joana', 'Joann', 'Joanna', 'Joelle', - 'Johanna', 'Jolanda', 'Jona', 'Jordana', 'Josee', 'Josefa', 'Josefina', - 'Josefine', 'Josepha', 'Josephine', 'Josiane', 'Josie', 'Jovita', - 'Joy', 'Joyce', 'Juana', 'Juanita', 'Judith', 'Judy', 'Julia', - 'Juliana', 'Juliane', 'Julianne', 'Julie', 'Juliet', 'Juliette', - 'July', 'June', 'Justina', 'Justine', 'Justise', 'Jutta', 'Jördis', - 'Kamilia', 'Kamilla', 'Karen', 'Karima', 'Karin', 'Karina', 'Karla', - 'Karola', 'Karolin', 'Karolina', 'Karoline', 'Kassandra', 'Katalin', - 'Katarina', 'Kate', 'Katharina', 'Katharine', 'Katherina', 'Katherine', - 'Kathleen', 'Kathrin', 'Kathrina', 'Kathryn', 'Kathy', 'Katinka', - 'Katja', 'Katjana', 'Katrin', 'Katrina', 'Katrine', 'Kayla', 'Keala', - 'Keelin', 'Kendra', 'Kerstin', 'Kiana', 'Kiara', 'Kim', 'Kira', - 'Kirsten', 'Kirstin', 'Kita', 'Klara', 'Klarissa', 'Klaudia', - 'Kleopatra', 'Kolina', 'Konstanze', 'Kora', 'Kordula', 'Kori', - 'Kornelia', 'Krista', 'Kristiane', 'Kristin', 'Kristina', 'Kristine', - 'Kyra', 'Käthe', 'Laila', 'Lana', 'Lara', 'Laria', 'Larissa', 'Laurel', - 'Lauren', 'Laurence', 'Laurentia', 'Lauretta', 'Lavina', 'Laya', 'Lea', - 'Leah', 'Leandra', 'Lee', 'Leigh', 'Leila', 'Lena', 'Leona', 'Leonie', - 'Leontine', 'Leopoldine', 'Lesley', 'Leslie', 'Levana', 'Levia', 'Lia', - 'Liane', 'Libusa', 'Licia', 'Lidia', 'Liesa', 'Liesbeth', 'Liese', - 'Liesel', 'Lilian', 'Liliane', 'Lilith', 'Lilli', 'Lillian', 'Lilo', - 'Lily', 'Lina', 'Linda', 'Lioba', 'Lisa', 'Lisbeth', 'Lise', 'Lisette', - 'Liv', 'Livana', 'Livia', 'Liz', 'Liza', 'Lizzie', 'Lola', 'Lora', - 'Lorena', 'Loretta', 'Lori', 'Lorraine', 'Lotte', 'Lotus', 'Louise', - 'Luana', 'Luca', 'Lucia', 'Luciana', 'Lucie', 'Lucy', 'Luigia', - 'Luisa', 'Luise', 'Luna', 'Luzia', 'Lydia', 'Lydie', 'Lynette', 'Lynn', - 'Lätizia', 'Maddalena', 'Madelaine', 'Madeleine', 'Madeline', - 'Madison', 'Madita', 'Madleine', 'Madlen', 'Madlene', 'Mae', 'Magda', - 'Magdalena', 'Maggy', 'Magret', 'Maia', 'Maike', 'Maiken', 'Mailin', - 'Maja', 'Malea', 'Malee', 'Malin', 'Malina', 'Mandy', 'Manja', 'Manon', - 'Manuela', 'Mara', 'Maraike', 'Marcella', 'Marcelle', 'Marcia', - 'Mareike', 'Maren', 'Margaret', 'Margareta', 'Margarete', 'Margaretha', - 'Margarita', 'Margaritha', 'Margherita', 'Margit', 'Margitta', - 'Margot', 'Margret', 'Margreth', 'Marguerite', 'Maria', 'Mariam', - 'Marian', 'Mariana', 'Marianna', 'Marianne', 'Marie', 'Marieke', - 'Mariella', 'Marielle', 'Marietta', 'Marija', 'Marika', 'Marilies', - 'Marilyn', 'Marina', 'Marion', 'Marisa', 'Marissa', 'Marita', - 'Maritta', 'Marjorie', 'Marla', 'Marleen', 'Marlen', 'Marlena', - 'Marlene', 'Marlies', 'Marlis', 'Marsha', 'Martha', 'Marthe', - 'Martina', 'Mary', 'Maryse', 'Mascha', 'Mathilda', 'Mathilde', - 'Matilde', 'Mattea', 'Maude', 'Maura', 'Maureen', 'Maximiliane', 'May', - 'Maya', 'Meg', 'Megan', 'Meike', 'Melanie', 'Melia', 'Melina', - 'Melinda', 'Melissa', 'Melitta', 'Melodie', 'Meloney', 'Mercedes', - 'Meret', 'Meri', 'Merle', 'Merline', 'Meryem', 'Mia', 'Micaela', - 'Michaela', 'Michele', 'Michelle', 'Milena', 'Milla', 'Milva', 'Mimi', - 'Minerva', 'Minna', 'Mira', 'Mirabella', 'Mireille', 'Mirella', - 'Mireya', 'Miriam', 'Mirijam', 'Mirjam', 'Moesha', 'Moira', 'Mona', - 'Moni', 'Monica', 'Monika', 'Monique', 'Monja', 'Morgane', 'Muriel', - 'Myriam', 'Nadin', 'Nadine', 'Nadja', 'Nadjana', 'Naemi', 'Nancy', - 'Nanette', 'Nani', 'Naomi', 'Nastasja', 'Natalia', 'Natalie', - 'Natanja', 'Natascha', 'Nathalie', 'Neeja', 'Nena', 'Neria', 'Nerine', - 'Nicol', 'Nicola', 'Nicole', 'Nicoletta', 'Nicolette', 'Nike', - 'Nikola', 'Nina', 'Ninja', 'Ninon', 'Noa', 'Noelle', 'Noemi', 'Noemie', - 'Nora', 'Norma', 'Nuala', 'Olga', 'Olivia', 'Ophelia', 'Orania', - 'Orla', 'Ornella', 'Orsola', 'Ottilie', 'Paloma', 'Pam', 'Pamela', - 'Pandora', 'Paola', 'Paolina', 'Pascale', 'Pat', 'Patrice', 'Patricia', - 'Patrizia', 'Patsy', 'Patty', 'Paula', 'Paulette', 'Paulina', - 'Pauline', 'Penelope', 'Pepita', 'Petra', 'Philine', 'Philippa', - 'Philomele', 'Philomena', 'Phoebe', 'Phyllis', 'Pia', 'Pier', 'Prica', - 'Prisca', 'Priscilla', 'Priscille', 'Priska', 'Rachel', 'Rachel', - 'Rachelle', 'Radomila', 'Rafaela', 'Raffaela', 'Raffaella', 'Ragna', - 'Rahel', 'Raja', 'Ramona', 'Raphaela', 'Raquel', 'Rebecca', 'Rebekka', - 'Regina', 'Regine', 'Reisha', 'Renata', 'Renate', 'Renee', 'Resi', - 'Rhea', 'Rhoda', 'Rhonda', 'Ricarda', 'Riccarda', 'Rike', 'Rita', - 'Roberta', 'Romana', 'Romina', 'Romy', 'Ronja', 'Rosa', 'Rosalia', - 'Rosalie', 'Rosalinda', 'Rosalinde', 'Rosaline', 'Rose', 'Roseline', - 'Rosetta', 'Rosette', 'Rosi', 'Rosina', 'Rosine', 'Rossana', - 'Roswitha', 'Roxana', 'Roxane', 'Roxanne', 'Roxy', 'Rubina', 'Ruth', - 'Sabine', 'Sabrina', 'Sahra', 'Sally', 'Salome', 'Salvina', 'Samanta', - 'Samantha', 'Samira', 'Sandra', 'Sandrina', 'Sandrine', 'Sandy', - 'Sanne', 'Sanya', 'Saphira', 'Sara', 'Sarah', 'Sarina', 'Sascha', - 'Saskia', 'Scarlet', 'Scarlett', 'Schirin', 'Selina', 'Selma', - 'Serafina', 'Seraina', 'Seraphin', 'Seraphina', 'Seraphine', 'Serena', - 'Severina', 'Severine', 'Shana', 'Shanaya', 'Shantala', 'Shari', - 'Sharlene', 'Sharon', 'Sheena', 'Sheila', 'Sheryl', 'Shirin', - 'Shirley', 'Shirlyn', 'Sibilla', 'Sibyl', 'Sibylle', 'Siegrid', - 'Sigrid', 'Sigrun', 'Silja', 'Silke', 'Silvana', 'Silvia', 'Silviane', - 'Simona', 'Simone', 'Simonette', 'Simonne', 'Sina', 'Sindy', 'Sinja', - 'Sissy', 'Skyla', 'Smarula', 'Smilla', 'Sofia', 'Sofie', 'Sonia', - 'Sonja', 'Sonnele', 'Sonya', 'Sophia', 'Sophie', 'Soraya', 'Stefanie', - 'Steffi', 'Stella', 'Stephanie', 'Sumehra', 'Summer', 'Susan', - 'Susanna', 'Susanne', 'Susi', 'Suzan', 'Suzanne', 'Suzette', 'Svea', - 'Svenja', 'Swane', 'Sybilla', 'Sybille', 'Sydney', 'Sylvana', 'Sylvia', - 'Sylvie', 'Tabitha', 'Taissa', 'Tamara', 'Tamina', 'Tania', 'Tanita', - 'Tanja', 'Tara', 'Tatiana', 'Tatjana', 'Taya', 'Tecla', 'Telka', - 'Teodora', 'Teona', 'Teresa', 'Terry', 'Tess', 'Tessa', 'Tessie', - 'Thea', 'Thekla', 'Theodora', 'Theres', 'Theresa', 'Therese', - 'Theresia', 'Tiana', 'Tiffany', 'Tilly', 'Timna', 'Tina', 'Tiziana', - 'Tonja', 'Toril', 'Tosca', 'Tracey', 'Traudl', 'Trixi', 'Tycho', - 'Tyra', 'Ulla', 'Ulli', 'Ulrica', 'Ulrike', 'Undine', 'Urania', - 'Ursel', 'Ursina', 'Ursula', 'Ursule', 'Uschi', 'Uta', 'Ute', - 'Valentina', 'Valentine', 'Valeria', 'Valerie', 'Valeska', 'Vanadis', - 'Vanessa', 'Vanja', 'Varinka', 'Venetia', 'Vera', 'Verena', 'Verona', - 'Veronica', 'Veronika', 'Veronique', 'Vesla', 'Vicky', 'Victoire', - 'Victoria', 'Viki', 'Viktoria', 'Vilja', 'Viola', 'Violet', 'Violetta', - 'Violette', 'Virginia', 'Virginie', 'Vittoria', 'Viviana', 'Viviane', - 'Vivien', 'Vivienne', 'Vreneli', 'Vreni', 'Vroni', 'Wencke', 'Weneke', - 'Wibke', 'Wilja', 'Willow', 'Wilma', - ) - - last_names = ( - 'Ackermann', 'Adler', 'Adolph', 'Albers', 'Anders', 'Atzler', 'Aumann', - 'Austermühle', 'Bachmann', 'Barkholz', 'Barth', 'Bauer', 'Baum', - 'Becker', 'Beckmann', 'Beer', 'Beier', 'Bender', 'Benthin', 'Berger', - 'Beyer', 'Bien', 'Biggen', 'Binner', 'Birnbaum', 'Bloch', 'Blümel', - 'Bohlander', 'Bohnbach', 'Bolander', 'Bolnbach', 'Bolzmann', 'Bonbach', - 'Boucsein', 'Briemer', 'Bruder', 'Buchholz', 'Budig', 'Butte', 'Bähr', - 'Bärer', 'Börner', 'Carsten', 'Caspar', 'Christoph', 'Cichorius', - 'Conradi', 'Davids', 'Dehmel', 'Dickhard', 'Dietz', 'Dippel', - 'Ditschlerin', 'Dobes', 'Dowerg', 'Drewes', 'Drub', 'Drubin', 'Dussen', - 'Dussen van', 'Döhn', 'Döring', 'Dörr', 'Dörschner', 'Eberhardt', - 'Ebert', 'Eberth', 'Eckbauer', 'Ehlert', 'Eigenwillig', 'Eimer', - 'Ernst', 'Etzler', 'Etzold', 'Faust', 'Fechner', 'Fiebig', 'Finke', - 'Fischer', 'Flantz', 'Fliegner', 'Franke', 'Freudenberger', 'Fritsch', - 'Fröhlich', 'Förster', 'Gehringer', 'Geisel', 'Geisler', 'Geißler', - 'Gerlach', 'Gertz', 'Gierschner', 'Gieß', 'Girschner', 'Gnatz', - 'Gorlitz', 'Gotthard', 'Graf', 'Grein Groth', 'Gröttner', 'Gude', - 'Gumprich', 'Gunpf', 'Gute', 'Gutknecht', 'Haase', 'Haering', 'Hahn', - 'Hamann', 'Hande', 'Harloff', 'Hartmann', 'Hartung', 'Hauffer', - 'Hecker', 'Heidrich', 'Hein', 'Heinrich', 'Heintze', 'Heinz', - 'Hellwig', 'Henck', 'Hendriks', 'Henk', 'Henschel', 'Hentschel', - 'Hering', 'Hermann', 'Hermighausen', 'Herrmann', 'Hertrampf', 'Heser', - 'Hesse', 'Hethur', 'Hettner', 'Heuser', 'Heydrich', 'Heß', 'Hiller', - 'Hoffmann', 'Hofmann', 'Holsten', 'Holt', 'Holzapfel', 'Hornich', - 'Hornig', 'Huhn', 'Hänel', 'Häring', 'Höfig', 'Hölzenbecher', 'Hörle', - 'Hövel', 'Hübel', 'Jacob', 'Jacobi', 'Jessel', 'Jockel', 'Johann', - 'Jopich', 'Junck', 'Juncken', 'Jungfer', 'Junitz', 'Junk', 'Junken', - 'Jäckel', 'Jähn', 'Jäkel', 'Jäntsch', 'Jüttner', 'Kabus', 'Kade', - 'Kallert', 'Kambs', 'Karge', 'Karz', 'Kaul', 'Kensy', 'Keudel', - 'Killer', 'Kitzmann', 'Klapp', 'Klemm', 'Klemt', 'Klingelhöfer', - 'Klotz', 'Knappe', 'Kobelt', 'Koch', 'Koch II', 'Kohl', 'Kostolzin', - 'Kramer', 'Kranz', 'Krause', 'Kraushaar', 'Krebs', 'Krein', 'Kreusel', - 'Kroker', 'Kruschwitz', 'Kuhl', 'Kusch', 'Käster', 'Köhler', 'Köster', - 'Kühnert', 'Lachmann', 'Ladeck', 'Lange', 'Langern', 'Lehmann', - 'Liebelt', 'Lindau', 'Lindner', 'Linke', 'Loos', 'Lorch', 'Losekann', - 'Löchel', 'Löffler', 'Löwer', 'Lübs', 'Mangold', 'Mans', 'Margraf', - 'Martin', 'Matthäi', 'Meister', 'Mende', 'Mentzel', 'Metz', 'Meyer', - 'Mielcarek', 'Mies', 'Misicher', 'Mitschke', 'Mohaupt', 'Mosemann', - 'Mude', 'Mälzer', 'Möchlichen', 'Mühle', 'Mülichen', 'Müller', 'Naser', - 'Nerger', 'Nette', 'Neureuther', 'Neuschäfer', 'Niemeier', 'Noack', - 'Nohlmans', 'Oderwald', 'Oestrovsky', 'Ortmann', 'Otto', 'Paffrath', - 'Patberg', 'Pechel', 'Pergande', 'Peukert', 'Pieper', 'Plath', 'Pohl', - 'Preiß', 'Pruschke', 'Putz', 'Pärtzelt', 'Pölitz', 'Radisch', - 'Reichmann', 'Reinhardt', 'Reising', 'Renner', 'Reuter', 'Riehl', - 'Ring', 'Ritter', 'Rogge', 'Rogner', 'Rohleder', 'Roht', 'Rose', - 'Rosemann', 'Rosenow', 'Roskoth', 'Rudolph', 'Ruppersberger', - 'Ruppert', 'Rust', 'Rädel', 'Röhrdanz', 'Röhricht', 'Römer', - 'Rörricht', 'Sager', 'Salz', 'Sauer', 'Schaaf', 'Schacht', 'Scheel', - 'Scheibe', 'Schenk', 'Scheuermann', 'Schinke', 'Schleich', 'Schleich', - 'Schlosser', 'Schmidt', 'Schmidtke', 'Schmiedecke', 'Schmiedt', - 'Scholl', 'Scholtz', 'Scholz', 'Schomber', 'Schottin', 'Schuchhardt', - 'Schulz', 'Schuster', 'Schweitzer', 'Schwital', 'Schäfer', 'Schönland', - 'Schüler', 'Segebahn', 'Seidel', 'Seifert', 'Seifert', 'Seip', - 'Siering', 'Sontag', 'Sorgatz', 'Speer', 'Spieß', 'Stadelmann', - 'Stahr', 'Staude', 'Steckel', 'Steinberg', 'Stey', 'Stiebitz', - 'Stiffel', 'Stoll', 'Stolze', 'Striebitz', 'Stroh', 'Stumpf', 'Sucker', - 'Säuberlich', 'Söding', 'Sölzer', 'Süßebier', 'Textor', 'Thanel', - 'Thies', 'Tintzmann', 'Tlustek', 'Trapp', 'Trommler', 'Trub', 'Trubin', - 'Trupp', 'Tröst', 'Trüb', 'Tschentscher', 'Täsche', 'Ullmann', - 'Ullrich', 'Vogt', 'Vollbrecht', 'Wagenknecht', 'Wagner', 'Walter', - 'Warmer', 'Weihmann', 'Weimer', 'Weinhage', 'Weinhold', 'Weitzel', - 'Weiß', 'Weller', 'Wende', 'Wernecke', 'Werner', 'Wesack', 'Wiek', - 'Wieloch', 'Wilms', 'Wilmsen', 'Winkler', 'Wirth', 'Wohlgemut', 'Wulf', - 'Wulff', 'Wähner', 'Zahn', 'Ziegert', 'Zimmer', 'Zirme', 'Zobel', - 'Zorbach', 'Zänker', 'auch Schlauchin', - ) - - prefixes_male = ( - 'Herr', 'Dr.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.', - ) - prefixes_female = ( - 'Frau', 'Dr.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.', - ) - - suffixes = ('B.Sc.', 'B.A.', 'B.Eng.', 'MBA.', ) - - @classmethod - def first_name(cls): - return cls.random_element( - (cls.first_name_male(), cls.first_name_female())) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def prefix(cls): - return cls.random_element((cls.prefix_male(), cls.prefix_female())) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes_male) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes_female) - - @classmethod - def suffix(cls): - return cls.random_element(cls.suffixes) diff --git a/src/faker/providers/dk_DK/__init__.py b/src/faker/providers/dk_DK/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/el_GR/__init__.py b/src/faker/providers/el_GR/__init__.py deleted file mode 100644 index 8dc9940..0000000 --- a/src/faker/providers/el_GR/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# coding=utf-8 -""" -fake.address(): Μαστρογιαννίδου 7, - ΤΚ 36777 Αλεξανδρούπολη -fake.line_address(): Αργυροπούλου 3, 34924 Δράμα -fake.street_name(): Αρδείας -fake.street_address(): Λεωφ. Ευόσμου 44 -fake.building_number(): 131 -fake.postcode(): ΤΚ 991 51 -fake.city(): Καστοριά -fake.region(): Πέλλα -fake.country(): Μπρουνέι -fake.latitude(): 38.818785 -fake.longitude(): 27.367441 -fake.latlng(): (36.706833, 28.523434) - -fake.name(): Θεοδώρα Αλεξανδράκη -fake.name_male(): Σόλων-Αγγελής Πετράκης -fake.name_female(): Μαρία Ξυγκάκου -fake.first_name(): Μάριος -fake.first_name_male(): Επαμεινώνδας -fake.first_name_female(): Ρεβέκα -fake.last_name(): Φραγκόπουλος -fake.last_name_male(): Αποστολάκης -fake.last_name_female(): Χαλκίδου - -fake.text(): Πιο προγραμματιστής παραδώσεις γραμμή στη νιρβάνα - κι. Πολύ έγραψες ημέρα τι συνεντεύξεις. Γραμμής - βρίσκονται αποθηκευτικού από συνάδελφος μέχρι τα. - -fake.phone_number(): 210 761 8331 - -fake.email(): aimilia.lioliopoulou@doukatziskapetanios.gr -fake.free_email(): yzygouris@gmail.com -fake.company_email(): eutychia.tsachaki@ioakeim.gr -fake.user_name(): konstantina.maniotis -fake.url(): http://www.anastasiou.org/ -""" diff --git a/src/faker/providers/en_CA/__init__.py b/src/faker/providers/en_CA/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/en_CA/address.py b/src/faker/providers/en_CA/address.py deleted file mode 100644 index efbb2ca..0000000 --- a/src/faker/providers/en_CA/address.py +++ /dev/null @@ -1,169 +0,0 @@ -from __future__ import unicode_literals -import re -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - - postal_code_letters = ('A','B','C','E','G','H','J', - 'K','L','M','N','P','R','S','T','V','X','Y') - - city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') - - city_suffixes = ( - 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', - 'chester', 'mouth', 'fort', 'haven', 'side', 'shire') - - building_number_formats = ('#####', '####', '###') - - street_suffixes = ( - 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', - 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', - 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', - 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', - 'Extensions', - 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', - 'Fork', - 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', - 'Groves', - 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', - 'Island', - 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', - 'Lakes', - 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', - 'Mall', - 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', - 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', - 'Parkway', - 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', - 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', - 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', - 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', - 'Square', - 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', - 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', - 'Trail', - 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', - 'Viaduct', - 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', - 'Ways', 'Well', 'Wells') - - postal_code_formats = ('?%? %?%', '?%?%?%') - - provinces = ( - 'Alberta', 'British Columbia', 'Manitoba', 'New Brunswick', - 'Newfoundland and Labrador', 'Northwest Territories', - 'New Brunswick', 'Nova Scotia', 'Nunavut', 'Ontario', - 'Prince Edward Island', 'Quebec', 'Saskatchewan', 'Yukon Territory') - - provinces_abbr = ( - 'AB', 'BC', 'MB', 'NB', 'NL', 'NT', 'NS', - 'NV', 'ON', 'PE', 'QC', 'SK', 'YT') - - countries = ( - 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', - 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', - 'Australia', 'Austria', 'Azerbaijan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', - 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', - 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', - 'Bulgaria', 'Burkina Faso', 'Burundi', - 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', - 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Congo', 'Cook Islands', - 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', - 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', - 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', - 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', - 'French Polynesia', 'French Southern Territories', - 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', - 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', - 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', - 'Hungary', - 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', - 'Jamaica', 'Japan', 'Jersey', 'Jordan', - 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic', - 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', - 'Liechtenstein', 'Lithuania', 'Luxembourg', - 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', - 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', - 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', - 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', - 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', - 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', - 'Qatar', - 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', - 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', - 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', - 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', - 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', - 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', - 'Syrian Arab Republic', - 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', - 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', - 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', - 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Wallis and Futuna', 'Western Sahara', - 'Yemen', - 'Zambia', 'Zimbabwe' - ) - - city_formats = ( - '{{city_prefix}} {{first_name}}{{city_suffix}}', - '{{city_prefix}} {{first_name}}', - '{{first_name}}{{city_suffix}}', - '{{last_name}}{{city_suffix}}', - ) - street_name_formats = ( - '{{first_name}} {{street_suffix}}', - '{{last_name}} {{street_suffix}}' - ) - street_address_formats = ( - '{{building_number}} {{street_name}}', - '{{building_number}} {{street_name}} {{secondary_address}}', - ) - address_formats = ( - "{{street_address}}\n{{city}}, {{province_abbr}} {{postalcode}}", - ) - secondary_address_formats = ('Apt. ###', 'Suite ###') - - @classmethod - def province(cls): - """ - """ - return cls.random_element(cls.provinces) - - @classmethod - def province_abbr(cls): - return cls.random_element(cls.provinces_abbr) - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def postal_code_letter(cls): - """ - Returns a random letter from the list of allowable - letters in a canadian postal code - """ - return cls.random_element(cls.postal_code_letters) - - @classmethod - def postalcode(cls): - """ - Replaces all question mark ('?') occurrences with a random letter - from postal_code_formats then passes result to - numerify to insert numbers - """ - temp = re.sub(r'\?', - lambda x: cls.postal_code_letter(), - cls.random_element(cls.postal_code_formats)) - return cls.numerify(temp) - diff --git a/src/faker/providers/en_CA/ssn.py b/src/faker/providers/en_CA/ssn.py deleted file mode 100644 index 6ebed47..0000000 --- a/src/faker/providers/en_CA/ssn.py +++ /dev/null @@ -1,38 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..ssn import Provider as SsnProvider -import random - -class Provider(SsnProvider): - - #in order to create a valid SIN we need to provide a number that passes a simple modified Luhn Algorithmn checksum - #this function essentially reverses the checksum steps to create a random valid SIN (Social Insurance Number) - @classmethod - def ssn(cls): - - #create an array of 8 elements initialized randomly - digits = random.sample(range(10), 8) - - # All of the digits must sum to a multiple of 10. - # sum the first 8 and set 9th to the value to get to a multiple of 10 - digits.append(10 - (sum(digits) % 10)) - - #digits is now the digital root of the number we want multiplied by the magic number 121 212 121 - #reverse the multiplication which occurred on every other element - for i in range(1, len(digits), 2): - if digits[i] % 2 == 0: - digits[i] = (digits[i] / 2) - else: - digits[i] = (digits[i] + 9) / 2 - - #build the resulting SIN string - sin = "" - for i in range(0, len(digits), 1): - sin += str(digits[i]) - #add a space to make it conform to normal standards in Canada - if i % 3 == 2: - sin += " " - - #finally return our random but valid SIN - return sin - diff --git a/src/faker/providers/en_GB/__init__.py b/src/faker/providers/en_GB/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/en_GB/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/en_US/__init__.py b/src/faker/providers/en_US/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/en_US/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/en_US/address.py b/src/faker/providers/en_US/address.py deleted file mode 100644 index 45a6a59..0000000 --- a/src/faker/providers/en_US/address.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import unicode_literals -import random - -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') - - city_suffixes = ( - 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', - 'chester', 'mouth', 'fort', 'haven', 'side', 'shire') - - building_number_formats = ('#####', '####', '###') - - street_suffixes = ( - 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', - 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', - 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', - 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', - 'Extensions', - 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', - 'Fork', - 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', - 'Groves', - 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', - 'Island', - 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', - 'Lakes', - 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', - 'Mall', - 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', - 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', - 'Parkway', - 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', - 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', - 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', - 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', - 'Square', - 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', - 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', - 'Trail', - 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', - 'Viaduct', - 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', - 'Ways', 'Well', 'Wells') - - postcode_formats = ('#####', '#####-####') - - states = ( - 'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', - 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', - 'Maryland', - 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', - 'NewHampshire', 'NewJersey', 'NewMexico', 'NewYork', 'NorthCarolina', 'NorthDakota', 'Ohio', 'Oklahoma', - 'Oregon', - 'Pennsylvania', 'RhodeIsland', 'SouthCarolina', 'SouthDakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', - 'Virginia', - 'Washington', 'WestVirginia', 'Wisconsin', 'Wyoming' ) - - states_abbr = ( - 'AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FM', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', - 'IA', - 'KS', 'KY', 'LA', 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', - 'NC', - 'ND', 'MP', 'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VI', 'VA', 'WA', - 'WV', - 'WI', 'WY') - - military_state_abbr = ('AE', 'AA', 'AP') - - military_ship_prefix = ('USS', 'USNS', 'USNV', 'USCGC') - - military_apo_format = ("PSC ####, Box ####") - - military_dpo_format = ("Unit #### Box ####") - - countries = ( - 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', - 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', - 'Australia', 'Austria', 'Azerbaijan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', - 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', - 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', - 'Bulgaria', 'Burkina Faso', 'Burundi', - 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', - 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Congo', 'Cook Islands', - 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', - 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', - 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', - 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', - 'French Polynesia', 'French Southern Territories', - 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', - 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', - 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', - 'Hungary', - 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', - 'Jamaica', 'Japan', 'Jersey', 'Jordan', - 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic', - 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', - 'Liechtenstein', 'Lithuania', 'Luxembourg', - 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', - 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', - 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', - 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway', - 'Oman', - 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', - 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico', - 'Qatar', - 'Reunion', 'Romania', 'Russian Federation', 'Rwanda', - 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', - 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', - 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', - 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', - 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', - 'Syrian Arab Republic', - 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', - 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', - 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', - 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Wallis and Futuna', 'Western Sahara', - 'Yemen', - 'Zambia', 'Zimbabwe' - ) - - city_formats = ( - '{{city_prefix}} {{first_name}}{{city_suffix}}', - '{{city_prefix}} {{first_name}}', - '{{first_name}}{{city_suffix}}', - '{{last_name}}{{city_suffix}}', - ) - - street_name_formats = ( - '{{first_name}} {{street_suffix}}', - '{{last_name}} {{street_suffix}}' - ) - - street_address_formats = ( - '{{building_number}} {{street_name}}', - '{{building_number}} {{street_name}} {{secondary_address}}', - ) - - address_formats = ( - "{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}", - ) - - address_formats = { - "{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}": 25, - #military address formatting. - "{{military_apo}}\nAPO {{military_state}} {{postcode}}": 1, - "{{military_ship}} {{last_name}}\nFPO {{military_state}} {{postcode}}": 1, - "{{military_dpo}}\nDPO {{military_state}} {{postcode}}": 1 - } - - secondary_address_formats = ('Apt. ###', 'Suite ###') - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def state(cls): - return cls.random_element(cls.states) - - @classmethod - def state_abbr(cls): - return cls.random_element(cls.states_abbr) - - @classmethod - def zipcode(cls): - return "%05d" % random.randint(501, 99950) - - @classmethod - def zipcode_plus4(cls): - return "%s-%04d" % (cls.zipcode(), random.randint(1, 9999)) - - @classmethod - def military_ship(cls): - """ - :example 'USS' - """ - return cls.random_element(cls.military_ship_prefix) - - @classmethod - def military_state(cls): - """ - :example 'APO' - """ - return cls.random_element(cls.military_state_abbr) - - @classmethod - def military_apo(cls): - """ - :example 'PSC 5394 Box 3492 - """ - return cls.numerify(cls.military_apo_format) - - @classmethod - def military_dpo(cls): - """ - :example 'Unit 3333 Box 9342' - """ - return cls.numerify(cls.military_dpo_format) - - - # Aliases - @classmethod - def postalcode(cls): - return cls.zipcode() - - @classmethod - def postalcode_plus4(cls): - return cls.zipcode_plus4() diff --git a/src/faker/providers/en_US/ssn.py b/src/faker/providers/en_US/ssn.py deleted file mode 100644 index 314d333..0000000 --- a/src/faker/providers/en_US/ssn.py +++ /dev/null @@ -1,10 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..ssn import Provider as SsnProvider - -class Provider(SsnProvider): - ssn_formats = ("###-##-####",) - - @classmethod - def ssn(cls): - return cls.bothify(cls.random_element(cls.ssn_formats)) \ No newline at end of file diff --git a/src/faker/providers/es_ES/__init__.py b/src/faker/providers/es_ES/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/es_ES/address.py b/src/faker/providers/es_ES/address.py deleted file mode 100644 index 86d47d5..0000000 --- a/src/faker/providers/es_ES/address.py +++ /dev/null @@ -1,105 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - building_number_formats = ('%', '%#', '%#', '%#', '%##') - street_prefixes = ( - 'Plaza', 'Calle', 'Avenida', 'Via', 'Vial', 'Rambla', 'Glorieta', 'Urbanización', 'Callejón', 'Cañada', - 'Alameda', 'Acceso', 'C.', 'Ronda', 'Pasaje', 'Cuesta', 'Pasadizo', 'Paseo', 'Camino' - ) - postcode_formats = ('#####', ) - states = ( - 'Álava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Ávila', 'Badajoz', - 'Baleares', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', - 'Ceuta', 'Ciudad', 'Córdoba', 'Cuenca', 'Girona', 'Granada', 'Guadalajara', - 'Guipúzcoa', 'Huelva', 'Huesca', 'Jaén', 'La Coruña', 'La Rioja', 'Las Palmas', - 'León', 'Lleida', 'Lugo', 'Madrid', 'Málaga', 'Melilla', 'Murcia', 'Navarra', - 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Santa Cruz de Tenerife', - 'Segovia', 'Sevilla', 'Soria', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', - 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza' - ) - countries = ( - 'Afganistán', 'Akrotiri', 'Albania', 'Alemania', 'Andorra', 'Angola', 'Anguila', - 'Antártida', 'Antigua y Barbuda', 'Antillas Neerlandesas', 'Arabia Saudí', - 'Arctic Ocean', 'Argelia', 'Argentina', 'Armenia', 'Aruba', 'Ashmore and Cartier Islands', - 'Atlantic Ocean', 'Australia', 'Austria', 'Azerbaiyán', 'Bahamas', - 'Bahráin', 'Bangladesh', 'Barbados', 'Bélgica', 'Belice', 'Benín', 'Bermudas', - 'Bielorrusia', 'Birmania Myanmar', 'Bolivia', 'Bosnia y Hercegovina', - 'Botsuana', 'Brasil', 'Brunéi', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Bután', - 'Cabo Verde', 'Camboya', 'Camerún', 'Canadá', 'Chad', 'Chile', 'China', - 'Chipre', 'Clipperton Island', 'Colombia', 'Comoras', 'Congo', 'Coral Sea Islands', - 'Corea del Norte', 'Corea del Sur', 'Costa de Marfil', 'Costa Rica', - 'Croacia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Dominica', 'Ecuador', 'Egipto', 'El Salvador', - 'El Vaticano', 'Emiratos Árabes Unidos', 'Eritrea', 'Eslovaquia', - 'Eslovenia', 'España', 'Estados Unidos', 'Estonia', 'Etiopía', 'Filipinas', - 'Finlandia', 'Fiyi', 'Francia', 'Gabón', 'Gambia', 'Gaza Strip', 'Georgia', - 'Ghana', 'Gibraltar', 'Granada', 'Grecia', 'Groenlandia', 'Guam', 'Guatemala', - 'Guernsey', 'Guinea', 'Guinea Ecuatorial', 'Guinea-Bissau', 'Guyana', 'Haití', - 'Honduras', 'Hong Kong', 'Hungría', 'India', 'Indian Ocean', 'Indonesia', - 'Irán', 'Iraq', 'Irlanda', 'Isla Bouvet', 'Isla Christmas', 'Isla Norfolk', - 'Islandia', 'Islas Caimán', 'Islas Cocos', 'Islas Cook', 'Islas Feroe', 'Islas Georgia del Sur y Sandwich del Sur', - 'Islas Heard y McDonald', 'Islas Malvinas', 'Islas Marianas del Norte', 'Islas Marshall', - 'Islas Pitcairn', 'Islas Salomón', 'Islas Turcas y Caicos', 'Islas Vírgenes Americanas', - 'Islas Vírgenes Británicas', 'Israel', 'Italia', 'Jamaica', 'Jan Mayen', 'Japón', 'Jersey', - 'Jordania', 'Kazajistán', 'Kenia', 'Kirguizistán', 'Kiribati', 'Kuwait', 'Laos', - 'Lesoto', 'Letonia', 'Líbano', 'Liberia', 'Libia', 'Liechtenstein', 'Lituania', - 'Luxemburgo', 'Macao', 'Macedonia', 'Madagascar', 'Malasia', 'Malaui', - 'Maldivas', 'Malí', 'Malta', 'Man, Isle of', 'Marruecos', 'Mauricio', - 'Mauritania', 'Mayotte', 'México', 'Micronesia', 'Moldavia', 'Mónaco', - 'Mongolia', 'Montserrat', 'Mozambique', 'Namibia', 'Nauru', 'Navassa Island', - 'Nepal', 'Nicaragua', 'Níger', 'Nigeria', 'Niue', 'Noruega', 'Nueva Caledonia', - 'Nueva Zelanda', 'Omán', 'Pacific Ocean', 'Países Bajos', 'Pakistán', 'Palaos', - 'Panamá', 'Papúa-Nueva Guinea', 'Paracel Islands', 'Paraguay', 'Perú', - 'Polinesia Francesa', 'Polonia', 'Portugal', 'Puerto Rico', 'Qatar', 'Reino Unido', - 'República Centroafricana', 'República Checa', 'República Democrática del Congo', - 'República Dominicana', 'Ruanda', 'Rumania', 'Rusia', 'Sáhara Occidental', 'Samoa', - 'Samoa Americana', 'San Cristóbal y Nieves', 'San Marino', - 'San Pedro y Miquelón', 'San Vicente y las Granadinas', 'Santa Helena', 'Santa Lucía', - 'Santo Tomé y Príncipe', 'Senegal', 'Seychelles', 'Sierra Leona', - 'Singapur', 'Siria', 'Somalia', 'Southern Ocean', 'Spratly Islands', 'Sri Lanka', - 'Suazilandia', 'Sudáfrica', 'Sudán', 'Suecia', 'Suiza', 'Surinam', - 'Svalbard y Jan Mayen', 'Tailandia', 'Taiwán', 'Tanzania', 'Tayikistán', - 'TerritorioBritánicodel Océano Indico', 'Territorios Australes Franceses', - 'Timor Oriental', 'Togo', 'Tokelau', 'Tonga', 'Trinidad y Tobago', 'Túnez', - 'Turkmenistán', 'Turquía', 'Tuvalu', 'Ucrania', 'Uganda', 'Unión Europea', - 'Uruguay', 'Uzbekistán', 'Vanuatu', 'Venezuela', 'Vietnam', 'Wake Island', - 'Wallis y Futuna', 'West Bank', 'World', 'Yemen', 'Yibuti', 'Zambia', 'Zimbabue' - ) - - city_formats = ( - '{{state_name}}', - ) - - street_name_formats = ( - '{{street_prefix}} {{first_name}} {{last_name}}', - '{{street_prefix}} de {{first_name}} {{last_name}}', - - ) - street_address_formats = ( - '{{street_name}} {{building_number}}', - '{{street_name}} {{building_number}} {{secondary_address}} ', - ) - address_formats = ( - "{{street_address}}\n{{city}}, {{postcode}}", - ) - secondary_address_formats = ('Apt. ##', 'Piso #', 'Puerta #') - - @classmethod - def state_name(cls): - return cls.random_element(cls.states) - - @classmethod - def street_prefix(cls): - return cls.random_element(cls.street_prefixes) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def state(cls): - return cls.random_element(cls.states) - diff --git a/src/faker/providers/es_MX/__init__.py b/src/faker/providers/es_MX/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/es_MX/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/es_MX/address.py b/src/faker/providers/es_MX/address.py deleted file mode 100644 index 83cbef6..0000000 --- a/src/faker/providers/es_MX/address.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- encoding: utf-8 -*- -from __future__ import unicode_literals -from ..address import Provider as AddressProvider -#import locale - -class Provider(AddressProvider): - #current_locale = locale.setlocale(locale.LC_ALL, "es_MX.UTF-8") - city_prefixes = ('Sur', 'Norte',) - city_adjetives = ('Nueva', 'Vieja',) - city_suffixies = ('de la Montaña', 'los bajos', 'los altos', ) - street_prefixes = ( - 'Ampliación', 'Andador', 'Avenida', 'Boulevard', 'Calle', 'Callejón', - 'Calzada', 'Cerrada', 'Circuito', 'Circunvalación', 'Continuación', - 'Corredor', 'Diagonal', 'Eje vial', 'Pasaje', 'Peatonal', 'Periférico', - 'Privada', 'Prolongación', 'Retorno', 'Viaducto' - ) - building_number_formats = ('#####', '####', '###') - postcode_formats = ('#####', '#####-####') - ## States and abbrs from Mexico from INEGI - ## http://www.inegi.org.mx/geo/contenidos/geoestadistica/CatalogoClaves.aspx - states = ( - ('AGS','Aguascalientes'), ('BC','Baja California'), - ('BCS','Baja California Sur'), ('CAMP','Campeche'), - ('COAH', 'Coahuila de Zaragoza'), ('COL', 'Colima'), - ('CHIS', 'Chiapas'), ('CHIH', 'Chihuahua'), - ('DF','Distrito Federal'), ('DGO', 'Durango'), - ('GTO', 'Guanajuato'), ('GRO', 'Guerrero'), ('HGO', 'Hidalgo'), - ('JAL', 'Jalisco'), ('MEX', 'México'), - ('MICH', 'Michoacán de Ocampo'), ('MOR', 'Morelos'), - ('NAY', 'Nayarit'), ('NL', 'Nuevo León'), ('OAX', 'Oaxaca'), - ('PUE','Puebla'), ('QRO', 'Querétaro'), - ('Q. ROO', 'Quintana Roo'), ('SLP', 'San Luis Potosí'), - ('SIN', 'Sinaloa'), ('SON', 'Sonora'), ('TAB', 'Tabasco'), - ('TAMPS','Tamaulipas'), ('TLAX','Tlaxcala'), - ('VER', 'Veracruz de Ignacio de la Llave'), - ('YUC', 'Yucatán'), ('ZAC','Zacatecas'),) - - zip_codes = { - ## The ZipCodes has a begin & final range - ## Source: Norma Técnica de Domicilios INEGI - 'AGS': (20000, 20999), 'BC' : (21000, 22999), - 'BCS': (23000, 23999), 'CAMP' : (24000, 24999), - 'COAH': (25000, 27999), 'COL': (28000, 28999), - 'CHIS': (29000, 30999), 'CHIH': (31000, 33999), - 'DF': (1000, 19999), 'DGO': (36000, 35999), - 'GTO': (36000, 38999), 'GRO': (39000, 41999), - 'HGO': (42000, 43999), 'JAL': (44000, 49999), - 'MEX': (50000, 57999), 'MICH': (58000, 61999), - 'MOR': (62000, 62999), 'NAY': (63000, 63999), - 'NL': (64000, 67999), 'OAX': (68000, 71999), - 'PUE': (72000, 75999), 'QRO': (76000, 76999), - 'Q. ROO': (77000, 75999), 'SLP': (78000, 79999), - 'SIN': (80000, 82999), 'SON': (83000, 85999), - 'TAB': (86000, 86999), 'TAMPS': (87000, 89999), - 'TLAX': (90000, 90999), 'VER': (91000, 97999), - 'YUC': (97000, 97999), 'ZAC': (98000, 99999) - } - ## List of Countries https://www.un.org/es/members/ - countries = ( - 'Afganistán', 'Albania', 'Alemania', 'Andorra', 'Angola', - 'Antigua y Barbuda', 'Arabia Saudita', 'Argelia', 'Argentina', - 'Armenia', 'Australia', 'Austria', 'Azerbaiyán', - 'Bahamas', 'Bahrein', 'Bangladesh', 'Barbados', 'Belarús', - 'Bélgica', 'Belice', 'Benin', 'Bhután', 'Bolivia', - 'Bosnia y Herzegovina', 'Botswana', 'Brasil', 'Brunei Darussalam', - 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cabo Verde', 'Camboya', - 'Camerún', 'Canadá', 'Chad', 'Chile', 'China', 'Chipre','Colombia', - 'Comoras', 'Congo', 'Costa Rica', 'Côte d\'Ivoire', 'Croacia', - 'Cuba', 'Dinamarca', 'Djibouti', 'Dominicana', 'Ecuador', 'Egipto', - 'El Salvador', 'Emiratos Árabes Unidos', 'Eritrea', 'Eslovaquia', - 'Eslovenia', 'España', 'Estados Unidos de América', 'Estonia', - 'Etiopía', 'ex República Yugoslava de Macedonia', - 'Federación de Rusia', 'Fiji', 'Filipinas', 'Finlandia', 'Francia', - 'Gabón', 'Gambia', 'Georgia', 'Ghana', 'Granada', 'Grecia', - 'Guatemala', 'Guinea', 'Guinea Bissau', 'Guinea Ecuatorial', - 'Guyana', 'Haití', 'Honduras', 'Hungría', 'India', 'Indonesia', - 'Irán', 'Iraq', 'Irlanda', 'Islandia', 'Islas Marshall', - 'Islas Salomón', 'Israel', 'Italia', 'Jamaica', 'Japón', - 'Jordania', 'Kazajstán', 'Kenya', 'Kirguistán', 'Kiribati', - 'Kuwait', 'Lesotho', 'Letonia', 'Líbano', 'Liberia', 'Libia', - 'Liechtenstein', 'Lituania', 'Luxemburgo', 'Madagascar', - 'Malasia', 'Malawi', 'Maldivas', 'Mali', 'Malta','Marruecos', - 'Mauricio', 'Mauritania', 'México', 'Micronesia', 'Mónaco', - 'Mongolia', 'Montenegro','Mozambique','Myanmar', 'Namibia', - 'Nauru', 'Nicaragua', 'Niger', 'Nigeria', 'Noruega', - 'Nueva Zelandia', 'Omán', 'Países Bajos', 'Pakistán', 'Palau', - 'Panamá', 'Papua Nueva Guinea', 'Paraguay', 'Perú', 'Polonia', - 'Portugal', 'Qatar', - 'Reino Unido de Gran Bretaña e Irlanda del Norte', - 'República Árabe Siria', 'República Centroafricana', - 'República Checa', 'República de Corea', 'República de Moldova', - 'República Democrática del Congo', - 'República Democrática Popular Lao', - 'República Dominicana', - 'República Federal Democrática de Nepal', - 'República Popular Democrática de Corea', - 'República Unida de Tanzanía', 'Rumania', 'Rwanda', - 'Saint Kitts y Nevis', 'Samoa', 'San Marino', 'Santa Lucía', - 'Santo Tomé y Príncipe', 'San Vicente y las Granadinas', - 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leona', 'Singapur', - 'Somalia', 'Sri Lanka', 'Sudáfrica', 'Sudán', 'Sudán del Sur', - 'Suecia', 'Suiza', 'Suriname', 'Swazilandia', 'Tailandia', - 'Tayikistán', 'Timor-Leste', 'Togo', 'Tonga', 'Trinidad y Tabago', - 'Túnez', 'Turkmenistán', 'Turquía', 'Tuvalu', 'Ucrania', 'Uganda', - 'Uruguay', 'Uzbekistán', 'Vanuatu', 'Venezuela', 'Vietman', - 'Yemen', 'Zambia', 'Zimbabwe' - ) - - city_formats = ( - '{{city_adjetive}} {{country}}', - 'San {{first_name}} {{city_suffix}}', - ) - street_name_formats = ( - '{{street_prefix}} {{last_name}}', - '{{street_prefix}} {{country}}', - '{{street_prefix}} {{state}}', - '{{street_prefix}} {{city_prefix}} {{last_name}}' - ) - street_address_formats = ( - #'{{building_number}} {{street_name}}', - '{{street_name}} {{secondary_address}}', - #'{{building_number}} {{street_name}} {{secondary_address}}', - ) - address_formats = ( - "{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}", - ) - secondary_address_formats = ('### ###', '### Interior ###', - '### Edif. ### , Depto. ###') - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def city_suffix(cls): - return cls.random_element(cls.city_suffixies) - - @classmethod - def city_adjetive(cls): - return cls.random_element(cls.city_adjetives) - - @classmethod - def street_prefix(cls): - """ - :example 'Avenida' - """ - return cls.random_element(cls.street_prefixes) - @classmethod - def secondary_address(cls): - """ - :example '020 Interior 999' - """ - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def state(cls): - """ - example: u'Guerrero' - """ - return cls.random_element(cls.states)[1] - - @classmethod - def state_abbr(cls): - """ - example: u'GRO' - """ - return cls.random_element(cls.states)[0] - diff --git a/src/faker/providers/fa_IR/__init__.py b/src/faker/providers/fa_IR/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/fa_IR/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/fa_IR/address.py b/src/faker/providers/fa_IR/address.py deleted file mode 100644 index 0946f4c..0000000 --- a/src/faker/providers/fa_IR/address.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - city_prefixes = ('شمال', 'غرب', 'شرق', 'جنوب', 'بندر', 'شهر', 'روستای', 'دهستان', 'شهرستان', 'باغات', 'استان') - building_number_formats = ('#####', '####', '###') - street_suffixes = ( - 'کوچه', 'خیابان', 'پل', 'دره', 'میدان', 'چهار راه', 'بن بست', 'بلوار', 'جنب', 'تقاطع', 'آزاد راه', 'بزرگ راه', 'جزیره', 'کوه', 'جاده', 'تونل' - ) - postcode_formats = ('###', '####', '#####','######', '##########') - states = ( - 'آذربایجان شرقی', 'آذربایجان غربی', 'اردبیل', 'خراسان', 'کردستان', 'گیلان', 'اصفهان', 'البرز', 'ایلام', 'بوشهر', 'تهران', 'چهارمحال و بختیاری', 'خراسان جنوبی', 'خراسان رضوی', 'خراسان شمالی', 'خوزستان', 'زنجان', 'سمنان', 'سیستان و بلوچستان', 'فارس', 'قزوین', 'قم', 'کرمان', 'کرمانشاه', 'کهگیلویه و بویراحمد', 'گلستان', 'لرستان', 'مازندران', 'مرکزی', 'هرمزگان', 'همدان', 'یزد' - ) - countries = ( - 'جمهوری آذربایجان', 'آرژانتین', 'آفریقای جنوبی', 'جمهوری آفریقای مرکزی', 'آلبانی', 'آلمان', 'آنتیگوا و باربودا', 'آندورا', 'آنگولا', 'اتریش', 'اتیوپی', 'اردن', 'ارمنستان', 'اروگوئه', 'اریتره', 'ازبکستان', 'اسپانیا', 'استرالیا', 'استونی', 'اسرائیل', 'اسلواکی', 'اسلوونی', 'افغانستان', 'اکوادور', 'الجزایر', 'السالوادور', 'امارات متحده عربی', 'اندونزی', 'اوکراین', 'اوگاندا', 'ایالات متحده آمریکا', 'ایتالیا', 'ایران', 'جمهوری ایرلند', 'ایسلند', 'باربادوس', 'باهاما', 'بحرین', 'برزیل', 'برونئی', 'بریتانیا', 'بلاروس', 'بلژیک', 'بلغارستان', 'بلیز', 'بنگلادش', 'بنین', 'پادشاهی بوتان', 'بوتسوانا', 'بورکینافاسو', 'بوروندی', 'بوسنی و هرزگوین', 'بولیوی', 'پاپوآ گینه نو', 'پاراگوئه', 'پاناما', 'پاکستان', 'پرتغال', 'پرو', 'پورتوریکو', 'تاجیکستان', 'تانزانیا', 'تایلند', 'جمهوری چین', 'ترکمنستان', 'ترکیه', 'ترینیداد و توباگو', 'توگو', 'تونس', 'تونگا', 'تووالو', 'تیمور شرقی', 'جامائیکا', 'جزایر سلیمان', 'جزایر مارشال', 'جمهوری چک', 'جمهوری دومینیکن', 'جیبوتی', 'چاد', 'چین', 'دانمارک', 'دومینیکا', 'جمهوری دومینیکن', 'رواندا', 'روسیه', 'رومانی', 'زامبیا', 'نیوزیلند', 'زیمباوه', 'جمهوری دموکراتیک کنگو (زئیر)', 'ژاپن', 'سائوتومه و پرینسیپ', 'ساحل عاج', 'ساموآی غربی', 'سن مارینو', 'سری‌لانکا', 'سنت کیتس و نویس', 'سنت لوسیا', 'سنت وینسنت و گرنادین‌ها', 'سنگاپور', 'سنگال', 'سوئد', 'سوئیس', 'سوازیلند', 'سودان', 'سودان جنوبی', 'سورینام', 'سوریه', 'سومالی', 'سیرالئون', 'سیشل', 'شیلی', 'صربستان', 'عراق', 'عربستان سعودی', 'عمان', 'غنا', 'فرانسه', 'فلسطین', 'فنلاند', 'فیجی', 'فیلیپین', 'قبرس', 'قرقیزستان', 'قزاقستان', 'قطر', 'کامبوج', 'کامرون', 'کانادا', 'کره جنوبی', 'کره شمالی', 'کرواسی', 'کاستاریکا', 'کلمبیا', 'جمهوری کنگو', 'جمهوری دموکراتیک کنگو', 'کنیا', 'کوبا', 'کوزوو', 'مجمع‌الجزایر قمر', 'کویت', 'کیپ ورد', 'کیریباتی', 'گابن', 'گامبیا', 'گرجستان', 'گرنادا', 'گرینلند(از مستعمرات دانمارک)', 'گواتمالا', 'گویان', 'گینه', 'گینه استوایی', 'گینه بیسائو', 'لائوس', 'لبنان', 'لتونی', 'لسوتو', 'لهستان', 'لوکزامبورگ', 'لیبریا', 'لیبی', 'لیتوانی', 'لیختن‌اشتاین', 'ماداگاسکار', 'مالاوی', 'مالت', 'مالدیو', 'مالزی', 'مالی', 'مجارستان', 'مراکش', 'مصر', 'مغولستان', 'مقدونیه', 'مکزیک', 'موریتانی', 'موریس', 'موزامبیک', 'مولداوی', 'موناکو', 'مونته‌نگرو', 'میانمار', 'ایالات فدرال میکرونزی', 'نائورو', 'نامیبیا', 'نپال', 'نروژ', 'نیجریه', 'نیکاراگوئه', 'نیوزیلند', 'واتیکان', 'وانواتو', 'ونزوئلا', 'ویتنام', 'هائیتی', 'هلند', 'هندوراس', 'هند', 'یمن', 'یونان' - ) - - city_formats = ( - '{{city_prefix}} {{first_name}}' - ) - street_name_formats = ( - '{{first_name}} {{street_suffix}}', - '{{last_name}} {{street_suffix}}' - ) - street_address_formats = ( - '{{building_number}} {{street_name}}', - '{{building_number}} {{street_name}} {{secondary_address}}', - ) - address_formats = ( - "{{street_address}}\n{{city}}, {{state}} {{postcode}}", - ) - secondary_address_formats = ('سوئیت ###', 'واحد ###') - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def state(cls): - return cls.random_element(cls.states) diff --git a/src/faker/providers/fa_IR/person.py b/src/faker/providers/fa_IR/person.py deleted file mode 100644 index 29ef7e4..0000000 --- a/src/faker/providers/fa_IR/person.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals -from ..person import Provider as PersonProvider - - -class Provider(PersonProvider): - formats = ( - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{prefix}} {{first_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{suffix}}', - '{{prefix}} {{first_name}} {{last_name}} {{suffix}}' - ) - - first_names = ( - # top 50 Female Names in Iran: http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/d1391.htm - 'فاطمه', 'اسما', 'زهرا', 'عسل', 'نازنین زهرا', 'النا', 'زینب', 'سارا', 'یسنا', 'آتنا', 'ریحانه', 'آیناز', 'هستی', 'محیا', 'ستایش', 'باران', 'ثنا', 'هلیا', 'مریم', 'یلدا', 'فاطمه زهرا', 'ملیكا', 'سارینا', 'نازنین', 'مهسا', 'آیلین', 'نرگس', 'حنانه', 'رقیه', 'كیانا', 'كوثر', 'هانیه', 'مبینا', 'مهدیس', 'رها', 'آوا', 'اسرا', 'یگانه', 'نیایش', 'حدیث', 'الینا', 'سوگند', 'مائده', 'پریا', 'معصومه', 'مهدیه', 'آیدا', 'الناز', 'محدثه', 'یاسمین', - # top 50 male Names in Iran: http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/p1391.htm - 'امیر علی', 'پرهام', 'ابوالفضل', 'كیان', 'امیرحسین', 'متین', 'محمد طاها', 'عرفان', 'محمد', 'دانیال', 'علی', 'آرمین', 'امیرمحمد', 'آرتین', 'حسین', 'سبحان', 'مهدی', 'سینا', 'محمد مهدی', 'آریا', 'محمدرضا', 'محمدپارسا', 'طاها', 'سجاد', 'امیررضا', 'آرش', 'امیرعباس', 'نیما', 'علیرضا', 'عرشیا', 'محمدامین', 'مبین', 'محمدحسین', 'یوسف', 'رضا', 'احسان', 'علی اصغر', 'آرین', 'امیرمهدی', 'محمدیاسین', 'ماهان', 'عباس', 'پارسا', 'حسام', 'یاسین', 'علی رضا', 'ایلیا', 'علی اكبر', 'محمدجواد', 'بنیامین' - ) - - last_names = ( - 'محمدی', 'محمد پور', 'اکبر پور', 'رضا زاده', 'مجتهدی', 'دایی', 'حمیدی', 'کابلی', 'عبدالعلی', 'احمدی', 'اشرفی', 'علیجانی', 'ابوطالبی', 'علی شاهی', 'الوندی', 'بهمنی', 'بهرامی', 'هنری', 'ایروانی', 'حریریان', 'جعفر پور', 'جلالی', 'جلیلی', 'روحانی', 'خسروجردی', 'منصوری', 'مهدیان', 'نوروزی', 'نوری', 'رسته', 'سماوات', 'سمسار', 'شادروان', 'شاکری', 'سلطانی', 'شبیری', 'تحسینی', 'تنزیلی', 'طلوعی', 'ولاشجردی', 'وثاق', 'ظفری', 'زمانی', 'زارع', 'زارعی', 'ربانی', 'شمشیری', 'صارمی', 'صیادی', 'سرخوشیان', - 'رستمی', 'رسولی', 'رفیعی', 'کریمی', 'کرمانی', 'سعیدی', 'عباسی', 'پویان', 'ترکاشوند', 'زنجانی', 'تهرانی', 'جنتی', 'صنایعی', 'جهانی', 'اشتری', 'چنگیزی', 'دادفر', 'سغیری', 'پارسا', 'ضابطی', 'میردامادی', 'عقیلی', 'نامور', 'حسنی', 'لاهوتی', 'محجوب', 'هاشمی', 'معروف', 'معین', 'هوشیار', 'هومن', 'هدایت', 'قاضی', 'ملکیان', 'ضرغامی', 'یزدی', 'نوبختی', 'مجتبوی', 'نیلوفری', 'لاچینی', 'علی پور', 'عبدالمالکی', 'فرجی', 'موسوی', 'همدانی', 'موحد', 'کمالی', 'گلپایگانی', 'نعمتی', 'عزیزی' - ) - - prefixes = ('جناب آقای', 'سرکار خانم', 'جناب آقای دکتر', 'سرکار خانم دکتر') - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) - - @classmethod - def suffix(cls): - return '' diff --git a/src/faker/providers/fa_IR/phone_number.py b/src/faker/providers/fa_IR/phone_number.py deleted file mode 100644 index 588f2fa..0000000 --- a/src/faker/providers/fa_IR/phone_number.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider - - -class Provider(PhoneNumberProvider): - formats = ( - # Mobile - '+98 91# ### ####', - '091# ### ####', - '+98 920 ### ####', - '0920 ### ####', - '+98 921 ### ####', - '0921 ### ####', - '+98 93# ### ####', - '093# ### ####', - # Land lines - '+98 21 #### ####', - '021 #### ####', - '+98 25 #### ####', - '025 #### ####', - '+98 26 #### ####', - '026 #### ####', - '+98 ### #### ####', - '0### #### ####' - ) \ No newline at end of file diff --git a/src/faker/providers/fi_FI/__init__.py b/src/faker/providers/fi_FI/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/fr_FR/__init__.py b/src/faker/providers/fr_FR/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/fr_FR/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/hi_IN/__init__.py b/src/faker/providers/hi_IN/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/hi_IN/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/hi_IN/address.py b/src/faker/providers/hi_IN/address.py deleted file mode 100644 index 39831e0..0000000 --- a/src/faker/providers/hi_IN/address.py +++ /dev/null @@ -1,55 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - - city_formats = ('{{city_name}}', ) - - street_name_formats = ( - '{{first_name}} {{last_name}}', - '{{last_name}}' - ) - - street_address_formats = ('{{building_number}} {{street_name}}', ) - - address_formats = ('{{street_address}}\n{{city}} {{postcode}}','{{street_address}}\n{{city}}-{{postcode}}' ) - - building_number_formats = ('####','###', '##', '#', '#/#','##/##','##/###','##/####') - - postcode_formats = ('######', ) - - cities = ( - 'आदिलाबाद','अगरतला','अहमदाबाद', 'अहमदनगर' , 'अजमेर' ,'अम्बाजी' ,'अमरपुर' ,'इलाहाबाद' ,'अकोला' 'अखनूर', - 'अन्तर्गत' , 'अलांग' ,'अलीगढ' ,'दादरा और नागर हवेली', 'अमरावती' , 'अमरोहा', 'अनन्तपुर', 'करना', 'जिससेबेलारी', - 'अनंतनाग','भागलपुर', 'पेपरबोर्डस','त्रिबेनी', 'टिसूज', 'भद्रक', 'बचेली' ,'बहादुरगंज' ,'बहादुरगढ' ,'चिरमिरी', 'चिराला', 'चित्रदुर्ग' , - 'चित्तूर' ,'चित्रकूट' ,'देवगढ़' , 'दालखोला' , 'देवास', 'चंडीगढ', 'फादर', 'चिन्नफ', 'चिपलुन', 'चक्रधरपुर', 'चंबा', 'फतहपुर', 'फतेहपुर', - 'फतेहगढ', 'फतहपुर' ,'फतहपुर' ,'चित्तूर' ,'चित्रकूट', 'सभापतिने', 'देवगढ़', 'द्वारारस्वीकृति', 'दालखोला', - 'धर्मापुरी', 'पाकाला', 'धारवाड' ,'असम', 'देहरा' , 'रानीताल' ,'खडगपुर', 'मोकामा', 'मोकोकचुंग' ,'जिलोंपर' ,'विस्तारण' ,'मोतिहारी' - ) - - states = ( - 'अरूणाचल प्रदेश', 'बिहार', 'असम' ,'आंध्र प्रदेश' ,'छत्तीसगढ','हरियाणा' ,'गुजरात' ,'हिमाचल प्रदेश', 'गोवा', 'मध्य प्रदेश', 'महाराष्ट्र', 'कश्मीर', - 'केरल' , 'कर्नाटक', 'मणिपुर' ,'मिजोरम', 'मेघालय', 'सिबक्कम' ,'राजस्थान','पंजाब', 'उडीसा' ,'उत्तरांचल' ,'उत्तर प्रदेश', 'तमिलनाडु', 'त्रिपुरा', - 'पश्चिमी बंगाल', 'अंडमान और निकोबार', 'द्वीप समूह' , 'दमन और दीव', 'दादरा और नागर हवेली', 'दिल्ली','पांडिचेरी', 'लक्षद्वीप' - ) - - countries = ( - 'आर्मेनिया', 'यू.के.','फ्रांस', 'अजेपटीना', 'ब्राजील' ,'ईरान', 'यूनान', 'स्पेन' ,'हमारे' , 'जॉजिऩया', 'लेबनान' , 'सायप्रस', 'सीरिया', 'कनाडा', 'रूस' , - 'संयुक्त राज्य अमरीका' ,'नेदर्लान्ड', 'फ्रांस','ऑस्ट्रेलिया', 'एंटीगुआ', 'बार्बुडा' ,'अर्जेंटीना', 'आर्मेनिया' ,'ऑस्ट्रिया', 'अज़रबाइजान','बारबाडोस', 'बेलारूस', 'बेल्जियम', - 'बेलीज़' ,'बेनिन', 'बहामास' ,'बहरीन', 'बांग्लादेश', 'भूटान', 'बोलिविया', 'बोस्निया' ,'हर्जेगोविना', 'बोत्सवाना' , 'ब्राजील' ,'ब्रुनेई' ,'बुल्गारिया', 'बुर्किना', 'फ़ासो', - 'बर्मा', 'बुरूंडी','डोमिनिकन रिपब्लिक','गिनिया', 'टीमोर','फ़िनलैंड','गेबोन', 'गाम्बिया', 'जर्मनी', 'जार्जिया ग्रेनेडा','घाना' ,'यूनान' ,'ग्रेट ब्रिटेन', 'हंगरी', - 'भारत', 'इराक', 'आयरलैंड', 'इंडोनेशिया' , 'इसराइल' , 'आइलैंड', 'ईरान' ,'इटली','जमैका' ,'जॉर्डन','जापान','क़जाख़स्तान', 'केन्या', 'किरिबाती', 'दक्षिण कोरिया', 'लातविया', - 'लाओस' , 'उत्तर कोरिया', 'दक्षिण कोसोवो', 'कुवैत', 'लेबनान', 'लिचटीनस्टीन', 'लिथुआनिया' ,'लक्समबर्ग', 'लीबिया' ,'लाइबेरिया', 'लेसोथो', - 'नेपाल' ,'न्यूजीलैंड', 'निकारागुआ', 'नाइजर', 'नाउरू','लुसिया', 'रूस', 'रोमानिया', 'अरब', 'अमीरात', 'यूएई' ,'युगांडा', 'यूक्रेन', 'उरूग्वे', - 'उज़बेकिस्तान', 'यूनाइटेड किंगडम', 'वानुआतू', 'वेटिकन सिटी' , 'वेनेजुएला', 'पश्चिमी सहारा' , 'वियतनाम', 'यमन', 'ज़ायर' , 'जाबम्बया', 'जिम्बाब्वे' - ) - - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) - - @classmethod - def state(cls): - return cls.random_element(cls.states) diff --git a/src/faker/providers/internet.py b/src/faker/providers/internet.py deleted file mode 100644 index 96ff857..0000000 --- a/src/faker/providers/internet.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider -import random - -from faker.providers.lorem import Provider as Lorem -from faker.utils.decorators import slugify, slugify_domain - - -class Provider(BaseProvider): - safe_email_tlds = ('org', 'com', 'net') - free_email_domains = ('gmail.com', 'yahoo.com', 'hotmail.com') - tlds = ('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org') - - uri_pages = ( - 'index', 'home', 'search', 'main', 'post', 'homepage', 'category', 'register', 'login', 'faq', 'about', 'terms', - 'privacy', 'author') - uri_paths = ( - 'app', 'main', 'wp-content', 'search', 'category', 'tag', 'categories', 'tags', 'blog', 'posts', 'list', 'explore') - uri_extensions = ('.html', '.html', '.html', '.htm', '.htm', '.php', '.php', '.jsp', '.asp') - - user_name_formats = ( - '{{last_name}}.{{first_name}}', - '{{first_name}}.{{last_name}}', - '{{first_name}}##', - '?{{last_name}}', - ) - email_formats = ( - '{{user_name}}@{{domain_name}}', - '{{user_name}}@{{free_email_domain}}', - ) - url_formats = ( - 'http://www.{{domain_name}}/', - 'http://{{domain_name}}/', - ) - uri_formats = ( - '{{url}}', - '{{url}}{{uri_page}}/', - '{{url}}{{uri_page}}{{uri_extension}}', - '{{url}}{{uri_path}}/{{uri_page}}/', - '{{url}}{{uri_path}}/{{uri_page}}{{uri_extension}}', - ) - image_placeholder_services = ( - 'http://placekitten.com/{width}/{height}', - 'http://placehold.it/{width}x{height}', - 'http://www.lorempixum.com/{width}/{height}', - 'http://dummyimage.com/{width}x{height}', - ) - - def email(self): - pattern = self.random_element(self.email_formats) - return "".join(self.generator.parse(pattern).split(" ")) - - def safe_email(self): - return self.user_name() + '@example.' + self.random_element(self.safe_email_tlds) - - def free_email(self): - return self.user_name() + '@' + self.free_email_domain() - - def company_email(self): - return self.user_name() + '@' + self.domain_name() - - @classmethod - def free_email_domain(cls): - return cls.random_element(cls.free_email_domains) - - @slugify_domain - def user_name(self): - pattern = self.random_element(self.user_name_formats) - return self.bothify(self.generator.parse(pattern)) - - def domain_name(self): - return self.domain_word() + '.' + self.tld() - - @slugify - def domain_word(self): - company = self.generator.format('company') - company_elements = company.split(' ') - company = company_elements.pop(0) - return company - - def tld(self): - return self.random_element(self.tlds) - - def url(self): - pattern = self.random_element(self.url_formats) - return self.generator.parse(pattern) - - def ipv4(self): - """ - Convert 32-bit integer to dotted IPv4 address. - """ - return ".".join(map(lambda n: str(random.randint(-2147483648, 2147483647) >> n & 0xFF), [24, 16, 8, 0])) - - def ipv6(self): - res = [hex(random.randint(0, 65535))[2:].zfill(4) for i in range(0, 8)] - return ":".join(res) - - def mac_address(self): - mac = [random.randint(0x00, 0xff) for i in range(0, 6)] - return ":".join(map(lambda x: "%02x" % x, mac)) - - @classmethod - def uri_page(cls): - return cls.random_element(cls.uri_pages) - - @classmethod - def uri_path(cls, deep=None): - deep = deep if deep else random.randint(1, 3) - return "/".join([cls.random_element(cls.uri_paths) for _ in range(0, deep)]) - - @classmethod - def uri_extension(cls): - return cls.random_element(cls.uri_extensions) - - def uri(self): - pattern = self.random_element(self.uri_formats) - return self.generator.parse(pattern) - - @classmethod - @slugify - def slug(cls, value=None): - """ - Django algorithm - """ - if value is None: - value = Lorem.text(20) - return value - - @classmethod - def image_url(cls, width=None, height=None): - """ - Returns URL to placeholder image - Example: http://placehold.it/640x480 - """ - width_ = width or cls.random_int(max=1024) - height_ = height or cls.random_int(max=1024) - placeholder_url = cls.random_element(cls.image_placeholder_services) - return placeholder_url.format(width=width_, height=height_) diff --git a/src/faker/providers/it_IT/__init__.py b/src/faker/providers/it_IT/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/it_IT/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/it_IT/address.py b/src/faker/providers/it_IT/address.py deleted file mode 100644 index 9cd9f33..0000000 --- a/src/faker/providers/it_IT/address.py +++ /dev/null @@ -1,121 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - city_prefixes = ('San', 'Borgo', 'Sesto', 'Quarto', 'Settimo') - city_suffixes = ( - 'a mare', 'lido', 'ligure', 'del friuli', 'salentino', 'calabro', 'veneto', 'nell\'emilia', 'umbro', 'laziale', - 'terme', 'sardo') - building_number_formats = ('###', '##', '#') - street_suffixes = ( - 'Piazza', 'Strada', 'Via', 'Borgo', 'Contrada', 'Rotonda', 'Incrocio', 'Viale', 'Stretto', 'Vicolo', 'Canale') - postcode_formats = ('#####',) - states = ('Agrigento', 'Alessandria', 'Ancona', 'Aosta', 'Arezzo', 'Ascoli Piceno', 'Asti', 'Avellino', 'Bari', - 'Barletta-Andria-Trani', 'Belluno', 'Benevento', 'Bergamo', 'Biella', 'Bologna', 'Bolzano', 'Brescia', - 'Brindisi', 'Cagliari', 'Caltanissetta', 'Campobasso', 'Carbonia-Iglesias', 'Caserta', 'Catania', - 'Catanzaro', 'Chieti', 'Como', 'Cosenza', 'Cremona', 'Crotone', 'Cuneo', 'Enna', 'Fermo', 'Ferrara', - 'Firenze', 'Foggia', 'Forlì-Cesena', 'Frosinone', 'Genova', 'Gorizia', 'Grosseto', 'Imperia', 'Isernia', - 'La Spezia', 'L\'Aquila', 'Latina', 'Lecce', 'Lecco', 'Livorno', 'Lodi', 'Lucca', 'Macerata', 'Mantova', - 'Massa-Carrara', 'Matera', 'Messina', 'Milano', 'Modena', 'Monza e della Brianza', 'Napoli', 'Novara', - 'Nuoro', 'Olbia-Tempio', 'Oristano', 'Padova', 'Palermo', 'Parma', 'Pavia', 'Perugia', 'Pesaro e Urbino', - 'Pescara', 'Piacenza', 'Pisa', 'Pistoia', 'Pordenone', 'Potenza', 'Prato', 'Ragusa', 'Ravenna', - 'Reggio Calabria', 'Reggio Emilia', 'Rieti', 'Rimini', 'Roma', 'Rovigo', 'Salerno', 'Medio Campidano', - 'Sassari', 'Savona', 'Siena', 'Siracusa', 'Sondrio', 'Taranto', 'Teramo', 'Terni', 'Torino', 'Ogliastra', - 'Trapani', 'Trento', 'Treviso', 'Trieste', 'Udine', 'Varese', 'Venezia', 'Verbano-Cusio-Ossola', - 'Vercelli', 'Verona', 'Vibo Valentia', 'Vicenza', 'Viterbo' ) - states_abbr = ( - 'AG', 'AL', 'AN', 'AO', 'AR', 'AP', 'AT', 'AV', 'BA', 'BT', 'BL', 'BN', 'BG', 'BI', 'BO', 'BZ', 'BS', 'BR', - 'CA', - 'CL', 'CB', 'CI', 'CE', 'CT', 'CZ', 'CH', 'CO', 'CS', 'CR', 'KR', 'CN', 'EN', 'FM', 'FE', 'FI', 'FG', 'FC', - 'FR', - 'GE', 'GO', 'GR', 'IM', 'IS', 'SP', 'AQ', 'LT', 'LE', 'LC', 'LI', 'LO', 'LU', 'MC', 'MN', 'MS', 'MT', 'ME', - 'MI', - 'MO', 'MB', 'NA', 'NO', 'NU', 'OT', 'OR', 'PD', 'PA', 'PR', 'PV', 'PG', 'PU', 'PE', 'PC', 'PI', 'PT', 'PN', - 'PZ', - 'PO', 'RG', 'RA', 'RC', 'RE', 'RI', 'RN', 'RM', 'RO', 'SA', 'VS', 'SS', 'SV', 'SI', 'SR', 'SO', 'TA', 'TE', - 'TR', - 'TO', 'OG', 'TP', 'TN', 'TV', 'TS', 'UD', 'VA', 'VE', 'VB', 'VC', 'VR', 'VV', 'VI', 'VT' ) - countries = ( - 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', - 'Antartide (territori a sud del 60° parallelo)', 'Antigua e Barbuda', 'Argentina', 'Armenia', 'Aruba', - 'Australia', 'Austria', 'Azerbaijan', - 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Bielorussia', 'Belgio', 'Belize', 'Benin', 'Bermuda', 'Bhutan', - 'Bolivia', 'Bosnia e Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brasile', - 'Territorio dell\'arcipelago indiano', 'Isole Vergini Britanniche', 'Brunei Darussalam', 'Bulgaria', - 'Burkina Faso', 'Burundi', - 'Cambogia', 'Cameroon', 'Canada', 'Capo Verde', 'Isole Cayman', 'Repubblica Centrale Africana', 'Chad', 'Cile', - 'Cina', 'Isola di Pasqua', 'Isola di Cocos (Keeling)', 'Colombia', 'Comoros', 'Congo', 'Isole Cook', - 'Costa Rica', 'Costa d\'Avorio', 'Croazia', 'Cuba', 'Cipro', 'Repubblica Ceca', - 'Danimarca', 'Gibuti', 'Repubblica Dominicana', - 'Equador', 'Egitto', 'El Salvador', 'Guinea Equatoriale', 'Eritrea', 'Estonia', 'Etiopia', - 'Isole Faroe', 'Isole Falkland (Malvinas)', 'Fiji', 'Finlandia', 'Francia', 'Guyana Francese', - 'Polinesia Francese', 'Territori Francesi del sud', - 'Gabon', 'Gambia', 'Georgia', 'Germania', 'Ghana', 'Gibilterra', 'Grecia', 'Groenlandia', 'Grenada', - 'Guadalupa', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', - 'Haiti', 'Heard Island and McDonald Islands', 'Città del Vaticano', 'Honduras', 'Hong Kong', 'Ungheria', - 'Islanda', 'India', 'Indonesia', 'Iran', 'Iraq', 'Irlanda', 'Isola di Man', 'Israele', 'Italia', - 'Giamaica', 'Giappone', 'Jersey', 'Giordania', - 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Kuwait', 'Republicca Kirgiza', - 'Repubblica del Laos', 'Latvia', 'Libano', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', - 'Lituania', 'Lussemburgo', - 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malesia', 'Maldive', 'Mali', 'Malta', 'Isole Marshall', - 'Martinica', 'Mauritania', 'Mauritius', 'Mayotte', 'Messico', 'Micronesia', 'Moldova', 'Principato di Monaco', - 'Mongolia', 'Montenegro', 'Montserrat', 'Marocco', 'Mozambico', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Antille Olandesi', 'Olanda', 'Nuova Caledonia', 'Nuova Zelanda', 'Nicaragua', - 'Niger', 'Nigeria', 'Niue', 'Isole Norfolk', 'Northern Mariana Islands', 'Norvegia', - 'Oman', - 'Pakistan', 'Palau', 'Palestina', 'Panama', 'Papua Nuova Guinea', 'Paraguay', 'Peru', 'Filippine', - 'Pitcairn Islands', 'Polonia', 'Portogallo', 'Porto Rico', - 'Qatar', - 'Reunion', 'Romania', 'Russia', 'Rwanda', - 'San Bartolomeo', 'Sant\'Elena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', - 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', - 'Arabia Saudita', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovenia', 'Isole Solomon', - 'Somalia', 'Sud Africa', 'Georgia del sud e South Sandwich Islands', 'Spagna', 'Sri Lanka', 'Sudan', 'Suriname', - 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Svezia', 'Svizzera', 'Siria', - 'Taiwan', 'Tajikistan', 'Tanzania', 'Tailandia', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad e Tobago', - 'Tunisia', 'Turchia', 'Turkmenistan', 'Isole di Turks and Caicos', 'Tuvalu', - 'Uganda', 'Ucraina', 'Emirati Arabi Uniti', 'Regno Unito', 'Stati Uniti d\'America', - 'United States Minor Outlying Islands', 'Isole Vergini Statunitensi', 'Uruguay', 'Uzbekistan', - 'Vanuatu', 'Venezuela', 'Vietnam', - 'Wallis and Futuna', 'Western Sahara', - 'Yemen', - 'Zambia', 'Zimbabwe' - ) - - city_formats = ( - '{{city_prefix}} {{first_name}} {{city_suffix}}', - '{{city_prefix}} {{first_name}}', - '{{first_name}} {{city_suffix}}', - '{{last_name}} {{city_suffix}}', - ) - street_name_formats = ( - '{{street_suffix}} {{first_name}}', - '{{street_suffix}} {{last_name}}' - ) - street_address_formats = ( - '{{street_name}} {{building_number}}', - '{{street_name}} {{building_number}} {{secondary_address}}', - ) - address_formats = ( - "{{street_address}}\n{{city}}, {{postcode}} {{state}} ({{state_abbr}})", - ) - secondary_address_formats = ('Appartamento ##', 'Piano #') - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def state(cls): - return cls.random_element(cls.states) - - @classmethod - def state_abbr(cls): - return cls.random_element(cls.states_abbr) diff --git a/src/faker/providers/it_IT/phone_number.py b/src/faker/providers/it_IT/phone_number.py deleted file mode 100644 index 3b67761..0000000 --- a/src/faker/providers/it_IT/phone_number.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider - - -class Provider(PhoneNumberProvider): - formats = ( - '+## ### ## ## ####', - '+## ## #######', - '+## ## ########', - '+## ### #######', - '+## ### ########', - '+## #### #######', - '+## #### ########' - ) \ No newline at end of file diff --git a/src/faker/providers/job.py b/src/faker/providers/job.py deleted file mode 100644 index 3eee43b..0000000 --- a/src/faker/providers/job.py +++ /dev/null @@ -1,634 +0,0 @@ -# coding=utf-8 - -from . import BaseProvider -from .. import Generator - - -class Provider(BaseProvider): - jobs=["Academic librarian", -"Accommodation manager", -"Accountant, chartered", -"Accountant, chartered certified", -"Accountant, chartered management", -"Accountant, chartered public finance", -"Accounting technician", -"Actor", -"Actuary", -"Acupuncturist", -"Administrator", -"Administrator, arts", -"Administrator, charities/voluntary organisations", -"Administrator, Civil Service", -"Administrator, education", -"Administrator, local government", -"Administrator, sports", -"Adult guidance worker", -"Adult nurse", -"Advertising account executive", -"Advertising account planner", -"Advertising art director", -"Advertising copywriter", -"Advice worker", -"Aeronautical engineer", -"Agricultural consultant", -"Agricultural engineer", -"Aid worker", -"Air broker", -"Air cabin crew", -"Air traffic controller", -"Airline pilot", -"Ambulance person", -"Amenity horticulturist", -"Analytical chemist", -"Animal nutritionist", -"Animal technologist", -"Animator", -"Applications developer", -"Arboriculturist", -"Archaeologist", -"Architect", -"Architectural technologist", -"Archivist", -"Armed forces logistics/support/administrative officer", -"Armed forces operational officer", -"Armed forces technical officer", -"Armed forces training and education officer", -"Art gallery manager", -"Art therapist", -"Artist", -"Arts administrator", -"Arts development officer", -"Astronomer", -"Audiological scientist", -"Automotive engineer", -"Banker", -"Barrister", -"Barrister's clerk", -"Best boy", -"Biochemist, clinical", -"Biomedical engineer", -"Biomedical scientist", -"Bonds trader", -"Bookseller", -"Brewing technologist", -"Broadcast engineer", -"Broadcast journalist", -"Broadcast presenter", -"Building control surveyor", -"Building services engineer", -"Building surveyor", -"Buyer, industrial", -"Buyer, retail", -"Cabin crew", -"Call centre manager", -"Camera operator", -"Careers adviser", -"Careers information officer", -"Cartographer", -"Catering manager", -"Ceramics designer", -"Charity fundraiser", -"Charity officer", -"Chartered accountant", -"Chartered certified accountant", -"Chartered legal executive (England and Wales)", -"Chartered loss adjuster", -"Chartered management accountant", -"Chartered public finance accountant", -"Chemical engineer", -"Chemist, analytical", -"Child psychotherapist", -"Chiropodist", -"Chiropractor", -"Civil engineer, consulting", -"Civil engineer, contracting", -"Civil Service administrator", -"Civil Service fast streamer", -"Claims inspector/assessor", -"Clinical biochemist", -"Clinical cytogeneticist", -"Clinical embryologist", -"Clinical molecular geneticist", -"Clinical psychologist", -"Clinical research associate", -"Clinical scientist, histocompatibility and immunogenetics", -"Clothing/textile technologist", -"Colour technologist", -"Commercial art gallery manager", -"Commercial horticulturist", -"Commercial/residential surveyor", -"Commissioning editor", -"Communications engineer", -"Community arts worker", -"Community development worker", -"Community education officer", -"Community pharmacist", -"Company secretary", -"Computer games developer", -"Conference centre manager", -"Conservation officer, historic buildings", -"Conservation officer, nature", -"Conservator, furniture", -"Conservator, museum/gallery", -"Consulting civil engineer", -"Contracting civil engineer", -"Control and instrumentation engineer", -"Copy", -"Copywriter, advertising", -"Corporate investment banker", -"Corporate treasurer", -"Counselling psychologist", -"Counsellor", -"Curator", -"Customer service manager", -"Cytogeneticist", -"Dance movement psychotherapist", -"Dancer", -"Data processing manager", -"Database administrator", -"Dealer", -"Dentist", -"Designer, blown glass/stained glass", -"Designer, ceramics/pottery", -"Designer, exhibition/display", -"Designer, fashion/clothing", -"Designer, furniture", -"Designer, graphic", -"Designer, industrial/product", -"Designer, interior/spatial", -"Designer, jewellery", -"Designer, multimedia", -"Designer, television/film set", -"Designer, textile", -"Development worker, community", -"Development worker, international aid", -"Diagnostic radiographer", -"Dietitian", -"Diplomatic Services operational officer", -"Dispensing optician", -"Doctor, general practice", -"Doctor, hospital", -"Dramatherapist", -"Drilling engineer", -"Early years teacher", -"Ecologist", -"Economist", -"Editor, commissioning", -"Editor, film/video", -"Editor, magazine features", -"Editorial assistant", -"Education administrator", -"Education officer, community", -"Education officer, environmental", -"Education officer, museum", -"Educational psychologist", -"Electrical engineer", -"Electronics engineer", -"Embryologist, clinical", -"Emergency planning/management officer", -"Energy engineer", -"Energy manager", -"Engineer, aeronautical", -"Engineer, agricultural", -"Engineer, automotive", -"Engineer, biomedical", -"Engineer, broadcasting (operations)", -"Engineer, building services", -"Engineer, chemical", -"Engineer, civil (consulting)", -"Engineer, civil (contracting)", -"Engineer, communications", -"Engineer, control and instrumentation", -"Engineer, drilling", -"Engineer, electrical", -"Engineer, electronics", -"Engineer, energy", -"Engineer, land", -"Engineer, maintenance", -"Engineer, maintenance (IT)", -"Engineer, manufacturing", -"Engineer, manufacturing systems", -"Engineer, materials", -"Engineer, mining", -"Engineer, petroleum", -"Engineer, production", -"Engineer, site", -"Engineer, structural", -"Engineer, technical sales", -"Engineer, water", -"Engineering geologist", -"English as a foreign language teacher", -"English as a second language teacher", -"Environmental consultant", -"Environmental education officer", -"Environmental health practitioner", -"Environmental manager", -"Equality and diversity officer", -"Equities trader", -"Ergonomist", -"Estate agent", -"Estate manager/land agent", -"Event organiser", -"Exercise physiologist", -"Exhibition designer", -"Exhibitions officer, museum/gallery", -"Facilities manager", -"Farm manager", -"Fashion designer", -"Fast food restaurant manager", -"Field seismologist", -"Field trials officer", -"Film/video editor", -"Financial adviser", -"Financial controller", -"Financial manager", -"Financial planner", -"Financial risk analyst", -"Financial trader", -"Fine artist", -"Firefighter", -"Fish farm manager", -"Fisheries officer", -"Fitness centre manager", -"Food technologist", -"Forensic psychologist", -"Forensic scientist", -"Forest/woodland manager", -"Freight forwarder", -"Furniture conservator/restorer", -"Furniture designer", -"Further education lecturer", -"Futures trader", -"Gaffer", -"Games developer", -"Garment/textile technologist", -"General practice doctor", -"Geneticist, molecular", -"Geochemist", -"Geographical information systems officer", -"Geologist, engineering", -"Geologist, wellsite", -"Geophysical data processor", -"Geophysicist/field seismologist", -"Geoscientist", -"Glass blower/designer", -"Government social research officer", -"Graphic designer", -"Haematologist", -"Health and safety adviser", -"Health and safety inspector", -"Health physicist", -"Health promotion specialist", -"Health service manager", -"Health visitor", -"Herbalist", -"Heritage manager", -"Higher education careers adviser", -"Higher education lecturer", -"Historic buildings inspector/conservation officer", -"Holiday representative", -"Homeopath", -"Horticultural consultant", -"Horticultural therapist", -"Horticulturist, amenity", -"Horticulturist, commercial", -"Hospital doctor", -"Hospital pharmacist", -"Hotel manager", -"Housing manager/officer", -"Human resources officer", -"Hydrogeologist", -"Hydrographic surveyor", -"Hydrologist", -"Illustrator", -"Immigration officer", -"Immunologist", -"Industrial buyer", -"Industrial/product designer", -"Information officer", -"Information systems manager", -"Insurance account manager", -"Insurance broker", -"Insurance claims handler", -"Insurance risk surveyor", -"Insurance underwriter", -"Intelligence analyst", -"Interior and spatial designer", -"International aid/development worker", -"Interpreter", -"Investment analyst", -"Investment banker, corporate", -"Investment banker, operational", -"IT consultant", -"IT sales professional", -"IT technical support officer", -"IT trainer", -"Jewellery designer", -"Journalist, broadcasting", -"Journalist, magazine", -"Journalist, newspaper", -"Land", -"Land/geomatics surveyor", -"Landscape architect", -"Lawyer", -"Lawyer", -"Learning disability nurse", -"Learning mentor", -"Lecturer, further education", -"Lecturer, higher education", -"Legal executive", -"Legal secretary", -"Leisure centre manager", -"Lexicographer", -"Librarian, academic", -"Librarian, public", -"Licensed conveyancer", -"Lighting technician, broadcasting/film/video", -"Lobbyist", -"Local government officer", -"Location manager", -"Logistics and distribution manager", -"Loss adjuster, chartered", -"Magazine features editor", -"Magazine journalist", -"Maintenance engineer", -"Make", -"Management consultant", -"Manufacturing engineer", -"Manufacturing systems engineer", -"Marine scientist", -"Market researcher", -"Marketing executive", -"Materials engineer", -"Mechanical engineer", -"Media buyer", -"Media planner", -"Medical illustrator", -"Medical laboratory scientific officer", -"Medical physicist", -"Medical sales representative", -"Medical secretary", -"Medical technical officer", -"Mental health nurse", -"Merchandiser, retail", -"Merchant navy officer", -"Metallurgist", -"Meteorologist", -"Microbiologist", -"Midwife", -"Minerals surveyor", -"Mining engineer", -"Mudlogger", -"Multimedia programmer", -"Multimedia specialist", -"Museum education officer", -"Museum/gallery conservator", -"Museum/gallery curator", -"Museum/gallery exhibitions officer", -"Music therapist", -"Music tutor", -"Musician", -"Nature conservation officer", -"Naval architect", -"Network engineer", -"Newspaper journalist", -"Nurse, adult", -"Nurse, children's", -"Nurse, learning disability", -"Nurse, mental health", -"Nutritional therapist", -"Occupational hygienist", -"Occupational psychologist", -"Occupational therapist", -"Oceanographer", -"Office manager", -"Oncologist", -"Operational investment banker", -"Operational researcher", -"Operations geologist", -"Ophthalmologist", -"Optician, dispensing", -"Optometrist", -"Orthoptist", -"Osteopath", -"Outdoor activities/education manager", -"Paediatric nurse", -"Paramedic", -"Passenger transport manager", -"Patent attorney", -"Patent examiner", -"Pathologist", -"Pension scheme manager", -"Pensions consultant", -"Personal assistant", -"Personnel officer", -"Petroleum engineer", -"Pharmacist, community", -"Pharmacist, hospital", -"Pharmacologist", -"Photographer", -"Physicist, medical", -"Physiological scientist", -"Physiotherapist", -"Phytotherapist", -"Pilot, airline", -"Planning and development surveyor", -"Plant breeder/geneticist", -"Podiatrist", -"Police officer", -"Politician's assistant", -"Presenter, broadcasting", -"Press photographer", -"Press sub", -"Primary school teacher", -"Print production planner", -"Printmaker", -"Prison officer", -"Private music teacher", -"Probation officer", -"Producer, radio", -"Producer, television/film/video", -"Product designer", -"Product/process development scientist", -"Production assistant, radio", -"Production assistant, television", -"Production designer, theatre/television/film", -"Production engineer", -"Production manager", -"Programme researcher, broadcasting/film/video", -"Programmer, applications", -"Programmer, multimedia", -"Programmer, systems", -"Proofreader", -"Psychiatric nurse", -"Psychiatrist", -"Psychologist, clinical", -"Psychologist, counselling", -"Psychologist, educational", -"Psychologist, forensic", -"Psychologist, occupational", -"Psychologist, prison and probation services", -"Psychologist, sport and exercise", -"Psychotherapist", -"Psychotherapist, child", -"Psychotherapist, dance movement", -"Public affairs consultant", -"Public house manager", -"Public librarian", -"Public relations account executive", -"Public relations officer", -"Publishing copy", -"Publishing rights manager", -"Purchasing manager", -"Quality manager", -"Quantity surveyor", -"Quarry manager", -"Race relations officer", -"Radiation protection practitioner", -"Radio broadcast assistant", -"Radio producer", -"Radiographer, diagnostic", -"Radiographer, therapeutic", -"Ranger/warden", -"Records manager", -"Recruitment consultant", -"Recycling officer", -"Regulatory affairs officer", -"Research officer, government", -"Research officer, political party", -"Research officer, trade union", -"Research scientist (life sciences)", -"Research scientist (maths)", -"Research scientist (medical)", -"Research scientist (physical sciences)", -"Restaurant manager", -"Restaurant manager, fast food", -"Retail banker", -"Retail buyer", -"Retail manager", -"Retail merchandiser", -"Risk analyst", -"Risk manager", -"Runner, broadcasting/film/video", -"Rural practice surveyor", -"Sales executive", -"Sales professional, IT", -"Sales promotion account executive", -"Science writer", -"Scientific laboratory technician", -"Scientist, audiological", -"Scientist, biomedical", -"Scientist, clinical (histocompatibility and immunogenetics)", -"Scientist, forensic", -"Scientist, marine", -"Scientist, physiological", -"Scientist, product/process development", -"Scientist, research (life sciences)", -"Scientist, research (maths)", -"Scientist, research (medical)", -"Scientist, research (physical sciences)", -"Scientist, water quality", -"Secondary school teacher", -"Secretary/administrator", -"Secretary, company", -"Seismic interpreter", -"Senior tax professional/tax inspector", -"Set designer", -"Ship broker", -"Site engineer", -"Social research officer, government", -"Social researcher", -"Social worker", -"Software engineer", -"Soil scientist", -"Solicitor", -"Solicitor, Scotland", -"Sound technician, broadcasting/film/video", -"Special educational needs teacher", -"Special effects artist", -"Speech and language therapist", -"Sport and exercise psychologist", -"Sports administrator", -"Sports coach", -"Sports development officer", -"Sports therapist", -"Stage manager", -"Statistician", -"Structural engineer", -"Sub", -"Surgeon", -"Surveyor, building", -"Surveyor, building control", -"Surveyor, commercial/residential", -"Surveyor, hydrographic", -"Surveyor, insurance", -"Surveyor, land/geomatics", -"Surveyor, minerals", -"Surveyor, mining", -"Surveyor, planning and development", -"Surveyor, quantity", -"Surveyor, rural practice", -"Systems analyst", -"Systems developer", -"Tax adviser", -"Tax inspector", -"Teacher, adult education", -"Teacher, early years/pre", -"Teacher, English as a foreign language", -"Teacher, music", -"Teacher, primary school", -"Teacher, secondary school", -"Teacher, special educational needs", -"Teaching laboratory technician", -"Technical author", -"Technical brewer", -"Technical sales engineer", -"TEFL teacher", -"Telecommunications researcher", -"Television camera operator", -"Television floor manager", -"Television production assistant", -"Television/film/video producer", -"Textile designer", -"Theatre director", -"Theatre manager", -"Theatre stage manager", -"Theme park manager", -"Therapeutic radiographer", -"Therapist, art", -"Therapist, drama", -"Therapist, horticultural", -"Therapist, music", -"Therapist, nutritional", -"Therapist, occupational", -"Therapist, speech and language", -"Therapist, sports", -"Tour manager", -"Tourism officer", -"Tourist information centre manager", -"Town planner", -"Toxicologist", -"Trade mark attorney", -"Trade union research officer", -"Trading standards officer", -"Training and development officer", -"Translator", -"Transport planner", -"Travel agency manager", -"Tree surgeon", -"Veterinary surgeon", -"Video editor", -"Visual merchandiser", -"Volunteer coordinator", -"Warden/ranger", -"Warehouse manager", -"Waste management officer", -"Water engineer", -"Water quality scientist", -"Web designer", -"Wellsite geologist", -"Writer", -"Youth worker"] - @classmethod - def job(cls): - return cls.random_element(cls.jobs) diff --git a/src/faker/providers/ko_KR/__init__.py b/src/faker/providers/ko_KR/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/ko_KR/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/ko_KR/address.py b/src/faker/providers/ko_KR/address.py deleted file mode 100644 index 904b5a5..0000000 --- a/src/faker/providers/ko_KR/address.py +++ /dev/null @@ -1,70 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - -class Provider(AddressProvider): - city_suffixes = ('마을', '시', '군', '구') - building_number_formats = ('#', '####', '###') - street_suffixes = ('동', '로', '거리') - postcode_formats = ('###-###', '###-###') - states = ( - '서울특별시', '부산광역시', '대구광역시', '인천광역시', '광주광역시', '대전광역시', '울산광역시', - '세종특별자치시', '경기도', '강원도', '충청북도', '충청남도', '전라북도', '전라남도', '경상북도', - '경상남도', '제주특별자치도') - countries = ('가나', '가봉', '가이아나', '감비아', '과테말라', '그레나다', '그리스', '기니', '기니비사우', - '나미비아', '나우루', '나이지리아', '남수단', '남아프리카 공화국', '네덜란드 왕국', '네팔', - '노르웨이', '뉴질랜드', '니제르', '니카라과', '대한민국', '덴마크', '도미니카 공화국', - '도미니카 연방', '독일', '동티모르', '라오스', '라이베리아', '라트비아', '러시아', '레바논', - '레소토', '루마니아', '룩셈부르크', '르완다', '리비아', '리투아니아', '리히텐슈타인', - '마다가스카르', '마셜 제도', '마케도니아 공화국', '말라위', '말레이시아', '말리', '멕시코', - '모나코', '모로코', '모리셔스', '모리타니', '모잠비크', '몬테네그로', '몰도바', '몰디브', - '몰타', '몽골', '미국', '미얀마', '미크로네시아 연방', '바누아투', '바레인', '바베이도스', - '바하마', '방글라데시', '베냉', '베네수엘라', '베트남', '벨기에', '벨라루스', '벨리즈', - '보스니아 헤르체고비나', '보츠와나', '볼리비아', '부룬디', '부르키나파소', '부탄', '불가리아', - '브라질', '브루나이', '사모아', '사우디아라비아', '산마리노', '상투메 프린시페', '세네갈', - '세르비아', '세이셸', '세인트루시아', '세인트빈센트 그레나딘', '세인트키츠 네비스', - '소말리아', '솔로몬 제도', '수단', '수리남', '스리랑카', '스와질란드', '스웨덴', '스위스', - '스페인', '슬로바키아', '슬로베니아', '시리아', '시에라리온 공화국', '싱가포르', - '아랍에미리트', '아르메니아', '아르헨티나', '아이슬란드', '아이티', '아일랜드', - '아제르바이잔', '아프가니스탄', '안도라', '알바니아', '알제리', '앙골라', '앤티가 바부다', - '에리트레아', '에스토니아', '에콰도르', '에티오피아', '엘살바도르', '영국', '예멘', '오만', - '오스트레일리아', '오스트리아', '온두라스', '요르단', '우간다', '우루과이', '우즈베키스탄', - '우크라이나', '이라크', '이란', '이스라엘', '이집트', '이탈리아', '인도네시아', '일본', - '자메이카', '잠비아', '적도 기니', '조선민주주의인민공화국', '조지아', '중앙아프리카 공화국', - '중화인민공화국', '지부티', '짐바브웨', '차드', '체코', '칠레', '카메룬', '카보베르데', - '카자흐스탄', '카타르', '캄보디아', '캐나다', '케냐', '코모로', '코스타리카', '코트디부아르', - '콜롬비아', '콩고 공화국', '콩고 민주 공화국', '쿠바', '쿠웨이트', '크로아티아', - '키르기스스탄', '키리바시', '키프로스', '타이', '타지키스탄', '탄자니아', '터키', - '토고', '통가', '투르크메니스탄', '투발루', '튀니지', '트리니다드 토바고', '파나마', - '파라과이', '파키스탄', '파푸아 뉴기니', '팔라우', '페루', '포르투갈', '폴란드', '프랑스', - '피지', '핀란드', '필리핀', '헝가리' - ) - - city_formats = ( - '{{last_name}}{{last_name}}{{city_suffix}}', - '{{first_name}}{{last_name}}{{last_name}}{{city_suffix}}' - ) - street_name_formats = ( - '{{last_name}}{{last_name}}{{last_name}}{{city_suffix}}', - '{{last_name}}{{last_name}}{{last_name}}{{street_suffix}}', - '{{first_name}}{{last_name}}{{last_name}}{{street_suffix}}', - '{{last_name}}{{last_name}}{{street_suffix}}' - ) - street_address_formats = ( - '{{street_name}} {{building_number}}', - '{{street_name}} {{building_number}} {{secondary_address}}' - ) - address_formats = ( - "{{state}} {{city}} {{street_address}} ({{postcode}})", - "{{state}} {{city}} \n {{street_address}} {{postcode}}" - ) - secondary_address_formats = ('###동 ###호', '#-#', '###', '###-#', '##-#') - - @classmethod - def state(cls): - return cls.random_element(cls.states) - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) \ No newline at end of file diff --git a/src/faker/providers/lorem.py b/src/faker/providers/lorem.py deleted file mode 100644 index ce6fd78..0000000 --- a/src/faker/providers/lorem.py +++ /dev/null @@ -1,169 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider - - -class Provider(BaseProvider): - word_list = ( - 'alias', 'consequatur', 'aut', 'perferendis', 'sit', 'voluptatem', - 'accusantium', 'doloremque', 'aperiam', 'eaque', 'ipsa', 'quae', 'ab', - 'illo', 'inventore', 'veritatis', 'et', 'quasi', 'architecto', - 'beatae', 'vitae', 'dicta', 'sunt', 'explicabo', 'aspernatur', 'aut', - 'odit', 'aut', 'fugit', 'sed', 'quia', 'consequuntur', 'magni', - 'dolores', 'eos', 'qui', 'ratione', 'voluptatem', 'sequi', 'nesciunt', - 'neque', 'dolorem', 'ipsum', 'quia', 'dolor', 'sit', 'amet', - 'consectetur', 'adipisci', 'velit', 'sed', 'quia', 'non', 'numquam', - 'eius', 'modi', 'tempora', 'incidunt', 'ut', 'labore', 'et', 'dolore', - 'magnam', 'aliquam', 'quaerat', 'voluptatem', 'ut', 'enim', 'ad', - 'minima', 'veniam', 'quis', 'nostrum', 'exercitationem', 'ullam', - 'corporis', 'nemo', 'enim', 'ipsam', 'voluptatem', 'quia', 'voluptas', - 'sit', 'suscipit', 'laboriosam', 'nisi', 'ut', 'aliquid', 'ex', 'ea', - 'commodi', 'consequatur', 'quis', 'autem', 'vel', 'eum', 'iure', - 'reprehenderit', 'qui', 'in', 'ea', 'voluptate', 'velit', 'esse', - 'quam', 'nihil', 'molestiae', 'et', 'iusto', 'odio', 'dignissimos', - 'ducimus', 'qui', 'blanditiis', 'praesentium', 'laudantium', 'totam', - 'rem', 'voluptatum', 'deleniti', 'atque', 'corrupti', 'quos', - 'dolores', 'et', 'quas', 'molestias', 'excepturi', 'sint', - 'occaecati', 'cupiditate', 'non', 'provident', 'sed', 'ut', - 'perspiciatis', 'unde', 'omnis', 'iste', 'natus', 'error', - 'similique', 'sunt', 'in', 'culpa', 'qui', 'officia', 'deserunt', - 'mollitia', 'animi', 'id', 'est', 'laborum', 'et', 'dolorum', 'fuga', - 'et', 'harum', 'quidem', 'rerum', 'facilis', 'est', 'et', 'expedita', - 'distinctio', 'nam', 'libero', 'tempore', 'cum', 'soluta', 'nobis', - 'est', 'eligendi', 'optio', 'cumque', 'nihil', 'impedit', 'quo', - 'porro', 'quisquam', 'est', 'qui', 'minus', 'id', 'quod', 'maxime', - 'placeat', 'facere', 'possimus', 'omnis', 'voluptas', 'assumenda', - 'est', 'omnis', 'dolor', 'repellendus', 'temporibus', 'autem', - 'quibusdam', 'et', 'aut', 'consequatur', 'vel', 'illum', 'qui', - 'dolorem', 'eum', 'fugiat', 'quo', 'voluptas', 'nulla', 'pariatur', - 'at', 'vero', 'eos', 'et', 'accusamus', 'officiis', 'debitis', 'aut', - 'rerum', 'necessitatibus', 'saepe', 'eveniet', 'ut', 'et', - 'voluptates', 'repudiandae', 'sint', 'et', 'molestiae', 'non', - 'recusandae', 'itaque', 'earum', 'rerum', 'hic', 'tenetur', 'a', - 'sapiente', 'delectus', 'ut', 'aut', 'reiciendis', 'voluptatibus', - 'maiores', 'doloribus', 'asperiores', 'repellat' - ) - - @classmethod - def word(cls): - """ - :example 'Lorem' - """ - return cls.random_element(cls.word_list) - - @classmethod - def words(cls, nb=3): - """ - Generate an array of random words - :example array('Lorem', 'ipsum', 'dolor') - :param nb how many words to return - """ - return [cls.word() for _ in range(0, nb)] - - @classmethod - def sentence(cls, nb_words=6, variable_nb_words=True): - """ - Generate a random sentence - :example 'Lorem ipsum dolor sit amet.' - :param nb_words around how many words the sentence should contain - :param variable_nb_words set to false if you want exactly $nbWords returned, - otherwise $nbWords may vary by +/-40% with a minimum of 1 - """ - if nb_words <= 0: - return '' - - if variable_nb_words: - nb_words = cls.randomize_nb_elements(nb_words) - - words = cls.words(nb_words) - words[0] = words[0].title() - - return " ".join(words) + '.' - - @classmethod - def sentences(cls, nb=3): - """ - Generate an array of sentences - :example array('Lorem ipsum dolor sit amet.', 'Consectetur adipisicing eli.') - :param nb how many sentences to return - :return list - """ - return [cls.sentence() for _ in range(0, nb)] - - @classmethod - def paragraph(cls, nb_sentences=3, variable_nb_sentences=True): - """ - Generate a single paragraph - :example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' - :param nb_sentences around how many sentences the paragraph should contain - :param variable_nb_sentences set to false if you want exactly $nbSentences returned, - otherwise $nbSentences may vary by +/-40% with a minimum of 1 - :return string - """ - if nb_sentences <= 0: - return '' - - if variable_nb_sentences: - nb_sentences = cls.randomize_nb_elements(nb_sentences) - - return " ".join(cls.sentences(nb_sentences)) - - @classmethod - def paragraphs(cls, nb=3): - """ - Generate an array of paragraphs - :example array($paragraph1, $paragraph2, $paragraph3) - :param nb how many paragraphs to return - :return array - """ - return [cls.paragraph() for _ in range(0, nb)] - - @classmethod - def text(cls, max_nb_chars=200): - """ - Generate a text string. - Depending on the $maxNbChars, returns a string made of words, sentences, or paragraphs. - :example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' - :param max_nb_chars Maximum number of characters the text should contain (minimum 5) - :return string - """ - text = [] - if max_nb_chars < 5: - raise ValueError('text() can only generate text of at least 5 characters') - - if max_nb_chars < 25: - # join words - while not text: - size = 0 - # determine how many words are needed to reach the $max_nb_chars once; - while size < max_nb_chars: - word = (' ' if size else '') + cls.word() - text.append(word) - size += len(word) - text.pop() - text[0] = text[0][0].upper() + text[0][1:] - last_index = len(text) - 1 - text[last_index] += '.' - elif max_nb_chars < 100: - # join sentences - while not text: - size = 0 - # determine how many sentences are needed to reach the $max_nb_chars once - while size < max_nb_chars: - sentence = (' ' if size else '') + cls.sentence() - text.append(sentence) - size += len(sentence) - text.pop() - else: - # join paragraphs - while not text: - size = 0 - # determine how many paragraphs are needed to reach the $max_nb_chars once - while size < max_nb_chars: - paragraph = ('\n' if size else '') + cls.paragraph() - text.append(paragraph) - size += len(paragraph) - text.pop() - - return "".join(text) diff --git a/src/faker/providers/lt_LT/__init__.py b/src/faker/providers/lt_LT/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/lv_LV/__init__.py b/src/faker/providers/lv_LV/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/misc.py b/src/faker/providers/misc.py deleted file mode 100644 index 44bd027..0000000 --- a/src/faker/providers/misc.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider -from . import date_time -import random -import hashlib -import string - -class Provider(BaseProvider): - language_codes = ('cn', 'de', 'el', 'en', 'es', 'fr', 'it', 'pt', 'ru') - - @classmethod - def boolean(cls, chance_of_getting_true=50): - return random.randint(1, 100) <= chance_of_getting_true - - @classmethod - def null_boolean(cls): - return { - 0: None, - 1: True, - -1: False - }[random.randint(-1, 1)] - - @classmethod - def md5(cls, raw_output=False): - """ - Calculates the md5 hash of a given string - :example 'cfcd208495d565ef66e7dff9f98764da' - """ - res = hashlib.md5(str(random.random()).encode('utf-8')) - if raw_output: - return res.digest() - return res.hexdigest() - - @classmethod - def sha1(cls, raw_output=False): - """ - Calculates the sha1 hash of a given string - :example 'b5d86317c2a144cd04d0d7c03b2b02666fafadf2' - """ - res = hashlib.sha1(str(random.random()).encode('utf-8')) - if raw_output: - return res.digest() - return res.hexdigest() - - @classmethod - def sha256(cls, raw_output=False): - """ - Calculates the sha256 hash of a given string - :example '85086017559ccc40638fcde2fecaf295e0de7ca51b7517b6aebeaaf75b4d4654' - """ - res = hashlib.sha256(str(random.random()).encode('utf-8')) - if raw_output: - return res.digest() - return res.hexdigest() - - def locale(self): - return self.language_code() + '_' + self.country_code() - - @classmethod - def country_code(cls): - return cls.random_element(date_time.Provider.countries)['code'] - - @classmethod - def language_code(cls): - return cls.random_element(cls.language_codes) - - - - @classmethod - def password(cls,length=10, special_chars=True, digits=True, upper_case=True, lower_case=True): - """ - Generates a random password. - @param length: Integer. Length of a password - @param special_chars: Boolean. Whether to use special characters !@#$%^&*()_+ - @param digits: Boolean. Whether to use digits - @param upper_case: Boolean. Whether to use upper letters - @param lower_case: Boolean. Whether to use lower letters - @return: String. Random password - """ - chars = "" - if special_chars: - chars += "!@#$%^&*()_+" - if digits: - chars += string.digits - if upper_case: - chars += string.ascii_uppercase - if lower_case: - chars += string.ascii_lowercase - return ''.join(random.choice(chars) for x in range(length)) diff --git a/src/faker/providers/miscelleneous.py b/src/faker/providers/miscelleneous.py deleted file mode 100644 index 1f0d465..0000000 --- a/src/faker/providers/miscelleneous.py +++ /dev/null @@ -1,4 +0,0 @@ -# coding=utf-8 - -# module provided just for backward compatibility -from .misc import * diff --git a/src/faker/providers/nl_NL/__init__.py b/src/faker/providers/nl_NL/__init__.py deleted file mode 100644 index 9bad579..0000000 --- a/src/faker/providers/nl_NL/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# coding=utf-8 diff --git a/src/faker/providers/no_NO/__init__.py b/src/faker/providers/no_NO/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/no_NO/internet.py b/src/faker/providers/no_NO/internet.py deleted file mode 100644 index b164f11..0000000 --- a/src/faker/providers/no_NO/internet.py +++ /dev/null @@ -1,37 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..internet import Provider as InternetProvider - -import re - - -class Provider(InternetProvider): - - tlds = ('com', 'com', 'com', 'net', 'org', 'no', 'no', 'no', 'no', 'no') - - @staticmethod - def _to_ascii(string): - replacements = ( - ('æ', 'ae'), ('Æ', 'Ae'), - ('ø', 'oe'), ('Ø', 'Oe'), - ('å', 'aa'), ('Å', 'Aa'), - ('ä', 'ae'), ('Ä', 'Ae'), - ('ö', 'oe'), ('Ö', 'Oe'), - ('ü', 'ue'), ('Ü', 'Ue'), - ) - for search, replace in replacements: - string = string.replace(search, replace) - - return string - - def user_name(self): - pattern = self.random_element(self.user_name_formats) - return self._to_ascii( - self.bothify(self.generator.parse(pattern) - ).lower()) - - def domain_word(self): - company = self.generator.format('company') - company_elements = company.split(' ') - company = self._to_ascii(company_elements.pop(0)) - return re.sub(r'\W', '', company).lower() diff --git a/src/faker/providers/person.py b/src/faker/providers/person.py deleted file mode 100644 index 175d855..0000000 --- a/src/faker/providers/person.py +++ /dev/null @@ -1,27 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider - - -class Provider(BaseProvider): - formats = ['{{first_name}} {{last_name}}', ] - - first_names = ['John', 'Jane'] - - last_names = ['Doe', ] - - def name(self): - """ - :example 'John Doe' - """ - pattern = self.random_element(self.formats) - return self.generator.parse(pattern) - - @classmethod - def first_name(cls): - return cls.random_element(cls.first_names) - - @classmethod - def last_name(cls): - return cls.random_element(cls.last_names) diff --git a/src/faker/providers/phone_number.py b/src/faker/providers/phone_number.py deleted file mode 100644 index 2922428..0000000 --- a/src/faker/providers/phone_number.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider - - -class Provider(BaseProvider): - formats = ('###-###-###',) - - @classmethod - def phone_number(cls): - return cls.numerify(cls.random_element(cls.formats)) \ No newline at end of file diff --git a/src/faker/providers/pl_PL/__init__.py b/src/faker/providers/pl_PL/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/pl_PL/address.py b/src/faker/providers/pl_PL/address.py deleted file mode 100644 index fab3078..0000000 --- a/src/faker/providers/pl_PL/address.py +++ /dev/null @@ -1,621 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - cities = ( - 'Warszawa', - 'Kraków', - 'Łódź', - 'Wrocław', - 'Poznań', - 'Gdańsk', - 'Szczecin', - 'Bydgoszcz', - 'Lublin', - 'Katowice', - 'Białystok', - 'Gdynia', - 'Częstochowa', - 'Radom', - 'Sosnowiec', - 'Toruń', - 'Kielce', - 'Gliwice', - 'Rzeszów', - 'Zabrze', - 'Bytom', - 'Olsztyn', - 'Bielsko-Biała', - 'Ruda Śląska', - 'Rybnik', - 'Tychy', - 'Dąbrowa Górnicza', - 'Gorzów Wielkopolski', - 'Elbląg', - 'Płock', - 'Opole', - 'Wałbrzych', - 'Zielona Góra', - 'Włocławek', - 'Tarnów', - 'Chorzów', - 'Koszalin', - 'Kalisz', - 'Legnica', - 'Grudziądz', - 'Słupsk', - 'Jaworzno', - 'Jastrzębie-Zdrój', - 'Nowy Sącz', - 'Jelenia Góra', - 'Konin', - 'Piotrków Trybunalski', - 'Siedlce', - 'Inowrocław', - 'Mysłowice', - 'Piła', - 'Lubin', - 'Ostrów Wielkopolski', - 'Ostrowiec Świętokrzyski', - 'Gniezno', - 'Stargard Szczeciński', - 'Siemianowice Śląskie', - 'Suwałki', - 'Głogów', - 'Pabianice', - 'Chełm', - 'Zamość', - 'Tomaszów Mazowiecki', - 'Leszno', - 'Przemyśl', - 'Stalowa Wola', - 'Kędzierzyn-Koźle', - 'Łomża', - 'Żory', - 'Mielec', - 'Tarnowskie Góry', - 'Tczew', - 'Bełchatów', - 'Świdnica', - 'Ełk', - 'Pruszków', - 'Będzin', - 'Biała Podlaska', - 'Zgierz', - 'Piekary Śląskie', - 'Racibórz', - 'Legionowo', - 'Ostrołęka', - 'Świętochłowice', - 'Starachowice', - 'Zawiercie', - 'Wejherowo', - 'Puławy', - 'Wodzisław Śląski', - 'Starogard Gdański', - 'Skierniewice', - 'Tarnobrzeg', - 'Skarżysko-Kamienna', - 'Radomsko', - 'Krosno', - 'Rumia', - 'Dębica', - 'Kołobrzeg', - 'Kutno', - 'Nysa', - 'Ciechanów', - 'Otwock', - 'Piaseczno', - 'Zduńska Wola', - 'Sieradz', - 'Świnoujście', - 'Żyrardów', - 'Szczecinek', - 'Świdnik', - 'Chojnice', - 'Nowa Sól', - 'Oświęcim', - 'Bolesławiec', - 'Mińsk Mazowiecki', - 'Mikołów', - 'Jarosław', - 'Sanok', - 'Knurów', - 'Malbork', - 'Żary', - 'Kwidzyn', - 'Chrzanów', - 'Sopot', - 'Sochaczew', - 'Wołomin', - 'Oleśnica', - 'Brzeg', - 'Olkusz', - 'Jasło', - 'Cieszyn', - 'Kraśnik', - 'Lębork', - 'Czechowice-Dziedzice', - 'Dzierżoniów', - 'Ostróda', - 'Police', - 'Nowy Targ', - 'Iława', - 'Czeladź', - 'Myszków', - 'Żywiec', - 'Zgorzelec', - 'Oława', - 'Bielawa', - 'Swarzędz', - 'Mława', - 'Ząbki', - 'Łuków', - 'Augustów', - 'Śrem', - 'Bochnia', - 'Luboń', - 'Giżycko', - 'Grodzisk Mazowiecki', - 'Łowicz', - 'Krotoszyn', - 'Września', - 'Turek', - 'Pruszcz Gdański', - 'Brodnica', - 'Gorlice', - 'Czerwionka-Leszczyny', - 'Kłodzko', - 'Marki', - 'Nowy Dwór Mazowiecki', - 'Kętrzyn', - 'Zakopane', - 'Wyszków', - 'Biłgoraj', - 'Żagań', - 'Bielsk Podlaski', - 'Świecie', - 'Wałcz', - 'Jarocin', - 'Pszczyna', - 'Wągrowiec', - 'Szczytno', - 'Białogard', - 'Sandomierz', - 'Bartoszyce', - 'Kluczbork', - 'Lubliniec', - 'Skawina', - 'Jawor', - 'Kościan', - 'Wieluń', - 'Kościerzyna', - 'Nowa Ruda', - 'Świebodzice', - 'Koło', - 'Piastów', - 'Goleniów', - 'Ostrów Mazowiecka', - 'Polkowice', - 'Lubartów', - 'Zambrów', - 'Płońsk', - 'Reda', - 'Łaziska Górne', - 'Środa Wielkopolska' - ) - - streets = ( - 'Polna', - 'Lesna', - 'Sloneczna', - 'Krótka', - 'Szkolna', - 'Ogrodowa', - 'Lipowa', - 'Brzozowa', - 'Lakowa', - 'Kwiatowa', - 'Sosnowa', - 'Koscielna', - 'Akacjowa', - 'Parkowa', - 'Zielona', - 'Kolejowa', - 'Sportowa', - 'Debowa', - 'Kosciuszki', - 'Maja', - 'Mickiewicza', - 'Cicha', - 'Spokojna', - 'Klonowa', - 'Spacerowa', - 'Swierkowa', - 'Kasztanowa', - 'Nowa', - 'Piaskowa', - 'Sienkiewicza', - 'Rózana', - 'Topolowa', - 'Wisniowa', - 'Dworcowa', - 'Wiejska', - 'Graniczna', - 'Slowackiego', - 'Dluga', - 'Wrzosowa', - 'Konopnickiej', - 'Boczna', - 'Waska', - 'Wierzbowa', - 'Jasminowa', - 'Wspólna', - 'Modrzewiowa', - 'Kopernika', - 'Jana Pawla II', - 'Poprzeczna', - 'Wesola', - 'Pogodna', - 'Zeromskiego', - 'Rynek', - 'Bukowa', - 'Wojska Polskiego', - 'Sadowa', - 'Górna', - 'Jodlowa', - 'Wolnosci', - 'Glówna', - 'Mlynska', - 'Strazacka', - 'Prusa', - 'Jesionowa', - 'Przemyslowa', - 'Osiedlowa', - 'Wiosenna', - 'Sikorskiego', - 'Chopina', - 'Poludniowa', - 'Malinowa', - 'Stawowa', - 'Reymonta', - 'Pilsudskiego', - 'Zacisze', - 'Cmentarna', - 'Okrezna', - 'Kochanowskiego', - 'Armii Krajowej', - 'Mila', - 'Jasna', - 'Wodna', - 'Zamkowa', - 'Witosa', - 'Reja', - 'Warszawska', - 'Miodowa', - 'Partyzantów', - 'Krzywa', - 'Kilinskiego', - 'Dolna', - 'Podgórna', - 'Kreta', - 'Jarzebinowa', - 'Moniuszki', - 'Targowa', - 'Prosta', - 'Orzeszkowej', - 'Spóldzielcza', - 'Jagodowa', - 'Dzialkowa', - 'Staszica', - 'Orzechowa', - 'Rzemieslnicza', - 'Rzeczna', - 'Boleslawa Chrobrego', - 'Fabryczna', - 'Teczowa', - 'Chabrowa', - 'Poziomkowa', - 'Konwaliowa', - 'Wyszynskiego', - 'Kalinowa', - 'Pólnocna', - 'Matejki', - 'Grunwaldzka', - 'Cisowa', - 'Nadrzeczna', - 'Pocztowa', - 'Zachodnia', - 'Dabrowskiego', - 'Grabowa', - 'Norwida', - 'Zródlana', - 'Asnyka', - 'Gajowa', - 'Paderewskiego', - 'Listopada', - 'Wyspianskiego', - 'Mostowa', - 'Broniewskiego', - 'Tuwima', - 'Wschodnia', - 'Jaworowa', - 'Poznanska', - 'Makowa', - 'Bema', - 'Jeziorna', - 'Piekna', - 'Czeresniowa', - 'Mala', - 'Krakowska', - 'Radosna', - 'Leszczynowa', - 'Traugutta', - 'Jadwigi', - 'Rolna', - 'Wyzwolenia', - 'Piastowska', - 'Grzybowa', - 'Krasickiego', - 'Podlesna', - 'Zytnia', - 'Zlota', - 'Bursztynowa', - 'Zwirowa', - 'Stycznia', - 'Widokowa', - 'Kazimierza Wielkiego', - 'Kamienna', - 'Jalowcowa', - 'Morelowa', - 'Mieszka I', - 'Mysliwska', - 'Laczna', - 'Szpitalna', - 'Wczasowa', - 'Zurawia', - 'Fiolkowa', - 'Glowackiego', - 'Rolnicza', - 'Tulipanowa', - 'Wladyslawa Jagielly', - 'Dworska', - 'Letnia', - 'Liliowa', - 'Owocowa', - 'Pulaskiego', - 'Stefana Batorego', - 'Harcerska', - 'Kollataja', - 'Strzelecka', - 'Kraszewskiego', - 'Wladyslawa Lokietka', - 'Zwirki i Wigury', - 'Wroclawska', - 'Gdanska', - 'Turystyczna', - 'Niepodleglosci', - 'Poniatowskiego', - 'Korczaka', - 'Rybacka', - 'Narutowicza', - 'Okrzei', - 'Krucza', - 'Jagiellonska', - 'Swierczewskiego', - 'Kasprowicza', - 'Szeroka', - 'Jana III Sobieskiego', - 'Mlynarska', - 'Olchowa', - 'Powstanców Slaskich', - 'Rumiankowa', - 'Stroma', - 'Starowiejska', - 'Mazowiecka', - 'Lawendowa', - 'Robotnicza', - 'Zbozowa', - 'Mokra', - 'Powstanców Wielkopolskich', - 'Towarowa', - 'Dobra', - 'Srodkowa', - 'Willowa', - 'Zielna', - 'Zdrojowa', - 'Opolska', - 'Agrestowa', - 'Ksiezycowa', - 'Zwyciestwa', - 'Fredry', - 'Letniskowa', - 'Andersa', - 'Baczynskiego', - 'Batalionów Chlopskich', - 'Dabrowskiej', - 'Orla', - 'Sklodowskiej-Curie', - 'Blekitna', - 'Rubinowa', - 'Brzoskwiniowa', - 'Urocza', - 'Galczynskiego', - 'Krasinskiego', - 'Pomorska', - 'Szymanowskiego', - 'Jezynowa', - 'Czarnieckiego', - 'Nalkowskiej', - 'Zaciszna', - 'Porzeczkowa', - 'Krancowa', - 'Jesienna', - 'Klasztorna', - 'Irysowa', - 'Niecala', - 'Wybickiego', - 'Nadbrzezna', - 'Szarych Szeregów', - 'Walowa', - 'Slowicza', - 'Strumykowa', - 'Drzymaly', - 'Golebia', - 'Torowa', - 'Cegielniana', - 'Cyprysowa', - 'Slowianska', - 'Diamentowa', - 'Warynskiego', - 'Czestochowska', - 'Dojazdowa', - 'Przechodnia', - 'Hallera', - 'Lubelska', - 'Plater', - 'Popieluszki', - 'Borówkowa', - 'Chelmonskiego', - 'Daszynskiego', - 'Plazowa', - 'Tartaczna', - 'Jabloniowa', - 'Kossaka', - 'Skargi', - 'Ludowa', - 'Sokola', - 'Azaliowa', - 'Szmaragdowa', - 'Lipca', - 'Staffa', - 'Tysiaclecia', - 'Brzechwy', - 'Jastrzebia', - 'Kusocinskiego', - 'Storczykowa', - 'Wilcza', - 'Górnicza', - 'Szafirowa', - 'Dlugosza', - 'Handlowa', - 'Krokusowa', - 'Skladowa', - 'Widok', - 'Perlowa', - 'Skosna', - 'Wypoczynkowa', - 'Chmielna', - 'Jaskólcza', - 'Nowowiejska', - 'Piwna', - 'Slaska', - 'Zaulek', - 'Glogowa', - 'Górska', - 'Truskawkowa', - 'Kaszubska', - 'Kosynierów', - 'Mazurska', - 'Srebrna', - 'Bociania', - 'Ptasia', - 'Cedrowa', - 'Rycerska', - 'Wieniawskiego', - 'Zabia', - 'Torunska', - 'Podmiejska', - 'Slonecznikowa', - 'Sowia', - 'Stolarska', - 'Powstanców', - 'Sucharskiego', - 'Boleslawa Krzywoustego', - 'Konarskiego', - 'Szczesliwa', - 'Lazurowa', - 'Miarki', - 'Narcyzowa', - 'Browarna', - 'Konstytucji 3 Maja', - 'Majowa', - 'Milosza', - 'Malczewskiego', - 'Orkana', - 'Skrajna', - 'Bankowa', - 'Bydgoska', - 'Piekarska', - 'Zeglarska', - 'Jana', - 'Turkusowa', - 'Tylna', - 'Wysoka', - 'Zakatek', - 'Maczka', - 'Morska', - 'Rataja', - 'Szewska', - 'Podwale', - 'Palacowa', - 'Magnoliowa', - 'Ceglana', - 'Sawickiej', - 'Sciegiennego', - 'Wiklinowa', - 'Zakole', - 'Borowa', - 'Kolorowa', - 'Lisia', - 'Lotnicza', - 'Sarnia', - 'Wiazowa', - 'Grottgera', - 'Kolonia', - 'Królewska', - 'Promienna', - 'Daleka', - 'Jana Sobieskiego', - 'Rejtana', - 'Wiatraczna', - 'Kaliska', - 'Lanowa', - 'Srednia', - 'Wislana', - 'Wróblewskiego', - 'Koralowa', - 'Kruczkowskiego', - 'Lelewela', - 'Makuszynskiego', - 'Sybiraków', - 'Kowalska', - 'Morcinka', - 'Odrzanska', - 'Okulickiego', - 'Solidarnosci', - 'Zapolskiej', - 'Labedzia', - 'Wojciecha', - 'Baltycka', - 'Lwowska', - 'Rajska', - 'Korfantego', - 'Pszenna', - 'Ciasna', - 'Floriana', - 'Hutnicza', - 'Kielecka' - ) - - postcode_formats = ('##-###',) - - @classmethod - def street_name(cls): - return cls.random_element(cls.streets) - - @classmethod - def city(cls): - return cls.random_element(cls.cities) \ No newline at end of file diff --git a/src/faker/providers/pl_PL/phone_number.py b/src/faker/providers/pl_PL/phone_number.py deleted file mode 100644 index 8288d67..0000000 --- a/src/faker/providers/pl_PL/phone_number.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider - - -class Provider(PhoneNumberProvider): - formats = ( - '+48 5## ### ###', - '+48 6## ### ###', - '+48 7## ### ###', - '+48 8## ### ###', - '+48 ## ### ## ##', - ) \ No newline at end of file diff --git a/src/faker/providers/profile.py b/src/faker/providers/profile.py deleted file mode 100644 index aa5ea22..0000000 --- a/src/faker/providers/profile.py +++ /dev/null @@ -1,52 +0,0 @@ -# coding=utf-8 - -from . import BaseProvider -from .. import Generator -import itertools - - -class Provider(BaseProvider): - """ - This provider is a collection of functions to generate personal profiles and identities. - - """ - - def simple_profile(self): - """ - Generates a basic profile with personal informations - """ - - return {"username":self.generator.user_name(), - "name":self.generator.name(), - "sex": self.random_element(["M","F"]), - "address":self.generator.address(), - "mail":self.generator.free_email(), - - #"password":self.generator.password() - "birthdate":self.generator.date(), - - } - - - def profile(self,fields=[]): - """ - Generates a complete profile. - If "fields" is not empty, only the fields in the list will be returned - """ - d={ - "job":self.generator.job(), - "company":self.generator.company(), - "ssn":self.generator.ssn(), - "residence":self.generator.address(), - "current_location":(self.generator.latitude(),self.generator.longitude()), - "blood_group":"".join(self.random_element(list(itertools.product(["A","B","AB","0"],["+","-"])))) - } - - d["website"]=[self.generator.url() for i in range(1,self.random_int(2,5))] - d= dict(d,**self.generator.simple_profile()) - #field selection - if len(fields)>0: - d=dict((k,v) for (k,v) in d.items() if k in fields) - - return d - diff --git a/src/faker/providers/pt_BR/__init__.py b/src/faker/providers/pt_BR/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/pt_BR/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/pt_BR/person.py b/src/faker/providers/pt_BR/person.py deleted file mode 100644 index 53c0dc1..0000000 --- a/src/faker/providers/pt_BR/person.py +++ /dev/null @@ -1,70 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..person import Provider as PersonProvider - - -class Provider(PersonProvider): - formats = ( - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{prefix}} {{last_name}}', - '{{first_name}} {{last_name}}-{{last_name}}', - '{{first_name}}-{{first_name}} {{last_name}}', - ) - - first_names = ( - 'Sofia', 'Julia', 'Isabella', 'Alice', 'Manuela', 'Maria Eduarda', 'Giovanna', 'Laura', 'Luiza', 'Beatriz', - 'Mariana', - 'Ana Clara', 'Maria Clara', 'Maria Luiza', 'Yasmin', 'Rafaela', 'Gabriela', 'Isabelly', 'Ana Julia', - 'Valentina', - 'Letícia', 'Lara', 'Ana Luiza', 'Lorena', 'Helena', 'Nicole', 'Isadora', 'Lívia', 'Sarah', 'Marina', - 'Ana Beatriz', - 'Melissa', 'Heloísa', 'Vitória', 'Cecília', 'Emanuelly', 'Lavínia', 'Maria Fernanda', 'Amanda', 'Gabrielly', - 'Larissa', 'Bianca', 'Esther', 'Clara', 'Rebeca', 'Eduarda', 'Alícia', 'Carolina', 'Emilly', 'Maria Julia', - 'Fernanda', - 'Pietra', 'Milena', 'Ana Laura', 'Catarina', 'Maria Alice', 'Ana Carolina', 'Agatha', 'Natália', 'Laís', - 'Elisa', - 'Camila', 'Maria Vitória', 'Luana', 'Olivia', 'Mirella', 'Maria', 'Maria Cecília', 'Marcela', 'Ana Sophia', - 'Kamilly', 'Joana', 'Eloah', 'Stella', 'Sophie', 'Maria Sophia', 'Bruna', 'Juliana', 'Bárbara', 'Maitê', - 'Clarice', - 'Ana Vitória', 'Caroline', 'Ana', 'Ana Lívia', 'Evelyn', 'Luna', 'Stephany', 'Isabel', 'Alexia', 'Mariane', - 'Brenda', - 'Alana', 'Maysa', 'Raquel', 'Nina', 'Sabrina', 'Emanuella', 'Daniela', 'Miguel', 'Arthur', 'Davi', 'Gabriel', - 'Lucas', 'Matheus', 'Pedro', 'Guilherme', 'Enzo', 'Rafael', 'Bernardo', 'Gustavo', 'Nicolas', 'Felipe', - 'Pedro Henrique', - 'João Pedro', 'Henrique', 'Samuel', 'Cauã', 'Eduardo', 'Vitor', 'Heitor', 'Murilo', 'Daniel', 'Pietro', - 'João Vitor', - 'Vinicius', 'Leonardo', 'Caio', 'Lorenzo', 'Thiago', 'Lucca', 'Isaac', 'Theo', 'Enzo Gabriel', 'João', - 'João Gabriel', - 'Emanuel', 'Yuri', 'Bryan', 'Luiz Felipe', 'Ryan', 'Joaquim', 'Antonio', 'Carlos Eduardo', 'Bruno', - 'Davi Lucas', - 'João Guilherme', 'Erick', 'Calebe', 'Benjamin', 'Vitor Hugo', 'Rodrigo', 'Ian', 'Fernando', 'Otávio', 'Breno', - 'Igor', 'Francisco', 'Thomas', 'André', 'Juan', 'Luiz Gustavo', 'Augusto', 'Kaique', 'Nathan', 'João Miguel', - 'João Lucas', - 'Pedro Lucas', 'Raul', 'Luiz Miguel', 'Cauê', 'Luiz Henrique', 'Benício', 'Anthony', 'Vitor Gabriel', 'Yago', - 'Marcelo', 'Luiz Otávio', 'Renan', 'Alexandre', 'Levi', 'Danilo', 'Thales', 'Lucas Gabriel', 'Diogo', - 'Davi Lucca', - 'Paulo', 'Enrico', 'Diego', 'Vicente', 'Marcos Vinicius', 'Luiz Fernando', 'Pedro Miguel', 'Gustavo Henrique', - 'Leandro', - 'Noah', 'Kevin', 'João Felipe', 'Luigi', - - ) - - last_names = ( - 'Silva', 'Santos', 'Oliveira', 'Souza', 'Pereira', 'Costela', 'Carvalho', 'Almeida', 'Ferreira', 'Ribeiro', - 'Rodrigues', - 'Gomes', 'Lima', 'Martins', 'Rocha', 'Alves', 'Araújo', 'Pinto', 'Barbosa', 'Castro', 'Fernandes', 'Melo', - 'Azevedo', - 'Barros', 'Cardoso', 'Correia', 'Cunha', 'Dias' - ) - - prefixes = ('de', 'da', 'do') - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) \ No newline at end of file diff --git a/src/faker/providers/ru_RU/__init__.py b/src/faker/providers/ru_RU/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/faker/providers/ru_RU/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/faker/providers/ru_RU/lorem.py b/src/faker/providers/ru_RU/lorem.py deleted file mode 100644 index cd1fcd7..0000000 --- a/src/faker/providers/ru_RU/lorem.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from ..lorem import Provider as LoremProvider - - -class Provider(LoremProvider): - word_list = ( - 'алььтыра', 'дэлььынётё', 'вэртырэм', 'вэрыар', 'ты', 'рэгяонэ', - 'црял', 'квюальизквюэ', 'квюоджё', 'зюаз', 'конгуы', 'антеопам', - 'прё', 'этёам', 'форынчйбюж', 'альиквуандо', 'зэнтынтиаэ', 'хёз', - 'адепйжкйнг', 'ыюм', 'льаборэж', 'вим', 'фабулаз', 'нэ', 'толлйт', - 'эож', 'ажжюм', 'лыгимуз', 'пэртинакёа', 'видишчы', 'рэпудёандаэ', - 'еюж', 'бонорюм', 'про', 'но', 'анкилльаы', 'доктюж', 'адипижкй', - 'зигнёфэрумквюы', 'дэлььиката', 'мютат', 'амэт', 'едквюэ', 'апыирёан', - 'мэя', 'латины', 'ед', 'дытракжйт', 'констятюам', 'ку', 'дольор', - 'игнота', 'льаорыыт', 'хэндрэрет', 'магна', 'мэль', 'дыфяниэбаж', - 'дэльэнйт', 'агам', 'эффикеэнди', 'дикунт', 'хабэо', 'ыт', 'ёужто', - 'долорэж', 'ипзум', 'аппэтырэ', 'ючю', 'брутэ', 'долорэм', - 'интылльэгэбат', 'вёжи', 'эвэртё', 'татион', 'зймюл', 'эи', - 'юрбанйтаж', 'кибо', 'прима', 'ад', 'попюльо', 'вирйз', 'незл', - 'тальэ', 'ан', 'жолюм', 'лебыр', 'эюрйпйдяч', 'вёртюты', 'зыд', - 'пауло', 'омныз', 'хонэзтатёз', 'тебиквюэ', 'шэа', 'оффекйяж', 'ат', - 'рыквюы', 'декат', 'торквюатоз', 'дюиж', 'номинатй', 'жкаывола', - 'ведят', 'аккузата', 'пхйложопхяа', 'аппарэат', 'порро', 'эю', - 'эрюдитя', 'адмодум', 'эррорибуз', 'чэнзэрет', 'мэльёуз', 'бландит', - 'молыжтйаы', 'пошжим', 'тамквюам', 'ажжынтиор', 'вяш', 'ывыртятюр', - 'эпикюре', 'квуёдам', 'граэкйж', 'конжтетуто', 'такематыш', 'мацим', - 'шынчебюз', 'витюпэраторебуз', 'дытыррюизщэт', 'граэко', 'граэки', - 'щуавятатэ', 'пырикульа', 'квюандо', 'факёльиси', 'дычэрунт', 'кюм', - 'аккюжамюз', 'омнэжквюы', 'экз', 'индоктум', 'рэктэквуэ', 'дектаж', - 'фюгит', 'хабымуч', 'фалля', 'нонумй', 'апэриам', 'июварыт', 'квуй', - 'мыис', 'дежпютатионй', 'мыдиокрым', 'ылоквюэнтиам', 'нюлльам', 'ут', - 'аугюэ', 'ыам', 'фырре', 'азжюывырит', 'квуым', 'йн', 'ножтро', - 'зючкёпит', 'конкыптам', 'майыжтатйж', 'дуо', 'ыт', 'элыктрам', - 'ёнэрмйщ', 'ыпикурэи', 'ыёюз', 'инимёкюж', 'шапэрэт', 'выро', - 'либриз', 'кевёбюж', 'эа', 'коммюны', 'лэгыры', 'рыпрэхэндунт', - 'дёзсэнтёаш', 'лаборамюз', 'элитр', 'чадипжкёнг', 'мёнём', 'нык', - 'мыа', 'тота', 'квюот', 'ратионебюж', 'пырфэкто', 'факэр', 'пэрчёус', - 'ёнанй', 'кончэтытюр', 'одео', 'зкрипторэм', 'чонэт', 'факилиз', - 'жэмпэр', 'атоморюм', 'эжт', 'дылыктуч', 'тинкидюнт', 'аэквюы', - 'глориатюр', 'пэркйпет', 'модо', 'жят', 'эзшэ', 'хаж', 'аюдирэ', - 'вокынт', 'векж', 'квюоджёныглэгэнтур', 'луптатум', 'мюндй', - 'опортэры', 'дэлььякатезшимя', 'квюиж', 'витюпырата', 'вэл', - 'ыльигэнди', 'янтэрэсщэт', 'оффэндйт', 'нихйл', 'квюаэчтио', 'пэр', - 'квюо', 'пырикюлёз', 'нам', 'атквюе' - ) diff --git a/src/faker/providers/ru_RU/person.py b/src/faker/providers/ru_RU/person.py deleted file mode 100644 index 05e9161..0000000 --- a/src/faker/providers/ru_RU/person.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..person import Provider as PersonProvider - - -class Provider(PersonProvider): - formats = ( - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{prefix}} {{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{prefix}} {{first_name}} {{last_name}}' - ) - - first_names = ( - 'Август', 'Авдей', 'Аверкий', 'Аверьян', 'Авксентий', 'Автоном', - 'Агап', 'Агафон', 'Аггей', 'Адам', 'Адриан', 'Азарий', - 'Аким', 'Александр', 'Алексей', 'Амвросий', 'Амос', 'Ананий', - 'Анатолий', 'Андрей', 'Андрон', 'Андроник', 'Аникей', 'Аникита', - 'Анисим', 'Антип', 'Антонин', 'Аполлинарий', 'Аполлон', 'Арефий', - 'Аристарх', 'Аркадий', 'Арсений', 'Артемий', 'Артем', 'Архип', - 'Аскольд', 'Афанасий', 'Афиноген', 'Бажен', 'Богдан', 'Болеслав', - 'Борис', 'Борислав', 'Боян', 'Бронислав', 'Будимир', 'Вадим', - 'Валентин', 'Валерий', 'Валерьян', 'Варлаам', 'Варфоломей', 'Василий', - 'Вацлав', 'Велимир', 'Венедикт', 'Вениамин', 'Викентий', 'Виктор', - 'Викторин', 'Виссарион', 'Виталий', 'Владилен', 'Владлен', 'Владимир', - 'Владислав', 'Влас', 'Всеволод', 'Всемил', 'Всеслав', 'Вышеслав', - 'Вячеслав', 'Гаврила', 'Галактион', 'Гедеон', 'Геннадий', 'Георгий', - 'Герасим', 'Герман', 'Глеб', 'Гордей', 'Гостомысл', 'Гремислав', - 'Григорий', 'Гурий', 'Давыд', 'Данила', 'Дементий', 'Демид', - 'Демьян', 'Денис', 'Дмитрий', 'Добромысл', 'Доброслав', 'Дорофей', - 'Евгений', 'Евграф', 'Евдоким', 'Евлампий', 'Евсей', 'Евстафий', - 'Евстигней', 'Егор', 'Елизар', 'Елисей', 'Емельян', 'Епифан', - 'Еремей', 'Ермил', 'Ермолай', 'Ерофей', 'Ефим', 'Ефрем', - 'Захар', 'Зиновий', 'Зосима', 'Иван', 'Игнатий', 'Игорь', - 'Измаил', 'Изот', 'Изяслав', 'Иларион', 'Илья', 'Иннокентий', - 'Иосиф', 'Ипат', 'Ипатий', 'Ипполит', 'Ираклий', 'Исай', - 'Исидор', 'Казимир', 'Каллистрат', 'Капитон', 'Карл', 'Карп', - 'Касьян', 'Ким', 'Кир', 'Кирилл', 'Клавдий', 'Климент', - 'Кондрат', 'Кондратий', 'Конон', 'Константин', 'Корнил', 'Кузьма', - 'Куприян', 'Лавр', 'Лаврентий', 'Ладимир', 'Ладислав', 'Лазарь', - 'Лев', 'Леон', 'Леонид', 'Леонтий', 'Лонгин', 'Лука', - 'Лукьян', 'Лучезар', 'Любим', 'Любомир', 'Любосмысл', 'Макар', - 'Максим', 'Максимильян', 'Мариан', 'Марк', 'Мартын', 'Мартьян', - 'Матвей', 'Мефодий', 'Мечислав', 'Милан', 'Милен', 'Милий', - 'Милован', 'Мина', 'Мир', 'Мирон', 'Мирослав', 'Митофан', - 'Михаил', 'Михей', 'Модест', 'Моисей', 'Мокей', 'Мстислав', - 'Назар', 'Наркис', 'Натан', 'Наум', 'Нестор', 'Никандр', - 'Никанор', 'Никита', 'Никифор', 'Никодим', 'Николай', 'Никон', - 'Нифонт', 'Олег', 'Олимпий', 'Онуфрий', 'Орест', 'Осип', - 'Остап', 'Остромир', 'Павел', 'Панкратий', 'Панкрат', 'Пантелеймон', - 'Панфил', 'Парамон', 'Парфен', 'Пахом', 'Петр', 'Пимен', - 'Платон', 'Поликарп', 'Порфирий', 'Потап', 'Пров', 'Прокл', - 'Прокофий', 'Прохор', 'Радим', 'Радислав', 'Радован', 'Ратибор', - 'Ратмир', 'Родион', 'Роман', 'Ростислав', 'Рубен', 'Руслан', - 'Рюрик', 'Савва', 'Савватий', 'Савелий', 'Самсон', 'Самуил', - 'Светозар', 'Святополк', 'Святослав', 'Севастьян', 'Селиван', 'Селиверст', - 'Семен', 'Серафим', 'Сергей', 'Сигизмунд', 'Сидор', 'Сила', - 'Силантий', 'Сильвестр', 'Симон', 'Сократ', 'Соломон', 'Софон', - 'Софрон', 'Спартак', 'Спиридон', 'Станимир', 'Станислав', 'Степан', - 'Стоян', 'Тарас', 'Твердислав', 'Творимир', 'Терентий', 'Тимофей', - 'Тимур', 'Тит', 'Тихон', 'Трифон', 'Трофим', 'Ульян', - 'Устин', 'Фадей', 'Федор', 'Федосий', 'Федот', 'Феликс', - 'Феоктист', 'Феофан', 'Ферапонт', 'Филарет', 'Филимон', 'Филипп', - 'Фирс', 'Флорентин', 'Фока', 'Фома', 'Фортунат', 'Фотий', - 'Фрол', 'Харитон', 'Харлампий', 'Христофор', 'Чеслав', 'Эдуард', - 'Эммануил', 'Эмиль', 'Эраст', 'Эрнест', 'Эрнст', 'Ювеналий', - 'Юлиан', 'Юлий', 'Юрий', 'Яков', 'Ян', 'Якуб', - 'Януарий', 'Ярополк', 'Ярослав' - ) - - last_names = ( - 'Смирнов', 'Иванов', 'Кузнецов', 'Попов', 'Соколов', - 'Лебедев', 'Козлов', 'Новиков', 'Морозов', 'Петров', - 'Волков', 'Соловьев', 'Васильев', 'Зайцев', 'Павлов', - 'Семенов', 'Голубев', 'Виноградов', 'Богданов', 'Воробьев', - 'Федоров', 'Михайлов', 'Беляев', 'Тарасов', 'Белов', - 'Комаров', 'Орлов', 'Киселев', 'Макаров', 'Андреев', - 'Ковалев', 'Ильин', 'Гусев', 'Титов', 'Кузьмин', - 'Кудрявцев', 'Баранов', 'Куликов', 'Алексеев', 'Степанов', - 'Яковлев', 'Сорокин', 'Сергеев', 'Романов', 'Захаров', - 'Борисов', 'Королев', 'Герасимов', 'Пономарев', 'Григорьев', - 'Лазарев', 'Медведев', 'Ершов', 'Никитин', 'Соболев', - 'Рябов', 'Поляков', 'Цветков', 'Данилов', 'Жуков', - 'Фролов', 'Журавлев', 'Николаев', 'Крылов', 'Максимов', - 'Сидоров', 'Осипов', 'Белоусов', 'Федотов', 'Дорофеев', - 'Егоров', 'Матвеев', 'Бобров', 'Дмитриев', 'Калинин', - 'Анисимов', 'Петухов', 'Антонов', 'Тимофеев', 'Никифоров', - 'Веселов', 'Филиппов', 'Марков', 'Большаков', 'Суханов', - 'Миронов', 'Ширяев', 'Александров', 'Коновалов', 'Шестаков', - 'Казаков', 'Ефимов', 'Денисов', 'Громов', 'Фомин', - 'Давыдов', 'Мельников', 'Щербаков', 'Блинов', 'Колесников', - 'Карпов', 'Афанасьев', 'Власов', 'Маслов', 'Исаков', - 'Тихонов', 'Аксенов', 'Гаврилов', 'Родионов', 'Котов', - 'Горбунов', 'Кудряшов', 'Быков', 'Зуев', 'Третьяков', - 'Савельев', 'Панов', 'Рыбаков', 'Суворов', 'Абрамов', - 'Воронов', 'Мухин', 'Архипов', 'Трофимов', 'Мартынов', - 'Емельянов', 'Горшков', 'Чернов', 'Овчинников', 'Селезнев', - 'Панфилов', 'Копылов', 'Михеев', 'Галкин', 'Назаров', - 'Лобанов', 'Лукин', 'Беляков', 'Потапов', 'Некрасов', - 'Хохлов', 'Жданов', 'Наумов', 'Шилов', 'Воронцов', - 'Ермаков', 'Дроздов', 'Игнатьев', 'Савин', 'Логинов', - 'Сафонов', 'Капустин', 'Кириллов', 'Моисеев', 'Елисеев', - 'Кошелев', 'Костин', 'Горбачев', 'Орехов', 'Ефремов', - 'Исаев', 'Евдокимов', 'Калашников', 'Кабанов', 'Носков', - 'Юдин', 'Кулагин', 'Лапин', 'Прохоров', 'Нестеров', - 'Харитонов', 'Агафонов', 'Муравьев', 'Ларионов', 'Федосеев', - 'Зимин', 'Пахомов', 'Шубин', 'Игнатов', 'Филатов', - 'Крюков', 'Рогов', 'Кулаков', 'Терентьев', 'Молчанов', - 'Владимиров', 'Артемьев', 'Гурьев', 'Зиновьев', 'Гришин', - 'Кононов', 'Дементьев', 'Ситников', 'Симонов', 'Мишин', - 'Фадеев', 'Комиссаров', 'Мамонтов', 'Носов', 'Гуляев', - 'Шаров', 'Устинов', 'Вишняков', 'Евсеев', 'Лаврентьев', - 'Брагин', 'Константинов', 'Корнилов', 'Авдеев', 'Зыков', - 'Бирюков', 'Шарапов', 'Никонов', 'Щукин', 'Дьячков', - 'Одинцов', 'Сазонов', 'Якушев', 'Красильников', 'Гордеев', - 'Самойлов', 'Князев', 'Беспалов', 'Уваров', 'Шашков', - 'Бобылев', 'Доронин', 'Белозеров', 'Рожков', 'Самсонов', - 'Мясников', 'Лихачев', 'Буров', 'Сысоев', 'Фомичев', - 'Русаков', 'Стрелков', 'Гущин', 'Тетерин', 'Колобов', - 'Субботин', 'Фокин', 'Блохин', 'Селиверстов', 'Пестов', - 'Кондратьев', 'Силин', 'Меркушев', 'Лыткин', 'Туров' - ) - - prefixes = ('г-н.', 'тов.') - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) diff --git a/src/faker/providers/sl_SI/__init__.py b/src/faker/providers/sl_SI/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/ssn.py b/src/faker/providers/ssn.py deleted file mode 100644 index 9eb8494..0000000 --- a/src/faker/providers/ssn.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider - - -class Provider(BaseProvider): - ssn_formats = ("###-##-####",) - - @classmethod - def ssn(cls): - return cls.bothify(cls.random_element(cls.ssn_formats)) \ No newline at end of file diff --git a/src/faker/providers/user_agent.py b/src/faker/providers/user_agent.py deleted file mode 100644 index c60bcd1..0000000 --- a/src/faker/providers/user_agent.py +++ /dev/null @@ -1,175 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals -from . import BaseProvider -from . import date_time -from datetime import datetime -import random - - -class Provider(BaseProvider): - user_agents = ( - 'chrome', 'firefox', 'internet_explorer', 'opera', 'safari', - ) - - windows_platform_tokens = ( - 'Windows 95', 'Windows 98', 'Windows 98; Win 9x 4.90', 'Windows CE', - 'Windows NT 4.0', 'Windows NT 5.0', 'Windows NT 5.01', - 'Windows NT 5.1', 'Windows NT 5.2', 'Windows NT 6.0', 'Windows NT 6.1', - 'Windows NT 6.2', - ) - - linux_processors = ('i686', 'x86_64',) - - mac_processors = ('Intel', 'PPC', 'U; Intel', 'U; PPC',) - - langs = ('en-US', 'sl-SI', 'it-IT',) - - @classmethod - def mac_processor(cls): - return cls.random_element(cls.mac_processors) - - @classmethod - def linux_processor(cls): - return cls.random_element(cls.linux_processors) - - @classmethod - def user_agent(cls): - name = cls.random_element(cls.user_agents) - return getattr(cls, name)() - - @classmethod - def chrome(cls): - saf = str(random.randint(531, 536)) + str(random.randint(0, 2)) - tmplt = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \ - ' Chrome/{2}.0.{3}.0 Safari/{4}' - platforms = ( - tmplt.format(cls.linux_platform_token(), - saf, - random.randint(13, 15), - random.randint(800, 899), - saf), - tmplt.format(cls.windows_platform_token(), - saf, - random.randint(13, 15), - random.randint(800, 899), - saf), - tmplt.format(cls.mac_platform_token(), - saf, - random.randint(13, 15), - random.randint(800, 899), - saf), - ) - - return 'Mozilla/5.0 ' + cls.random_element(platforms) - - @classmethod - def firefox(cls): - ver = ( - 'Gecko/{0} Firefox/{1}.0'.format( - date_time.Provider.date_time_between( - datetime(2011, 1, 1)), random.randint(4, 15)), - 'Gecko/{0} Firefox/3.6.{1}'.format( - date_time.Provider.date_time_between( - datetime(2010, 1, 1)), random.randint(1, 20)), - 'Gecko/{0} Firefox/3.8'.format( - date_time.Provider.date_time_between( - datetime(2010, 1, 1)), ), - ) - tmplt_win = '({0}; {1}; rv:1.9.{2}.20) {3}' - tmplt_lin = '({0}; rv:1.9.{1}.20) {2}' - tmplt_mac = '({0}; rv:1.9.{1}.20) {2}' - platforms = ( - tmplt_win.format(cls.windows_platform_token(), - cls.random_element(cls.langs), - random.randint(0, 2), - random.choice(ver)), - tmplt_lin.format(cls.linux_platform_token(), - random.randint(5, 7), - random.choice(ver)), - tmplt_mac.format(cls.mac_platform_token(), - random.randint(2, 6), - random.choice(ver)), - ) - - return 'Mozilla/5.0 ' + cls.random_element(platforms) - - @classmethod - def safari(cls): - saf = "{0}.{1}.{2}".format(random.randint(531, 535), - random.randint(1, 50), - random.randint(1, 7)) - if random.randint(0, 1) == 0: - ver = "{0}.{1}".format(random.randint(4, 5), - random.randint(0, 1)) - else: - ver = "{0}.0.{1}".format(random.randint(4, 5), - random.randint(1, 5)) - tmplt_win = '(Windows; U; {0}) AppleWebKit/{1} (KHTML, like Gecko)' \ - ' Version/{2} Safari/{3}' - tmplt_mac = '({0} rv:{1}.0; {2}) AppleWebKit/{3} (KHTML, like Gecko)' \ - ' Version/{4} Safari/{5}' - tmplt_ipod = '(iPod; U; CPU iPhone OS {0}_{1} like Mac OS X; {2})' \ - ' AppleWebKit/{3} (KHTML, like Gecko) Version/{4}.0.5' \ - ' Mobile/8B{5} Safari/6{6}' - platforms = ( - tmplt_win.format(cls.windows_platform_token(), - saf, - ver, - saf), - tmplt_mac.format(cls.mac_platform_token(), - random.randint(2, 6), - cls.random_element(cls.langs), - saf, - ver, - saf), - tmplt_ipod.format(random.randint(3, 4), - random.randint(0, 3), - cls.random_element(cls.langs), - saf, - random.randint(3, 4), - random.randint(111, 119), - saf), - ) - - return 'Mozilla/5.0 ' + cls.random_element(platforms) - - @classmethod - def opera(cls): - tmplt = '({0}; {1}) Presto/2.9.{2} Version/{3}.00' - platforms = ( - tmplt.format(cls.linux_platform_token(), - cls.random_element(cls.langs), - random.randint(160, 190), - random.randint(10, 12)), - tmplt.format(cls.windows_platform_token(), - cls.random_element(cls.langs), - random.randint(160, 190), - random.randint(10, 12)), - ) - return 'Opera/{0}.{1}.{2}'.format(random.randint(8, 9), - random.randint(10, 99), - cls.random_element(platforms)) - - @classmethod - def internet_explorer(cls): - tmplt = 'Mozilla/5.0 (compatible; MSIE {0}.0; {1}; Trident/{2}.{3})' - return tmplt.format(random.randint(5, 9), - cls.windows_platform_token(), - random.randint(3, 5), - random.randint(0, 1)) - - @classmethod - def windows_platform_token(cls): - return cls.random_element(cls.windows_platform_tokens) - - @classmethod - def linux_platform_token(cls): - return 'X11; Linux {0}'.format( - cls.random_element(cls.linux_processors)) - - @classmethod - def mac_platform_token(cls): - return 'Macintosh; {0} Mac OS X 10_{1}_{2}'.format( - cls.random_element(cls.mac_processors), - random.randint(5, 8), random.randint(0, 9)) diff --git a/src/faker/providers/zh_CN/__init__.py b/src/faker/providers/zh_CN/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/zh_CN/address.py b/src/faker/providers/zh_CN/address.py deleted file mode 100644 index 6e5e5c8..0000000 --- a/src/faker/providers/zh_CN/address.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - city_suffixes = ["市", ] - city_formats = ["{{first_name}}{{city_suffix}}", ] - - building_number_formats = ["?座", ] - postcode_formats = ["%#####", ] - - street_suffixes = ["街", "路"] - street_name_formats = ["{{last_name}}{{street_suffix}}", ] - street_address_formats = ["{{street_name}}{{building_number}}", ] - - address_formats = ["{{city}}{{street_address}} {{postcode}}", ] - - states = ["西夏区", "永川区", "秀英区", "高港区", "清城区", "兴山区", - "锡山区", "清河区", "龙潭区", "华龙区", "海陵区", "滨城区", - "东丽区", "高坪区", "沙湾区", "平山区", "城北区", "海港区", - "沙市区", "双滦区", "长寿区", "山亭区", "南湖区", "浔阳区", - "南长区", "友好区", "安次区", "翔安区", "沈河区", "魏都区", - "西峰区", "萧山区", "金平区", "沈北新区", "孝南区", "上街区", - "城东区", "牧野区", "大东区", "白云区", "花溪区", "吉利区", - "新城区", "怀柔区", "六枝特区", "涪城区", "清浦区", "南溪区", - "淄川区", "高明区"] - cities = ["北京", "上海", "天津", "重庆", "哈尔滨", "长春", "沈阳", - "呼和浩特", "石家庄", "乌鲁木齐", "兰州", "西宁", "西安", - "银川", "郑州", "济南", "太原", "合肥", "武汉", "长沙", - "南京", "成都", "贵阳", "昆明", "南宁", "拉萨", "杭州", - "南昌", "广州", "福州", "台北", "海口", "香港", "澳门"] - countries = ["阿富汗", "阿拉斯加", "阿尔巴尼亚", "阿尔及利亚", "安道尔", "安哥拉", "安圭拉岛英", "安提瓜和巴布达", - "阿根廷", "亚美尼亚", "阿鲁巴岛", "阿森松", "澳大利亚", "奥地利", "阿塞拜疆", "巴林", "孟加拉国", - "巴巴多斯", "白俄罗斯", "比利时", "伯利兹", "贝宁", "百慕大群岛", "不丹", "玻利维亚", "波斯尼亚和黑塞哥维那", - "博茨瓦纳", "巴西", "保加利亚", "布基纳法索", "布隆迪", "喀麦隆", "加拿大", "加那利群岛", "佛得角", - "开曼群岛", "中非", "乍得", "智利", "圣诞岛", "科科斯岛", "哥伦比亚", "巴哈马国", "多米尼克国", "科摩罗", - "刚果", "科克群岛", "哥斯达黎加", "克罗地亚", "古巴", "塞浦路斯", "捷克", "丹麦", "迪戈加西亚岛", "吉布提", - "多米尼加共和国", "厄瓜多尔", "埃及", "萨尔瓦多", "赤道几内亚", "厄立特里亚", "爱沙尼亚", "埃塞俄比亚", "福克兰群岛", - "法罗群岛", "斐济", "芬兰", "法国", "法属圭亚那", "法属波里尼西亚", "加蓬", "冈比亚", "格鲁吉亚", "德国", "加纳", - "直布罗陀", "希腊", "格陵兰岛", "格林纳达", "瓜德罗普岛", "关岛", "危地马拉", "几内亚", "几内亚比绍", "圭亚那", - "海地", "夏威夷", "洪都拉斯", "匈牙利", "冰岛", "印度", "印度尼西亚", "伊郎", "伊拉克", "爱尔兰", "以色列", - "意大利", "科特迪瓦", "牙买加", "日本", "约旦", "柬埔塞", "哈萨克斯坦", "肯尼亚", "基里巴斯", "朝鲜", "韩国", - "科威特", "吉尔吉斯斯坦", "老挝", "拉脱维亚", "黎巴嫩", "莱索托", "利比里亚", "利比亚", "列支敦士登", "立陶宛", - "卢森堡", "马其顿", "马达加斯加", "马拉维", "马来西亚", "马尔代夫", "马里", "马耳他", "马里亚纳群岛", "马绍尔群岛", - "马提尼克", "毛里塔尼亚", "毛里求斯", "马约特岛", "墨西哥", "密克罗尼西亚", "中途岛", "摩尔多瓦", "摩纳哥", "蒙古", - "蒙特塞拉特岛", "摩洛哥", "莫桑比克", "缅甸", "纳米比亚", "瑙鲁", "尼泊尔", "荷兰", "荷属安的列斯群岛", "新喀里多尼亚群岛", - "新西兰", "尼加拉瓜", "尼日尔", "尼日利亚", "纽埃岛", "诺福克岛", "挪威", "阿曼", "帕劳", "巴拿马", "巴布亚新几内亚", - "巴拉圭", "秘鲁", "菲律宾", "波兰", "葡萄牙", "巴基斯坦", "波多黎各", "卡塔尔", "留尼汪岛", "罗马尼亚", "俄罗斯", - "卢旺达", "东萨摩亚", "西萨摩亚", "圣马力诺", "圣皮埃尔岛及密克隆岛", "圣多美和普林西比", "沙特阿拉伯", "塞内加尔", - "塞舌尔", "新加坡", "斯洛伐克", "斯洛文尼亚", "所罗门群岛", "索马里", "南非", "西班牙", "斯里兰卡", "圣克里斯托弗和尼维斯", - "圣赫勒拿", "圣卢西亚", "圣文森特岛", "苏丹", "苏里南", "斯威士兰", "瑞典", "瑞士", "叙利亚", "塔吉克斯坦", "坦桑尼亚", - "泰国", "阿拉伯联合酋长国", "多哥", "托克劳群岛", "汤加", "特立尼达和多巴哥", "突尼斯", "土耳其", "土库曼斯坦", - "特克斯和凯科斯群岛", "图瓦卢", "美国", "乌干达", "乌克兰", "英国", "乌拉圭", "乌兹别克斯坦", "瓦努阿图", - "梵蒂冈", "委内瑞拉", "越南", "维尔京群岛", "维尔京群岛和圣罗克伊", "威克岛", "瓦里斯和富士那群岛", "西撒哈拉", - "也门", "南斯拉夫", "扎伊尔", "赞比亚", "桑给巴尔", "津巴布韦", "中华人民共和国", "中国"] - - @classmethod - def building_number(cls): - return cls.lexify(cls.random_element(cls.building_number_formats)) - - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) - - @classmethod - def state(cls): - return cls.random_element(cls.states) - \ No newline at end of file diff --git a/src/faker/providers/zh_CN/person.py b/src/faker/providers/zh_CN/person.py deleted file mode 100644 index 8d7aed8..0000000 --- a/src/faker/providers/zh_CN/person.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from ..person import Provider as PersonProvider - - -class Provider(PersonProvider): - formats = ["{{last_name}}{{first_name}}", ] - first_names = ["伟", "芳", "娜", "敏", "静", "秀英", "丽", "强", "磊", "洋", "艳", "勇", "军", "杰", "娟", - "涛", "超", "明", "霞", "秀兰", "刚", "平", "燕", "辉", "玲", "桂英", "丹", "萍", "鹏", "华", - "红", "玉兰", "飞", "桂兰", "英", "梅", "鑫", "波", "斌", "莉", "宇", "浩", "凯", "秀珍", "健", - "俊", "帆", "雪", "帅", "慧", "旭", "宁", "婷", "玉梅", "龙", "林", "玉珍", "凤英", "晶", "欢", - "玉英", "颖", "红梅", "佳", "倩", "阳", "建华", "亮", "成", "琴", "兰英", "畅", "建", "云", "洁", - "峰", "建国", "建军", "柳", "淑珍", "春梅", "海燕", "晨", "冬梅", "秀荣", "瑞", "桂珍", "莹", "秀云", - "桂荣", "志强", "秀梅", "丽娟", "婷婷", "玉华", "兵", "雷", "东", "琳", "雪梅", "淑兰", "丽丽", "玉", - "秀芳", "欣", "淑英", "桂芳", "博", "丽华", "丹丹", "彬", "桂香", "坤", "想", "淑华", "荣", "秀华", - "桂芝", "岩", "杨", "小红", "金凤", "文", "利", "楠", "红霞", "建平", "瑜", "桂花", "璐", "凤兰"] - - last_names = ["赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "诸", "卫", "蒋", "沈", "韩", "杨", - "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", - "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", - "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", - "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", - "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", - "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", - "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "粱", - "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", - "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", - "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", - "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", - "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "魏", "家", "封", - "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", - "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", - "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", - "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", - "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", - "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", - "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", - "温", "别", "庄", "晏", "柴", "翟", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", - "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", - "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆", - "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", - "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", - "游", "竺", "权", "逯", "盖", "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧", "阳", - "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫", "连", "皇", "甫", "尉", "迟", "公", "羊", - "澹", "台", "公", "冶", "宗", "政", "濮", "阳", "淳", "于", "单", "于", "太", "叔", "申", "屠", - "公", "孙", "仲", "孙", "轩", "辕", "令", "狐", "钟", "离", "宇", "文", "长", "孙", "慕", "容", - "鲜", "于", "闾", "丘", "司", "徒", "司", "空", "亓", "官", "司", "寇", "仉", "督", "子", "车", - "颛", "孙", "端", "木", "巫", "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公", "良", - "拓", "跋", "夹", "谷", "宰", "父", "谷", "粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", - "段", "干", "百", "里", "东", "郭", "南", "门", "呼", "延", "归", "海", "羊", "舌", "微", "生", - "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门", - "商", "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟"] diff --git a/src/faker/providers/zh_TW/__init__.py b/src/faker/providers/zh_TW/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/faker/providers/zh_TW/address.py b/src/faker/providers/zh_TW/address.py deleted file mode 100644 index 6a81359..0000000 --- a/src/faker/providers/zh_TW/address.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from ..address import Provider as AddressProvider - - -class Provider(AddressProvider): - city_formats = ("{{city_name}}", ) - - building_number_formats = ("%號", "%#號", "%##號", ) - postcode_formats = ("%####", "%##", ) - - street_name_formats = ("{{street_name}}", ) - street_address_formats = ("{{street_name}}{{building_number}}", ) - - address_formats = ("{{postcode}} {{city}}{{street_address}}", ) - secondary_address_formats = ('#樓', '之#') - - street_names = ("中正路", "中山路", "民生路", "中華路", "和平路", - "中興路", "仁愛路", "復興路", "民族路", "民權路", - "忠孝路", "信義路", "成功路", "新興路", "忠孝街", - "和平街", "信義街", "仁愛街", "文化路", "大同路", - "三民路", "新生路", "光復路", "自強路", "光明路", - "公園路", "民生街", "文化街", "中興街", "建國路", - "民權街", "自強街", "中山路1段", "中山路2段", "光明街", - "成功街", "永安街", "四維路", "新興街", "民族街", - "福德街", "大同街", "文昌街", "復興街", "博愛街", - "博愛路", "光華街", "太平路", "水源路", "新生街", - "四維街", "大仁街", "中央路", "大智街", "林森路", - "八德路", "長春路", "南街", "福德路", "光華路", - "八德街", "中山路3段", "東興路", "勝利街", "文昌路", - "三民街", "大勇街", "民有街", "自由路", "長安街", - "明德路", "明德街", "光復街", "德街", "忠義路", - "中和路", "自由街", "中正路1段", "永和街", "延平路", - "正義路", "五福街", "華興街", "育英路", "平和路", - "福安街", "中正路2段", "勝利路", "育英街", "興街", - "自立街", "民享街", "大智路", "民治街", "民治路", - "學府路", "中華街", "忠義街", "和街", "民富街",) - - cities = ("基隆市", "台北市", "新北市", "桃園縣", "新竹市", - "新竹縣", "苗栗縣", "台中市", "彰化縣", "南投縣", - "雲林縣", "嘉義市", "嘉義縣", "台南市", "高雄市", - "屏東縣", "台東縣", "花蓮縣", "宜蘭縣", "澎湖縣", - "金門縣", "連江縣") - - # from - countries = ("阿爾巴尼亞", "剛果共和國", "阿爾及利亞", "丹麥", - "安哥拉", "多明尼加", "安圭拉", "多米尼克", - "阿根廷", "厄瓜多爾", "亞美尼亞", "埃及", - "阿路巴", "薩爾瓦多", "澳大利亞", "厄利垂亞", - "奧地利", "愛沙尼亞", "亞塞拜然", "衣索匹亞", - "巴哈馬", "斐濟", "巴林", "芬蘭", "孟加拉", "法屬玻里尼西亞", - "法國", "巴貝多", "加彭", "白俄羅斯", "喬治亞", - "比利時", "德國", "貝里斯", "迦納", "貝南", "直布羅陀", - "百慕達", "英國", "不丹", "希臘", "玻利維亞", "格瑞那達", - "波希尼亞及赫塞哥維那", "瓜地馬拉", "波札那", "幾內亞", - "巴西", "蓋亞那", "汶萊", "海地", "保加利亞", "宏都拉斯", - "布吉納法索", "香港", "蒲隆地", "匈牙利", "柬埔寨", "冰島", - "喀麥隆", "印度", "加拿大", "印尼", "維德角島", "依朗", - "開曼群島", "伊拉克", "中非共和國", "愛爾蘭", "查德", "以色列", - "智利", "義大利", "中國大陸", "牙買加", "哥倫比亞", "日本", - "剛果", "約旦", "科克群島", "肯亞", "哥斯大黎加", "韓國", - "象牙海岸", "科威特", "克羅埃西亞", "寮國", "塞浦路斯", "拉脫維亞", - "捷克", "賴索托", "盧森堡", "聖露西亞", "澳門", "聖文森及格瑞那丁", - "馬其頓", "聖多美及普林西比", "馬達加斯加", "沙烏地阿拉伯", - "馬拉威", "塞內加爾", "馬來西亞", "塞席爾", "馬爾地夫", "獅子山", - "馬利", "新加坡", "馬爾他", "斯洛伐克", "模里西斯", "斯洛維尼亞", - "茅利塔尼亞", "索羅門群島", "墨西哥", "索馬利亞", - "摩爾多瓦", "南非", "蒙古", "西班牙", "摩洛哥", "斯里蘭卡", - "緬甸", "蘇丹", "納米比亞", "蘇利南", "諾魯", "史瓦濟蘭", - "尼泊爾", "瑞典", "荷蘭", "瑞士", "新喀里多尼亞", "敘利亞", - "紐西蘭", "坦尚尼亞", "尼日", "泰國", "奈及利亞", "多哥", - "挪威", "千里達及托貝哥", "阿曼", "突尼西亞", "巴基斯坦", "土耳其", - "巴拿馬", "烏干達", "巴布亞紐幾內亞", "烏克蘭", - "巴拉圭", "阿拉伯聯合大公國", "秘魯", "美國", "菲律賓", "烏拉圭", - "波蘭", "委內瑞拉", "葡萄牙", "越南", "卡達", "西薩摩亞", - "羅馬尼亞", "葉門", "俄羅斯", "尚比亞", "盧安達", "辛巴威", - "聖克里斯多福及尼維斯") - - @classmethod - def secondary_address(cls): - return cls.numerify(cls.random_element(cls.secondary_address_formats)) - - @classmethod - def building_number(cls): - return cls.numerify(cls.random_element(cls.building_number_formats)) - - @classmethod - def street_name(cls): - return cls.random_element(cls.street_names) - - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) - \ No newline at end of file diff --git a/src/faker/providers/zh_TW/phone_number.py b/src/faker/providers/zh_TW/phone_number.py deleted file mode 100644 index 27f1769..0000000 --- a/src/faker/providers/zh_TW/phone_number.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider - - -class Provider(PhoneNumberProvider): - formats = ("(##) %#######", - "##-%#######", - "### %#######", - "09########", - "09##-######", - "##-%######", - "## %######") diff --git a/src/faker/providers/zh_TW/ssn.py b/src/faker/providers/zh_TW/ssn.py deleted file mode 100644 index 6093a4b..0000000 --- a/src/faker/providers/zh_TW/ssn.py +++ /dev/null @@ -1,11 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -from ..ssn import Provider as SsnProvider - - -class Provider(SsnProvider): - ssn_formats = ("?#########",) - - @classmethod - def ssn(cls): - return cls.bothify(cls.random_element(cls.ssn_formats)).upper() diff --git a/src/faker/shims/__init__.py b/src/faker/shims/__init__.py deleted file mode 100644 index d96a329..0000000 --- a/src/faker/shims/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - from collections import Counter -except ImportError: - from .counter import Counter diff --git a/src/faker/shims/counter.py b/src/faker/shims/counter.py deleted file mode 100644 index c27a0e1..0000000 --- a/src/faker/shims/counter.py +++ /dev/null @@ -1,187 +0,0 @@ -# From http://code.activestate.com/recipes/576611-counter-class/ - -from operator import itemgetter -from heapq import nlargest -from itertools import repeat, ifilter - - -class Counter(dict): - '''Dict subclass for counting hashable objects. Sometimes called a bag - or multiset. Elements are stored as dictionary keys and their counts - are stored as dictionary values. - - >>> Counter('zyzygy') - Counter({'y': 3, 'z': 2, 'g': 1}) - - ''' - - def __init__(self, iterable=None, **kwds): - '''Create a new, empty Counter object. And if given, count elements - from an input iterable. Or, initialize the count from another mapping - of elements to their counts. - - >>> c = Counter() # a new, empty counter - >>> c = Counter('gallahad') # a new counter from an iterable - >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping - >>> c = Counter(a=4, b=2) # a new counter from keyword args - - ''' - self.update(iterable, **kwds) - - def __missing__(self, key): - return 0 - - def most_common(self, n=None): - '''List the n most common elements and their counts from the most - common to the least. If n is None, then list all element counts. - - >>> Counter('abracadabra').most_common(3) - [('a', 5), ('r', 2), ('b', 2)] - - ''' - if n is None: - return sorted(self.iteritems(), key=itemgetter(1), reverse=True) - return nlargest(n, self.iteritems(), key=itemgetter(1)) - - def elements(self): - '''Iterator over elements repeating each as many times as its count. - - >>> c = Counter('ABCABC') - >>> sorted(c.elements()) - ['A', 'A', 'B', 'B', 'C', 'C'] - - If an element's count has been set to zero or is a negative number, - elements() will ignore it. - - ''' - for elem, count in self.iteritems(): - for _ in repeat(None, count): - yield elem - - # Override dict methods where the meaning changes for Counter objects. - - @classmethod - def fromkeys(cls, iterable, v=None): - raise NotImplementedError( - 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') - - def update(self, iterable=None, **kwds): - '''Like dict.update() but add counts instead of replacing them. - - Source can be an iterable, a dictionary, or another Counter instance. - - >>> c = Counter('which') - >>> c.update('witch') # add elements from another iterable - >>> d = Counter('watch') - >>> c.update(d) # add elements from another counter - >>> c['h'] # four 'h' in which, witch, and watch - 4 - - ''' - if iterable is not None: - if hasattr(iterable, 'iteritems'): - if self: - self_get = self.get - for elem, count in iterable.iteritems(): - self[elem] = self_get(elem, 0) + count - else: - dict.update(self, iterable) # fast path when counter is empty - else: - self_get = self.get - for elem in iterable: - self[elem] = self_get(elem, 0) + 1 - if kwds: - self.update(kwds) - - def copy(self): - 'Like dict.copy() but returns a Counter instance instead of a dict.' - return Counter(self) - - def __delitem__(self, elem): - 'Like dict.__delitem__() but does not raise KeyError for missing values.' - if elem in self: - dict.__delitem__(self, elem) - - def __repr__(self): - if not self: - return '%s()' % self.__class__.__name__ - items = ', '.join(map('%r: %r'.__mod__, self.most_common())) - return '%s({%s})' % (self.__class__.__name__, items) - - # Multiset-style mathematical operations discussed in: - # Knuth TAOCP Volume II section 4.6.3 exercise 19 - # and at http://en.wikipedia.org/wiki/Multiset - # - # Outputs guaranteed to only include positive counts. - # - # To strip negative and zero counts, add-in an empty counter: - # c += Counter() - - def __add__(self, other): - '''Add counts from two counters. - - >>> Counter('abbb') + Counter('bcc') - Counter({'b': 4, 'c': 2, 'a': 1}) - - - ''' - if not isinstance(other, Counter): - return NotImplemented - result = Counter() - for elem in set(self) | set(other): - newcount = self[elem] + other[elem] - if newcount > 0: - result[elem] = newcount - return result - - def __sub__(self, other): - ''' Subtract count, but keep only results with positive counts. - - >>> Counter('abbbc') - Counter('bccd') - Counter({'b': 2, 'a': 1}) - - ''' - if not isinstance(other, Counter): - return NotImplemented - result = Counter() - for elem in set(self) | set(other): - newcount = self[elem] - other[elem] - if newcount > 0: - result[elem] = newcount - return result - - def __or__(self, other): - '''Union is the maximum of value in either of the input counters. - - >>> Counter('abbb') | Counter('bcc') - Counter({'b': 3, 'c': 2, 'a': 1}) - - ''' - if not isinstance(other, Counter): - return NotImplemented - _max = max - result = Counter() - for elem in set(self) | set(other): - newcount = _max(self[elem], other[elem]) - if newcount > 0: - result[elem] = newcount - return result - - def __and__(self, other): - ''' Intersection is the minimum of corresponding counts. - - >>> Counter('abbb') & Counter('bcc') - Counter({'b': 1}) - - ''' - if not isinstance(other, Counter): - return NotImplemented - _min = min - result = Counter() - if len(self) < len(other): - self, other = other, self - for elem in ifilter(self.__contains__, other): - newcount = _min(self[elem], other[elem]) - if newcount > 0: - result[elem] = newcount - return result diff --git a/src/faker/utils/distribution.py b/src/faker/utils/distribution.py deleted file mode 100644 index d632151..0000000 --- a/src/faker/utils/distribution.py +++ /dev/null @@ -1,27 +0,0 @@ -# coding=utf-8 - -import bisect -import random - - -def random_sample(): - return random.uniform(0.0, 1.0) - - -def cumsum(it): - total = 0 - for x in it: - total += x - yield total - - -def choice_distribution(a, p): - assert len(a) == len(p) - - cdf = list(cumsum(p)) - normal = cdf[-1] - cdf2 = [i / normal for i in cdf] - uniform_sample = random_sample() - idx = bisect.bisect_right(cdf2, uniform_sample) - - return a[idx] diff --git a/src/faker/utils/text.py b/src/faker/utils/text.py deleted file mode 100644 index be55146..0000000 --- a/src/faker/utils/text.py +++ /dev/null @@ -1,27 +0,0 @@ -# coding=utf-8 - -import re -import unicodedata - - -_re_pattern = re.compile('[^\w\s-]') -_re_pattern_allow_dots = re.compile('[^\.\w\s-]') -_re_spaces = re.compile('[-\s]+') - - -def slugify(value, allow_dots=False): - """ - Converts to lowercase, removes non-word characters (alphanumerics and - underscores) and converts spaces to hyphens. Also strips leading and - trailing whitespace. Modified to optionally allow dots. - - Copied from Django 1.7 - """ - value = unicodedata.normalize('NFKD', value) - value = value.encode('ascii', 'ignore').decode('ascii') - value = value.strip().lower() - if allow_dots: - value = _re_pattern_allow_dots.sub('', value) - else: - value = _re_pattern.sub('', value) - return _re_spaces.sub('-', value) diff --git a/src/fakeum.py b/src/fakeum.py index d278040..6b77541 100644 --- a/src/fakeum.py +++ b/src/fakeum.py @@ -1,74 +1,39 @@ #!/usr/bin/python # encoding: utf-8 # -# Copyright © 2014 deanishe@deanishe.net +# Copyright (c) 2014 deanishe@deanishe.net # # MIT Licence. See http://opensource.org/licenses/MIT # # Created on 2014-12-29 # -""" -""" +"""Alfred 3 workflow to generate test data.""" -from __future__ import print_function, unicode_literals, absolute_import +from __future__ import print_function, absolute_import from collections import OrderedDict import datetime import random -import subprocess import sys -from workflow import Workflow, ICON_WARNING, MATCH_ALL, MATCH_ALLCHARS -from faker import Factory +from workflow import Workflow3, ICON_WARNING, MATCH_ALL, MATCH_ALLCHARS -DELIMITER = '×' +from common import ( + DEFAULT_SETTINGS, + ISSUE_URL, + UPDATE_SETTINGS, + intvar, + run_workflow, +) -HELP_URL = 'https://github.com/deanishe/alfred-fakeum' -UPDATE_SETTINGS = {'github_slug': 'deanishe/alfred-fakeum'} +# Query delimiter that separates faker name from quantity +DELIMITER = u'✕' -# All locales supported by faker -ALL_LOCALES = { - 'bg_BG': 'Bulgarian', - 'cs_CZ': 'Czech', - 'de_DE': 'German', - 'dk_DK': 'Danish', - 'el_GR': 'Greek', - 'en_CA': 'English (CA)', - 'en_GB': 'English (GB)', - 'en_US': 'English (US)', - 'es_ES': 'Spanish (ES)', - 'es_MX': 'Spanish (MX)', - 'fa_IR': 'Persian', - 'fi_FI': 'Finnish', - 'fr_FR': 'French', - 'hi_IN': 'Hindi', - 'it_IT': 'Italian', - 'ko_KR': 'Korean', - 'lt_LT': 'Lithuanian', - 'lv_LV': 'Latvian', - 'nl_NL': 'Dutch', - # 'no_NO': 'Norwegian', # Doesn't seem to be working :( - 'pl_PL': 'Polish', - 'pt_BR': 'Portuguese (BR)', - 'ru_RU': 'Russian', - 'sl_SI': 'Slovenian', - 'zh_CN': 'Chinese (CN)', - 'zh_TW': 'Chinese (TW)', -} +# Number of sentences per paragraph of Lipsum text +LIPSUMS = intvar('LIPSUM_SENTENCES', 3) -DEFAULT_SETTINGS = { - 'locales': [ - # 'en_GB', - 'en_US', - 'de_DE', - 'it_IT', - 'es_ES', - # 'fr_FR', - ], -} - -ALFRED_AS = 'tell application "Alfred 2" to search "fake "' +# ALFRED_AS = 'tell application "Alfred 2" to search "fake "' FAKERS = OrderedDict([ # People @@ -124,7 +89,8 @@ fakers = [] def get_faker(): - """Return random faker instance""" + """Return random faker instance.""" + from faker import Factory global fakers if not fakers: for loc in wf.settings.get('locales', DEFAULT_SETTINGS['locales']): @@ -133,39 +99,38 @@ def get_faker(): return random.choice(fakers) -def run_workflow(): - """Run workflow in Alfred""" - subprocess.call(['osascript', '-e', ALFRED_AS]) +# def run_workflow(): +# """Run workflow in Alfred""" +# subprocess.call(['osascript', '-e', ALFRED_AS]) def get_fake_datum(name): - """Return one fake datum for name""" - + """Return one fake datum for name.""" methname = FAKERS[name] # Get a faker instance that has the required method while True: faker = get_faker() if hasattr(faker, methname): - datum = getattr(faker, methname)() + if name == 'Paragraph': # Pass no. of sentences to generator + datum = getattr(faker, methname)(LIPSUMS, False) + else: + datum = getattr(faker, methname)() break if isinstance(datum, int): - datum = '{}'.format(datum) + datum = str(datum) elif isinstance(datum, datetime.datetime): - datum = '{}'.format(datum.strftime('%Y-%m-%d %H:%M:%S')) + datum = datum.strftime('%Y-%m-%d %H:%M:%S') elif not isinstance(datum, basestring): - log.debug('{} : ({}) {!r}'.format(name, - datum.__class__, - datum)) + log.debug(u'%s : (%s) %r', name, datum.__class__, datum) return datum def get_fake_data(names=None, count=1): - """Return list of fake data""" - + """Return list of fake data.""" fake_data = [] if not names: @@ -188,35 +153,38 @@ def get_fake_data(names=None, count=1): def main(wf): - + """Run workflow.""" if wf.update_available: wf.add_item('A newer version is available', - '↩ to install update', + u'↩ to install update', autocomplete='workflow:update', icon='update-available.png') query = None + if len(wf.args): query = wf.args[0] - log.debug('query : {!r}'.format(query)) + log.debug('query=%r', query) - count = None + count = 0 if DELIMITER in query: if query.endswith(DELIMITER): + # Run workflow with previous query + # run_workflow(wf.cached_data('last_query', session=True)) run_workflow() - return 0 + return query, count = [s.strip() for s in query.split(DELIMITER)] if count: if not count.isdigit(): - wf.add_item('Not a number : {}'.format(count), + wf.add_item(u'Not a number : ' + count, 'Please enter a number', icon=ICON_WARNING) wf.send_feedback() - return 0 + return count = int(count) else: @@ -225,6 +193,9 @@ def main(wf): fake_data = get_fake_data(names=[query], count=count) else: + # Save last query so we can jump back to it if user backs up + # wf.cache_data('last_query', query, session=True) + fake_data = get_fake_data() if query: @@ -234,10 +205,10 @@ def main(wf): match_on=MATCH_ALL ^ MATCH_ALLCHARS, min_score=20) - log.debug('count : {!r}'.format(count)) + log.debug('count=%d', count) if not fake_data: - wf.add_item('No matching fake data', + wf.add_item('No matching fakers', 'Try a different query', icon=ICON_WARNING) @@ -246,22 +217,30 @@ def main(wf): subtitle = data if count: example = data.split('\n')[0].strip() - subtitle = '{} ✕ e.g. "{}"'.format(count, example) + subtitle = u'{} ✕ e.g. "{}"'.format(count, example) - wf.add_item(name, - subtitle, - arg=data, - autocomplete='{} {} '.format(name, DELIMITER), - valid=True, - largetext=data, - copytext=data) + it = wf.add_item(name, + subtitle, + arg=data, + autocomplete=u'{} {} '.format(name, DELIMITER), + valid=True, + largetext=data, + copytext=data) + + it.setvar('title', 'Copied to Clipboard') + it.setvar('text', data) + + mod = it.add_modifier('cmd', 'Paste to frontmost application') + mod.setvar('paste', 1) + mod.setvar('SHOW_NOTIFICATIONS', 0) wf.send_feedback() if __name__ == '__main__': - wf = Workflow(default_settings=DEFAULT_SETTINGS, - update_settings=UPDATE_SETTINGS, - help_url=HELP_URL) + wf = Workflow3(default_settings=DEFAULT_SETTINGS, + update_settings=UPDATE_SETTINGS, + help_url=ISSUE_URL, + libraries=['./libs']) log = wf.logger sys.exit(wf.run(main)) diff --git a/src/icons/docs.png b/src/icons/docs.png new file mode 100644 index 0000000000000000000000000000000000000000..1a15ae7b4a1a972bd10dcc08befe209a35aa2375 GIT binary patch literal 7511 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 QQ*i-x6&>XoMVqMq2QZ2z>i_@% literal 0 HcmV?d00001 diff --git a/src/icons/icon.png b/src/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f7e5b61578c919d3773d804a91acce7d9b19d6 GIT binary patch literal 6119 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 o7@UewlYW`({Qvpm@bzViGY5wC-bgoX41f= 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 F{{eXtaAp7i literal 0 HcmV?d00001 diff --git a/src/inactive.png b/src/icons/off.png similarity index 100% rename from src/inactive.png rename to src/icons/off.png diff --git a/src/icons/on.png b/src/icons/on.png new file mode 100644 index 0000000000000000000000000000000000000000..2e96bece05eb28989718e824ea35b64840facfd1 GIT binary patch literal 7137 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 literal 0 HcmV?d00001 diff --git a/src/icons/update-available.png b/src/icons/update-available.png new file mode 100644 index 0000000000000000000000000000000000000000..21e3a15bf1e5c8fc217a74d3b84360e765febf38 GIT binary patch literal 3856 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 literal 0 HcmV?d00001 diff --git a/src/info.plist b/src/info.plist index 8f6e748..3b960aa 100644 --- a/src/info.plist +++ b/src/info.plist @@ -6,16 +6,207 @@ net.deanishe.alfred-fakeum connections + 03F09777-FA2A-45F3-A8A8-49AA079FFC61 + + + destinationuid + 439C72BE-4E5C-4E43-9A27-67278851C53B + modifiers + 0 + modifiersubtext + + vitoclose + + + + 08313AD4-F429-4763-9CBB-A964807C3DF8 + + + destinationuid + 6B240575-52BD-4397-9404-E14A5D663E41 + modifiers + 0 + modifiersubtext + + vitoclose + + + + 1663C906-4CD7-4A49-A885-76ABB8B44FA3 + + + destinationuid + 41689F12-93E0-4C28-996B-4E9753D67E71 + modifiers + 0 + modifiersubtext + + vitoclose + + + 305FB681-8DA9-4F6C-9C38-1B3880FDD6BF destinationuid - 4665F575-371B-44C6-BDA4-732AF54E382A + 4FA6CD79-202B-4F1B-9D2E-45133B1CBF62 modifiers - 1048576 + 0 modifiersubtext - Paste to frontmost application + + vitoclose + + + 4665F575-371B-44C6-BDA4-732AF54E382A + + + destinationuid + 439C72BE-4E5C-4E43-9A27-67278851C53B + modifiers + 0 + modifiersubtext + + vitoclose + + + + 4FA6CD79-202B-4F1B-9D2E-45133B1CBF62 + + + destinationuid + A02656B0-0D8B-4C2B-8C8C-325486F55C83 + modifiers + 0 + modifiersubtext + + vitoclose + + + + destinationuid + DB3E2362-A245-48F2-97EB-7438EE01A0BC + modifiers + 0 + modifiersubtext + + vitoclose + + + + 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 + + + destinationuid + 6753BE65-D846-4708-B37C-BF050DF5F151 + modifiers + 0 + modifiersubtext + + vitoclose + + + + destinationuid + 1663C906-4CD7-4A49-A885-76ABB8B44FA3 + modifiers + 0 + modifiersubtext + + vitoclose + + + + destinationuid + F01C9E5F-D701-41D1-8FC2-71EE6DD64371 + modifiers + 0 + modifiersubtext + + vitoclose + + + + 5BB103F1-C20A-4AEC-AB23-051F4AA6816E + + + destinationuid + 439C72BE-4E5C-4E43-9A27-67278851C53B + modifiers + 0 + modifiersubtext + + vitoclose + + + + 5D5BA360-FC2F-41E9-8F59-D110EEDCB173 + + + destinationuid + 83AA3EC6-EBFE-46C8-85C4-2E91D6871E8D + modifiers + 0 + modifiersubtext + + vitoclose + + + + 6753BE65-D846-4708-B37C-BF050DF5F151 + + + destinationuid + 5BB103F1-C20A-4AEC-AB23-051F4AA6816E + modifiers + 0 + modifiersubtext + + vitoclose + + + + 6B240575-52BD-4397-9404-E14A5D663E41 + + + destinationuid + BF97123F-C623-457B-B1E9-F417109255A7 + modifiers + 0 + modifiersubtext + + vitoclose + + + + 80140127-E88D-4ED2-B69F-2A6EA08F3407 + + + destinationuid + 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 + modifiers + 0 + modifiersubtext + + vitoclose + + + + 83AA3EC6-EBFE-46C8-85C4-2E91D6871E8D + + + destinationuid + 0668BE10-EC1F-4149-998D-8323D46BB16C + modifiers + 0 + modifiersubtext + + vitoclose + + + + A02656B0-0D8B-4C2B-8C8C-325486F55C83 + destinationuid 03F09777-FA2A-45F3-A8A8-49AA079FFC61 @@ -23,36 +214,63 @@ 0 modifiersubtext - - - destinationuid - 02889F0D-B10C-46F5-8F31-B7033B55CF01 - modifiers - 0 - modifiersubtext - + vitoclose + - 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 + ABCA2919-C9DA-4D16-9C99-15842934B872 destinationuid - 83025411-F0C4-44CC-8A83-F0711AC3B74D + 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 modifiers 0 modifiersubtext + vitoclose + - 83025411-F0C4-44CC-8A83-F0711AC3B74D + BF97123F-C623-457B-B1E9-F417109255A7 destinationuid - 5FB80B45-B960-401C-8E6D-F605734CF47A + 439C72BE-4E5C-4E43-9A27-67278851C53B modifiers 0 modifiersubtext + vitoclose + + + + DB3E2362-A245-48F2-97EB-7438EE01A0BC + + + destinationuid + 4665F575-371B-44C6-BDA4-732AF54E382A + modifiers + 0 + modifiersubtext + + vitoclose + + + + E4106CE4-7B7A-41AC-896D-40160A37952C + + + F01C9E5F-D701-41D1-8FC2-71EE6DD64371 + + + destinationuid + E4106CE4-7B7A-41AC-896D-40160A37952C + modifiers + 0 + modifiersubtext + + vitoclose + @@ -69,42 +287,18 @@ config - autopaste - - clipboardtext - {query} - - type - alfred.workflow.output.clipboard - uid - 4665F575-371B-44C6-BDA4-732AF54E382A - version - 0 - - - config - - autopaste + alfredfiltersresults - clipboardtext - {query} - - type - alfred.workflow.output.clipboard - uid - 03F09777-FA2A-45F3-A8A8-49AA079FFC61 - version - 0 - - - config - + alfredfiltersresultsmatchmode + 0 + argumenttrimmode + 0 argumenttype 1 escaping 102 keyword - fake + {var:keyword} queuedelaycustom 3 queuedelayimmediatelyinitially @@ -116,7 +310,11 @@ runningsubtext Faking up some stuff… script - /usr/bin/python fakeum.py "{query}" + /usr/bin/python fakeum.py "$1" + scriptargtype + 1 + scriptfile + subtext Fake data for testing title @@ -131,82 +329,169 @@ uid 305FB681-8DA9-4F6C-9C38-1B3880FDD6BF version - 0 + 2 config - lastpathcomponent + autopaste - onlyshowifquerypopulated - - output - 0 - removeextension - - sticky - - text + clipboardtext {query} - title - Copied to Clipboard + transient + type - alfred.workflow.output.notification + alfred.workflow.output.clipboard uid - 02889F0D-B10C-46F5-8F31-B7033B55CF01 + 03F09777-FA2A-45F3-A8A8-49AA079FFC61 version - 0 + 2 config + argument + . +/---- FAKE OUT ----\ +query={query} +vars={allvars} +\------------------/ + cleardebuggertext + + processoutputs + + + type + alfred.workflow.utility.debug + uid + 4FA6CD79-202B-4F1B-9D2E-45133B1CBF62 + version + 1 + + + config + + inputstring + {var:paste} + matchcasesensitive + + matchmode + 1 + matchstring + 1 + + type + alfred.workflow.utility.filter + uid + A02656B0-0D8B-4C2B-8C8C-325486F55C83 + version + 1 + + + config + + autopaste + + clipboardtext + {query} + transient + + + type + alfred.workflow.output.clipboard + uid + 4665F575-371B-44C6-BDA4-732AF54E382A + version + 2 + + + config + + inputstring + {var:paste} + matchcasesensitive + + matchmode + 0 + matchstring + 1 + + type + alfred.workflow.utility.filter + uid + DB3E2362-A245-48F2-97EB-7438EE01A0BC + version + 1 + + + config + + triggerid + locales + + type + alfred.workflow.trigger.external + uid + 08313AD4-F429-4763-9CBB-A964807C3DF8 + version + 1 + + + config + + concurrently + escaping 102 script - /usr/bin/python config.py --toggle "{query}" + /usr/bin/python config.py --toggle-locale "$1" + scriptargtype + 1 + scriptfile + type 0 type alfred.workflow.action.script uid - 83025411-F0C4-44CC-8A83-F0711AC3B74D + BF97123F-C623-457B-B1E9-F417109255A7 version - 0 + 2 config - lastpathcomponent + externaltriggerid + notify + passinputasargument - onlyshowifquerypopulated - - output - 0 - removeextension - - sticky - - title - {query} + passvariables + + workflowbundleid + self type - alfred.workflow.output.notification + alfred.workflow.output.callexternaltrigger uid - 5FB80B45-B960-401C-8E6D-F605734CF47A + 439C72BE-4E5C-4E43-9A27-67278851C53B version - 0 + 1 config + alfredfiltersresults + + alfredfiltersresultsmatchmode + 0 + argumenttrimmode + 0 argumenttype 1 escaping 102 - keyword - fakeconfig queuedelaycustom 3 queuedelayimmediatelyinitially @@ -216,66 +501,520 @@ queuemode 1 runningsubtext - Loading locales… + script - /usr/bin/python config.py "{query}" + /usr/bin/python config.py locales "$1" + scriptargtype + 1 + scriptfile + subtext - Turn locales on/off + title - Configure Fakum Locales + type 0 withspace + + + type + alfred.workflow.input.scriptfilter + uid + 6B240575-52BD-4397-9404-E14A5D663E41 + version + 2 + + + config + + concurrently + + escaping + 102 + script + /usr/bin/python config.py --toggle-notifications + scriptargtype + 1 + scriptfile + + type + 0 + + type + alfred.workflow.action.script + uid + 5BB103F1-C20A-4AEC-AB23-051F4AA6816E + version + 2 + + + config + + inputstring + {query} + matchcasesensitive + matchmode + 0 + matchstring + notifications + + type + alfred.workflow.utility.filter + uid + 6753BE65-D846-4708-B37C-BF050DF5F151 + version + 1 + + + config + + argumenttype + 2 + keyword + fakeconfig + subtext + Turn locales on/off + text + Fakeum Configuration + withspace + + + type + alfred.workflow.input.keyword + uid + ABCA2919-C9DA-4D16-9C99-15842934B872 + version + 1 + + + config + + alfredfiltersresults + + alfredfiltersresultsmatchmode + 0 + argumenttrimmode + 0 + argumenttype + 1 + escaping + 102 + queuedelaycustom + 3 + queuedelayimmediatelyinitially + + queuedelaymode + 0 + queuemode + 1 + runningsubtext + Loading settings… + script + /usr/bin/python config.py settings "$1" + scriptargtype + 1 + scriptfile + + subtext + + title + + type + 0 + withspace + type alfred.workflow.input.scriptfilter uid 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 version - 0 + 2 + + + config + + browser + + spaces + + url + {var:action} + utf8 + + + type + alfred.workflow.action.openurl + uid + 41689F12-93E0-4C28-996B-4E9753D67E71 + version + 1 + + + config + + inputstring + {query} + matchcasesensitive + + matchmode + 2 + matchstring + https?://.+ + + type + alfred.workflow.utility.filter + uid + 1663C906-4CD7-4A49-A885-76ABB8B44FA3 + version + 1 + + + config + + triggerid + config + + type + alfred.workflow.trigger.external + uid + 80140127-E88D-4ED2-B69F-2A6EA08F3407 + version + 1 + + + config + + externaltriggerid + locales + passinputasargument + + passvariables + + workflowbundleid + self + + type + alfred.workflow.output.callexternaltrigger + uid + E4106CE4-7B7A-41AC-896D-40160A37952C + version + 1 + + + config + + inputstring + {query} + matchcasesensitive + + matchmode + 0 + matchstring + locales + + type + alfred.workflow.utility.filter + uid + F01C9E5F-D701-41D1-8FC2-71EE6DD64371 + version + 1 + + + config + + lastpathcomponent + + onlyshowifquerypopulated + + removeextension + + text + {var:text} + title + {var:title} + + type + alfred.workflow.output.notification + uid + 0668BE10-EC1F-4149-998D-8323D46BB16C + version + 1 + + + config + + triggerid + notify + + type + alfred.workflow.trigger.external + uid + 5D5BA360-FC2F-41E9-8F59-D110EEDCB173 + version + 1 + + + config + + inputstring + {var:SHOW_NOTIFICATIONS} + matchcasesensitive + + matchmode + 0 + matchstring + 1 + + type + alfred.workflow.utility.filter + uid + 83AA3EC6-EBFE-46C8-85C4-2E91D6871E8D + version + 1 readme uidata - 02889F0D-B10C-46F5-8F31-B7033B55CF01 - - ypos - 250 - 03F09777-FA2A-45F3-A8A8-49AA079FFC61 + colorindex + 9 + xpos + 550 ypos - 130 + 40 + + 0668BE10-EC1F-4149-998D-8323D46BB16C + + colorindex + 12 + xpos + 390 + ypos + 1020 + + 08313AD4-F429-4763-9CBB-A964807C3DF8 + + colorindex + 4 + note + Filter and turn locales on/off + xpos + 40 + ypos + 330 + + 1663C906-4CD7-4A49-A885-76ABB8B44FA3 + + colorindex + 2 + note + {query} is URL + xpos + 430 + ypos + 720 305FB681-8DA9-4F6C-9C38-1B3880FDD6BF + colorindex + 9 + note + Generate fake data + xpos + 40 ypos - 130 + 40 + + 41689F12-93E0-4C28-996B-4E9753D67E71 + + colorindex + 2 + xpos + 550 + ypos + 690 + + 439C72BE-4E5C-4E43-9A27-67278851C53B + + colorindex + 12 + xpos + 840 + ypos + 330 4665F575-371B-44C6-BDA4-732AF54E382A + colorindex + 9 + xpos + 550 ypos - 10 + 180 + + 4FA6CD79-202B-4F1B-9D2E-45133B1CBF62 + + colorindex + 9 + xpos + 260 + ypos + 70 53CFB8D5-1D80-415A-8340-D1FDCBFCCD36 + colorindex + 7 + note + Show settings + xpos + 220 ypos - 370 + 690 - 5FB80B45-B960-401C-8E6D-F605734CF47A + 5BB103F1-C20A-4AEC-AB23-051F4AA6816E + colorindex + 1 + note + Toggle notifications on/off + xpos + 550 ypos - 370 + 500 - 83025411-F0C4-44CC-8A83-F0711AC3B74D + 5D5BA360-FC2F-41E9-8F59-D110EEDCB173 + colorindex + 12 + note + Show a notification + xpos + 40 ypos - 370 + 1020 + + 6753BE65-D846-4708-B37C-BF050DF5F151 + + colorindex + 1 + note + {query} == notifications + xpos + 430 + ypos + 530 + + 6B240575-52BD-4397-9404-E14A5D663E41 + + colorindex + 4 + note + Filter and turn locales on/off + xpos + 220 + ypos + 330 + + 80140127-E88D-4ED2-B69F-2A6EA08F3407 + + colorindex + 7 + xpos + 40 + ypos + 770 + + 83AA3EC6-EBFE-46C8-85C4-2E91D6871E8D + + colorindex + 12 + note + SHOW_NOTIFICATIONS == 1 + xpos + 260 + ypos + 1050 + + A02656B0-0D8B-4C2B-8C8C-325486F55C83 + + colorindex + 9 + note + paste != 1 + xpos + 430 + ypos + 70 + + ABCA2919-C9DA-4D16-9C99-15842934B872 + + colorindex + 7 + xpos + 40 + ypos + 620 + + BF97123F-C623-457B-B1E9-F417109255A7 + + colorindex + 4 + note + Toggle locale on/off + xpos + 390 + ypos + 330 + + DB3E2362-A245-48F2-97EB-7438EE01A0BC + + colorindex + 9 + note + paste == 1 + xpos + 430 + ypos + 210 + + E4106CE4-7B7A-41AC-896D-40160A37952C + + colorindex + 4 + xpos + 550 + ypos + 850 + + F01C9E5F-D701-41D1-8FC2-71EE6DD64371 + + colorindex + 4 + note + {query} == locales + xpos + 430 + ypos + 880 + variables + + LIPSUM_SENTENCES + 3 + SHOW_NOTIFICATIONS + 1 + keyword + fake + + version + 2.0 webaddress diff --git a/src/libs/dateutil/__init__.py b/src/libs/dateutil/__init__.py new file mode 100644 index 0000000..796ef3d --- /dev/null +++ b/src/libs/dateutil/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from ._version import VERSION as __version__ diff --git a/src/libs/dateutil/_common.py b/src/libs/dateutil/_common.py new file mode 100644 index 0000000..e8b4af7 --- /dev/null +++ b/src/libs/dateutil/_common.py @@ -0,0 +1,34 @@ +""" +Common code used in multiple modules. +""" + + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + __hash__ = None + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) diff --git a/src/libs/dateutil/_version.py b/src/libs/dateutil/_version.py new file mode 100644 index 0000000..c1a0357 --- /dev/null +++ b/src/libs/dateutil/_version.py @@ -0,0 +1,10 @@ +""" +Contains information about the dateutil version. +""" + +VERSION_MAJOR = 2 +VERSION_MINOR = 6 +VERSION_PATCH = 1 + +VERSION_TUPLE = (VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH) +VERSION = '.'.join(map(str, VERSION_TUPLE)) diff --git a/src/libs/dateutil/easter.py b/src/libs/dateutil/easter.py new file mode 100644 index 0000000..e4def97 --- /dev/null +++ b/src/libs/dateutil/easter.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic easter computing method for any given year, using +Western, Orthodox or Julian algorithms. +""" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different easter + calculation methods: + + 1 - Original calculation in Julian calendar, valid in + dates after 326 AD + 2 - Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3 - Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + * ``EASTER_JULIAN = 1`` + * ``EASTER_ORTHODOX = 2`` + * ``EASTER_WESTERN = 3`` + + The default method is method 3. + + More about the algorithm may be found at: + + http://users.chariot.net.au/~gmarts/eastalg.htm + + and + + http://www.tondering.dk/claus/calendar.html + + """ + + if not (1 <= method <= 3): + raise ValueError("invalid method") + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g + 15) % 30 + j = (y + y//4 + i) % 7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e + y//100 - 16 - (y//100 - 16)//4 + else: + # New method + c = y//100 + h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 + i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) + j = (y + y//4 + i + 2 - c + c//4) % 7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i - j + e + d = 1 + (p + 27 + (p + 6)//40) % 31 + m = 3 + (p + 26)//30 + return datetime.date(int(y), int(m), int(d)) diff --git a/src/libs/dateutil/parser.py b/src/libs/dateutil/parser.py new file mode 100644 index 0000000..595331f --- /dev/null +++ b/src/libs/dateutil/parser.py @@ -0,0 +1,1374 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic date/time string parser which is able to parse +most known formats to represent a date and/or time. + +This module attempts to be forgiving with regards to unlikely input formats, +returning a datetime object even for dates which are ambiguous. If an element +of a date/time stamp is omitted, the following rules are applied: +- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour + on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is + specified. +- If a time zone is omitted, a timezone-naive datetime is returned. + +If any other elements are missing, they are taken from the +:class:`datetime.datetime` object passed to the parameter ``default``. If this +results in a day number exceeding the valid number of days per month, the +value falls back to the end of the month. + +Additional resources about date/time string formats can be found below: + +- `A summary of the international standard date and time notation + `_ +- `W3C Date and Time Formats `_ +- `Time Formats (Planetary Rings Node) `_ +- `CPAN ParseDate module + `_ +- `Java SimpleDateFormat Class + `_ +""" +from __future__ import unicode_literals + +import datetime +import string +import time +import collections +import re +from io import StringIO +from calendar import monthrange + +from six import text_type, binary_type, integer_types + +from . import relativedelta +from . import tz + +__all__ = ["parse", "parserinfo"] + + +class _timelex(object): + # Fractional seconds are sometimes split by a comma + _split_decimal = re.compile("([.,])") + + def __init__(self, instream): + if isinstance(instream, binary_type): + instream = instream.decode() + + if isinstance(instream, text_type): + instream = StringIO(instream) + + if getattr(instream, 'read', None) is None: + raise TypeError('Parser must be a string or character stream, not ' + '{itype}'.format(itype=instream.__class__.__name__)) + + self.instream = instream + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + """ + This function breaks the time string into lexical units (tokens), which + can be parsed by the parser. Lexical units are demarcated by changes in + the character set, so any continuous string of letters is considered + one unit, any continuous string of numbers is considered one unit. + + The main complication arises from the fact that dots ('.') can be used + both as separators (e.g. "Sep.20.2009") or decimal points (e.g. + "4:30:21.447"). As such, it is necessary to read the full context of + any dot-separated strings before breaking it into tokens; as such, this + function maintains a "token stack", for when the ambiguous context + demands that multiple tokens be parsed at once. + """ + if self.tokenstack: + return self.tokenstack.pop(0) + + seenletters = False + token = None + state = None + + while not self.eof: + # We only realize that we've reached the end of a token when we + # find a character that's not part of the current token - since + # that character may be part of the next token, it's stored in the + # charstack. + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + + if not nextchar: + self.eof = True + break + elif not state: + # First character of the token - determines if we're starting + # to parse a word, a number or something else. + token = nextchar + if self.isword(nextchar): + state = 'a' + elif self.isnum(nextchar): + state = '0' + elif self.isspace(nextchar): + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + # If we've already started reading a word, we keep reading + # letters until we find something that's not part of a word. + seenletters = True + if self.isword(nextchar): + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + # If we've already started reading a number, we keep reading + # numbers until we find something that doesn't fit. + if self.isnum(nextchar): + token += nextchar + elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + # If we've seen some letters and a dot separator, continue + # parsing, and the tokens will be broken up later. + seenletters = True + if nextchar == '.' or self.isword(nextchar): + token += nextchar + elif self.isnum(nextchar) and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + # If we've seen at least one dot separator, keep going, we'll + # break up the tokens later. + if nextchar == '.' or self.isnum(nextchar): + token += nextchar + elif self.isword(nextchar) and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + + if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or + token[-1] in '.,')): + l = self._split_decimal.split(token) + token = l[0] + for tok in l[1:]: + if tok: + self.tokenstack.append(tok) + + if state == '0.' and token.count('.') == 0: + token = token.replace(',', '.') + + return token + + def __iter__(self): + return self + + def __next__(self): + token = self.get_token() + if token is None: + raise StopIteration + + return token + + def next(self): + return self.__next__() # Python 2.x support + + @classmethod + def split(cls, s): + return list(cls(s)) + + @classmethod + def isword(cls, nextchar): + """ Whether or not the next character is part of a word """ + return nextchar.isalpha() + + @classmethod + def isnum(cls, nextchar): + """ Whether the next character is part of a number """ + return nextchar.isdigit() + + @classmethod + def isspace(cls, nextchar): + """ Whether the next character is whitespace """ + return nextchar.isspace() + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (classname, ", ".join(l)) + + def __len__(self): + return (sum(getattr(self, attr) is not None + for attr in self.__slots__)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + """ + Class which handles what inputs are accepted. Subclass this to customize + the language and acceptable values for each parameter. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. Default is ``False``. + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + Default is ``False``. + """ + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), + ("Wed", "Wednesday"), + ("Thu", "Thursday"), + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "Sept", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z"] + PERTAIN = ["of"] + TZOFFSET = {} + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year // 100 * 100 + + def _convert(self, lst): + dct = {} + for i, v in enumerate(lst): + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + if len(name) >= min(len(n) for n in self._weekdays.keys()): + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + if len(name) >= min(len(n) for n in self._months.keys()): + try: + return self._months[name.lower()] + 1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + + return self.TZOFFSET.get(name) + + def convertyear(self, year, century_specified=False): + if year < 100 and not century_specified: + year += self._century + if abs(year - self._year) >= 50: + if year < self._year: + year += 100 + else: + year -= 100 + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year, res.century_specified) + + if res.tzoffset == 0 and not res.tzname or res.tzname == 'Z': + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class _ymd(list): + def __init__(self, tzstr, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + self.century_specified = False + self.tzstr = tzstr + + @staticmethod + def token_could_be_year(token, year): + try: + return int(token) == year + except ValueError: + return False + + @staticmethod + def find_potential_year_tokens(year, tokens): + return [token for token in tokens if _ymd.token_could_be_year(token, year)] + + def find_probable_year_index(self, tokens): + """ + attempt to deduce if a pre 100 year was lost + due to padded zeros being taken off + """ + for index, token in enumerate(self): + potential_year_tokens = _ymd.find_potential_year_tokens(token, tokens) + if len(potential_year_tokens) == 1 and len(potential_year_tokens[0]) > 2: + return index + + def append(self, val): + if hasattr(val, '__len__'): + if val.isdigit() and len(val) > 2: + self.century_specified = True + elif val > 100: + self.century_specified = True + + super(self.__class__, self).append(int(val)) + + def resolve_ymd(self, mstridx, yearfirst, dayfirst): + len_ymd = len(self) + year, month, day = (None, None, None) + + if len_ymd > 3: + raise ValueError("More than three YMD values") + elif len_ymd == 1 or (mstridx != -1 and len_ymd == 2): + # One member, or two members with a month string + if mstridx != -1: + month = self[mstridx] + del self[mstridx] + + if len_ymd > 1 or mstridx == -1: + if self[0] > 31: + year = self[0] + else: + day = self[0] + + elif len_ymd == 2: + # Two members with numbers + if self[0] > 31: + # 99-01 + year, month = self + elif self[1] > 31: + # 01-99 + month, year = self + elif dayfirst and self[1] <= 12: + # 13-01 + day, month = self + else: + # 01-13 + month, day = self + + elif len_ymd == 3: + # Three members + if mstridx == 0: + month, day, year = self + elif mstridx == 1: + if self[0] > 31 or (yearfirst and self[2] <= 31): + # 99-Jan-01 + year, month, day = self + else: + # 01-Jan-01 + # Give precendence to day-first, since + # two-digit years is usually hand-written. + day, month, year = self + + elif mstridx == 2: + # WTF!? + if self[1] > 31: + # 01-99-Jan + day, year, month = self + else: + # 99-01-Jan + year, day, month = self + + else: + if self[0] > 31 or \ + self.find_probable_year_index(_timelex.split(self.tzstr)) == 0 or \ + (yearfirst and self[1] <= 12 and self[2] <= 31): + # 99-01-01 + if dayfirst and self[2] <= 12: + year, day, month = self + else: + year, month, day = self + elif self[0] > 12 or (dayfirst and self[1] <= 12): + # 13-01-01 + day, month, year = self + else: + # 01-13-01 + month, day, year = self + + return year, month, day + + +class parser(object): + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, ignoretz=False, tzinfos=None, **kwargs): + """ + Parse the date/time string into a :class:`datetime.datetime` object. + + :param timestr: + Any date/time string using the supported formats. + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a + naive :class:`datetime.datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in minutes or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -10800, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -10800)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param **kwargs: + Keyword arguments as passed to ``_parse()``. + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ValueError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises TypeError: + Raised for non-string or character stream input. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + + if default is None: + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + + res, skipped_tokens = self._parse(timestr, **kwargs) + + if res is None: + raise ValueError("Unknown string format") + + if len(res) == 0: + raise ValueError("String does not contain a date.") + + repl = {} + for attr in ("year", "month", "day", "hour", + "minute", "second", "microsecond"): + value = getattr(res, attr) + if value is not None: + repl[attr] = value + + if 'day' not in repl: + # If the default day exceeds the last day of the month, fall back to + # the end of the month. + cyear = default.year if res.year is None else res.year + cmonth = default.month if res.month is None else res.month + cday = default.day if res.day is None else res.day + + if cday > monthrange(cyear, cmonth)[1]: + repl['day'] = monthrange(cyear, cmonth)[1] + + ret = default.replace(**repl) + + if res.weekday is not None and not res.day: + ret = ret+relativedelta.relativedelta(weekday=res.weekday) + + if not ignoretz: + if (isinstance(tzinfos, collections.Callable) or + tzinfos and res.tzname in tzinfos): + + if isinstance(tzinfos, collections.Callable): + tzdata = tzinfos(res.tzname, res.tzoffset) + else: + tzdata = tzinfos.get(res.tzname) + + if isinstance(tzdata, datetime.tzinfo): + tzinfo = tzdata + elif isinstance(tzdata, text_type): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, integer_types): + tzinfo = tz.tzoffset(res.tzname, tzdata) + else: + raise ValueError("Offset must be tzinfo subclass, " + "tz string, or int offset.") + ret = ret.replace(tzinfo=tzinfo) + elif res.tzname and res.tzname in time.tzname: + ret = ret.replace(tzinfo=tz.tzlocal()) + elif res.tzoffset == 0: + ret = ret.replace(tzinfo=tz.tzutc()) + elif res.tzoffset: + ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + + if kwargs.get('fuzzy_with_tokens', False): + return ret, skipped_tokens + else: + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset", "ampm"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, + fuzzy_with_tokens=False): + """ + Private method which performs the heavy lifting of parsing, called from + ``parse()``, which passes on its ``kwargs`` to this function. + + :param timestr: + The string to parse. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. If set to ``None``, this value is retrieved from the + current :class:`parserinfo` object (which itself defaults to + ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + If this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + """ + if fuzzy_with_tokens: + fuzzy = True + + info = self.info + + if dayfirst is None: + dayfirst = info.dayfirst + + if yearfirst is None: + yearfirst = info.yearfirst + + res = self._result() + l = _timelex.split(timestr) # Splits the timestr into tokens + + # keep up with the last token skipped so we can recombine + # consecutively skipped tokens (-2 for when i begins at 0). + last_skipped_token_i = -2 + skipped_tokens = list() + + try: + # year/month/day list + ymd = _ymd(timestr) + + # Index of the month string in ymd + mstridx = -1 + + len_l = len(l) + i = 0 + while i < len_l: + + # Check if it's a number + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Token is a number + len_li = len(l[i]) + i += 1 + + if (len(ymd) == 3 and len_li in (2, 4) + and res.hour is None and (i >= len_l or (l[i] != ':' and + info.hms(l[i]) is None))): + # 19990101T23[59] + s = l[i-1] + res.hour = int(s[:2]) + + if len_li == 4: + res.minute = int(s[2:]) + + elif len_li == 6 or (len_li > 6 and l[i-1].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = l[i-1] + + if not ymd and l[i-1].find('.') == -1: + #ymd.append(info.convertyear(int(s[:2]))) + + ymd.append(s[:2]) + ymd.append(s[2:4]) + ymd.append(s[4:]) + else: + # 19990101T235959[.59] + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = _parsems(s[4:]) + + elif len_li in (8, 12, 14): + # YYYYMMDD + s = l[i-1] + ymd.append(s[:4]) + ymd.append(s[4:6]) + ymd.append(s[6:8]) + + if len_li > 8: + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + + if len_li > 12: + res.second = int(s[12:]) + + elif ((i < len_l and info.hms(l[i]) is not None) or + (i+1 < len_l and l[i] == ' ' and + info.hms(l[i+1]) is not None)): + + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + if l[i] == ' ': + i += 1 + + idx = info.hms(l[i]) + + while True: + if idx == 0: + res.hour = int(value) + + if value % 1: + res.minute = int(60*(value % 1)) + + elif idx == 1: + res.minute = int(value) + + if value % 1: + res.second = int(60*(value % 1)) + + elif idx == 2: + res.second, res.microsecond = \ + _parsems(value_repr) + + i += 1 + + if i >= len_l or idx == 2: + break + + # 12h00 + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + break + else: + i += 1 + idx += 1 + + if i < len_l: + newidx = info.hms(l[i]) + + if newidx is not None: + idx = newidx + + elif (i == len_l and l[i-2] == ' ' and + info.hms(l[i-3]) is not None): + # X h MM or X m SS + idx = info.hms(l[i-3]) + + if idx == 0: # h + res.minute = int(value) + + sec_remainder = value % 1 + if sec_remainder: + res.second = int(60 * sec_remainder) + elif idx == 1: # m + res.second, res.microsecond = \ + _parsems(value_repr) + + # We don't need to advance the tokens here because the + # i == len_l call indicates that we're looking at all + # the tokens already. + + elif i+1 < len_l and l[i] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + i += 1 + value = float(l[i]) + res.minute = int(value) + + if value % 1: + res.second = int(60*(value % 1)) + + i += 1 + + if i < len_l and l[i] == ':': + res.second, res.microsecond = _parsems(l[i+1]) + i += 2 + + elif i < len_l and l[i] in ('-', '/', '.'): + sep = l[i] + ymd.append(value_repr) + i += 1 + + if i < len_l and not info.jump(l[i]): + try: + # 01-01[-01] + ymd.append(l[i]) + except ValueError: + # 01-Jan[-01] + value = info.month(l[i]) + + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + else: + return None, None + + i += 1 + + if i < len_l and l[i] == sep: + # We have three members + i += 1 + value = info.month(l[i]) + + if value is not None: + ymd.append(value) + mstridx = len(ymd)-1 + assert mstridx == -1 + else: + ymd.append(l[i]) + + i += 1 + elif i >= len_l or info.jump(l[i]): + if i+1 < len_l and info.ampm(l[i+1]) is not None: + # 12 am + res.hour = int(value) + + if res.hour < 12 and info.ampm(l[i+1]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i+1]) == 0: + res.hour = 0 + + i += 1 + else: + # Year, month or day + ymd.append(value) + i += 1 + elif info.ampm(l[i]) is not None: + + # 12am + res.hour = int(value) + + if res.hour < 12 and info.ampm(l[i]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i]) == 0: + res.hour = 0 + i += 1 + + elif not fuzzy: + return None, None + else: + i += 1 + continue + + # Check weekday + value = info.weekday(l[i]) + if value is not None: + res.weekday = value + i += 1 + continue + + # Check month name + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + + i += 1 + if i < len_l: + if l[i] in ('-', '/'): + # Jan-01[-99] + sep = l[i] + i += 1 + ymd.append(l[i]) + i += 1 + + if i < len_l and l[i] == sep: + # Jan-01-99 + i += 1 + ymd.append(l[i]) + i += 1 + + elif (i+3 < len_l and l[i] == l[i+2] == ' ' + and info.pertain(l[i+1])): + # Jan of 01 + # In this case, 01 is clearly year + try: + value = int(l[i+3]) + except ValueError: + # Wrong guess + pass + else: + # Convert it here to become unambiguous + ymd.append(str(info.convertyear(value))) + i += 4 + continue + + # Check am/pm + value = info.ampm(l[i]) + if value is not None: + # For fuzzy parsing, 'a' or 'am' (both valid English words) + # may erroneously trigger the AM/PM flag. Deal with that + # here. + val_is_ampm = True + + # If there's already an AM/PM flag, this one isn't one. + if fuzzy and res.ampm is not None: + val_is_ampm = False + + # If AM/PM is found and hour is not, raise a ValueError + if res.hour is None: + if fuzzy: + val_is_ampm = False + else: + raise ValueError('No hour specified with ' + + 'AM or PM flag.') + elif not 0 <= res.hour <= 12: + # If AM/PM is found, it's a 12 hour clock, so raise + # an error for invalid range + if fuzzy: + val_is_ampm = False + else: + raise ValueError('Invalid hour specified for ' + + '12-hour clock.') + + if val_is_ampm: + if value == 1 and res.hour < 12: + res.hour += 12 + elif value == 0 and res.hour == 12: + res.hour = 0 + + res.ampm = value + + elif fuzzy: + last_skipped_token_i = self._skip_token(skipped_tokens, + last_skipped_token_i, i, l) + i += 1 + continue + + # Check for a timezone name + if (res.hour is not None and len(l[i]) <= 5 and + res.tzname is None and res.tzoffset is None and + not [x for x in l[i] if x not in + string.ascii_uppercase]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + i += 1 + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i < len_l and l[i] in ('+', '-'): + l[i] = ('+', '-')[l[i] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + continue + + # Check for a numbered timezone + if res.hour is not None and l[i] in ('+', '-'): + signal = (-1, 1)[l[i] == '+'] + i += 1 + len_li = len(l[i]) + + if len_li == 4: + # -0300 + res.tzoffset = int(l[i][:2])*3600+int(l[i][2:])*60 + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + res.tzoffset = int(l[i])*3600+int(l[i+2])*60 + i += 2 + elif len_li <= 2: + # -[0]3 + res.tzoffset = int(l[i][:2])*3600 + else: + return None, None + i += 1 + + res.tzoffset *= signal + + # Look for a timezone name between parenthesis + if (i+3 < len_l and + info.jump(l[i]) and l[i+1] == '(' and l[i+3] == ')' and + 3 <= len(l[i+2]) <= 5 and + not [x for x in l[i+2] + if x not in string.ascii_uppercase]): + # -0300 (BRST) + res.tzname = l[i+2] + i += 4 + continue + + # Check jumps + if not (info.jump(l[i]) or fuzzy): + return None, None + + last_skipped_token_i = self._skip_token(skipped_tokens, + last_skipped_token_i, i, l) + i += 1 + + # Process year/month/day + year, month, day = ymd.resolve_ymd(mstridx, yearfirst, dayfirst) + if year is not None: + res.year = year + res.century_specified = ymd.century_specified + + if month is not None: + res.month = month + + if day is not None: + res.day = day + + except (IndexError, ValueError, AssertionError): + return None, None + + if not info.validate(res): + return None, None + + if fuzzy_with_tokens: + return res, tuple(skipped_tokens) + else: + return res, None + + @staticmethod + def _skip_token(skipped_tokens, last_skipped_token_i, i, l): + if last_skipped_token_i == i - 1: + # recombine the tokens + skipped_tokens[-1] += l[i] + else: + # just append + skipped_tokens.append(l[i]) + last_skipped_token_i = i + return last_skipped_token_i + + +DEFAULTPARSER = parser() + + +def parse(timestr, parserinfo=None, **kwargs): + """ + + Parse a string in one of the supported formats, using the + ``parserinfo`` parameters. + + :param timestr: + A string containing a date/time stamp. + + :param parserinfo: + A :class:`parserinfo` object containing parameters for the parser. + If ``None``, the default arguments to the :class:`parserinfo` + constructor are used. + + The ``**kwargs`` parameter takes the following keyword arguments: + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in minutes or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -10800, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -10800)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM and + YMD. If set to ``None``, this value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken to + be the year, otherwise the last number is taken to be the year. If + this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ValueError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = _timelex.split(tzstr) + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + i = j + if (i < len_l and (l[i] in ('+', '-') or l[i][0] in + "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1, -1)[l[i] == '+'] + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, (int(l[i][:2])*3600 + + int(l[i][2:])*60)*signal) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i])*3600+int(l[i+2])*60)*signal) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2])*3600*signal) + else: + return None + i += 1 + if res.dstabbr: + break + else: + break + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': + l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + i += 2 + if l[i] == '-': + value = int(l[i+1])*-1 + i += 1 + else: + value = int(l[i]) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i])-1) % 7 + else: + x.day = int(l[i]) + i += 2 + x.time = int(l[i]) + i += 2 + if i < len_l: + if l[i] in ('-', '+'): + signal = (-1, 1)[l[i] == "+"] + i += 1 + else: + signal = 1 + res.dstoffset = (res.stdoffset+int(l[i]))*signal + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',', '/', 'J', 'M', + '.', '-', ':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + i += 1 + x.month = int(l[i]) + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.weekday = (int(l[i])-1) % 7 + else: + # year day (zero based) + x.yday = int(l[i])+1 + + i += 1 + + if i < len_l and l[i] == '/': + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2])*3600+int(l[i][2:])*60) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + x.time = int(l[i])*3600+int(l[i+2])*60 + i += 2 + if i+1 < len_l and l[i+1] == ':': + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2])*3600) + else: + return None + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + return res + + +DEFAULTTZPARSER = _tzparser() + + +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +def _parsems(value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + +# vim:ts=4:sw=4:et diff --git a/src/libs/dateutil/relativedelta.py b/src/libs/dateutil/relativedelta.py new file mode 100644 index 0000000..0e66afc --- /dev/null +++ b/src/libs/dateutil/relativedelta.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- +import datetime +import calendar + +import operator +from math import copysign + +from six import integer_types +from warnings import warn + +from ._common import weekday + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + + +class relativedelta(object): + """ + The relativedelta type is based on the specification of the excellent + work done by M.-A. Lemburg in his + `mx.DateTime `_ extension. + However, notice that this type does *NOT* implement the same algorithm as + his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + + There are two different ways to build a relativedelta instance. The + first one is passing it two date/datetime classes:: + + relativedelta(datetime1, datetime2) + + The second one is passing it any number of the following keyword arguments:: + + relativedelta(arg1=x,arg2=y,arg3=z...) + + year, month, day, hour, minute, second, microsecond: + Absolute information (argument is singular); adding or subtracting a + relativedelta with absolute information does not perform an aritmetic + operation, but rather REPLACES the corresponding value in the + original datetime with the value(s) in relativedelta. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative (argument is plural); adding + or subtracting a relativedelta with relative information performs + the corresponding aritmetic operation on the original datetime value + with the information in the relativedelta. + + weekday: + One of the weekday instances (MO, TU, etc). These instances may + receive a parameter N, specifying the Nth weekday, which could + be positive or negative (like MO(+1) or MO(-2). Not specifying + it is the same as specifying +1. You can also use an integer, + where 0=MO. + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + + Here is the behavior of operations with relativedelta: + + 1. Calculate the absolute year, using the 'year' argument, or the + original datetime year, if the argument is not present. + + 2. Add the relative 'years' argument to the absolute year. + + 3. Do steps 1 and 2 for month/months. + + 4. Calculate the absolute day, using the 'day' argument, or the + original datetime day, if the argument is not present. Then, + subtract from the day until it fits in the year and month + found after their operations. + + 5. Add the relative 'days' argument to the absolute day. Notice + that the 'weeks' argument is multiplied by 7 and added to + 'days'. + + 6. Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, + microsecond/microseconds. + + 7. If the 'weekday' argument is present, calculate the weekday, + with the given (wday, nth) tuple. wday is the index of the + weekday (0-6, 0=Mon), and nth is the number of weeks to add + forward or backward, depending on its signal. Notice that if + the calculated date is already Monday, for example, using + (0, 1) or (0, -1) won't change the day. + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + + # Check for non-integer values in integer-only quantities + if any(x is not None and x != int(x) for x in (years, months)): + raise ValueError("Non-integer years and months are " + "ambiguous and not currently supported.") + + if dt1 and dt2: + # datetime is a subclass of date. So both must be date + if not (isinstance(dt1, datetime.date) and + isinstance(dt2, datetime.date)): + raise TypeError("relativedelta only diffs datetime/date") + + # We allow two dates, or two datetimes, so we coerce them to be + # of the same type + if (isinstance(dt1, datetime.datetime) != + isinstance(dt2, datetime.datetime)): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + # Get year / month delta between the two + months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) + self._set_months(months) + + # Remove the year/month delta so the timedelta is just well-defined + # time units (seconds, days and microseconds) + dtm = self.__radd__(dt2) + + # If we've overshot our target, make an adjustment + if dt1 < dt2: + compare = operator.gt + increment = 1 + else: + compare = operator.lt + increment = -1 + + while compare(dt1, dtm): + months += increment + self._set_months(months) + dtm = self.__radd__(dt2) + + # Get the timedelta between the "months-adjusted" date and dt1 + delta = dt1 - dtm + self.seconds = delta.seconds + delta.days * 86400 + self.microseconds = delta.microseconds + else: + # Relative information + self.years = years + self.months = months + self.days = days + weeks * 7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + + # Absolute information + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if any(x is not None and int(x) != x + for x in (year, month, day, hour, + minute, second, microsecond)): + # For now we'll deprecate floats - later it'll be an error. + warn("Non-integer value passed as absolute information. " + + "This is not a well-defined condition and will raise " + + "errors in future versions.", DeprecationWarning) + + if isinstance(weekday, integer_types): + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31, 59, 90, 120, 151, 181, 212, + 243, 273, 304, 334, 366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = yday + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError("invalid year day (%d)" % yday) + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = _sign(self.microseconds) + div, mod = divmod(self.microseconds * s, 1000000) + self.microseconds = mod * s + self.seconds += div * s + if abs(self.seconds) > 59: + s = _sign(self.seconds) + div, mod = divmod(self.seconds * s, 60) + self.seconds = mod * s + self.minutes += div * s + if abs(self.minutes) > 59: + s = _sign(self.minutes) + div, mod = divmod(self.minutes * s, 60) + self.minutes = mod * s + self.hours += div * s + if abs(self.hours) > 23: + s = _sign(self.hours) + div, mod = divmod(self.hours * s, 24) + self.hours = mod * s + self.days += div * s + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years += div * s + if (self.hours or self.minutes or self.seconds or self.microseconds + or self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + @property + def weeks(self): + return self.days // 7 + + @weeks.setter + def weeks(self, value): + self.days = self.days - (self.weeks * 7) + value * 7 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years = div * s + else: + self.years = 0 + + def normalized(self): + """ + Return a version of this object represented entirely using integer + values for the relative attributes. + + >>> relativedelta(days=1.5, hours=2).normalized() + relativedelta(days=1, hours=14) + + :return: + Returns a :class:`dateutil.relativedelta.relativedelta` object. + """ + # Cascade remainders down (rounding each to roughly nearest microsecond) + days = int(self.days) + + hours_f = round(self.hours + 24 * (self.days - days), 11) + hours = int(hours_f) + + minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) + minutes = int(minutes_f) + + seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) + seconds = int(seconds_f) + + microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) + + # Constructor carries overflow back up with call to _fix() + return self.__class__(years=self.years, months=self.months, + days=days, hours=hours, minutes=minutes, + seconds=seconds, microseconds=microseconds, + leapdays=self.leapdays, year=self.year, + month=self.month, day=self.day, + weekday=self.weekday, hour=self.hour, + minute=self.minute, second=self.second, + microsecond=self.microsecond) + + def __add__(self, other): + if isinstance(other, relativedelta): + return self.__class__(years=other.years + self.years, + months=other.months + self.months, + days=other.days + self.days, + hours=other.hours + self.hours, + minutes=other.minutes + self.minutes, + seconds=other.seconds + self.seconds, + microseconds=(other.microseconds + + self.microseconds), + leapdays=other.leapdays or self.leapdays, + year=(other.year if other.year is not None + else self.year), + month=(other.month if other.month is not None + else self.month), + day=(other.day if other.day is not None + else self.day), + weekday=(other.weekday if other.weekday is not None + else self.weekday), + hour=(other.hour if other.hour is not None + else self.hour), + minute=(other.minute if other.minute is not None + else self.minute), + second=(other.second if other.second is not None + else self.second), + microsecond=(other.microsecond if other.microsecond + is not None else + self.microsecond)) + if isinstance(other, datetime.timedelta): + return self.__class__(years=self.years, + months=self.months, + days=self.days + other.days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds + other.seconds, + microseconds=self.microseconds + other.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + if not isinstance(other, datetime.date): + return NotImplemented + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth) - 1) * 7 + if nth > 0: + jumpdays += (7 - ret.weekday() + weekday) % 7 + else: + jumpdays += (ret.weekday() - weekday) % 7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __radd__(self, other): + return self.__add__(other) + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented # In case the other object defines __rsub__ + return self.__class__(years=self.years - other.years, + months=self.months - other.months, + days=self.days - other.days, + hours=self.hours - other.hours, + minutes=self.minutes - other.minutes, + seconds=self.seconds - other.seconds, + microseconds=self.microseconds - other.microseconds, + leapdays=self.leapdays or other.leapdays, + year=(self.year if self.year is not None + else other.year), + month=(self.month if self.month is not None else + other.month), + day=(self.day if self.day is not None else + other.day), + weekday=(self.weekday if self.weekday is not None else + other.weekday), + hour=(self.hour if self.hour is not None else + other.hour), + minute=(self.minute if self.minute is not None else + other.minute), + second=(self.second if self.second is not None else + other.second), + microsecond=(self.microsecond if self.microsecond + is not None else + other.microsecond)) + + def __neg__(self): + return self.__class__(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __bool__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + # Compatibility with Python 2.x + __nonzero__ = __bool__ + + def __mul__(self, other): + try: + f = float(other) + except TypeError: + return NotImplemented + + return self.__class__(years=int(self.years * f), + months=int(self.months * f), + days=int(self.days * f), + hours=int(self.hours * f), + minutes=int(self.minutes * f), + seconds=int(self.seconds * f), + microseconds=int(self.microseconds * f), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + __rmul__ = __mul__ + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.microseconds == other.microseconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + __hash__ = None + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + try: + reciprocal = 1 / float(other) + except TypeError: + return NotImplemented + + return self.__mul__(reciprocal) + + __truediv__ = __div__ + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("{attr}={value:+g}".format(attr=attr, value=value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("{attr}={value}".format(attr=attr, value=repr(value))) + return "{classname}({attrs})".format(classname=self.__class__.__name__, + attrs=", ".join(l)) + + +def _sign(x): + return int(copysign(1, x)) + +# vim:ts=4:sw=4:et diff --git a/src/libs/dateutil/rrule.py b/src/libs/dateutil/rrule.py new file mode 100644 index 0000000..429f8fc --- /dev/null +++ b/src/libs/dateutil/rrule.py @@ -0,0 +1,1610 @@ +# -*- coding: utf-8 -*- +""" +The rrule module offers a small, complete, and very fast, implementation of +the recurrence rules documented in the +`iCalendar RFC `_, +including support for caching of results. +""" +import itertools +import datetime +import calendar +import sys + +try: + from math import gcd +except ImportError: + from fractions import gcd + +from six import advance_iterator, integer_types +from six.moves import _thread, range +import heapq + +from ._common import weekday as weekdaybase + +# For warning about deprecation of until and count +from warnings import warn + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) +M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = list(range(7)) + +# Imported on demand. +easter = None +parser = None + + +class weekday(weekdaybase): + """ + This version of weekday does not allow n = 0. + """ + def __init__(self, wkday, n=None): + if n == 0: + raise ValueError("Can't create weekday with n==0") + + super(weekday, self).__init__(wkday, n) + + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + + +def _invalidates_cache(f): + """ + Decorator for rruleset methods which may invalidate the + cached length. + """ + def inner_func(self, *args, **kwargs): + rv = f(self, *args, **kwargs) + self._invalidate_cache() + return rv + + return inner_func + + +class rrulebase(object): + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = _thread.allocate_lock() + self._invalidate_cache() + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _invalidate_cache(self): + if self._cache is not None: + self._cache = [] + self._cache_complete = False + self._cache_gen = self._iter() + + if self._cache_lock.locked(): + self._cache_lock.release() + + self._len = None + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(advance_iterator(gen)) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxsize, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = advance_iterator(gen) + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penality. + def count(self): + """ Returns the number of recurrences in this set. It will have go + trough the whole recurrence, if this hasn't been done before. """ + if self._len is None: + for x in self: + pass + return self._len + + def before(self, dt, inc=False): + """ Returns the last recurrence before the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + """ Returns the first recurrence after the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def xafter(self, dt, count=None, inc=False): + """ + Generator which yields up to `count` recurrences after the given + datetime instance, equivalent to `after`. + + :param dt: + The datetime at which to start generating recurrences. + + :param count: + The maximum number of recurrences to generate. If `None` (default), + dates are generated until the recurrence rule is exhausted. + + :param inc: + If `dt` is an instance of the rule and `inc` is `True`, it is + included in the output. + + :yields: Yields a sequence of `datetime` objects. + """ + + if self._cache_complete: + gen = self._cache + else: + gen = self + + # Select the comparison function + if inc: + comp = lambda dc, dtc: dc >= dtc + else: + comp = lambda dc, dtc: dc > dtc + + # Generate dates + n = 0 + for d in gen: + if comp(d, dt): + if count is not None: + n += 1 + if n > count: + break + + yield d + + def between(self, after, before, inc=False, count=1): + """ Returns all the occurrences of the rrule between after and before. + The inc keyword defines what happens if after and/or before are + themselves occurrences. With inc=True, they will be included in the + list, if they are found in the recurrence set. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + + +class rrule(rrulebase): + """ + That's the base of the rrule operation. It accepts all the keywords + defined in the RFC as its constructor parameters (except byday, + which was renamed to byweekday) and more. The constructor prototype is:: + + rrule(freq) + + Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, + or SECONDLY. + + .. note:: + Per RFC section 3.3.10, recurrence instances falling on invalid dates + and times are ignored rather than coerced: + + Recurrence rules may generate recurrence instances with an invalid + date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM + on a day where the local time is moved forward by an hour at 1:00 + AM). Such recurrence instances MUST be ignored and MUST NOT be + counted as part of the recurrence set. + + This can lead to possibly surprising behavior when, for example, the + start date occurs at the end of the month: + + >>> from dateutil.rrule import rrule, MONTHLY + >>> from datetime import datetime + >>> start_date = datetime(2014, 12, 31) + >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) + ... # doctest: +NORMALIZE_WHITESPACE + [datetime.datetime(2014, 12, 31, 0, 0), + datetime.datetime(2015, 1, 31, 0, 0), + datetime.datetime(2015, 3, 31, 0, 0), + datetime.datetime(2015, 5, 31, 0, 0)] + + Additionally, it supports the following keyword arguments: + + :param cache: + If given, it must be a boolean value specifying to enable or disable + caching of results. If you will use the same rrule instance multiple + times, enabling caching will improve the performance considerably. + :param dtstart: + The recurrence start. Besides being the base for the recurrence, + missing parameters in the final recurrence instances will also be + extracted from this date. If not given, datetime.now() will be used + instead. + :param interval: + The interval between each freq iteration. For example, when using + YEARLY, an interval of 2 means once every two years, but with HOURLY, + it means once every two hours. The default interval is 1. + :param wkst: + The week start day. Must be one of the MO, TU, WE constants, or an + integer, specifying the first day of the week. This will affect + recurrences based on weekly periods. The default week start is got + from calendar.firstweekday(), and may be modified by + calendar.setfirstweekday(). + :param count: + How many occurrences will be generated. + + .. note:: + As of version 2.5.0, the use of the ``until`` keyword together + with the ``count`` keyword is deprecated per RFC-2445 Sec. 4.3.10. + :param until: + If given, this must be a datetime instance, that will specify the + limit of the recurrence. The last recurrence in the rule is the greatest + datetime that is less than or equal to the value specified in the + ``until`` parameter. + + .. note:: + As of version 2.5.0, the use of the ``until`` keyword together + with the ``count`` keyword is deprecated per RFC-2445 Sec. 4.3.10. + :param bysetpos: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each given integer will specify an occurrence + number, corresponding to the nth occurrence of the rule inside the + frequency period. For example, a bysetpos of -1 if combined with a + MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will + result in the last work day of every month. + :param bymonth: + If given, it must be either an integer, or a sequence of integers, + meaning the months to apply the recurrence to. + :param bymonthday: + If given, it must be either an integer, or a sequence of integers, + meaning the month days to apply the recurrence to. + :param byyearday: + If given, it must be either an integer, or a sequence of integers, + meaning the year days to apply the recurrence to. + :param byweekno: + If given, it must be either an integer, or a sequence of integers, + meaning the week numbers to apply the recurrence to. Week numbers + have the meaning described in ISO8601, that is, the first week of + the year is that containing at least four days of the new year. + :param byweekday: + If given, it must be either an integer (0 == MO), a sequence of + integers, one of the weekday constants (MO, TU, etc), or a sequence + of these constants. When given, these variables will define the + weekdays where the recurrence will be applied. It's also possible to + use an argument n for the weekday instances, which will mean the nth + occurrence of this weekday in the period. For example, with MONTHLY, + or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the + first friday of the month where the recurrence happens. Notice that in + the RFC documentation, this is specified as BYDAY, but was renamed to + avoid the ambiguity of that keyword. + :param byhour: + If given, it must be either an integer, or a sequence of integers, + meaning the hours to apply the recurrence to. + :param byminute: + If given, it must be either an integer, or a sequence of integers, + meaning the minutes to apply the recurrence to. + :param bysecond: + If given, it must be either an integer, or a sequence of integers, + meaning the seconds to apply the recurrence to. + :param byeaster: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each integer will define an offset from the + Easter Sunday. Passing the offset 0 to byeaster will yield the Easter + Sunday itself. This is an extension to the RFC specification. + """ + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + super(rrule, self).__init__(cache) + global easter + if not dtstart: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + + # Cache the original byxxx rules, if they are provided, as the _byxxx + # attributes do not necessarily map to the inputs, and this can be + # a problem in generating the strings. Only store things if they've + # been supplied (the string retrieval will just use .get()) + self._original_rule = {} + + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + + if count is not None and until: + warn("Using both 'count' and 'until' is inconsistent with RFC 2445" + " and has been deprecated in dateutil. Future versions will " + "raise an error.", DeprecationWarning) + + if wkst is None: + self._wkst = calendar.firstweekday() + elif isinstance(wkst, integer_types): + self._wkst = wkst + else: + self._wkst = wkst.weekday + + if bysetpos is None: + self._bysetpos = None + elif isinstance(bysetpos, integer_types): + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + + if self._bysetpos: + self._original_rule['bysetpos'] = self._bysetpos + + if (byweekno is None and byyearday is None and bymonthday is None and + byweekday is None and byeaster is None): + if freq == YEARLY: + if bymonth is None: + bymonth = dtstart.month + self._original_rule['bymonth'] = None + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == MONTHLY: + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == WEEKLY: + byweekday = dtstart.weekday() + self._original_rule['byweekday'] = None + + # bymonth + if bymonth is None: + self._bymonth = None + else: + if isinstance(bymonth, integer_types): + bymonth = (bymonth,) + + self._bymonth = tuple(sorted(set(bymonth))) + + if 'bymonth' not in self._original_rule: + self._original_rule['bymonth'] = self._bymonth + + # byyearday + if byyearday is None: + self._byyearday = None + else: + if isinstance(byyearday, integer_types): + byyearday = (byyearday,) + + self._byyearday = tuple(sorted(set(byyearday))) + self._original_rule['byyearday'] = self._byyearday + + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if isinstance(byeaster, integer_types): + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(sorted(byeaster)) + + self._original_rule['byeaster'] = self._byeaster + else: + self._byeaster = None + + # bymonthday + if bymonthday is None: + self._bymonthday = () + self._bynmonthday = () + else: + if isinstance(bymonthday, integer_types): + bymonthday = (bymonthday,) + + bymonthday = set(bymonthday) # Ensure it's unique + + self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) + self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) + + # Storing positive numbers first, then negative numbers + if 'bymonthday' not in self._original_rule: + self._original_rule['bymonthday'] = tuple( + itertools.chain(self._bymonthday, self._bynmonthday)) + + # byweekno + if byweekno is None: + self._byweekno = None + else: + if isinstance(byweekno, integer_types): + byweekno = (byweekno,) + + self._byweekno = tuple(sorted(set(byweekno))) + + self._original_rule['byweekno'] = self._byweekno + + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + else: + # If it's one of the valid non-sequence types, convert to a + # single-element sequence before the iterator that builds the + # byweekday set. + if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): + byweekday = (byweekday,) + + self._byweekday = set() + self._bynweekday = set() + for wday in byweekday: + if isinstance(wday, integer_types): + self._byweekday.add(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.add(wday.weekday) + else: + self._bynweekday.add((wday.weekday, wday.n)) + + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + + if self._byweekday is not None: + self._byweekday = tuple(sorted(self._byweekday)) + orig_byweekday = [weekday(x) for x in self._byweekday] + else: + orig_byweekday = tuple() + + if self._bynweekday is not None: + self._bynweekday = tuple(sorted(self._bynweekday)) + orig_bynweekday = [weekday(*x) for x in self._bynweekday] + else: + orig_bynweekday = tuple() + + if 'byweekday' not in self._original_rule: + self._original_rule['byweekday'] = tuple(itertools.chain( + orig_byweekday, orig_bynweekday)) + + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = set((dtstart.hour,)) + else: + self._byhour = None + else: + if isinstance(byhour, integer_types): + byhour = (byhour,) + + if freq == HOURLY: + self._byhour = self.__construct_byset(start=dtstart.hour, + byxxx=byhour, + base=24) + else: + self._byhour = set(byhour) + + self._byhour = tuple(sorted(self._byhour)) + self._original_rule['byhour'] = self._byhour + + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = set((dtstart.minute,)) + else: + self._byminute = None + else: + if isinstance(byminute, integer_types): + byminute = (byminute,) + + if freq == MINUTELY: + self._byminute = self.__construct_byset(start=dtstart.minute, + byxxx=byminute, + base=60) + else: + self._byminute = set(byminute) + + self._byminute = tuple(sorted(self._byminute)) + self._original_rule['byminute'] = self._byminute + + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = ((dtstart.second,)) + else: + self._bysecond = None + else: + if isinstance(bysecond, integer_types): + bysecond = (bysecond,) + + self._bysecond = set(bysecond) + + if freq == SECONDLY: + self._bysecond = self.__construct_byset(start=dtstart.second, + byxxx=bysecond, + base=60) + else: + self._bysecond = set(bysecond) + + self._bysecond = tuple(sorted(self._bysecond)) + self._original_rule['bysecond'] = self._bysecond + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def __str__(self): + """ + Output a string that would generate this RRULE if passed to rrulestr. + This is mostly compatible with RFC2445, except for the + dateutil-specific extension BYEASTER. + """ + + output = [] + h, m, s = [None] * 3 + if self._dtstart: + output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) + h, m, s = self._dtstart.timetuple()[3:6] + + parts = ['FREQ=' + FREQNAMES[self._freq]] + if self._interval != 1: + parts.append('INTERVAL=' + str(self._interval)) + + if self._wkst: + parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) + + if self._count is not None: + parts.append('COUNT=' + str(self._count)) + + if self._until: + parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) + + if self._original_rule.get('byweekday') is not None: + # The str() method on weekday objects doesn't generate + # RFC2445-compliant strings, so we should modify that. + original_rule = dict(self._original_rule) + wday_strings = [] + for wday in original_rule['byweekday']: + if wday.n: + wday_strings.append('{n:+d}{wday}'.format( + n=wday.n, + wday=repr(wday)[0:2])) + else: + wday_strings.append(repr(wday)) + + original_rule['byweekday'] = wday_strings + else: + original_rule = self._original_rule + + partfmt = '{name}={vals}' + for name, key in [('BYSETPOS', 'bysetpos'), + ('BYMONTH', 'bymonth'), + ('BYMONTHDAY', 'bymonthday'), + ('BYYEARDAY', 'byyearday'), + ('BYWEEKNO', 'byweekno'), + ('BYDAY', 'byweekday'), + ('BYHOUR', 'byhour'), + ('BYMINUTE', 'byminute'), + ('BYSECOND', 'bysecond'), + ('BYEASTER', 'byeaster')]: + value = original_rule.get(key) + if value: + parts.append(partfmt.format(name=name, vals=(','.join(str(v) + for v in value)))) + + output.append(';'.join(parts)) + return '\n'.join(output) + + def replace(self, **kwargs): + """Return new rrule with same attributes except for those attributes given new + values by whichever keyword arguments are specified.""" + new_kwargs = {"interval": self._interval, + "count": self._count, + "dtstart": self._dtstart, + "freq": self._freq, + "until": self._until, + "wkst": self._wkst, + "cache": False if self._cache is None else True } + new_kwargs.update(self._original_rule) + new_kwargs.update(kwargs) + return rrule(**new_kwargs) + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY: ii.ydayset, + MONTHLY: ii.mdayset, + WEEKLY: ii.wdayset, + DAILY: ii.ddayset, + HOURLY: ii.ddayset, + MINUTELY: ii.ddayset, + SECONDLY: ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY: ii.htimeset, + MINUTELY: ii.mtimeset, + SECONDLY: ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and second not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday and + -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and + -ii.nextyearlen+i-ii.yearlen not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + total += 1 + yield res + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal + i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + + total += 1 + yield res + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + + if byhour: + ndays, hour = self.__mod_distance(value=hour, + byxxx=self._byhour, + base=24) + else: + ndays, hour = divmod(hour+interval, 24) + + if ndays: + day += ndays + fixday = True + + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + + valid = False + rep_rate = (24*60) + for j in range(rep_rate // gcd(interval, rep_rate)): + if byminute: + nhours, minute = \ + self.__mod_distance(value=minute, + byxxx=self._byminute, + base=60) + else: + nhours, minute = divmod(minute+interval, 60) + + div, hour = divmod(hour+nhours, 24) + if div: + day += div + fixday = True + filtered = False + + if not byhour or hour in byhour: + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval and ' + + 'byhour resulting in empty rule.') + + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399 - (hour * 3600 + minute * 60 + second)) + // interval) * interval) + + rep_rate = (24 * 3600) + valid = False + for j in range(0, rep_rate // gcd(interval, rep_rate)): + if bysecond: + nminutes, second = \ + self.__mod_distance(value=second, + byxxx=self._bysecond, + base=60) + else: + nminutes, second = divmod(second+interval, 60) + + div, minute = divmod(minute+nminutes, 60) + if div: + hour += div + div, hour = divmod(hour, 24) + if div: + day += div + fixday = True + + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval, ' + + 'byhour and byminute resulting in empty' + + ' rule.') + + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + + def __construct_byset(self, start, byxxx, base): + """ + If a `BYXXX` sequence is passed to the constructor at the same level as + `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some + specifications which cannot be reached given some starting conditions. + + This occurs whenever the interval is not coprime with the base of a + given unit and the difference between the starting position and the + ending position is not coprime with the greatest common denominator + between the interval and the base. For example, with a FREQ of hourly + starting at 17:00 and an interval of 4, the only valid values for + BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not + coprime. + + :param start: + Specifies the starting position. + :param byxxx: + An iterable containing the list of allowed values. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + This does not preserve the type of the iterable, returning a set, since + the values should be unique and the order is irrelevant, this will + speed up later lookups. + + In the event of an empty set, raises a :exception:`ValueError`, as this + results in an empty rrule. + """ + + cset = set() + + # Support a single byxxx value. + if isinstance(byxxx, integer_types): + byxxx = (byxxx, ) + + for num in byxxx: + i_gcd = gcd(self._interval, base) + # Use divmod rather than % because we need to wrap negative nums. + if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: + cset.add(num) + + if len(cset) == 0: + raise ValueError("Invalid rrule byxxx generates an empty set.") + + return cset + + def __mod_distance(self, value, byxxx, base): + """ + Calculates the next value in a sequence where the `FREQ` parameter is + specified along with a `BYXXX` parameter at the same "level" + (e.g. `HOURLY` specified with `BYHOUR`). + + :param value: + The old value of the component. + :param byxxx: + The `BYXXX` set, which should have been generated by + `rrule._construct_byset`, or something else which checks that a + valid rule is present. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + If a valid value is not found after `base` iterations (the maximum + number before the sequence would start to repeat), this raises a + :exception:`ValueError`, as no valid values were found. + + This returns a tuple of `divmod(n*interval, base)`, where `n` is the + smallest number of `interval` repetitions until the next specified + value in `byxxx` is found. + """ + accumulator = 0 + for ii in range(1, base + 1): + # Using divmod() over % to account for negative intervals + div, value = divmod(value + self._interval, base) + accumulator += div + if value in byxxx: + return (accumulator, value) + + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365 + calendar.isleap(year) + self.nextyearlen = 365 + calendar.isleap(year + 1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1, 1, 1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst) % 7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen + + (lyearweekday-rr._wkst) % 7) % 7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and (month != self.lastmonth or + year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday) % 7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday) % 7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return list(range(self.yearlen)), 0, self.yearlen + + def mdayset(self, year, month, day): + dset = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + dset[i] = i + return dset, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + dset = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + dset[i] = i + i += 1 + # if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return dset, start, i + + def ddayset(self, year, month, day): + dset = [None] * self.yearlen + i = datetime.date(year, month, day).toordinal() - self.yearordinal + dset[i] = i + return dset, i, i + 1 + + def htimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def mtimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + """ The rruleset type allows more complex recurrence setups, mixing + multiple rules, dates, exclusion rules, and exclusion dates. The type + constructor takes the following keyword arguments: + + :param cache: If True, caching of results will be enabled, improving + performance of multiple queries considerably. """ + + class _genitem(object): + def __init__(self, genlist, gen): + try: + self.dt = advance_iterator(gen) + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def __next__(self): + try: + self.dt = advance_iterator(self.gen) + except StopIteration: + if self.genlist[0] is self: + heapq.heappop(self.genlist) + else: + self.genlist.remove(self) + heapq.heapify(self.genlist) + + next = __next__ + + def __lt__(self, other): + return self.dt < other.dt + + def __gt__(self, other): + return self.dt > other.dt + + def __eq__(self, other): + return self.dt == other.dt + + def __ne__(self, other): + return self.dt != other.dt + + def __init__(self, cache=False): + super(rruleset, self).__init__(cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + @_invalidates_cache + def rrule(self, rrule): + """ Include the given :py:class:`rrule` instance in the recurrence set + generation. """ + self._rrule.append(rrule) + + @_invalidates_cache + def rdate(self, rdate): + """ Include the given :py:class:`datetime` instance in the recurrence + set generation. """ + self._rdate.append(rdate) + + @_invalidates_cache + def exrule(self, exrule): + """ Include the given rrule instance in the recurrence set exclusion + list. Dates which are part of the given recurrence rules will not + be generated, even if some inclusive rrule or rdate matches them. + """ + self._exrule.append(exrule) + + @_invalidates_cache + def exdate(self, exdate): + """ Include the given datetime instance in the recurrence set + exclusion list. Dates included that way will not be generated, + even if some inclusive rrule or rdate matches them. """ + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate)) + for gen in [iter(x) for x in self._rrule]: + self._genitem(rlist, gen) + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate)) + for gen in [iter(x) for x in self._exrule]: + self._genitem(exlist, gen) + lastdt = None + total = 0 + heapq.heapify(rlist) + heapq.heapify(exlist) + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exitem = exlist[0] + advance_iterator(exitem) + if exlist and exlist[0] is exitem: + heapq.heapreplace(exlist, exitem) + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + advance_iterator(ritem) + if rlist and rlist[0] is ritem: + heapq.heapreplace(rlist, ritem) + self._len = total + + +class _rrulestr(object): + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, + "FR": 4, "SA": 5, "SU": 6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError("invalid until date") + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): + """ + Two ways to specify this: +1MO or MO(+1) + """ + l = [] + for wday in value.split(','): + if '(' in wday: + # If it's of the form TH(+1), etc. + splt = wday.split('(') + w = splt[0] + n = int(splt[1][:-1]) + elif len(wday): + # If it's of the form +1MO + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: + n = int(n) + else: + raise ValueError("Invalid (empty) BYDAY specification.") + + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError("unknown parameter name") + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError("unknown parameter '%s'" % name) + except (KeyError, ValueError): + raise ValueError("invalid '%s': %s" % (name, value)) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + s = s.upper() + if not s.strip(): + raise ValueError("empty string") + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and (s.find(':') == -1 or + s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError("unsupported RRULE parm: "+parm) + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported RDATE parm: "+parm) + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError("unsupported EXRULE parm: "+parm) + exrulevals.append(value) + elif name == "EXDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported EXDATE parm: "+parm) + exdatevals.append(value) + elif name == "DTSTART": + for parm in parms: + raise ValueError("unsupported DTSTART parm: "+parm) + if not parser: + from dateutil import parser + dtstart = parser.parse(value, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + raise ValueError("unsupported property: "+name) + if (forceset or len(rrulevals) > 1 or rdatevals + or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + rset = rruleset(cache=cache) + for value in rrulevals: + rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + rset.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + for datestr in value.split(','): + rset.exdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + if compatible and dtstart: + rset.rdate(dtstart) + return rset + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/src/libs/dateutil/tz/__init__.py b/src/libs/dateutil/tz/__init__.py new file mode 100644 index 0000000..b0a5043 --- /dev/null +++ b/src/libs/dateutil/tz/__init__.py @@ -0,0 +1,5 @@ +from .tz import * + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", + "enfold", "datetime_ambiguous", "datetime_exists"] diff --git a/src/libs/dateutil/tz/_common.py b/src/libs/dateutil/tz/_common.py new file mode 100644 index 0000000..f1cf2af --- /dev/null +++ b/src/libs/dateutil/tz/_common.py @@ -0,0 +1,394 @@ +from six import PY3 + +from functools import wraps + +from datetime import datetime, timedelta, tzinfo + + +ZERO = timedelta(0) + +__all__ = ['tzname_in_python2', 'enfold'] + + +def tzname_in_python2(namefunc): + """Change unicode output into bytestrings in Python 2 + + tzname() API changed in Python 3. It used to return bytes, but was changed + to unicode strings + """ + def adjust_encoding(*args, **kwargs): + name = namefunc(*args, **kwargs) + if name is not None and not PY3: + name = name.encode() + + return name + + return adjust_encoding + + +# The following is adapted from Alexander Belopolsky's tz library +# https://github.com/abalkin/tz +if hasattr(datetime, 'fold'): + # This is the pre-python 3.6 fold situation + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + return dt.replace(fold=fold) + +else: + class _DatetimeWithFold(datetime): + """ + This is a class designed to provide a PEP 495-compliant interface for + Python versions before 3.6. It is used only for dates in a fold, so + the ``fold`` attribute is fixed at ``1``. + + .. versionadded:: 2.6.0 + """ + __slots__ = () + + @property + def fold(self): + return 1 + + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + if getattr(dt, 'fold', 0) == fold: + return dt + + args = dt.timetuple()[:6] + args += (dt.microsecond, dt.tzinfo) + + if fold: + return _DatetimeWithFold(*args) + else: + return datetime(*args) + + +def _validate_fromutc_inputs(f): + """ + The CPython version of ``fromutc`` checks that the input is a ``datetime`` + object and that ``self`` is attached as its ``tzinfo``. + """ + @wraps(f) + def fromutc(self, dt): + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + return f(self, dt) + + return fromutc + + +class _tzinfo(tzinfo): + """ + Base class for all ``dateutil`` ``tzinfo`` objects. + """ + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + + dt = dt.replace(tzinfo=self) + + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) + + return same_dt and not same_offset + + def _fold_status(self, dt_utc, dt_wall): + """ + Determine the fold status of a "wall" datetime, given a representation + of the same datetime as a (naive) UTC datetime. This is calculated based + on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all + datetimes, and that this offset is the actual number of hours separating + ``dt_utc`` and ``dt_wall``. + + :param dt_utc: + Representation of the datetime as UTC + + :param dt_wall: + Representation of the datetime as "wall time". This parameter must + either have a `fold` attribute or have a fold-naive + :class:`datetime.tzinfo` attached, otherwise the calculation may + fail. + """ + if self.is_ambiguous(dt_wall): + delta_wall = dt_wall - dt_utc + _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) + else: + _fold = 0 + + return _fold + + def _fold(self, dt): + return getattr(dt, 'fold', 0) + + def _fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + + # Re-implement the algorithm from Python's datetime.py + dtoff = dt.utcoffset() + if dtoff is None: + raise ValueError("fromutc() requires a non-None utcoffset() " + "result") + + # The original datetime.py code assumes that `dst()` defaults to + # zero during ambiguous times. PEP 495 inverts this presumption, so + # for pre-PEP 495 versions of python, we need to tweak the algorithm. + dtdst = dt.dst() + if dtdst is None: + raise ValueError("fromutc() requires a non-None dst() result") + delta = dtoff - dtdst + + dt += delta + # Set fold=1 so we can default to being in the fold for + # ambiguous dates. + dtdst = enfold(dt, fold=1).dst() + if dtdst is None: + raise ValueError("fromutc(): dt.dst gave inconsistent " + "results; cannot convert") + return dt + dtdst + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurance, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + dt_wall = self._fromutc(dt) + + # Calculate the fold status given the two datetimes. + _fold = self._fold_status(dt, dt_wall) + + # Set the default fold value for ambiguous dates + return enfold(dt_wall, fold=_fold) + + +class tzrangebase(_tzinfo): + """ + This is an abstract base class for time zones represented by an annual + transition into and out of DST. Child classes should implement the following + methods: + + * ``__init__(self, *args, **kwargs)`` + * ``transitions(self, year)`` - this is expected to return a tuple of + datetimes representing the DST on and off transitions in standard + time. + + A fully initialized ``tzrangebase`` subclass should also provide the + following attributes: + * ``hasdst``: Boolean whether or not the zone uses DST. + * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects + representing the respective UTC offsets. + * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short + abbreviations in DST and STD, respectively. + * ``_hasdst``: Whether or not the zone has DST. + + .. versionadded:: 2.6.0 + """ + def __init__(self): + raise NotImplementedError('tzrangebase is an abstract base class') + + def utcoffset(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_base_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def fromutc(self, dt): + """ Given a datetime in UTC, return local time """ + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # Get transitions - if there are none, fixed offset + transitions = self.transitions(dt.year) + if transitions is None: + return dt + self.utcoffset(dt) + + # Get the transition times in UTC + dston, dstoff = transitions + + dston -= self._std_offset + dstoff -= self._std_offset + + utc_transitions = (dston, dstoff) + dt_utc = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt_utc, utc_transitions) + + if isdst: + dt_wall = dt + self._dst_offset + else: + dt_wall = dt + self._std_offset + + _fold = int(not isdst and self.is_ambiguous(dt_wall)) + + return enfold(dt_wall, fold=_fold) + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if not self.hasdst: + return False + + start, end = self.transitions(dt.year) + + dt = dt.replace(tzinfo=None) + return (end <= dt < end + self._dst_base_offset) + + def _isdst(self, dt): + if not self.hasdst: + return False + elif dt is None: + return None + + transitions = self.transitions(dt.year) + + if transitions is None: + return False + + dt = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt, transitions) + + # Handle ambiguous dates + if not isdst and self.is_ambiguous(dt): + return not self._fold(dt) + else: + return isdst + + def _naive_isdst(self, dt, transitions): + dston, dstoff = transitions + + dt = dt.replace(tzinfo=None) + + if dston < dstoff: + isdst = dston <= dt < dstoff + else: + isdst = not dstoff <= dt < dston + + return isdst + + @property + def _dst_base_offset(self): + return self._dst_offset - self._std_offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +def _total_seconds(td): + # Python 2.6 doesn't have a total_seconds() method on timedelta objects + return ((td.seconds + td.days * 86400) * 1000000 + + td.microseconds) // 1000000 + + +_total_seconds = getattr(timedelta, 'total_seconds', _total_seconds) diff --git a/src/libs/dateutil/tz/tz.py b/src/libs/dateutil/tz/tz.py new file mode 100644 index 0000000..9468282 --- /dev/null +++ b/src/libs/dateutil/tz/tz.py @@ -0,0 +1,1511 @@ +# -*- coding: utf-8 -*- +""" +This module offers timezone implementations subclassing the abstract +:py:`datetime.tzinfo` type. There are classes to handle tzfile format files +(usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, etc), TZ +environment string (in all known formats), given ranges (with help from +relative deltas), local machine timezone, fixed offset timezone, and UTC +timezone. +""" +import datetime +import struct +import time +import sys +import os +import bisect + +from six import string_types +from ._common import tzname_in_python2, _tzinfo, _total_seconds +from ._common import tzrangebase, enfold +from ._common import _validate_fromutc_inputs + +try: + from .win import tzwin, tzwinlocal +except ImportError: + tzwin = tzwinlocal = None + +ZERO = datetime.timedelta(0) +EPOCH = datetime.datetime.utcfromtimestamp(0) +EPOCHORDINAL = EPOCH.toordinal() + + +class tzutc(datetime.tzinfo): + """ + This is a tzinfo object that represents the UTC time zone. + """ + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return "UTC" + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Fast track version of fromutc() returns the original ``dt`` object for + any valid :py:class:`datetime.datetime` object. + """ + return dt + + def __eq__(self, other): + if not isinstance(other, (tzutc, tzoffset)): + return NotImplemented + + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class tzoffset(datetime.tzinfo): + """ + A simple class for representing a fixed offset from UTC. + + :param name: + The timezone name, to be returned when ``tzname()`` is called. + + :param offset: + The time zone offset in seconds, or (since version 2.6.0, represented + as a :py:class:`datetime.timedelta` object. + """ + def __init__(self, name, offset): + self._name = name + + try: + # Allow a timedelta + offset = _total_seconds(offset) + except (TypeError, AttributeError): + pass + self._offset = datetime.timedelta(seconds=offset) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._name + + @_validate_fromutc_inputs + def fromutc(self, dt): + return dt + self._offset + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + def __eq__(self, other): + if not isinstance(other, tzoffset): + return NotImplemented + + return self._offset == other._offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + repr(self._name), + int(_total_seconds(self._offset))) + + __reduce__ = object.__reduce__ + + +class tzlocal(_tzinfo): + """ + A :class:`tzinfo` subclass built around the ``time`` timezone functions. + """ + def __init__(self): + super(tzlocal, self).__init__() + + self._std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + self._dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + self._dst_offset = self._std_offset + + self._dst_saved = self._dst_offset - self._std_offset + self._hasdst = bool(self._dst_saved) + + def utcoffset(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset - self._std_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + naive_dst = self._naive_is_dst(dt) + return (not naive_dst and + (naive_dst != self._naive_is_dst(dt - self._dst_saved))) + + def _naive_is_dst(self, dt): + timestamp = _datetime_to_timestamp(dt) + return time.localtime(timestamp + time.timezone).tm_isdst + + def _isdst(self, dt, fold_naive=True): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + # >>> import tz, datetime + # >>> t = tz.tzlocal() + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # + # Here is a more stable implementation: + # + if not self._hasdst: + return False + + # Check for ambiguous times: + dstval = self._naive_is_dst(dt) + fold = getattr(dt, 'fold', None) + + if self.is_ambiguous(dt): + if fold is not None: + return not self._fold(dt) + else: + return True + + return dstval + + def __eq__(self, other): + if not isinstance(other, tzlocal): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", + "isstd", "isgmt", "dstoffset"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return NotImplemented + + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt and + self.dstoffset == other.dstoffset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + + +class _tzfile(object): + """ + Lightweight class for holding the relevant transition and time zone + information read from binary tzfiles. + """ + attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', + 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] + + def __init__(self, **kwargs): + for attr in self.attrs: + setattr(self, attr, kwargs.get(attr, None)) + + +class tzfile(_tzinfo): + """ + This is a ``tzinfo`` subclass thant allows one to use the ``tzfile(5)`` + format timezone files to extract current and historical zone information. + + :param fileobj: + This can be an opened file stream or a file name that the time zone + information can be read from. + + :param filename: + This is an optional parameter specifying the source of the time zone + information in the event that ``fileobj`` is a file object. If omitted + and ``fileobj`` is a file stream, this parameter will be set either to + ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. + + See `Sources for Time Zone and Daylight Saving Time Data + `_ for more information. Time zone + files can be compiled from the `IANA Time Zone database files + `_ with the `zic time zone compiler + `_ + """ + + def __init__(self, fileobj, filename=None): + super(tzfile, self).__init__() + + file_opened_here = False + if isinstance(fileobj, string_types): + self._filename = fileobj + fileobj = open(fileobj, 'rb') + file_opened_here = True + elif filename is not None: + self._filename = filename + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = repr(fileobj) + + if fileobj is not None: + if not file_opened_here: + fileobj = _ContextWrapper(fileobj) + + with fileobj as file_stream: + tzobj = self._read_tzfile(file_stream) + + self._set_tzdata(tzobj) + + def _set_tzdata(self, tzobj): + """ Set the time zone data of this object from a _tzfile object """ + # Copy the relevant attributes over as private attributes + for attr in _tzfile.attrs: + setattr(self, '_' + attr, getattr(tzobj, attr)) + + def _read_tzfile(self, fileobj): + out = _tzfile() + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + if fileobj.read(4).decode() != "TZif": + raise ValueError("magic not found") + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4))) + else: + out.trans_list_utc = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + out.trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + out.trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt).decode() + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now (but seek for correct file position) + if leapcnt: + fileobj.seek(leapcnt * 8, os.SEEK_CUR) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # Build ttinfo list + out.ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + # Round to full-minutes if that's not the case. Python's + # datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 for some information. + gmtoff = 60 * ((gmtoff + 30) // 60) + tti = _ttinfo() + tti.offset = gmtoff + tti.dstoffset = datetime.timedelta(0) + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + out.ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + out.ttinfo_std = None + out.ttinfo_dst = None + out.ttinfo_before = None + if out.ttinfo_list: + if not out.trans_list_utc: + out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] + else: + for i in range(timecnt-1, -1, -1): + tti = out.trans_idx[i] + if not out.ttinfo_std and not tti.isdst: + out.ttinfo_std = tti + elif not out.ttinfo_dst and tti.isdst: + out.ttinfo_dst = tti + + if out.ttinfo_std and out.ttinfo_dst: + break + else: + if out.ttinfo_dst and not out.ttinfo_std: + out.ttinfo_std = out.ttinfo_dst + + for tti in out.ttinfo_list: + if not tti.isdst: + out.ttinfo_before = tti + break + else: + out.ttinfo_before = out.ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + laststdoffset = None + out.trans_list = [] + for i, tti in enumerate(out.trans_idx): + if not tti.isdst: + offset = tti.offset + laststdoffset = offset + else: + if laststdoffset is not None: + # Store the DST offset as well and update it in the list + tti.dstoffset = tti.offset - laststdoffset + out.trans_idx[i] = tti + + offset = laststdoffset or 0 + + out.trans_list.append(out.trans_list_utc[i] + offset) + + # In case we missed any DST offsets on the way in for some reason, make + # a second pass over the list, looking for the /next/ DST offset. + laststdoffset = None + for i in reversed(range(len(out.trans_idx))): + tti = out.trans_idx[i] + if tti.isdst: + if not (tti.dstoffset or laststdoffset is None): + tti.dstoffset = tti.offset - laststdoffset + else: + laststdoffset = tti.offset + + if not isinstance(tti.dstoffset, datetime.timedelta): + tti.dstoffset = datetime.timedelta(seconds=tti.dstoffset) + + out.trans_idx[i] = tti + + out.trans_idx = tuple(out.trans_idx) + out.trans_list = tuple(out.trans_list) + out.trans_list_utc = tuple(out.trans_list_utc) + + return out + + def _find_last_transition(self, dt, in_utc=False): + # If there's no list, there are no transitions to find + if not self._trans_list: + return None + + timestamp = _datetime_to_timestamp(dt) + + # Find where the timestamp fits in the transition list - if the + # timestamp is a transition time, it's part of the "after" period. + trans_list = self._trans_list_utc if in_utc else self._trans_list + idx = bisect.bisect_right(trans_list, timestamp) + + # We want to know when the previous transition was, so subtract off 1 + return idx - 1 + + def _get_ttinfo(self, idx): + # For no list or after the last transition, default to _ttinfo_std + if idx is None or (idx + 1) >= len(self._trans_list): + return self._ttinfo_std + + # If there is a list and the time is before it, return _ttinfo_before + if idx < 0: + return self._ttinfo_before + + return self._trans_idx[idx] + + def _find_ttinfo(self, dt): + idx = self._resolve_ambiguous_time(dt) + + return self._get_ttinfo(idx) + + def fromutc(self, dt): + """ + The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. + + :param dt: + A :py:class:`datetime.datetime` object. + + :raises TypeError: + Raised if ``dt`` is not a :py:class:`datetime.datetime` object. + + :raises ValueError: + Raised if this is called with a ``dt`` which does not have this + ``tzinfo`` attached. + + :return: + Returns a :py:class:`datetime.datetime` object representing the + wall time in ``self``'s time zone. + """ + # These isinstance checks are in datetime.tzinfo, so we'll preserve + # them, even if we don't care about duck typing. + if not isinstance(dt, datetime.datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # First treat UTC as wall time and get the transition we're in. + idx = self._find_last_transition(dt, in_utc=True) + tti = self._get_ttinfo(idx) + + dt_out = dt + datetime.timedelta(seconds=tti.offset) + + fold = self.is_ambiguous(dt_out, idx=idx) + + return enfold(dt_out, fold=int(fold)) + + def is_ambiguous(self, dt, idx=None): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if idx is None: + idx = self._find_last_transition(dt) + + # Calculate the difference in offsets from current to previous + timestamp = _datetime_to_timestamp(dt) + tti = self._get_ttinfo(idx) + + if idx is None or idx <= 0: + return False + + od = self._get_ttinfo(idx - 1).offset - tti.offset + tt = self._trans_list[idx] # Transition time + + return timestamp < tt + od + + def _resolve_ambiguous_time(self, dt): + idx = self._find_last_transition(dt) + + # If we have no transitions, return the index + _fold = self._fold(dt) + if idx is None or idx == 0: + return idx + + # If it's ambiguous and we're in a fold, shift to a different index. + idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) + + return idx - idx_offset + + def utcoffset(self, dt): + if dt is None: + return None + + if not self._ttinfo_std: + return ZERO + + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if dt is None: + return None + + if not self._ttinfo_dst: + return ZERO + + tti = self._find_ttinfo(dt) + + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.dstoffset + + @tzname_in_python2 + def tzname(self, dt): + if not self._ttinfo_std or dt is None: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return NotImplemented + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) + + def __reduce__(self): + return self.__reduce_ex__(None) + + def __reduce_ex__(self, protocol): + return (self.__class__, (None, self._filename), self.__dict__) + + +class tzrange(tzrangebase): + """ + The ``tzrange`` object is a time zone specified by a set of offsets and + abbreviations, equivalent to the way the ``TZ`` variable can be specified + in POSIX-like systems, but using Python delta objects to specify DST + start, end and offsets. + + :param stdabbr: + The abbreviation for standard time (e.g. ``'EST'``). + + :param stdoffset: + An integer or :class:`datetime.timedelta` object or equivalent + specifying the base offset from UTC. + + If unspecified, +00:00 is used. + + :param dstabbr: + The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). + + If specified, with no other DST information, DST is assumed to occur + and the default behavior or ``dstoffset``, ``start`` and ``end`` is + used. If unspecified and no other DST information is specified, it + is assumed that this zone has no DST. + + If this is unspecified and other DST information is *is* specified, + DST occurs in the zone but the time zone abbreviation is left + unchanged. + + :param dstoffset: + A an integer or :class:`datetime.timedelta` object or equivalent + specifying the UTC offset during DST. If unspecified and any other DST + information is specified, it is assumed to be the STD offset +1 hour. + + :param start: + A :class:`relativedelta.relativedelta` object or equivalent specifying + the time and time of year that daylight savings time starts. To specify, + for example, that DST starts at 2AM on the 2nd Sunday in March, pass: + + ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` + + If unspecified and any other DST information is specified, the default + value is 2 AM on the first Sunday in April. + + :param end: + A :class:`relativedelta.relativedelta` object or equivalent representing + the time and time of year that daylight savings time ends, with the + same specification method as in ``start``. One note is that this should + point to the first time in the *standard* zone, so if a transition + occurs at 2AM in the DST zone and the clocks are set back 1 hour to 1AM, + set the `hours` parameter to +1. + + + **Examples:** + + .. testsetup:: tzrange + + from dateutil.tz import tzrange, tzstr + + .. doctest:: tzrange + + >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") + True + + >>> from dateutil.relativedelta import * + >>> range1 = tzrange("EST", -18000, "EDT") + >>> range2 = tzrange("EST", -18000, "EDT", -14400, + ... relativedelta(hours=+2, month=4, day=1, + ... weekday=SU(+1)), + ... relativedelta(hours=+1, month=10, day=31, + ... weekday=SU(-1))) + >>> tzstr('EST5EDT') == range1 == range2 + True + + """ + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + + global relativedelta + from dateutil import relativedelta + + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + + try: + stdoffset = _total_seconds(stdoffset) + except (TypeError, AttributeError): + pass + + try: + dstoffset = _total_seconds(dstoffset) + except (TypeError, AttributeError): + pass + + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = bool(self._start_delta) + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + if not self.hasdst: + return None + + base_year = datetime.datetime(year, 1, 1) + + start = base_year + self._start_delta + end = base_year + self._end_delta + + return (start, end) + + def __eq__(self, other): + if not isinstance(other, tzrange): + return NotImplemented + + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzstr(tzrange): + """ + ``tzstr`` objects are time zone objects specified by a time-zone string as + it would be passed to a ``TZ`` variable on POSIX-style systems (see + the `GNU C Library: TZ Variable`_ for more details). + + There is one notable exception, which is that POSIX-style time zones use an + inverted offset format, so normally ``GMT+3`` would be parsed as an offset + 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an + offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX + behavior, pass a ``True`` value to ``posix_offset``. + + The :class:`tzrange` object provides the same functionality, but is + specified using :class:`relativedelta.relativedelta` objects. rather than + strings. + + :param s: + A time zone string in ``TZ`` variable format. This can be a + :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: :class:`unicode`) + or a stream emitting unicode characters (e.g. :class:`StringIO`). + + :param posix_offset: + Optional. If set to ``True``, interpret strings such as ``GMT+3`` or + ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the + POSIX standard. + + .. _`GNU C Library: TZ Variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + """ + def __init__(self, s, posix_offset=False): + global parser + from dateutil import parser + + self._s = s + + res = parser._parsetz(s) + if res is None: + raise ValueError("unknown string format") + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC") and not posix_offset: + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + self.hasdst = bool(self._start_delta) + + def _delta(self, x, isend=0): + from dateutil import relativedelta + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset - self._std_offset + kwargs["seconds"] -= delta.seconds + delta.days * 86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +class _tzicalvtzcomp(object): + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + + +class _tzicalvtz(_tzinfo): + def __init__(self, tzid, comps=[]): + super(_tzicalvtz, self).__init__() + + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + + dt = dt.replace(tzinfo=None) + + try: + return self._cachecomp[self._cachedate.index((dt, self._fold(dt)))] + except ValueError: + pass + + lastcompdt = None + lastcomp = None + + for comp in self._comps: + compdt = self._find_compdt(comp, dt) + + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + + self._cachedate.insert(0, (dt, self._fold(dt))) + self._cachecomp.insert(0, lastcomp) + + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + + return lastcomp + + def _find_compdt(self, comp, dt): + if comp.tzoffsetdiff < ZERO and self._fold(dt): + dt -= comp.tzoffsetdiff + + compdt = comp.rrule.before(dt, inc=True) + + return compdt + + def utcoffset(self, dt): + if dt is None: + return None + + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "" % repr(self._tzid) + + __reduce__ = object.__reduce__ + + +class tzical(object): + """ + This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure + as set out in `RFC 2445`_ Section 4.6.5 into one or more `tzinfo` objects. + + :param `fileobj`: + A file or stream in iCalendar format, which should be UTF-8 encoded + with CRLF endings. + + .. _`RFC 2445`: https://www.ietf.org/rfc/rfc2445.txt + """ + def __init__(self, fileobj): + global rrule + from dateutil import rrule + + if isinstance(fileobj, string_types): + self._s = fileobj + # ical should be encoded in UTF-8 with CRLF + fileobj = open(fileobj, 'r') + else: + self._s = getattr(fileobj, 'name', repr(fileobj)) + fileobj = _ContextWrapper(fileobj) + + self._vtz = {} + + with fileobj as fobj: + self._parse_rfc(fobj.read()) + + def keys(self): + """ + Retrieves the available time zones as a list. + """ + return list(self._vtz.keys()) + + def get(self, tzid=None): + """ + Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. + + :param tzid: + If there is exactly one time zone available, omitting ``tzid`` + or passing :py:const:`None` value returns it. Otherwise a valid + key (which can be retrieved from :func:`keys`) is required. + + :raises ValueError: + Raised if ``tzid`` is not specified but there are either more + or fewer than 1 zone defined. + + :returns: + Returns either a :py:class:`datetime.tzinfo` object representing + the relevant time zone or :py:const:`None` if the ``tzid`` was + not found. + """ + if tzid is None: + if len(self._vtz) == 0: + raise ValueError("no timezones defined") + elif len(self._vtz) > 1: + raise ValueError("more than one timezone available") + tzid = next(iter(self._vtz)) + + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError("empty offset") + if s[0] in ('+', '-'): + signal = (-1, +1)[s[0] == '+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal + elif len(s) == 6: + return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal + else: + raise ValueError("invalid offset: " + s) + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError("empty string") + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError("unknown component: "+value) + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError("component not closed: "+comptype) + if not tzid: + raise ValueError("mandatory TZID not found") + if not comps: + raise ValueError( + "at least one component is needed") + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError("mandatory DTSTART not found") + if tzoffsetfrom is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + if tzoffsetto is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError("invalid component end: "+value) + elif comptype: + if name == "DTSTART": + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError( + "unsupported %s parm: %s " % (name, parms[0])) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError( + "unsupported TZOFFSETTO parm: "+parms[0]) + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError( + "unsupported TZNAME parm: "+parms[0]) + tzname = value + elif name == "COMMENT": + pass + else: + raise ValueError("unsupported property: "+name) + else: + if name == "TZID": + if parms: + raise ValueError( + "unsupported TZID parm: "+parms[0]) + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + else: + raise ValueError("unsupported property: "+name) + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", + "/usr/lib/zoneinfo", + "/usr/share/lib/zoneinfo", + "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + + +def gettz(name=None): + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name == ":": + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + if name.startswith(":"): + name = name[:-1] + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ', '_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin is not None: + try: + tz = tzwin(name) + except WindowsError: + tz = None + + if not tz: + from dateutil.zoneinfo import get_zonefile_instance + tz = get_zonefile_instance().get(name) + + if not tz: + for c in name: + # name must have at least one offset to be a tzstr + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = tzutc() + elif name in time.tzname: + tz = tzlocal() + return tz + + +def datetime_exists(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + would fall in a gap. + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" exists in ``tz``. + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + tz = dt.tzinfo + + dt = dt.replace(tzinfo=None) + + # This is essentially a test of whether or not the datetime can survive + # a round trip to UTC. + dt_rt = dt.replace(tzinfo=tz).astimezone(tzutc()).astimezone(tz) + dt_rt = dt_rt.replace(tzinfo=None) + + return dt == dt_rt + + +def datetime_ambiguous(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + is ambiguous (i.e if there are two times differentiated only by their DST + status). + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" is ambiguous in + ``tz``. + + .. versionadded:: 2.6.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + + tz = dt.tzinfo + + # If a time zone defines its own "is_ambiguous" function, we'll use that. + is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) + if is_ambiguous_fn is not None: + try: + return tz.is_ambiguous(dt) + except: + pass + + # If it doesn't come out and tell us it's ambiguous, we'll just check if + # the fold attribute has any effect on this particular date and time. + dt = dt.replace(tzinfo=tz) + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dst = wall_0.dst() == wall_1.dst() + + return not (same_offset and same_dst) + + +def _datetime_to_timestamp(dt): + """ + Convert a :class:`datetime.datetime` object to an epoch timestamp in seconds + since January 1, 1970, ignoring the time zone. + """ + return _total_seconds((dt.replace(tzinfo=None) - EPOCH)) + + +class _ContextWrapper(object): + """ + Class for wrapping contexts so that they are passed through in a + with statement. + """ + def __init__(self, context): + self.context = context + + def __enter__(self): + return self.context + + def __exit__(*args, **kwargs): + pass + +# vim:ts=4:sw=4:et diff --git a/src/libs/dateutil/tz/win.py b/src/libs/dateutil/tz/win.py new file mode 100644 index 0000000..36a1c26 --- /dev/null +++ b/src/libs/dateutil/tz/win.py @@ -0,0 +1,332 @@ +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct + +from six.moves import winreg +from six import text_type + +try: + import ctypes + from ctypes import wintypes +except ValueError: + # ValueError is raised on non-Windows systems for some horrible reason. + raise ImportError("Running tzwin on non-Windows system") + +from ._common import tzrangebase + +__all__ = ["tzwin", "tzwinlocal", "tzres"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + + +def _settzkeyname(): + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + try: + winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + return TZKEYNAME + + +TZKEYNAME = _settzkeyname() + + +class tzres(object): + """ + Class for accessing `tzres.dll`, which contains timezone name related + resources. + + .. versionadded:: 2.5.0 + """ + p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char + + def __init__(self, tzres_loc='tzres.dll'): + # Load the user32 DLL so we can load strings from tzres + user32 = ctypes.WinDLL('user32') + + # Specify the LoadStringW function + user32.LoadStringW.argtypes = (wintypes.HINSTANCE, + wintypes.UINT, + wintypes.LPWSTR, + ctypes.c_int) + + self.LoadStringW = user32.LoadStringW + self._tzres = ctypes.WinDLL(tzres_loc) + self.tzres_loc = tzres_loc + + def load_name(self, offset): + """ + Load a timezone name from a DLL offset (integer). + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.load_name(112)) + 'Eastern Standard Time' + + :param offset: + A positive integer value referring to a string from the tzres dll. + + ..note: + Offsets found in the registry are generally of the form + `@tzres.dll,-114`. The offset in this case if 114, not -114. + + """ + resource = self.p_wchar() + lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) + nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) + return resource[:nchar] + + def name_from_string(self, tzname_str): + """ + Parse strings as returned from the Windows registry into the time zone + name as defined in the registry. + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.name_from_string('@tzres.dll,-251')) + 'Dateline Daylight Time' + >>> print(tzr.name_from_string('Eastern Standard Time')) + 'Eastern Standard Time' + + :param tzname_str: + A timezone name string as returned from a Windows registry key. + + :return: + Returns the localized timezone string from tzres.dll if the string + is of the form `@tzres.dll,-offset`, else returns the input string. + """ + if not tzname_str.startswith('@'): + return tzname_str + + name_splt = tzname_str.split(',-') + try: + offset = int(name_splt[1]) + except: + raise ValueError("Malformed timezone string.") + + return self.load_name(offset) + + +class tzwinbase(tzrangebase): + """tzinfo class based on win32's timezones available in the registry.""" + def __init__(self): + raise NotImplementedError('tzwinbase is an abstract base class') + + def __eq__(self, other): + # Compare on all relevant dimensions, including name. + if not isinstance(other, tzwinbase): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._stddayofweek == other._stddayofweek and + self._dstdayofweek == other._dstdayofweek and + self._stdweeknumber == other._stdweeknumber and + self._dstweeknumber == other._dstweeknumber and + self._stdhour == other._stdhour and + self._dsthour == other._dsthour and + self._stdminute == other._stdminute and + self._dstminute == other._dstminute and + self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr) + + @staticmethod + def list(): + """Return a list of all time zones known to the system.""" + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZKEYNAME) as tzkey: + result = [winreg.EnumKey(tzkey, i) + for i in range(winreg.QueryInfoKey(tzkey)[0])] + return result + + def display(self): + return self._display + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + + if not self.hasdst: + return None + + dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + + dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + + # Ambiguous dates default to the STD side + dstoff -= self._dst_base_offset + + return dston, dstoff + + def _get_hasdst(self): + return self._dstmonth != 0 + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzwin(tzwinbase): + + def __init__(self, name): + self._name = name + + # multiple contexts only possible in 2.7 and 3.1, we still support 2.6 + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + keydict = valuestodict(tzkey) + + self._std_abbr = keydict["Std"] + self._dst_abbr = keydict["Dlt"] + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + dstoffset = stdoffset-tup[2] # + DaylightBias * -1 + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + def __init__(self): + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: + keydict = valuestodict(tzlocalkey) + + self._std_abbr = keydict["StandardName"] + self._dst_abbr = keydict["DaylightName"] + + try: + tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, + sn=self._std_abbr) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + except OSError: + self._display = None + + stdoffset = -keydict["Bias"]-keydict["StandardBias"] + dstoffset = stdoffset-keydict["DaylightBias"] + + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # For reasons unclear, in this particular key, the day of week has been + # moved to the END of the SYSTEMTIME structure. + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:5] + + self._stddayofweek = tup[7] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:5] + + self._dstdayofweek = tup[7] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwinlocal()" + + def __str__(self): + # str will return the standard name, not the daylight name. + return "tzwinlocal(%s)" % repr(self._std_abbr) + + def __reduce__(self): + return (self.__class__, ()) + + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ + first = datetime.datetime(year, month, 1, hour, minute) + + # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), + # Because 7 % 7 = 0 + weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) + wd = weekdayone + ((whichweek - 1) * ONEWEEK) + if (wd.month != month): + wd -= ONEWEEK + + return wd + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dout = {} + size = winreg.QueryInfoKey(key)[1] + tz_res = None + + for i in range(size): + key_name, value, dtype = winreg.EnumValue(key, i) + if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: + # If it's a DWORD (32-bit integer), it's stored as unsigned - convert + # that to a proper signed integer + if value & (1 << 31): + value = value - (1 << 32) + elif dtype == winreg.REG_SZ: + # If it's a reference to the tzres DLL, load the actual string + if value.startswith('@tzres'): + tz_res = tz_res or tzres() + value = tz_res.name_from_string(value) + + value = value.rstrip('\x00') # Remove trailing nulls + + dout[key_name] = value + + return dout diff --git a/src/libs/dateutil/tzwin.py b/src/libs/dateutil/tzwin.py new file mode 100644 index 0000000..cebc673 --- /dev/null +++ b/src/libs/dateutil/tzwin.py @@ -0,0 +1,2 @@ +# tzwin has moved to dateutil.tz.win +from .tz.win import * diff --git a/src/libs/dateutil/zoneinfo/__init__.py b/src/libs/dateutil/zoneinfo/__init__.py new file mode 100644 index 0000000..a2ed4f9 --- /dev/null +++ b/src/libs/dateutil/zoneinfo/__init__.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +import warnings +import json + +from tarfile import TarFile +from pkgutil import get_data +from io import BytesIO +from contextlib import closing + +from dateutil.tz import tzfile + +__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata", "rebuild"] + +ZONEFILENAME = "dateutil-zoneinfo.tar.gz" +METADATA_FN = 'METADATA' + +# python2.6 compatability. Note that TarFile.__exit__ != TarFile.close, but +# it's close enough for python2.6 +tar_open = TarFile.open +if not hasattr(TarFile, '__exit__'): + def tar_open(*args, **kwargs): + return closing(TarFile.open(*args, **kwargs)) + + +class tzfile(tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + + +def getzoneinfofile_stream(): + try: + return BytesIO(get_data(__name__, ZONEFILENAME)) + except IOError as e: # TODO switch to FileNotFoundError? + warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) + return None + + +class ZoneInfoFile(object): + def __init__(self, zonefile_stream=None): + if zonefile_stream is not None: + with tar_open(fileobj=zonefile_stream, mode='r') as tf: + # dict comprehension does not work on python2.6 + # TODO: get back to the nicer syntax when we ditch python2.6 + # self.zones = {zf.name: tzfile(tf.extractfile(zf), + # filename = zf.name) + # for zf in tf.getmembers() if zf.isfile()} + self.zones = dict((zf.name, tzfile(tf.extractfile(zf), + filename=zf.name)) + for zf in tf.getmembers() + if zf.isfile() and zf.name != METADATA_FN) + # deal with links: They'll point to their parent object. Less + # waste of memory + # links = {zl.name: self.zones[zl.linkname] + # for zl in tf.getmembers() if zl.islnk() or zl.issym()} + links = dict((zl.name, self.zones[zl.linkname]) + for zl in tf.getmembers() if + zl.islnk() or zl.issym()) + self.zones.update(links) + try: + metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) + metadata_str = metadata_json.read().decode('UTF-8') + self.metadata = json.loads(metadata_str) + except KeyError: + # no metadata in tar file + self.metadata = None + else: + self.zones = dict() + self.metadata = None + + def get(self, name, default=None): + """ + Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method + for retrieving zones from the zone dictionary. + + :param name: + The name of the zone to retrieve. (Generally IANA zone names) + + :param default: + The value to return in the event of a missing key. + + .. versionadded:: 2.6.0 + + """ + return self.zones.get(name, default) + + +# The current API has gettz as a module function, although in fact it taps into +# a stateful class. So as a workaround for now, without changing the API, we +# will create a new "global" class instance the first time a user requests a +# timezone. Ugly, but adheres to the api. +# +# TODO: Remove after deprecation period. +_CLASS_ZONE_INSTANCE = list() + + +def get_zonefile_instance(new_instance=False): + """ + This is a convenience function which provides a :class:`ZoneInfoFile` + instance using the data provided by the ``dateutil`` package. By default, it + caches a single instance of the ZoneInfoFile object and returns that. + + :param new_instance: + If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and + used as the cached instance for the next call. Otherwise, new instances + are created only as necessary. + + :return: + Returns a :class:`ZoneInfoFile` object. + + .. versionadded:: 2.6 + """ + if new_instance: + zif = None + else: + zif = getattr(get_zonefile_instance, '_cached_instance', None) + + if zif is None: + zif = ZoneInfoFile(getzoneinfofile_stream()) + + get_zonefile_instance._cached_instance = zif + + return zif + + +def gettz(name): + """ + This retrieves a time zone from the local zoneinfo tarball that is packaged + with dateutil. + + :param name: + An IANA-style time zone name, as found in the zoneinfo file. + + :return: + Returns a :class:`dateutil.tz.tzfile` time zone object. + + .. warning:: + It is generally inadvisable to use this function, and it is only + provided for API compatibility with earlier versions. This is *not* + equivalent to ``dateutil.tz.gettz()``, which selects an appropriate + time zone based on the inputs, favoring system zoneinfo. This is ONLY + for accessing the dateutil-specific zoneinfo (which may be out of + date compared to the system zoneinfo). + + .. deprecated:: 2.6 + If you need to use a specific zoneinfofile over the system zoneinfo, + instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call + :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. + + Use :func:`get_zonefile_instance` to retrieve an instance of the + dateutil-provided zoneinfo. + """ + warnings.warn("zoneinfo.gettz() will be removed in future versions, " + "to use the dateutil-provided zoneinfo files, instantiate a " + "ZoneInfoFile object and use ZoneInfoFile.zones.get() " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].zones.get(name) + + +def gettz_db_metadata(): + """ Get the zonefile metadata + + See `zonefile_metadata`_ + + :returns: + A dictionary with the database metadata + + .. deprecated:: 2.6 + See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, + query the attribute ``zoneinfo.ZoneInfoFile.metadata``. + """ + warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " + "versions, to use the dateutil-provided zoneinfo files, " + "ZoneInfoFile object and query the 'metadata' attribute " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/src/libs/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/src/libs/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..613c0ff3b4ef910935629a7d145354f40314150c GIT binary patch literal 138881 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

JhNxWz(jR;|ydeCa;C2AnpExwACw9*3D&&pc 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 c?65YLG({~Ia|B8@OLH+-Ci*Wvo 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 literal 0 HcmV?d00001 diff --git a/src/libs/dateutil/zoneinfo/rebuild.py b/src/libs/dateutil/zoneinfo/rebuild.py new file mode 100644 index 0000000..9d53bb8 --- /dev/null +++ b/src/libs/dateutil/zoneinfo/rebuild.py @@ -0,0 +1,52 @@ +import logging +import os +import tempfile +import shutil +import json +from subprocess import check_call + +from dateutil.zoneinfo import tar_open, METADATA_FN, ZONEFILENAME + + +def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): + """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* + + filename is the timezone tarball from ftp.iana.org/tz. + + """ + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + try: + with tar_open(filename) as tf: + for name in zonegroups: + tf.extract(name, tmpdir) + filepaths = [os.path.join(tmpdir, n) for n in zonegroups] + try: + check_call(["zic", "-d", zonedir] + filepaths) + except OSError as e: + _print_on_nosuchfile(e) + raise + # write metadata file + with open(os.path.join(zonedir, METADATA_FN), 'w') as f: + json.dump(metadata, f, indent=4, sort_keys=True) + target = os.path.join(moduledir, ZONEFILENAME) + with tar_open(target, "w:%s" % format) as tf: + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + finally: + shutil.rmtree(tmpdir) + + +def _print_on_nosuchfile(e): + """Print helpful troubleshooting message + + e is an exception raised by subprocess.check_call() + + """ + if e.errno == 2: + logging.error( + "Could not find zic. Perhaps you need to install " + "libc-bin or some other package that provides it, " + "or it's not in your PATH?") diff --git a/src/docopt.py b/src/libs/docopt.py similarity index 100% rename from src/docopt.py rename to src/libs/docopt.py diff --git a/src/libs/faker/__init__.py b/src/libs/faker/__init__.py new file mode 100644 index 0000000..13896f0 --- /dev/null +++ b/src/libs/faker/__init__.py @@ -0,0 +1,6 @@ +VERSION = '0.8.7' + +from faker.generator import Generator +from faker.factory import Factory + +Faker = Factory.create diff --git a/src/faker/__main__.py b/src/libs/faker/__main__.py similarity index 100% rename from src/faker/__main__.py rename to src/libs/faker/__main__.py diff --git a/src/faker/build_docs.py b/src/libs/faker/build_docs.py similarity index 81% rename from src/faker/build_docs.py rename to src/libs/faker/build_docs.py index a4deede..66d28d1 100644 --- a/src/faker/build_docs.py +++ b/src/libs/faker/build_docs.py @@ -4,6 +4,7 @@ from __future__ import print_function from __future__ import unicode_literals import os +import pprint import sys @@ -28,7 +29,7 @@ def write_provider(fh, doc, provider, formatters, excludes=None): excludes = [] write(fh, '\n') - title = "``faker.providers.{0}``".format(doc.get_provider_name(provider)) + title = "``{0}``".format(doc.get_provider_name(provider)) write(fh, '%s\n' % title) write(fh, "-" * len(title)) write(fh, '\n\n::\n') @@ -37,28 +38,24 @@ def write_provider(fh, doc, provider, formatters, excludes=None): if signature in excludes: continue try: + # `pprint` can't format sets of heterogenous types. + if not isinstance(example, set): + example = pprint.pformat(example, indent=4) lines = text_type(example).expandtabs().splitlines() except UnicodeEncodeError: msg = 'error on "{0}" with value "{1}"'.format(signature, example) raise Exception(msg) - margin = max(30, doc.max_name_len+1) - remains = 150 - margin - separator = '#' write(fh, '\n') - for line in lines: - for i in range(0, (len(line) // remains) + 1): - write(fh, "\t{fake:<{margin}}{separator} {example}".format( - fake=signature, - separator=separator, - example=line[i*remains:(i+1)*remains], - margin=margin - )) - signature = separator = ' ' - write(fh, '\n') + write(fh, "\t{fake}\n{example}\n".format( + fake=signature, + example='\n'.join(['\t# ' + line for line in lines]), + )) def write_docs(*args, **kwargs): - from faker import Faker, documentor, DEFAULT_LOCALE, AVAILABLE_LOCALES + from faker import Faker, documentor + from faker.config import DEFAULT_LOCALE, AVAILABLE_LOCALES + fake = Faker(locale=DEFAULT_LOCALE) from faker.providers import BaseProvider @@ -82,6 +79,7 @@ def write_docs(*args, **kwargs): [write(fh, ' providers/%s\n' % doc.get_provider_name(provider)) for provider, fakers in formatters] + AVAILABLE_LOCALES = list(AVAILABLE_LOCALES) AVAILABLE_LOCALES.sort() for lang in AVAILABLE_LOCALES: fname = os.path.join(DOCS_ROOT, 'locales', '%s.rst' % lang) diff --git a/src/faker/cli.py b/src/libs/faker/cli.py similarity index 59% rename from src/faker/cli.py rename to src/libs/faker/cli.py index 626acb7..acf771f 100644 --- a/src/faker/cli.py +++ b/src/libs/faker/cli.py @@ -7,8 +7,9 @@ import os import sys import argparse -from faker import Faker, Factory, documentor -from faker import VERSION, AVAILABLE_LOCALES, DEFAULT_LOCALE +from faker import Faker, documentor +from faker import VERSION +from faker.config import AVAILABLE_LOCALES, DEFAULT_LOCALE, META_PROVIDERS_MODULES if sys.version < '3': @@ -28,7 +29,7 @@ def print_provider(doc, provider, formatters, excludes=None, output=None): excludes = [] print(file=output) - print("### faker.providers.{0}".format( + print("### {0}".format( doc.get_provider_name(provider)), file=output) print(file=output) @@ -37,10 +38,15 @@ def print_provider(doc, provider, formatters, excludes=None, output=None): continue try: lines = text_type(example).expandtabs().splitlines() + except UnicodeDecodeError: + # The example is actually made of bytes. + # We could coerce to bytes, but that would fail anyway when we wiil + # try to `print` the line. + lines = [""] except UnicodeEncodeError: raise Exception('error on "{0}" with value "{1}"'.format( signature, example)) - margin = max(30, doc.max_name_len+1) + margin = max(30, doc.max_name_len + 1) remains = 150 - margin separator = '#' for line in lines: @@ -48,17 +54,17 @@ def print_provider(doc, provider, formatters, excludes=None, output=None): print("\t{fake:<{margin}}{separator} {example}".format( fake=signature, separator=separator, - example=line[i*remains:(i+1)*remains], + example=line[i * remains:(i + 1) * remains], margin=margin ), file=output) signature = separator = ' ' def print_doc(provider_or_field=None, - args=None, lang=DEFAULT_LOCALE, output=None): + args=None, lang=DEFAULT_LOCALE, output=None, includes=None): args = args or [] output = output or sys.stdout - fake = Faker(locale=lang) + fake = Faker(locale=lang, includes=includes) from faker.providers import BaseProvider base_provider_formatters = [f for f in dir(BaseProvider)] @@ -67,7 +73,7 @@ def print_doc(provider_or_field=None, if '.' in provider_or_field: parts = provider_or_field.split('.') locale = parts[-2] if parts[-2] in AVAILABLE_LOCALES else lang - fake = Factory.create(locale, providers=[parts[-1]]) + fake = Faker(locale, providers=[provider_or_field], includes=includes) doc = documentor.Documentor(fake) doc.already_generated = base_provider_formatters print_provider( @@ -79,8 +85,8 @@ def print_doc(provider_or_field=None, try: print(fake.format(provider_or_field, *args), end='', file=output) except AttributeError: - print('No faker found for "{0}({1})"'.format( - provider_or_field, args), file=output) + raise ValueError('No faker found for "{0}({1})"'.format( + provider_or_field, args)) else: doc = documentor.Documentor(fake) @@ -122,10 +128,39 @@ class Command(object): if default_locale not in AVAILABLE_LOCALES: default_locale = DEFAULT_LOCALE + epilog = """supported locales: + + {0} + + faker can take a locale as an argument, to return localized data. If no + localized provider is found, the factory falls back to the default en_US + locale. + +examples: + + $ faker address + 968 Bahringer Garden Apt. 722 + Kristinaland, NJ 09890 + + $ faker -l de_DE address + Samira-Niemeier-Allee 56 + 94812 Biedenkopf + + $ faker profile ssn,birthdate + {{'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}} + + $ faker -r=3 -s=";" name + Willam Kertzmann; + Josiah Maggio; + Gayla Schmitt; + +""".format(', '.join(sorted(AVAILABLE_LOCALES))) + formatter_class = argparse.RawDescriptionHelpFormatter parser = argparse.ArgumentParser( prog=self.prog_name, description='{0} version {1}'.format(self.prog_name, VERSION), + epilog=epilog, formatter_class=formatter_class) parser.add_argument("--version", action="version", @@ -138,27 +173,56 @@ class Command(object): parser.add_argument('-l', '--lang', choices=AVAILABLE_LOCALES, - default=default_locale) + default=default_locale, + metavar='LOCALE', + help="specify the language for a localized " + "provider (e.g. de_DE)") parser.add_argument('-r', '--repeat', - default=1, type=int) + default=1, + type=int, + help="generate the specified number of outputs") parser.add_argument('-s', '--sep', - default='\n') + default='\n', + help="use the specified separator after each " + "output") - parser.add_argument('fake', action='store', nargs='*') + parser.add_argument('-i', + '--include', + default=META_PROVIDERS_MODULES, + nargs='*', + help="list of additional custom providers to " + "user, given as the import path of the module " + "containing your Provider class (not the provider " + "class itself)") + + parser.add_argument('fake', + action='store', + nargs='?', + help="name of the fake to generate output for " + "(e.g. profile)") + + parser.add_argument('fake_args', + metavar="fake argument", + action='store', + nargs='*', + help="optional arguments to pass to the fake " + "(e.g. the profile fake takes an optional " + "list of comma separated field names as the " + "first argument)") arguments = parser.parse_args(self.argv[1:]) for i in range(arguments.repeat): - fake = arguments.fake[0] if len(arguments.fake) else None - - print_doc(fake, - arguments.fake[1:], + print_doc(arguments.fake, + arguments.fake_args, lang=arguments.lang, - output=arguments.o) + output=arguments.o, + includes=arguments.include + ) print(arguments.sep, file=arguments.o) - if not fake: + if not arguments.fake: # repeat not supported for all docs break diff --git a/src/libs/faker/compat.py b/src/libs/faker/compat.py new file mode 100644 index 0000000..0eb8254 --- /dev/null +++ b/src/libs/faker/compat.py @@ -0,0 +1,27 @@ +try: + from inspect import getfullargspec as _getargspec +except ImportError: + from inspect import getargspec as _getargspec + + +class getargspec(object): + def __init__(self, method): + self.argspec = _getargspec(method) + + @property + def args(self): + return self.argspec.args + + @property + def varargs(self): + return self.argspec.varargs + + @property + def varkw(self): + if hasattr(self.argspec, 'keywords'): + return self.argspec.keywords + return self.argspec.varkw + + @property + def defaults(self): + return self.argspec.defaults diff --git a/src/libs/faker/config.py b/src/libs/faker/config.py new file mode 100644 index 0000000..3796de8 --- /dev/null +++ b/src/libs/faker/config.py @@ -0,0 +1,13 @@ +# coding=utf-8 +from importlib import import_module +from faker.utils.loading import find_available_locales, find_available_providers + +DEFAULT_LOCALE = 'en_US' + +META_PROVIDERS_MODULES = [ + 'faker.providers', +] + +PROVIDERS = find_available_providers([import_module(path) for path in META_PROVIDERS_MODULES]) + +AVAILABLE_LOCALES = find_available_locales(PROVIDERS) diff --git a/src/faker/documentor.py b/src/libs/faker/documentor.py similarity index 88% rename from src/faker/documentor.py rename to src/libs/faker/documentor.py index 77d43eb..a936420 100644 --- a/src/faker/documentor.py +++ b/src/libs/faker/documentor.py @@ -4,6 +4,8 @@ from __future__ import unicode_literals import inspect +from .compat import getargspec + from faker import utils @@ -39,16 +41,20 @@ class Documentor(object): formatters = {} for name, method in inspect.getmembers(provider, inspect.ismethod): - # skip 'private' method and inherited methods if name.startswith('_') or name in self.already_generated: continue arguments = [] + faker_args = [] + faker_kwargs = {} + + if name == 'binary': + faker_kwargs['length'] = 1024 if with_args: # retrieve all parameter - argspec = inspect.getargspec(method) + argspec = getargspec(method) lst = [x for x in argspec.args if x not in ['self', 'cls']] for i, arg in enumerate(lst): @@ -75,8 +81,8 @@ class Documentor(object): if with_args != 'first': if argspec.varargs: arguments.append('*' + argspec.varargs) - if argspec.keywords: - arguments.append('**' + argspec.keywords) + if argspec.varkw: + arguments.append('**' + argspec.varkw) # build fake method signature signature = "{0}{1}({2})".format(prefix, @@ -84,7 +90,7 @@ class Documentor(object): ", ".join(arguments)) # make a fake example - example = self.generator.format(name) + example = self.generator.format(name, *faker_args, **faker_kwargs) formatters[signature] = example diff --git a/src/faker/factory.py b/src/libs/faker/factory.py similarity index 60% rename from src/faker/factory.py rename to src/libs/faker/factory.py index e071f96..79b9a7f 100644 --- a/src/faker/factory.py +++ b/src/libs/faker/factory.py @@ -3,18 +3,20 @@ from __future__ import unicode_literals from __future__ import absolute_import +from importlib import import_module import locale as pylocale -import sys -from faker import DEFAULT_LOCALE, DEFAULT_PROVIDERS, AVAILABLE_LOCALES from faker import Generator -from faker import providers as providers_mod +from faker.config import DEFAULT_LOCALE, PROVIDERS, AVAILABLE_LOCALES +from faker.utils.loading import list_module class Factory(object): @classmethod - def create(cls, locale=None, providers=None, generator=None, **config): + def create(cls, locale=None, providers=None, generator=None, includes=None, **config): + if includes is None: + includes = [] # fix locale to package name locale = locale.replace('-', '_') if locale else DEFAULT_LOCALE @@ -23,12 +25,17 @@ class Factory(object): msg = 'Invalid configuration for faker locale "{0}"'.format(locale) raise AttributeError(msg) - providers = providers or DEFAULT_PROVIDERS + config['locale'] = locale + providers = providers or PROVIDERS + + providers += includes faker = generator or Generator(**config) - faker.add_provider(providers_mod.BaseProvider) for prov_name in providers: + if prov_name == 'faker.providers': + continue + prov_cls, lang_found = cls._get_provider_class(prov_name, locale) provider = prov_cls(faker) provider.__provider__ = prov_name @@ -61,17 +68,21 @@ class Factory(object): raise ValueError(msg) @classmethod - def _find_provider_class(cls, provider, locale=''): + def _find_provider_class(cls, provider_path, locale=None): + provider_module = import_module(provider_path) - path = "{providers}{lang}.{provider}".format( - providers=providers_mod.__package__ or providers_mod.__name__, - lang='.' + locale if locale else '', - provider=provider - ) + if getattr(provider_module, 'localized', False): + available_locales = list_module(provider_module) + if not locale or locale not in available_locales: + locale = getattr(provider_module, 'default_locale', DEFAULT_LOCALE) - try: - __import__(path) - except ImportError: - return None + path = "{provider_path}.{locale}".format( + provider_path=provider_path, + locale=locale, + ) + provider_module = import_module(path) + else: + if locale is not None: + provider_module = import_module(provider_path) - return sys.modules[path].Provider + return provider_module.Provider diff --git a/src/faker/generator.py b/src/libs/faker/generator.py similarity index 72% rename from src/faker/generator.py rename to src/libs/faker/generator.py index 7b383be..73835c3 100644 --- a/src/faker/generator.py +++ b/src/libs/faker/generator.py @@ -3,10 +3,12 @@ from __future__ import unicode_literals import re -import random +import random as random_module _re_token = re.compile(r'\{\{(\s?)(\w+)(\s?)\}\}') +random = random_module.Random() +mod_random = random # compat with name released in 0.8 class Generator(object): @@ -17,6 +19,7 @@ class Generator(object): self.providers = [] self.__config = dict( list(self.__config.items()) + list(config.items())) + self.__random = random def add_provider(self, provider): @@ -49,8 +52,19 @@ class Generator(object): """Returns added providers.""" return self.providers - def seed(self, seed=None): + @property + def random(self): + return self.__random + + def seed_instance(self, seed=None): """Calls random.seed""" + if self.__random == random: + # create per-instance random obj when first time seed_instance() is called + self.__random = random_module.Random() + self.__random.seed(seed) + + @classmethod + def seed(cls, seed=None): random.seed(seed) def format(self, formatter, *args, **kwargs): @@ -64,7 +78,15 @@ class Generator(object): try: return getattr(self, formatter) except AttributeError: - raise AttributeError('Unknown formatter "{0}"'.format(formatter)) + if 'locale' in self.__config: + msg = 'Unknown formatter "{0}" with locale "{1}"'.format( + formatter, self.__config['locale'] + ) + else: + raise AttributeError('Unknown formatter "{0}"'.format( + formatter + )) + raise AttributeError(msg) def set_formatter(self, name, method): """ diff --git a/src/faker/providers/__init__.py b/src/libs/faker/providers/__init__.py similarity index 53% rename from src/faker/providers/__init__.py rename to src/libs/faker/providers/__init__.py index a876d2f..eb1f176 100644 --- a/src/faker/providers/__init__.py +++ b/src/libs/faker/providers/__init__.py @@ -1,8 +1,9 @@ # coding=utf-8 +from collections import Counter import re -import random import string + from faker.utils.distribution import choice_distribution @@ -21,8 +22,7 @@ class BaseProvider(object): def __init__(self, generator): self.generator = generator - @classmethod - def random_int(cls, min=0, max=9999): + def random_int(self, min=0, max=9999): """ Returns a random integer between two values. @@ -30,66 +30,65 @@ class BaseProvider(object): :param max: upper bound value (inclusive; default=9999) :returns: random integer between min and max """ - return random.randint(min, max) + return self.generator.random.randint(min, max) - @classmethod - def random_digit(cls): + def random_digit(self): """ Returns a random digit/number between 0 and 9. """ - return random.randint(0, 9) + return self.generator.random.randint(0, 9) - @classmethod - def random_digit_not_null(cls): + def random_digit_not_null(self): """ Returns a random non-zero digit/number between 1 and 9. """ - return random.randint(1, 9) + return self.generator.random.randint(1, 9) - @classmethod - def random_digit_or_empty(cls): + def random_digit_or_empty(self): """ Returns a random digit/number between 0 and 9 or an empty string. """ - if random.randint(0, 1): - return random.randint(0, 9) + if self.generator.random.randint(0, 1): + return self.generator.random.randint(0, 9) else: return '' - @classmethod - def random_digit_not_null_or_empty(cls): + def random_digit_not_null_or_empty(self): """ Returns a random non-zero digit/number between 1 and 9 or and empty string. """ - if random.randint(0, 1): - return random.randint(1, 9) + if self.generator.random.randint(0, 1): + return self.generator.random.randint(1, 9) else: return '' - @classmethod - def random_number(cls, digits=None): + def random_number(self, digits=None, fix_len=False): """ - Returns a random number with 1 digit (default, when digits==None) - or a random number with 0 to given number of digits. + Returns a random number with 1 digit (default, when digits==None), + a random number with 0 to given number of digits, or a random number + with given number to given number of digits (when ``fix_len==True``). :param digits: maximum number of digits - :returns: random number with 0 to given number of digits + :param fix_len: should the number have fixed length? + :returns: random number with 0 to given number of digits or + fixed length number """ if digits is None: - digits = BaseProvider.random_digit() - return random.randint(0, pow(10, digits) - 1) + digits = self.random_digit() + if fix_len: + return self.generator.random.randint(pow(10, digits - 1), pow(10, digits) - 1) + else: + return self.generator.random.randint(0, pow(10, digits) - 1) - @classmethod - def random_letter(cls): + def random_letter(self): """Returns a random letter (between a-z and A-Z).""" - return random.choice(getattr(string, 'letters', string.ascii_letters)) + return self.generator.random.choice(getattr(string, 'letters', string.ascii_letters)) - @classmethod - def random_element(cls, elements=('a', 'b', 'b')): + def random_element(self, elements=('a', 'b', 'c')): """ Returns a random element from a passed object. @@ -109,12 +108,35 @@ class BaseProvider(object): if isinstance(elements, dict): choices = elements.keys() probabilities = elements.values() - return choice_distribution(list(choices), list(probabilities)) + return choice_distribution(list(choices), list(probabilities), self.generator.random) else: - return random.choice(list(elements)) + return self.generator.random.choice(list(elements)) - @classmethod - def randomize_nb_elements(cls, number=10, le=False, ge=False): + def random_sample(self, elements=('a', 'b', 'c'), length=None): + if length is None: + length = self.generator.random.randint(1, len(elements)) + + return [self.random_element(elements) for _ in range(length)] + + def random_sample_unique(self, elements=('a', 'b', 'c'), length=None): + """ + Returns a `set` of random unique elements for the specified length. + Multiple occurances of the same value increase its probabilty to be in the output. + """ + elements = Counter(elements) + if length is None: + length = self.generator.random.randint(1, len(elements)) + + if length > len(elements): + raise ValueError("Sample length cannot be longer than the number of unique elements to pick from.") + sample = set() + for _ in range(length): + element = self.random_element(elements) + sample.add(element) + elements.pop(element) + return sample + + def randomize_nb_elements(self, number=10, le=False, ge=False, min=None, max=None): """ Returns a random value near number. @@ -127,10 +149,14 @@ class BaseProvider(object): return number _min = 100 if ge else 60 _max = 100 if le else 140 - return int(number * random.randint(_min, _max) / 100) + 1 + nb = int(number * self.generator.random.randint(_min, _max) / 100) + if min is not None and nb < min: + nb = min + if max is not None and nb > min: + nb = max + return nb - @classmethod - def numerify(cls, text='###'): + def numerify(self, text='###'): """ Replaces all placeholders in given text with randomized values, replacing: all hash sign ('#') occurrences with a random digit @@ -144,35 +170,34 @@ class BaseProvider(object): :returns: string with all numerical placeholders filled in """ text = _re_hash.sub( - lambda x: str(BaseProvider.random_digit()), + lambda x: str(self.random_digit()), text) text = _re_perc.sub( - lambda x: str(BaseProvider.random_digit_not_null()), + lambda x: str(self.random_digit_not_null()), text) text = _re_excl.sub( - lambda x: str(BaseProvider.random_digit_or_empty()), + lambda x: str(self.random_digit_or_empty()), text) text = _re_at.sub( - lambda x: str(BaseProvider.random_digit_not_null_or_empty()), + lambda x: str(self.random_digit_not_null_or_empty()), text) return text - @classmethod - def lexify(cls, text='????'): + def lexify(self, text='????', letters=string.ascii_letters): """ Replaces all question mark ('?') occurrences with a random letter. :param text: string to be parsed + :param letters: a set of letters to choose from. :returns: string with all letter placeholders filled in """ - return _re_qm.sub(lambda x: BaseProvider.random_letter(), text) + return _re_qm.sub(lambda x: self.random_element(letters), text) - @classmethod - def bothify(cls, text='## ??'): + def bothify(self, text='## ??', letters=string.ascii_letters): """ Replaces all placeholders with random numbers and letters. :param text: string to be parsed :returns: string with all numerical and letter placeholders filled in """ - return BaseProvider.lexify(BaseProvider.numerify(text)) + return self.lexify(self.numerify(text), letters=letters) diff --git a/src/faker/providers/address.py b/src/libs/faker/providers/address/__init__.py similarity index 58% rename from src/faker/providers/address.py rename to src/libs/faker/providers/address/__init__.py index 9e6f82b..ff39972 100644 --- a/src/faker/providers/address.py +++ b/src/libs/faker/providers/address/__init__.py @@ -1,10 +1,11 @@ # coding=utf-8 - from __future__ import unicode_literals from decimal import Decimal -import random -from . import BaseProvider -from . import date_time + +from .. import BaseProvider +from .. import date_time + +localized = True class Provider(BaseProvider): @@ -17,27 +18,25 @@ class Provider(BaseProvider): building_number_formats = ('##', ) postcode_formats = ('#####', ) countries = [tz['name'] for tz in date_time.Provider.countries] + country_codes = [tz['code'] for tz in date_time.Provider.countries] - @classmethod - def city_suffix(cls): + def city_suffix(self): """ :example 'town' """ - return cls.random_element(cls.city_suffixes) + return self.random_element(self.city_suffixes) - @classmethod - def street_suffix(cls): + def street_suffix(self): """ :example 'Avenue' """ - return cls.random_element(cls.street_suffixes) + return self.random_element(self.street_suffixes) - @classmethod - def building_number(cls): + def building_number(self): """ :example '791' """ - return cls.numerify(cls.random_element(cls.building_number_formats)) + return self.numerify(self.random_element(self.building_number_formats)) def city(self): """ @@ -60,12 +59,11 @@ class Provider(BaseProvider): pattern = self.random_element(self.street_address_formats) return self.generator.parse(pattern) - @classmethod - def postcode(cls): + def postcode(self): """ :example 86039-9874 """ - return cls.bothify(cls.random_element(cls.postcode_formats)).upper() + return self.bothify(self.random_element(self.postcode_formats)).upper() def address(self): """ @@ -74,26 +72,27 @@ class Provider(BaseProvider): pattern = self.random_element(self.address_formats) return self.generator.parse(pattern) - @classmethod - def country(cls): - return cls.random_element(cls.countries) + def country(self): + return self.random_element(self.countries) - @classmethod - def geo_coordinate(cls, center=None, radius=0.001): + def country_code(self): + return self.random_element(self.country_codes) + + def geo_coordinate(self, center=None, radius=0.001): """ Optionally center the coord and pick a point within radius. """ - if not center: - return Decimal(str(random.randint(-180000000, 180000000) / 1000000.0)).quantize(Decimal('.000001')) + if center is None: + return Decimal(str(self.generator.random.randint(-180000000, 180000000) / 1000000.0)).quantize(Decimal('.000001')) else: - geo = random.uniform(center - radius, center + radius) - return Decimal(str(geo)) + center = float(center) + radius = float(radius) + geo = self.generator.random.uniform(center - radius, center + radius) + return Decimal(str(geo)).quantize(Decimal('.000001')) - @classmethod - def latitude(cls): + def latitude(self): # Latitude has a range of -90 to 90, so divide by two. - return cls.geo_coordinate() / 2 + return self.geo_coordinate() / 2 - @classmethod - def longitude(cls): - return cls.geo_coordinate() + def longitude(self): + return self.geo_coordinate() diff --git a/src/libs/faker/providers/address/cs_CZ/__init__.py b/src/libs/faker/providers/address/cs_CZ/__init__.py new file mode 100644 index 0000000..29570a9 --- /dev/null +++ b/src/libs/faker/providers/address/cs_CZ/__init__.py @@ -0,0 +1,758 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + + city_formats = ('{{city_name}}', ) + + street_name_formats = ('{{street_name}}', ) + street_address_formats = ('{{street_name}} {{building_number}}', ) + address_formats = ('{{street_address}}\n{{postcode}} {{city}}', ) + + building_number_formats = ('###', '##', '#', '#/#') + + street_suffixes_long = ('náměstí', ) + street_suffixes_short = ('nám.', ) + + postcode_formats = ('### ##', ) + + cities = ( + 'Abertamy', 'Adamov', 'Andělská Hora', 'Bakov nad Jizerou', 'Bavorov', + 'Bechyně', 'Benešov nad Ploučnicí', 'Benátky nad Jizerou', + 'Bezdružice', 'Bečov nad Teplou', 'Blatná', 'Blovice', 'Blšany', + 'Bochov', 'Bohušovice nad Ohří', 'Bojkovice', 'Bor', 'Borohrádek', + 'Borovany', 'Boží Dar', 'Brandýs nad Orlicí', 'Brno', 'Broumov', + 'Brtnice', 'Brumov-Bylnice', 'Brušperk', 'Budišov nad Budišovkou', + 'Budyně nad Ohří', 'Bučovice', 'Buštěhrad', 'Bystré', 'Bystřice', + 'Bystřice nad Pernštejnem', 'Bystřice pod Hostýnem', 'Bzenec', + 'Bílovec', 'Bělá nad Radbuzou', 'Bělá pod Bezdězem', 'Březnice', + 'Březová', 'Březová nad Svitavou', 'Břidličná', 'Chabařovice', + 'Chlumec', 'Chlumec nad Cidlinou', 'Choceň', 'Chomutov', 'Chotěboř', + 'Chrast', 'Chrastava', 'Chropyně', 'Chvaletice', 'Chyše', 'Chýnov', + 'Chřibská', 'Cvikov', 'Dačice', 'Dašice', 'Desná', 'Deštná', + 'Dobrovice', 'Dobruška', 'Dobřany', 'Dobřichovice', 'Dobříš', 'Doksy', + 'Dolní Benešov', 'Dolní Bousov', 'Dolní Kounice', 'Dolní Poustevna', + 'Dubá', 'Dubí', 'Dubňany', 'Duchcov', 'Děčín', 'Františkovy Lázně', + 'Fryšták', 'Frýdek-Místek', 'Frýdlant', 'Frýdlant nad Ostravicí', + 'Fulnek', 'Golčův Jeníkov', 'Habartov', 'Habry', 'Hanušovice', + 'Harrachov', 'Hartmanice', 'Havířov', 'Hejnice', 'Heřmanův Městec', + 'Hlinsko', 'Hluboká nad Vltavou', 'Hluk', 'Hodkovice nad Mohelkou', + 'Holice', 'Holýšov', 'Hora Svaté Kateřiny', 'Horažďovice', + 'Horní Benešov', 'Horní Blatná', 'Horní Bříza', 'Horní Cerekev', + 'Horní Jelení', 'Horní Jiřetín', 'Horní Planá', 'Horní Slavkov', + 'Horšovský Týn', 'Hostinné', 'Hostivice', 'Hostomice', 'Hostouň', + 'Hořice', 'Hořovice', 'Hoštka', 'Hradec Králové', + 'Hradec nad Moravicí', 'Hranice (okres Cheb)', 'Hrob', + 'Hrochův Týnec', 'Hronov', 'Hrotovice', 'Hroznětín', + 'Hrušovany nad Jevišovkou', 'Hrádek', 'Hrádek nad Nisou', 'Hulín', + 'Husinec', 'Hustopeče', 'Ivanovice na Hané', 'Ivančice', + 'Jablonec nad Jizerou', 'Jablonec nad Nisou', 'Jablonné nad Orlicí', + 'Jablonné v Podještědí', 'Jablunkov', 'Janov', 'Janovice nad Úhlavou', + 'Janské Lázně', 'Jaroměřice nad Rokytnou', 'Javorník', 'Jemnice', + 'Jesenice (okres Rakovník)', 'Jevišovice', 'Jevíčko', 'Jihlava', + 'Jilemnice', 'Jistebnice', 'Jiříkov', 'Jáchymov', 'Jílové', + 'Jílové u Prahy', 'Kamenice nad Lipou', 'Kamenický Šenov', 'Kaplice', + 'Kardašova Řečice', 'Karlovy Vary', 'Karolinka', 'Karviná', + 'Kasejovice', 'Kaznějov', 'Kašperské Hory', 'Kdyně', 'Kelč', 'Kladno', + 'Kladruby', 'Klecany', 'Klimkovice', 'Klobouky u Brna', 'Kojetín', + 'Konice', 'Kopidlno', 'Koryčany', 'Kosmonosy', 'Kostelec na Hané', + 'Kostelec nad Labem', 'Kostelec nad Orlicí', + 'Kostelec nad Černými lesy', 'Kouřim', 'Košťany', 'Kožlany', + 'Kralovice', 'Kraslice', 'Kravaře', 'Kryry', 'Králíky', 'Králův Dvůr', + 'Krásno', 'Krásná Hora nad Vltavou', 'Krásná Lípa', 'Krásné Údolí', + 'Kunovice', 'Kunštát', 'Kynšperk nad Ohří', 'Lanžhot', + 'Ledeč nad Sázavou', 'Ledvice', 'Letohrad', 'Letovice', 'Liberec', + 'Libochovice', 'Libušín', 'Libáň', 'Libčice nad Vltavou', 'Liběchov', + 'Lipník nad Bečvou', 'Litovel', 'Lišov', 'Loket', 'Lom', + 'Lomnice nad Lužnicí', 'Lomnice nad Popelkou', 'Loučná pod Klínovcem', + 'Lovosice', 'Loštice', 'Luby', 'Luhačovice', 'Lučany nad Nisou', + 'Luže', 'Lysá nad Labem', 'Lázně Bohdaneč', 'Lázně Bělohrad', + 'Lázně Kynžvart', 'Manětín', 'Mašťov', 'Meziboří', 'Meziměstí', + 'Mikulov', 'Mikulášovice', 'Miletín', 'Milevsko', 'Milovice', 'Mimoň', + 'Miroslav', 'Mirotice', 'Mirovice', 'Mirošov', 'Mladá Boleslav', + 'Mladá Vožice', 'Mnichovice', 'Mnichovo Hradiště', 'Mníšek pod Brdy', + 'Modřice', 'Mohelnice', 'Moravské Budějovice', 'Moravský Beroun', + 'Moravský Krumlov', 'Morkovice-Slížany', 'Most', 'Mýto', + 'Městec Králové', 'Město Albrechtice', 'Město Touškov', 'Měčín', + 'Mšeno', 'Nalžovské Hory', 'Napajedla', 'Nasavrky', 'Nechanice', + 'Nejdek', 'Nepomuk', 'Netolice', 'Neveklov', 'Nová Bystřice', + 'Nová Paka', 'Nová Role', 'Nová Včelnice', 'Nové Hrady', + 'Nové Město nad Metují', 'Nové Město pod Smrkem', 'Nové Sedlo', + 'Nové Strašecí', 'Nový Bydžov', 'Nový Knín', 'Náměšť nad Oslavou', + 'Nýrsko', 'Nýřany', 'Němčice nad Hanou', 'Odolena Voda', 'Odry', + 'Olešnice', 'Olomouc', 'Oloví', 'Opava', 'Opočno', 'Osek', 'Osečná', + 'Oslavany', 'Ostrava', 'Pacov', 'Pardubice', 'Paskov', + 'Pec pod Sněžkou', 'Petřvald', 'Pečky', 'Pilníkov', 'Planá', + 'Planá nad Lužnicí', 'Plasy', 'Plesná', 'Plumlov', 'Plzeň', 'Plánice', + 'Poběžovice', 'Podbořany', 'Podivín', 'Pohořelice', + 'Police nad Metují', 'Polička', 'Polná', 'Postoloprty', 'Potštát', + 'Počátky', 'Praha', 'Proseč', 'Prostějov', 'Protivín', 'Pyšely', + 'Přebuz', 'Přelouč', 'Přerov', 'Přeštice', 'Přibyslav', 'Přimda', + 'Příbor', 'Rabí', 'Radnice', 'Rajhrad', 'Ralsko', 'Raspenava', + 'Rejštejn', 'Rokytnice nad Jizerou', 'Rokytnice v Orlických horách', + 'Ronov nad Doubravou', 'Rosice', 'Rotava', 'Rousínov', + 'Rovensko pod Troskami', 'Roztoky', 'Rožmberk nad Vltavou', + 'Rožmitál pod Třemšínem', 'Rožďalovice', 'Rtyně v Podkrkonoší', + 'Rudná', 'Rudolfov', 'Rychnov u Jablonce nad Nisou', 'Rychvald', + 'Rájec-Jestřebí', 'Rýmařov', 'Sadská', 'Sedlec-Prčice', 'Sedlice', + 'Sedlčany', 'Semily', 'Sezemice', 'Sezimovo Ústí', 'Seč', 'Skalná', + 'Skuteč', 'Slatiňany', 'Slavičín', 'Slavkov u Brna', 'Slavonice', + 'Slušovice', 'Smečno', 'Smiřice', 'Smržovka', 'Sobotka', 'Soběslav', + 'Solnice', 'Spálené Poříčí', 'Staré Město (okres Uherské Hradiště)', + 'Staré Město (okres Šumperk)', 'Starý Plzenec', 'Staňkov', 'Stochov', + 'Stod', 'Strmilov', 'Stráž nad Nežárkou', 'Stráž pod Ralskem', + 'Strážnice', 'Strážov', 'Studénka', 'Stárkov', 'Stříbro', + 'Suchdol nad Lužnicí', 'Svoboda nad Úpou', 'Svratka', + 'Světlá nad Sázavou', 'Sázava', 'Tanvald', 'Telč', 'Teplice', + 'Teplice nad Metují', 'Teplá', 'Terezín', 'Tišnov', 'Toužim', + 'Tovačov', 'Trhové Sviny', 'Trhový Štěpánov', 'Trmice', + 'Týn nad Vltavou', 'Týnec nad Labem', 'Týnec nad Sázavou', + 'Týniště nad Orlicí', 'Třebechovice pod Orebem', 'Třebenice', 'Třeboň', + 'Třemošnice', 'Třemošná', 'Třešť', 'Uherský Ostroh', + 'Uhlířské Janovice', 'Unhošť', 'Valašské Klobouky', 'Valtice', + 'Vamberk', 'Vejprty', 'Velešín', 'Velká Bystřice', 'Velká Bíteš', + 'Velké Bílovice', 'Velké Hamry', 'Velké Opatovice', 'Velké Pavlovice', + 'Velký Šenov', 'Veltrusy', 'Velvary', 'Verneřice', + 'Veselí nad Lužnicí', 'Vidnava', 'Vimperk', 'Vizovice', + 'Vlachovo Březí', 'Vodňany', 'Volary', 'Volyně', 'Votice', 'Vracov', + 'Vratimov', 'Vrbno pod Pradědem', 'Vroutek', 'Vysoké Veselí', + 'Vysoké nad Jizerou', 'Vyšší Brod', 'Vítkov', 'Výsluní', 'Všeruby', + 'Zbiroh', 'Zbýšov', 'Zdice', 'Zlaté Hory', 'Zliv', 'Zlín', + 'Zruč nad Sázavou', 'Zubří', 'Zákupy', 'Zásmuky', 'Újezd u Brna', + 'Úpice', 'Úsov', 'Ústí nad Labem', 'Úterý', 'Úvaly', 'Úštěk', + 'Černovice', 'Černošice', 'Černošín', 'Červená Řečice', + 'Červený Kostelec', 'Česká Kamenice', 'Česká Skalice', + 'České Budějovice', 'České Velenice', 'Český Brod', 'Český Dub', + 'Řevnice', 'Šenov', 'Šlapanice', 'Šluknov', 'Špindlerův Mlýn', + 'Štramberk', 'Štíty', 'Štětí', 'Švihov', 'Žacléř', 'Žamberk', 'Žandov', + 'Ždánice', 'Ždírec nad Doubravou', 'Žebrák', 'Železnice', + 'Železná Ruda', 'Železný Brod', 'Židlochovice', 'Žirovnice', 'Žlutice', + 'Žulová') + + streets = ( + 'Horní Stromky', + 'Vizovická', + 'K Brusce', + 'Mírová', + 'Rašínská', + 'Boušova', + 'Pobřežní', + 'Dolnobřežanská', + 'Černá', + 'Šůrova', + 'Červenkova', + 'Nad Mostem', + 'Libuňská', + 'Chotovická', + 'Petříkova', + 'Pod Vodárenskou Věží', + 'Na Fišerce', + 'Ke Březině', + 'Za Lázeňkou', + 'Nad Šafránkou', + 'Na Laurové', + 'Nám. Republiky', + 'Vlašimská', + 'Nad Rohatci', + 'Tylišovská', + 'Nábřeží Kapitána Jaroše', + 'Lešovská', + 'U Podjezdu', + 'Průškova', + 'Estonská', + 'Máslova', + 'K Otočce', + 'Jižní', + 'Švecova', + 'Mongolská', + 'Kalská', + 'Nad Rokytkou', + 'Malešovská', + 'Plzeňská', + 'V Hájkách', + 'Úpská', + 'Ambrožova', + 'Pikovická', + 'Neužilova', + 'Na Staré Vinici', + 'Vstupní', + 'Nýdecká', + 'U Společenské Zahrady', + 'Ostrovského', + 'Bazovského', + 'Lešenská', + 'Na Štamberku', + 'Na Svahu', + 'Výhledské Nám.', + 'K Lipám', + 'Za Stadionem', + 'Opletalova', + 'Nábřeží Ludvíka Svobody', + 'Komenského Nám.', + 'Křimická', + 'Domkovská', + 'Pyšelská', + 'Štychova', + 'Horákova', + 'Nad Zavážkou', + 'K Prelátům', + 'Vašátkova', + 'Benákova', + 'Náměstí Prezidenta Masaryka', + 'Mílovská', + 'U Hostivařského Nádraží', + 'Jihovýchodní I', + 'Hostivařské Nám.', + 'Zbynická', + 'Heineho', + 'U Dobešky', + 'Doubická', + 'Ke Břvům', + 'Na Záhonech', + 'Kloboukova', + 'Kostnické Náměstí', + 'Pelclova', + 'Smotlachova', + 'Pod Spiritkou', + 'Hůlkova', + 'Matenská', + 'Do Zahrádek Ii', + 'Dobrošovská', + 'Lovčenská', + 'Jasná I', + 'Škrétova', + 'Moravanů', + 'Budapešťská', + 'Kojetická', + 'Náměstí I. P. Pavlova', + 'Bajkalská', + 'U Větrolamu', + 'Vlčická', + 'Jarešova', + 'Sámova', + 'Kotrčová', + 'Musílkova', + 'Ingrišova', + 'U Nových Domů I', + 'Dělostřelecká', + 'Ke Hrázi', + 'Mochovská', + 'Rýmařovská', + 'Dolní Chaloupky', + 'Za Arielem', + 'U Rajské Zahrady', + 'K Šedivce', + 'Březová', + 'Doubravínova', + 'Mládkova', + 'Tachovské Náměstí', + 'Lehárova', + 'Severní X', + 'V Tehovičkách', + 'Bermanova', + 'Grammova', + 'Spojovací', + 'Verdunská', + 'Závrchy', + 'Čerpadlová', + 'Vítězná', + 'Nad Plynovodem', + 'U Smíchovského Hřbitova', + 'Nedvědovo Náměstí', + 'Bachova', + 'U Dálnice', + 'Všejanská', + 'Maňákova', + 'Rokytnická', + 'Loděnická', + 'U Pumpy', + 'Michnova', + 'Záblatská', + 'Poslední', + 'Hněvkovského', + 'Za Křížem', + 'Nad Návsí', + 'Jablonecká', + 'Súdánská', + 'Mazancova', + 'Pod Čertovou Skalou', + 'Weilova', + 'Čajkovského', + 'Nad Zátiším', + 'Moldavská', + 'Juarézova', + 'Žižkova', + 'Pod Lochkovem', + 'Nad Vernerákem', + 'Žherská', + 'Prusíkova', + 'Výtoňská', + 'Na Srážku', + 'Šachovská', + 'Nučická', + 'Novákovo Náměstí', + 'Sitteho', + 'U Vápenice', + 'Na Kuthence', + 'Čelakovského Sady', + 'V Závitu', + 'Na Vartě', + 'Oválová', + 'Machovická', + 'Nad Olšinami', + 'Vajgarská', + 'Kulhavého', + 'Kodaňská', + 'Kralupská', + 'Lednická', + 'Pod Velkým Hájem', + 'Hvězdonická', + 'Na Kozinci', + 'Semická', + 'K Dálnici', + 'Trytova', + 'Vyhlídkova', + 'Pohnertova', + 'U Nového Dvora', + 'K Vodě', + 'Nad Libří', + 'K Matěji', + 'V Kotcích', + 'Kohoutových', + 'Na Cikánce', + 'Chládkova', + 'Slatiňanská', + 'Pod Kostelem', + 'Na Spojce', + 'Na Zahrádkách', + 'Nad Obcí', + 'K Přehradám', + 'Na Náspu', + 'V Nížinách', + 'Josefa Houdka', + 'Na Pěšině', + 'Hnězdenská', + 'Za Statky', + 'Kremnická', + 'Čestmírova', + 'U Rakovky', + 'Kodicilova', + 'K Lučinám', + 'Nouzov', + 'Krátký Lán', + 'Anny Drabíkové', + 'Kadaňská', + 'Stroupežnického', + 'Jírova', + 'U Dětského Hřiště', + 'Žofie Podlipské', + 'Nad Šancemi', + 'Lošáková', + 'Roblínská', + 'Mezi Sklady', + 'Na Pomezí', + 'U Mlýnského Rybníka', + 'Makedonská', + 'K Dýmači', + 'V Zátiší', + 'Pohořelec', + 'Jiřinková', + 'U Nové Dálnice', + 'Čuprova', + 'Vraňanská', + 'Severovýchodní Vi', + 'Petřínská', + 'K Hořavce', + 'Sádovská', + 'Pod Průsekem', + 'Konžská', + 'Dřítenská', + 'Pirinská', + 'U Hřiště', + 'Kukelská', + 'Moravanská', + 'Koclířova', + 'Žilinská', + 'Ve Žlíbku', + 'Veronské Nám.', + 'U Větrníku', + 'Svojsíkova', + 'Izraelská', + 'Staňkovka', + 'Na Viničních Horách', + 'Čankovská', + 'Na Špitálce', + 'Valdovská', + 'Rudoltická', + 'Ke Strašnické', + 'Paťanka', + 'Panuškova', + 'Pankrácké Nám.', + 'Budčická', + 'Šermířská', + 'Medlovská', + 'K Vidouli', + 'Horní Chaloupky', + 'V Americe', + 'Dejvická', + 'Klášterecká', + 'Šárovo Kolo', + 'Mladoboleslavská', + 'Palackého', + 'Lumiérů', + 'Ivančická', + 'Za Valem', + 'Na Břevnovské Pláni', + 'Tichonická', + 'Náměstí Hrdinů', + 'Mistřínská', + 'Křížkovského', + 'Tanvaldská', + 'V Padolině', + 'Před Skalkami Ii', + 'Na Křivce', + 'Nad Zámečkem', + 'Nad Krocínkou', + 'Podlešínská', + 'Nad Popelkou', + 'Oderská', + 'Jeruzalémská', + 'Smolenská', + 'Lebeděvova', + 'Libichovská', + 'Na Šafránce', + 'Průjezdná', + 'Záluské', + 'Branišovská', + 'Spinozova', + 'K Betáni', + 'Machuldova', + 'Podohradská', + 'Cerhenická', + 'V Brůdku', + 'U Vlachovky', + 'Pod Letištěm', + 'Vlastislavova', + 'Klecanská', + 'Žinkovská', + 'Maltézské Náměstí', + 'Boršov', + 'Mukařovského', + 'Josefa Šimůnka', + 'Suchdolská', + 'Opočínská', + 'Heydukova', + 'Vršovka', + 'Thurnova', + 'Mezilesní', + 'Za Pivovarem', + 'Uljanovská', + 'Panenská', + 'Sladovnická', + 'Plynární', + 'Kozácká', + 'Vlasákova', + 'Javornická', + 'Ševčíkova', + 'Podle Náhonu', + 'Doubravická', + 'Františka Černého', + 'Chotětovská', + 'K Háječku', + 'Pod Výšinkou', + 'U Šesté Baterie', + 'Drahanská', + 'Augustova', + 'U Balabenky', + 'Boční I', + 'Jirčanská', + 'Na Šubě', + 'Brixiho', + 'Klímova', + 'Kazín', + 'Fügnerovo Náměstí', + 'Na Příčné Mezi', + 'Plánická', + 'Africká', + 'Vratislavova', + 'Olympijská', + 'Na Bojišti', + 'K Nádrži', + 'Vokrojova', + 'Bořetínská', + 'Kováříkova', + 'Lánovská', + 'U Staré Pošty', + 'Na Poustkách', + 'V Poli', + 'Meziškolská', + 'Pajerova', + 'Habartovská', + 'Mlékárenská', + 'Dělnická', + 'U Štěpu', + 'Družná', + 'Klouzková', + 'Před Rybníkem', + 'Nad Košinkou', + 'Spolupráce', + 'V Humenci', + 'Adélčina', + 'Březanova', + 'Pod Kesnerkou', + 'Kosmonoská', + 'Do Dubin', + 'Nad Lávkou', + 'Mezi Lysinami', + 'Na Topolce', + 'Snopkova', + 'Severní Viii', + 'Okrová', + 'Třebihošťská', + 'Mádrova', + 'Na Lázeňce', + 'Slivenecká', + 'Nám. Barikád', + 'Nad Strouhou', + 'Jindřicha Plachty', + 'Pod Srázem', + 'U Waltrovky', + 'Bratří Čapků', + 'Onšovecká', + 'Machnova', + 'Kostková', + 'Rožmberská', + 'Zapských', + 'Přípřežní', + 'Výravská', + 'Podléšková', + 'Štěchovická', + 'Poleradská', + 'Jilmová', + 'Hostýnská') + + states = ( + 'Hlavní město Praha', + 'Středočeský kraj', + 'Jihočeský kraj', + 'Plzeňský kraj', + 'Karlovarský kraj', + 'Ústecký kraj', + 'Liberecký kraj', + 'Královéhradecký kraj', + 'Pardubický kraj', + 'Kraj Vysočina', + 'Jihomoravský kraj', + 'Olomoucký kraj', + 'Moravskoslezský kraj', + 'Zlínský kraj', + ) + + countries = ( + 'Afghánistán', + 'Albánie', + 'Alžírsko', + 'Andorra', + 'Angola', + 'Antigua a Barbuda', + 'Argentina', + 'Arménie', + 'Austrálie', + 'Bahamy', + 'Bahrajn', + 'Bangladéš', + 'Barbados', + 'Belgie', + 'Belize', + 'Benin', + 'Bhútán', + 'Bolívie', + 'Bosna a Hercegovina', + 'Botswana', + 'Brazílie', + 'Brunej', + 'Bulharsko', + 'Burkina Faso', + 'Burundi', + 'Bělorusko', + 'Chile', + 'Chorvatsko', + 'Cookovy ostrovy', + 'Demokratická republika Kongo', + 'Dominika', + 'Dominikánská republika', + 'Dánsko', + 'Džibutsko', + 'Egypt', + 'Ekvádor', + 'Eritrea', + 'Estonsko', + 'Etiopie', + 'Federativní státy Mikronésie', + 'Fidži', + 'Filipíny', + 'Finsko', + 'Francie', + 'Gabon', + 'Gambie', + 'Ghana', + 'Gruzie', + 'Guatemala', + 'Guinea', + 'Guinea-Bissau', + 'Guyana', + 'Haiti', + 'Honduras', + 'Indie', + 'Irsko', + 'Irák', + 'Island', + 'Itálie', + 'Izrael', + 'Jamajka', + 'Japonsko', + 'Jemen', + 'Jihoafrická republika', + 'Jižní Súdán', + 'Jordánsko', + 'Kambodža', + 'Kamerun', + 'Kanada', + 'Kapverdy', + 'Katar', + 'Kazachstán', + 'Keňa', + 'Kiribati', + 'Kolumbie', + 'Kostarika', + 'Kuba', + 'Kypr', + 'Kyrgyzstán', + 'Laos', + 'Lesotho', + 'Libanon', + 'Libye', + 'Lichtenštejnsko', + 'Litva', + 'Lotyšsko', + 'Lucembursko', + 'Madagaskar', + 'Makedonie', + 'Malajsie', + 'Malawi', + 'Maledivy', + 'Mali', + 'Malta', + 'Maroko', + 'Marshallovy ostrovy', + 'Mauricius', + 'Mauritánie', + 'Maďarsko', + 'Mexiko', + 'Moldavsko', + 'Monako', + 'Mongolsko', + 'Mosambik', + 'Myanmar', + 'Namibie', + 'Nauru', + 'Nepál', + 'Niger', + 'Nigérie', + 'Nikaragua', + 'Niue', + 'Nizozemsko', + 'Norsko', + 'Nový Zéland', + 'Německo', + 'Omán', + 'Palau', + 'Panama', + 'Papua-Nová Guinea', + 'Paraguay', + 'Peru', + 'Pobřeží slonoviny', + 'Polsko', + 'Portugalsko', + 'Pákistán', + 'Rakousko', + 'Republika Kongo', + 'Rovníková Guinea', + 'Rumunsko', + 'Rusko', + 'Rwanda', + 'Salvador', + 'Samoa', + 'San Marino', + 'Saúdská Arábie', + 'Senegal', + 'Severní Korea', + 'Seychely', + 'Sierra Leone', + 'Singapur', + 'Slovensko', + 'Slovinsko', + 'Somálsko', + 'Spojené arabské emiráty', + 'Spojené království', + 'Spojené státy americké', + 'Srbsko', + 'Středoafrická republika', + 'Surinam', + 'Svatá Lucie', + 'Svatý Kryštof a Nevis', + 'Svatý Tomáš a Princův ostrov', + 'Svatý Vincenc a Grenadiny', + 'Svazijsko', + 'Súdán', + 'Sýrie', + 'Tanzanie', + 'Thajsko', + 'Togo', + 'Tonga', + 'Trinidad a Tobago', + 'Tunisko', + 'Turecko', + 'Turkmenistán', + 'Tuvalu', + 'Tádžikistán', + 'Uganda', + 'Ukrajina', + 'Uruguay', + 'Uzbekistán', + 'Vanuatu', + 'Vatikán', + 'Venezuela', + 'Vietnam', + 'Východní Timor', + 'Zambie', + 'Zimbabwe', + 'Ázerbájdžán', + 'Írán', + 'Čad', + 'Černá Hora', + 'Česko', + 'Čína', + 'Řecko', + 'Šalamounovy ostrovy', + 'Španělsko', + 'Srí Lanka', + 'Švédsko', + 'Švýcarsko') + + def street_suffix_short(self): + return self.random_element(self.street_suffixes_short) + + def street_suffix_long(self): + return self.random_element(self.street_suffixes_long) + + def city_name(self): + return self.random_element(self.cities) + + def street_name(self): + return self.random_element(self.streets) + + def state(self): + return self.random_element(self.states) diff --git a/src/faker/providers/de_DE/address.py b/src/libs/faker/providers/address/de_DE/__init__.py similarity index 96% rename from src/faker/providers/de_DE/address.py rename to src/libs/faker/providers/address/de_DE/__init__.py index 52652a2..707dd86 100644 --- a/src/faker/providers/de_DE/address.py +++ b/src/libs/faker/providers/address/de_DE/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -174,18 +174,17 @@ class Provider(AddressProvider): 'Äquatorialguinea', 'Äthiopien', 'Äußeres Ozeanien', 'Österreich', ) - @classmethod - def street_suffix_short(cls): - return cls.random_element(cls.street_suffixes_short) + def street_suffix_short(self): + return self.random_element(self.street_suffixes_short) - @classmethod - def street_suffix_long(cls): - return cls.random_element(cls.street_suffixes_long) + def street_suffix_long(self): + return self.random_element(self.street_suffixes_long) - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) + def city_name(self): + return self.random_element(self.cities) - @classmethod - def state(cls): - return cls.random_element(cls.states) + def state(self): + return self.random_element(self.states) + + def country(self): + return self.random_element(self.countries) diff --git a/src/faker/providers/el_GR/address.py b/src/libs/faker/providers/address/el_GR/__init__.py similarity index 99% rename from src/faker/providers/el_GR/address.py rename to src/libs/faker/providers/address/el_GR/__init__.py index 3d949df..284d8bf 100644 --- a/src/faker/providers/el_GR/address.py +++ b/src/libs/faker/providers/address/el_GR/__init__.py @@ -1,8 +1,8 @@ # coding=utf-8 from __future__ import unicode_literals from decimal import Decimal -import random -from ..address import Provider as AddressProvider + +from .. import Provider as AddressProvider def contains_point(poly, point): @@ -88,43 +88,34 @@ class Provider(AddressProvider): pattern = self.random_element(self.line_address_formats) return self.generator.parse(pattern) - @classmethod - def street_prefix(cls): - return cls.random_element(cls.street_prefixes_short + cls.street_prefixes_long) + def street_prefix(self): + return self.random_element(self.street_prefixes_short + self.street_prefixes_long) - @classmethod - def street_prefix_short(cls): - return cls.random_element(cls.street_prefixes_short) + def street_prefix_short(self): + return self.random_element(self.street_prefixes_short) - @classmethod - def street_prefix_long(cls): - return cls.random_element(cls.street_prefixes_long) + def street_prefix_long(self): + return self.random_element(self.street_prefixes_long) - @classmethod - def street(cls): - return cls.random_element(cls.localities) + def street(self): + return self.random_element(self.localities) - @classmethod - def city(cls): - return cls.random_element(cls.cities) + def city(self): + return self.random_element(self.cities) - @classmethod - def region(cls): - return cls.random_element(cls.regions) + def region(self): + return self.random_element(self.regions) - @classmethod - def latlng(cls): - return float(cls.latitude()), float(cls.longitude()) - - @classmethod - def latitude(cls): - l = list(map(lambda t: int(t[0] * 10000000), cls.poly)) - return Decimal(str(random.randint(min(l), max(l)) / 10000000.0)).quantize(Decimal('.000001')) + def latlng(self): + return float(self.latitude()), float(self.longitude()) - @classmethod - def longitude(cls): - l = list(map(lambda t: int(t[1] * 10000000), cls.poly)) - return Decimal(str(random.randint(min(l), max(l)) / 10000000.0)).quantize(Decimal('.000001')) + def latitude(self): + l = list(map(lambda t: int(t[0] * 10000000), self.poly)) + return Decimal(str(self.generator.random.randint(min(l), max(l)) / 10000000.0)).quantize(Decimal('.000001')) + + def longitude(self): + l = list(map(lambda t: int(t[1] * 10000000), self.poly)) + return Decimal(str(self.generator.random.randint(min(l), max(l)) / 10000000.0)).quantize(Decimal('.000001')) # Ονόματα πρωτευουσών νομών cities = ( diff --git a/src/faker/providers/en_GB/address.py b/src/libs/faker/providers/address/en/__init__.py similarity index 51% rename from src/faker/providers/en_GB/address.py rename to src/libs/faker/providers/address/en/__init__.py index edcb7d6..ca3bc78 100644 --- a/src/faker/providers/en_GB/address.py +++ b/src/libs/faker/providers/address/en/__init__.py @@ -1,47 +1,8 @@ -from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from __future__ import unicode_literals +from .. import Provider as AddressProvider class Provider(AddressProvider): - city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') - city_suffixes = ( - 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', - 'chester', 'mouth', 'fort', 'haven', 'side', 'shire') - building_number_formats = ('#', '##', '###') - street_suffixes = ( - 'alley', 'avenue', 'branch', 'bridge', 'brook', 'brooks', 'burg', 'burgs', 'bypass', 'camp', 'canyon', 'cape', - 'causeway', 'center', 'centers', 'circle', 'circles', 'cliff', 'cliffs', 'club', 'common', 'corner', 'corners', - 'course', 'court', 'courts', 'cove', 'coves', 'creek', 'crescent', 'crest', 'crossing', 'crossroad', 'curve', - 'dale', 'dam', 'divide', 'drive', 'drive', 'drives', 'estate', 'estates', 'expressway', 'extension', - 'extensions', - 'fall', 'falls', 'ferry', 'field', 'fields', 'flat', 'flats', 'ford', 'fords', 'forest', 'forge', 'forges', - 'fork', - 'forks', 'fort', 'freeway', 'garden', 'gardens', 'gateway', 'glen', 'glens', 'green', 'greens', 'grove', - 'groves', - 'harbor', 'harbors', 'haven', 'heights', 'highway', 'hill', 'hills', 'hollow', 'inlet', 'inlet', 'island', - 'island', - 'islands', 'islands', 'isle', 'isle', 'junction', 'junctions', 'key', 'keys', 'knoll', 'knolls', 'lake', - 'lakes', - 'land', 'landing', 'lane', 'light', 'lights', 'loaf', 'lock', 'locks', 'locks', 'lodge', 'lodge', 'loop', - 'mall', - 'manor', 'manors', 'meadow', 'meadows', 'mews', 'mill', 'mills', 'mission', 'mission', 'motorway', 'mount', - 'mountain', 'mountain', 'mountains', 'mountains', 'neck', 'orchard', 'oval', 'overpass', 'park', 'parks', - 'parkway', - 'parkways', 'pass', 'passage', 'path', 'pike', 'pine', 'pines', 'place', 'plain', 'plains', 'plains', 'plaza', - 'plaza', 'point', 'points', 'port', 'port', 'ports', 'ports', 'prairie', 'prairie', 'radial', 'ramp', 'ranch', - 'rapid', 'rapids', 'rest', 'ridge', 'ridges', 'river', 'road', 'road', 'roads', 'roads', 'route', 'row', 'rue', - 'run', 'shoal', 'shoals', 'shore', 'shores', 'skyway', 'spring', 'springs', 'springs', 'spur', 'spurs', - 'square', - 'square', 'squares', 'squares', 'station', 'station', 'stravenue', 'stravenue', 'stream', 'stream', 'street', - 'street', 'streets', 'summit', 'summit', 'terrace', 'throughway', 'trace', 'track', 'trafficway', 'trail', - 'trail', - 'tunnel', 'tunnel', 'turnpike', 'turnpike', 'underpass', 'union', 'unions', 'valley', 'valleys', 'via', - 'viaduct', - 'view', 'views', 'village', 'village', 'villages', 'ville', 'vista', 'vista', 'walk', 'walks', 'wall', 'way', - 'ways', 'well', 'wells') - - postcode_formats = ('??#? #??', '?#? #??', '?# #??', '?## #??', '??# #??', '??## #??',) - countries = ( 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', @@ -91,30 +52,3 @@ class Provider(AddressProvider): 'Yemen', 'Zambia', 'Zimbabwe' ) - - city_formats = ( - '{{city_prefix}} {{first_name}}{{city_suffix}}', - '{{city_prefix}} {{first_name}}', - '{{first_name}}{{city_suffix}}', - '{{last_name}}{{city_suffix}}', - ) - street_name_formats = ( - '{{first_name}} {{street_suffix}}', - '{{last_name}} {{street_suffix}}' - ) - street_address_formats = ( - '{{building_number}} {{street_name}}', - '{{secondary_address}}\n{{street_name}}', - ) - address_formats = ( - "{{street_address}}\n{{city}}\n{{postcode}}", - ) - secondary_address_formats = ('Flat #', 'Flat ##', 'Flat ##?', 'Studio #', 'Studio ##', 'Studio ##?') - - @classmethod - def city_prefix(cls): - return cls.random_element(cls.city_prefixes) - - @classmethod - def secondary_address(cls): - return cls.bothify(cls.random_element(cls.secondary_address_formats)) diff --git a/src/libs/faker/providers/address/en_AU/__init__.py b/src/libs/faker/providers/address/en_AU/__init__.py new file mode 100644 index 0000000..ac2e2f1 --- /dev/null +++ b/src/libs/faker/providers/address/en_AU/__init__.py @@ -0,0 +1,136 @@ +from __future__ import unicode_literals + +from ..en import Provider as AddressProvider + + +class Provider(AddressProvider): + + city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port', + 'St.') + + city_suffixes = ('town', 'ton', 'land', 'ville', 'berg', 'burgh', + 'borough', 'bury', 'view', 'port', 'mouth', 'stad', + 'furt', 'chester', 'mouth', 'fort', 'haven', 'side', + 'shire') + + building_number_formats = ('###', '##', '#') + + street_suffixes = ( + 'Access', 'Alley', 'Alleyway', 'Amble', 'Anchorage', 'Approach', + 'Arcade', 'Artery', 'Avenue', 'Basin', 'Beach', 'Bend', 'Block', + 'Boulevard', 'Brace', 'Brae', 'Break', 'Bridge', 'Broadway', 'Brow', + 'Bypass', 'Byway', 'Causeway', 'Centre', 'Centreway', 'Chase', + 'Circle', 'Circlet', 'Circuit', 'Circus', 'Close', 'Colonnade', + 'Common', 'Concourse', 'Copse', 'Corner', 'Corso', 'Court', + 'Courtyard', 'Cove', 'Crescent', 'Crest', 'Cross', 'Crossing', + 'Crossroad', 'Crossway', 'Cruiseway', 'Cul-de-sac', 'Cutting', 'Dale', + 'Dell', 'Deviation', 'Dip', 'Distributor', 'Drive', 'Driveway', 'Edge', + 'Elbow', 'End', 'Entrance', 'Esplanade', 'Estate', 'Expressway', + 'Extension', 'Fairway', 'Fire Track', 'Firetrail', 'Flat', 'Follow', + 'Footway', 'Foreshore', 'Formation', 'Freeway', 'Front', 'Frontage', + 'Gap', 'Garden', 'Gardens', 'Gate', 'Gates', 'Glade', 'Glen', 'Grange', + 'Green', 'Ground', 'Grove', 'Gully', 'Heights', 'Highroad', 'Highway', + 'Hill', 'Interchange', 'Intersection', 'Junction', 'Key', 'Landing', + 'Lane', 'Laneway', 'Lees', 'Line', 'Link', 'Little', 'Lookout', 'Loop', + 'Lower', 'Mall', 'Meander', 'Mew', 'Mews', 'Motorway', 'Mount', 'Nook', + 'Outlook', 'Parade', 'Park', 'Parklands', 'Parkway', 'Part', 'Pass', + 'Path', 'Pathway', 'Piazza', 'Place', 'Plateau', 'Plaza', 'Pocket', + 'Point', 'Port', 'Promenade', 'Quad', 'Quadrangle', 'Quadrant', 'Quay', + 'Quays', 'Ramble', 'Ramp', 'Range', 'Reach', 'Reserve', 'Rest', + 'Retreat', 'Ride', 'Ridge', 'Ridgeway', 'Right Of Way', 'Ring', 'Rise', + 'River', 'Riverway', 'Riviera', 'Road', 'Roads', 'Roadside', 'Roadway', + 'Ronde', 'Rosebowl', 'Rotary', 'Round', 'Route', 'Row', 'Rue', 'Run', + 'Service Way', 'Siding', 'Slope', 'Sound', 'Spur', 'Square', 'Stairs', + 'State Highway', 'Steps', 'Strand', 'Street', 'Strip', 'Subway', + 'Tarn', 'Terrace', 'Thoroughfare', 'Tollway', 'Top', 'Tor', 'Towers', + 'Track', 'Trail', 'Trailer', 'Triangle', 'Trunkway', 'Turn', + 'Underpass', 'Upper', 'Vale', 'Viaduct', 'View', 'Villas', 'Vista', + 'Wade', 'Walk', 'Walkway', 'Way', 'Wynd') + + postcode_formats = ( + # as per https://en.wikipedia.org/wiki/Postcodes_in_Australia + # NSW + '1###', + '20##', + '21##', + '22##', + '23##', + '24##', + '25##', + '2619', + '262#', + '263#', + '264#', + '265#', + '266#', + '267#', + '268#', + '269#', + '27##', + '28##', + '292#', + '293#', + '294#', + '295#', + '296#', + '297#', + '298#', + '299#', + # ACT + '02##', + '260#', + '261#', + '290#', + '291#', + '2920', + # VIC + '3###', + '8###', + # QLD + '4###', + '9###', + # SA + '5###', + # WA + '6###', + # TAS + '7###', + # NT + '08##', + '09##', ) + + states = ('Australian Capital Territory', 'New South Wales', + 'Northern Territory', 'Queensland', 'South Australia', + 'Tasmania', 'Victoria', 'Western Australia') + + states_abbr = ('ACT', 'NSW', 'NT', 'QLD', 'SA', 'TAS', 'VIC', 'WA') + + city_formats = ('{{city_prefix}} {{first_name}}{{city_suffix}}', + '{{city_prefix}} {{first_name}}', + '{{first_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', ) + + street_name_formats = ('{{first_name}} {{street_suffix}}', + '{{last_name}} {{street_suffix}}') + + street_address_formats = ( + '{{building_number}} {{street_name}}', + '{{secondary_address}}\n {{building_number}} {{street_name}}', ) + + address_formats = ( + "{{street_address}}\n{{city}}, {{state_abbr}}, {{postcode}}", ) + + secondary_address_formats = ('Apt. ###', 'Flat ##', 'Suite ###', 'Unit ##', + 'Level #', '### /', '## /', '# /') + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def state(self): + return self.random_element(self.states) + + def state_abbr(self): + return self.random_element(self.states_abbr) diff --git a/src/libs/faker/providers/address/en_CA/__init__.py b/src/libs/faker/providers/address/en_CA/__init__.py new file mode 100644 index 0000000..a5d180a --- /dev/null +++ b/src/libs/faker/providers/address/en_CA/__init__.py @@ -0,0 +1,114 @@ +from __future__ import unicode_literals +import re +from ..en import Provider as AddressProvider + + +class Provider(AddressProvider): + + postal_code_letters = ( + 'A', 'B', 'C', 'E', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', + 'T', 'V', 'X', 'Y', + ) + + city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') + + city_suffixes = ( + 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', + 'chester', 'mouth', 'fort', 'haven', 'side', 'shire') + + building_number_formats = ('#####', '####', '###') + + street_suffixes = ( + 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', + 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', + 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', + 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', + 'Extensions', + 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', + 'Fork', + 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', + 'Groves', + 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', + 'Island', + 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', + 'Lakes', + 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', + 'Mall', + 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', + 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', + 'Parkway', + 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', + 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', + 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', + 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', + 'Square', + 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', + 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', + 'Trail', + 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', + 'Viaduct', + 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', + 'Ways', 'Well', 'Wells') + + postal_code_formats = ('?%? %?%', '?%?%?%') + + provinces = ( + 'Alberta', 'British Columbia', 'Manitoba', 'New Brunswick', + 'Newfoundland and Labrador', 'Northwest Territories', + 'New Brunswick', 'Nova Scotia', 'Nunavut', 'Ontario', + 'Prince Edward Island', 'Quebec', 'Saskatchewan', 'Yukon Territory') + + provinces_abbr = ( + 'AB', 'BC', 'MB', 'NB', 'NL', 'NT', 'NS', + 'NV', 'ON', 'PE', 'QC', 'SK', 'YT') + + city_formats = ( + '{{city_prefix}} {{first_name}}{{city_suffix}}', + '{{city_prefix}} {{first_name}}', + '{{first_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', + ) + street_name_formats = ( + '{{first_name}} {{street_suffix}}', + '{{last_name}} {{street_suffix}}' + ) + street_address_formats = ( + '{{building_number}} {{street_name}}', + '{{building_number}} {{street_name}} {{secondary_address}}', + ) + address_formats = ( + "{{street_address}}\n{{city}}, {{province_abbr}} {{postalcode}}", + ) + secondary_address_formats = ('Apt. ###', 'Suite ###') + + def province(self): + """ + """ + return self.random_element(self.provinces) + + def province_abbr(self): + return self.random_element(self.provinces_abbr) + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def postal_code_letter(self): + """ + Returns a random letter from the list of allowable + letters in a canadian postal code + """ + return self.random_element(self.postal_code_letters) + + def postalcode(self): + """ + Replaces all question mark ('?') occurrences with a random letter + from postal_code_formats then passes result to + numerify to insert numbers + """ + temp = re.sub(r'\?', + lambda x: self.postal_code_letter(), + self.random_element(self.postal_code_formats)) + return self.numerify(temp) diff --git a/src/libs/faker/providers/address/en_GB/__init__.py b/src/libs/faker/providers/address/en_GB/__init__.py new file mode 100644 index 0000000..3e81e13 --- /dev/null +++ b/src/libs/faker/providers/address/en_GB/__init__.py @@ -0,0 +1,118 @@ +from __future__ import unicode_literals +from collections import OrderedDict + +from ..en import Provider as AddressProvider + + +class Provider(AddressProvider): + city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') + city_suffixes = ( + 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', + 'chester', 'mouth', 'fort', 'haven', 'side', 'shire', + ) + building_number_formats = ('#', '##', '###') + street_suffixes = ( + 'alley', 'avenue', 'branch', 'bridge', 'brook', 'brooks', 'burg', 'burgs', 'bypass', 'camp', 'canyon', 'cape', + 'causeway', 'center', 'centers', 'circle', 'circles', 'cliff', 'cliffs', 'club', 'common', 'corner', 'corners', + 'course', 'court', 'courts', 'cove', 'coves', 'creek', 'crescent', 'crest', 'crossing', 'crossroad', 'curve', + 'dale', 'dam', 'divide', 'drive', 'drive', 'drives', 'estate', 'estates', 'expressway', 'extension', + 'extensions', + 'fall', 'falls', 'ferry', 'field', 'fields', 'flat', 'flats', 'ford', 'fords', 'forest', 'forge', 'forges', + 'fork', + 'forks', 'fort', 'freeway', 'garden', 'gardens', 'gateway', 'glen', 'glens', 'green', 'greens', 'grove', + 'groves', + 'harbor', 'harbors', 'haven', 'heights', 'highway', 'hill', 'hills', 'hollow', 'inlet', 'inlet', 'island', + 'island', + 'islands', 'islands', 'isle', 'isle', 'junction', 'junctions', 'key', 'keys', 'knoll', 'knolls', 'lake', + 'lakes', + 'land', 'landing', 'lane', 'light', 'lights', 'loaf', 'lock', 'locks', 'locks', 'lodge', 'lodge', 'loop', + 'mall', + 'manor', 'manors', 'meadow', 'meadows', 'mews', 'mill', 'mills', 'mission', 'mission', 'motorway', 'mount', + 'mountain', 'mountain', 'mountains', 'mountains', 'neck', 'orchard', 'oval', 'overpass', 'park', 'parks', + 'parkway', + 'parkways', 'pass', 'passage', 'path', 'pike', 'pine', 'pines', 'place', 'plain', 'plains', 'plains', 'plaza', + 'plaza', 'point', 'points', 'port', 'port', 'ports', 'ports', 'prairie', 'prairie', 'radial', 'ramp', 'ranch', + 'rapid', 'rapids', 'rest', 'ridge', 'ridges', 'river', 'road', 'road', 'roads', 'roads', 'route', 'row', 'rue', + 'run', 'shoal', 'shoals', 'shore', 'shores', 'skyway', 'spring', 'springs', 'springs', 'spur', 'spurs', + 'square', + 'square', 'squares', 'squares', 'station', 'station', 'stravenue', 'stravenue', 'stream', 'stream', 'street', + 'street', 'streets', 'summit', 'summit', 'terrace', 'throughway', 'trace', 'track', 'trafficway', 'trail', + 'trail', + 'tunnel', 'tunnel', 'turnpike', 'turnpike', 'underpass', 'union', 'unions', 'valley', 'valleys', 'via', + 'viaduct', + 'view', 'views', 'village', 'village', 'villages', 'ville', 'vista', 'vista', 'walk', 'walks', 'wall', 'way', + 'ways', 'well', 'wells') + + POSTAL_ZONES = ( + 'AB', 'AL', 'B' , 'BA', 'BB', 'BD', 'BH', 'BL', 'BN', 'BR', + 'BS', 'BT', 'CA', 'CB', 'CF', 'CH', 'CM', 'CO', 'CR', 'CT', + 'CV', 'CW', 'DA', 'DD', 'DE', 'DG', 'DH', 'DL', 'DN', 'DT', + 'DY', 'E' , 'EC', 'EH', 'EN', 'EX', 'FK', 'FY', 'G' , 'GL', + 'GY', 'GU', 'HA', 'HD', 'HG', 'HP', 'HR', 'HS', 'HU', 'HX', + 'IG', 'IM', 'IP', 'IV', 'JE', 'KA', 'KT', 'KW', 'KY', 'L' , + 'LA', 'LD', 'LE', 'LL', 'LN', 'LS', 'LU', 'M' , 'ME', 'MK', + 'ML', 'N' , 'NE', 'NG', 'NN', 'NP', 'NR', 'NW', 'OL', 'OX', + 'PA', 'PE', 'PH', 'PL', 'PO', 'PR', 'RG', 'RH', 'RM', 'S' , + 'SA', 'SE', 'SG', 'SK', 'SL', 'SM', 'SN', 'SO', 'SP', 'SR', + 'SS', 'ST', 'SW', 'SY', 'TA', 'TD', 'TF', 'TN', 'TQ', 'TR', + 'TS', 'TW', 'UB', 'W' , 'WA', 'WC', 'WD', 'WF', 'WN', 'WR', + 'WS', 'WV', 'YO', 'ZE' + ) + + POSTAL_ZONES_ONE_CHAR = [zone for zone in POSTAL_ZONES if len(zone) == 1] + POSTAL_ZONES_TWO_CHARS = [zone for zone in POSTAL_ZONES if len(zone) == 2] + + postcode_formats = ( + 'AN NEE', + 'ANN NEE', + 'PN NEE', + 'PNN NEE', + 'ANC NEE', + 'PND NEE', + ) + + _postcode_sets = OrderedDict(( + (' ', ' '), + ('N', [str(i) for i in range(0, 10)]), + ('A', POSTAL_ZONES_ONE_CHAR), + ('B', 'ABCDEFGHKLMNOPQRSTUVWXY'), + ('C', 'ABCDEFGHJKSTUW'), + ('D', 'ABEHMNPRVWXY'), + ('E', 'ABDEFGHJLNPQRSTUWXYZ'), + ('P', POSTAL_ZONES_TWO_CHARS), + )) + + city_formats = ( + '{{city_prefix}} {{first_name}}{{city_suffix}}', + '{{city_prefix}} {{first_name}}', + '{{first_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', + ) + street_name_formats = ( + '{{first_name}} {{street_suffix}}', + '{{last_name}} {{street_suffix}}' + ) + street_address_formats = ( + '{{building_number}} {{street_name}}', + '{{secondary_address}}\n{{street_name}}', + ) + address_formats = ( + "{{street_address}}\n{{city}}\n{{postcode}}", + ) + secondary_address_formats = ('Flat #', 'Flat ##', 'Flat ##?', 'Studio #', 'Studio ##', 'Studio ##?') + + def postcode(self): + """ + See http://web.archive.org/web/20090930140939/http://www.govtalk.gov.uk/gdsc/html/noframes/PostCode-2-1-Release.htm + """ + postcode = '' + pattern = self.random_element(self.postcode_formats) + for placeholder in pattern: + postcode += self.random_element(self._postcode_sets[placeholder]) + return postcode + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.bothify(self.random_element(self.secondary_address_formats)) diff --git a/src/libs/faker/providers/address/en_US/__init__.py b/src/libs/faker/providers/address/en_US/__init__.py new file mode 100644 index 0000000..8520ccf --- /dev/null +++ b/src/libs/faker/providers/address/en_US/__init__.py @@ -0,0 +1,156 @@ +from __future__ import unicode_literals +from collections import OrderedDict + +from ..en import Provider as AddressProvider + + +class Provider(AddressProvider): + city_prefixes = ('North', 'East', 'West', 'South', 'New', 'Lake', 'Port') + + city_suffixes = ( + 'town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', + 'chester', 'mouth', 'fort', 'haven', 'side', 'shire') + + building_number_formats = ('#####', '####', '###') + + street_suffixes = ( + 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', + 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', + 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', + 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', + 'Extensions', + 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', + 'Fork', + 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', + 'Groves', + 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', + 'Island', + 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', + 'Lakes', + 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', + 'Mall', + 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', + 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', + 'Parkway', + 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', + 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', + 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', + 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', + 'Square', + 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', + 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', + 'Trail', + 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', + 'Viaduct', + 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', + 'Ways', 'Well', 'Wells') + + postcode_formats = ('#####', '#####-####') + + states = ( + 'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', + 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', + 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', + 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', + 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', + 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', + 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', + 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', + 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', + 'West Virginia', 'Wisconsin', 'Wyoming', + ) + states_abbr = ( + 'AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FM', 'FL', + 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MH', + 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', + 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', + 'SD', 'TN', 'TX', 'UT', 'VT', 'VI', 'VA', 'WA', 'WV', 'WI', 'WY', + ) + + military_state_abbr = ('AE', 'AA', 'AP') + + military_ship_prefix = ('USS', 'USNS', 'USNV', 'USCGC') + + military_apo_format = ("PSC ####, Box ####") + + military_dpo_format = ("Unit #### Box ####") + + city_formats = ( + '{{city_prefix}} {{first_name}}{{city_suffix}}', + '{{city_prefix}} {{first_name}}', + '{{first_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', + ) + + street_name_formats = ( + '{{first_name}} {{street_suffix}}', + '{{last_name}} {{street_suffix}}' + ) + + street_address_formats = ( + '{{building_number}} {{street_name}}', + '{{building_number}} {{street_name}} {{secondary_address}}', + ) + + address_formats = ( + "{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}", + ) + + address_formats = OrderedDict(( + ("{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}", 25), + # military address formatting. + ("{{military_apo}}\nAPO {{military_state}} {{postcode}}", 1), + ("{{military_ship}} {{last_name}}\nFPO {{military_state}} {{postcode}}", 1), + ("{{military_dpo}}\nDPO {{military_state}} {{postcode}}", 1), + )) + + secondary_address_formats = ('Apt. ###', 'Suite ###') + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def state(self): + return self.random_element(self.states) + + def state_abbr(self): + return self.random_element(self.states_abbr) + + def zipcode(self): + return "%05d" % self.generator.random.randint(501, 99950) + + def zipcode_plus4(self): + return "%s-%04d" % (self.zipcode(), self.generator.random.randint(1, 9999)) + + def military_ship(self): + """ + :example 'USS' + """ + return self.random_element(self.military_ship_prefix) + + def military_state(self): + """ + :example 'APO' + """ + return self.random_element(self.military_state_abbr) + + def military_apo(self): + """ + :example 'PSC 5394 Box 3492 + """ + return self.numerify(self.military_apo_format) + + def military_dpo(self): + """ + :example 'Unit 3333 Box 9342' + """ + return self.numerify(self.military_dpo_format) + + # Aliases + def postalcode(self): + return self.zipcode() + + def postalcode_plus4(self): + return self.zipcode_plus4() diff --git a/src/libs/faker/providers/address/es/__init__.py b/src/libs/faker/providers/address/es/__init__.py new file mode 100644 index 0000000..2714e08 --- /dev/null +++ b/src/libs/faker/providers/address/es/__init__.py @@ -0,0 +1,51 @@ +# -*- encoding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + + # List of Countries https://www.un.org/es/members/ + countries = ( + 'Afganistán', 'Albania', 'Alemania', 'Andorra', 'Angola', + 'Antigua y Barbuda', 'Arabia Saudita', 'Argelia', 'Argentina', + 'Armenia', 'Australia', 'Austria', 'Azerbaiyán', 'Bahamas', 'Bahrein', + 'Bangladesh', 'Barbados', 'Belarús', 'Bélgica', 'Belice', 'Benin', + 'Bhután', 'Bolivia', 'Bosnia y Herzegovina', 'Botswana', 'Brasil', + 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', + 'Cabo Verde', 'Camboya', 'Camerún', 'Canadá', 'Chad', 'Chile', 'China', + 'Chipre', 'Colombia', 'Comoras', 'Congo', 'Costa Rica', + 'Côte d\'Ivoire', 'Croacia', 'Cuba', 'Dinamarca', 'Djibouti', + 'Dominicana', 'Ecuador', 'Egipto', 'El Salvador', + 'Emiratos Árabes Unidos', 'Eritrea', 'Eslovaquia', 'Eslovenia', + 'España', 'Estados Unidos de América', 'Estonia', 'Etiopía', + 'ex República Yugoslava de Macedonia', 'Federación de Rusia', 'Fiji', + 'Filipinas', 'Finlandia', 'Francia', 'Gabón', 'Gambia', 'Georgia', + 'Ghana', 'Granada', 'Grecia', 'Guatemala', 'Guinea', 'Guinea Bissau', + 'Guinea Ecuatorial', 'Guyana', 'Haití', 'Honduras', 'Hungría', 'India', + 'Indonesia', 'Irán', 'Iraq', 'Irlanda', 'Islandia', 'Islas Marshall', + 'Islas Salomón', 'Israel', 'Italia', 'Jamaica', 'Japón', 'Jordania', + 'Kazajstán', 'Kenya', 'Kirguistán', 'Kiribati', 'Kuwait', 'Lesotho', + 'Letonia', 'Líbano', 'Liberia', 'Libia', 'Liechtenstein', 'Lituania', + 'Luxemburgo', 'Madagascar', 'Malasia', 'Malawi', 'Maldivas', 'Mali', + 'Malta', 'Marruecos', 'Mauricio', 'Mauritania', 'México', 'Micronesia', + 'Mónaco', 'Mongolia', 'Montenegro', 'Mozambique', 'Myanmar', 'Namibia', + 'Nauru', 'Nicaragua', 'Niger', 'Nigeria', 'Noruega', 'Nueva Zelandia', + 'Omán', 'Países Bajos', 'Pakistán', 'Palau', 'Panamá', + 'Papua Nueva Guinea', 'Paraguay', 'Perú', 'Polonia', 'Portugal', + 'Qatar', 'Reino Unido de Gran Bretaña e Irlanda del Norte', + 'República Árabe Siria', 'República Centroafricana', 'República Checa', + 'República de Corea', 'República de Moldova', + 'República Democrática del Congo', 'República Democrática Popular Lao', + 'República Dominicana', 'República Federal Democrática de Nepal', + 'República Popular Democrática de Corea', 'República Unida de Tanzanía', + 'Rumania', 'Rwanda', 'Saint Kitts y Nevis', 'Samoa', 'San Marino', + 'Santa Lucía', 'Santo Tomé y Príncipe', 'San Vicente y las Granadinas', + 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leona', 'Singapur', + 'Somalia', 'Sri Lanka', 'Sudáfrica', 'Sudán', 'Sudán del Sur', 'Suecia', + 'Suiza', 'Suriname', 'Swazilandia', 'Tailandia', 'Tayikistán', + 'Timor-Leste', 'Togo', 'Tonga', 'Trinidad y Tabago', 'Túnez', + 'Turkmenistán', 'Turquía', 'Tuvalu', 'Ucrania', 'Uganda', 'Uruguay', + 'Uzbekistán', 'Vanuatu', 'Venezuela', 'Vietman', 'Yemen', 'Zambia', + 'Zimbabwe', + ) diff --git a/src/libs/faker/providers/address/es_ES/__init__.py b/src/libs/faker/providers/address/es_ES/__init__.py new file mode 100644 index 0000000..316bc1a --- /dev/null +++ b/src/libs/faker/providers/address/es_ES/__init__.py @@ -0,0 +1,54 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from ..es import Provider as AddressProvider + + +class Provider(AddressProvider): + building_number_formats = ('%', '%#', '%#', '%#', '%##') + street_prefixes = ( + 'Plaza', 'Calle', 'Avenida', 'Via', 'Vial', 'Rambla', 'Glorieta', + 'Urbanización', 'Callejón', 'Cañada', 'Alameda', 'Acceso', 'C.', + 'Ronda', 'Pasaje', 'Cuesta', 'Pasadizo', 'Paseo', 'Camino', + ) + postcode_formats = ('#####', ) + states = ( + 'Álava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Ávila', 'Badajoz', + 'Baleares', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', + 'Ceuta', 'Ciudad', 'Córdoba', 'Cuenca', 'Girona', 'Granada', 'Guadalajara', + 'Guipúzcoa', 'Huelva', 'Huesca', 'Jaén', 'La Coruña', 'La Rioja', 'Las Palmas', + 'León', 'Lleida', 'Lugo', 'Madrid', 'Málaga', 'Melilla', 'Murcia', 'Navarra', + 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Santa Cruz de Tenerife', + 'Segovia', 'Sevilla', 'Soria', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', + 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza' + ) + + city_formats = ( + '{{state_name}}', + ) + + street_name_formats = ( + '{{street_prefix}} {{first_name}} {{last_name}}', + '{{street_prefix}} de {{first_name}} {{last_name}}', + + ) + street_address_formats = ( + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}} {{secondary_address}} ', + ) + address_formats = ( + "{{street_address}}\n{{city}}, {{postcode}}", + ) + secondary_address_formats = ('Apt. ##', 'Piso #', 'Puerta #') + + def state_name(self): + return self.random_element(self.states) + + def street_prefix(self): + return self.random_element(self.street_prefixes) + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/es_MX/__init__.py b/src/libs/faker/providers/address/es_MX/__init__.py new file mode 100644 index 0000000..7fdd436 --- /dev/null +++ b/src/libs/faker/providers/address/es_MX/__init__.py @@ -0,0 +1,127 @@ +# -*- encoding: utf-8 -*- +from __future__ import unicode_literals +from collections import OrderedDict + +from ..es import Provider as AddressProvider + + +class Provider(AddressProvider): + city_prefixes = ('Sur', 'Norte',) + city_adjetives = ('Nueva', 'Vieja',) + city_suffixies = ('de la Montaña', 'los bajos', 'los altos', ) + street_prefixes = ( + 'Ampliación', 'Andador', 'Avenida', 'Boulevard', 'Calle', 'Callejón', + 'Calzada', 'Cerrada', 'Circuito', 'Circunvalación', 'Continuación', + 'Corredor', 'Diagonal', 'Eje vial', 'Pasaje', 'Peatonal', 'Periférico', + 'Privada', 'Prolongación', 'Retorno', 'Viaducto', + ) + building_number_formats = ('#####', '####', '###') + postcode_formats = ('#####', '#####-####') + + # States and abbrs from Mexico from INEGI + # http://www.inegi.org.mx/geo/contenidos/geoestadistica/CatalogoClaves.aspx + states = ( + ('AGS', 'Aguascalientes'), ('BC', 'Baja California'), + ('BCS', 'Baja California Sur'), ('CAMP', 'Campeche'), + ('COAH', 'Coahuila de Zaragoza'), ('COL', 'Colima'), + ('CHIS', 'Chiapas'), ('CHIH', 'Chihuahua'), + ('DF', 'Distrito Federal'), ('DGO', 'Durango'), + ('GTO', 'Guanajuato'), ('GRO', 'Guerrero'), ('HGO', 'Hidalgo'), + ('JAL', 'Jalisco'), ('MEX', 'México'), + ('MICH', 'Michoacán de Ocampo'), ('MOR', 'Morelos'), + ('NAY', 'Nayarit'), ('NL', 'Nuevo León'), ('OAX', 'Oaxaca'), + ('PUE', 'Puebla'), ('QRO', 'Querétaro'), + ('Q. ROO', 'Quintana Roo'), ('SLP', 'San Luis Potosí'), + ('SIN', 'Sinaloa'), ('SON', 'Sonora'), ('TAB', 'Tabasco'), + ('TAMPS', 'Tamaulipas'), ('TLAX', 'Tlaxcala'), + ('VER', 'Veracruz de Ignacio de la Llave'), + ('YUC', 'Yucatán'), ('ZAC', 'Zacatecas'),) + + zip_codes = OrderedDict(( + # The ZipCodes has a begin & final range + # Source: Norma Técnica de Domicilios INEGI + ('AGS', (20000, 20999)), + ('BC', (21000, 22999)), + ('BCS', (23000, 23999)), + ('CAMP', (24000, 24999)), + ('COAH', (25000, 27999)), + ('COL', (28000, 28999)), + ('CHIS', (29000, 30999)), + ('CHIH', (31000, 33999)), + ('DF', (1000, 19999)), + ('DGO', (36000, 35999)), + ('GTO', (36000, 38999)), + ('GRO', (39000, 41999)), + ('HGO', (42000, 43999)), + ('JAL', (44000, 49999)), + ('MEX', (50000, 57999)), + ('MICH', (58000, 61999)), + ('MOR', (62000, 62999)), + ('NAY', (63000, 63999)), + ('NL', (64000, 67999)), + ('OAX', (68000, 71999)), + ('PUE', (72000, 75999)), + ('QRO', (76000, 76999)), + ('Q. ROO', (77000, 75999)), + ('SLP', (78000, 79999)), + ('SIN', (80000, 82999)), + ('SON', (83000, 85999)), + ('TAB', (86000, 86999)), + ('TAMPS', (87000, 89999)), + ('TLAX', (90000, 90999)), + ('VER', (91000, 97999)), + ('YUC', (97000, 97999)), + ('ZAC', (98000, 99999)), + )) + + city_formats = ( + '{{city_adjetive}} {{country}}', + 'San {{first_name}} {{city_suffix}}', + ) + street_name_formats = ( + '{{street_prefix}} {{last_name}}', + '{{street_prefix}} {{country}}', + '{{street_prefix}} {{state}}', + '{{street_prefix}} {{city_prefix}} {{last_name}}' + ) + street_address_formats = ( + '{{street_name}} {{secondary_address}}', + ) + address_formats = ( + "{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}", + ) + secondary_address_formats = ('### ###', '### Interior ###', + '### Edif. ### , Depto. ###') + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def city_suffix(self): + return self.random_element(self.city_suffixies) + + def city_adjetive(self): + return self.random_element(self.city_adjetives) + + def street_prefix(self): + """ + :example 'Avenida' + """ + return self.random_element(self.street_prefixes) + + def secondary_address(self): + """ + :example '020 Interior 999' + """ + return self.numerify(self.random_element(self.secondary_address_formats)) + + def state(self): + """ + example: u'Guerrero' + """ + return self.random_element(self.states)[1] + + def state_abbr(self): + """ + example: u'GRO' + """ + return self.random_element(self.states)[0] diff --git a/src/libs/faker/providers/address/fa_IR/__init__.py b/src/libs/faker/providers/address/fa_IR/__init__.py new file mode 100644 index 0000000..0f37b92 --- /dev/null +++ b/src/libs/faker/providers/address/fa_IR/__init__.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_prefixes = ( + 'شمال', 'غرب', 'شرق', 'جنوب', 'بندر', 'شهر', 'روستای', 'دهستان', + 'شهرستان', 'باغات', 'استان', + ) + building_number_formats = ('#####', '####', '###') + street_suffixes = ( + 'کوچه', 'خیابان', 'پل', 'دره', 'میدان', 'چهار راه', 'بن بست', 'بلوار', + 'جنب', 'تقاطع', 'آزاد راه', 'بزرگ راه', 'جزیره', 'کوه', 'جاده', 'تونل', + ) + postcode_formats = ('###', '####', '#####', '######', '##########',) + states = ( + 'آذربایجان شرقی', 'آذربایجان غربی', 'اردبیل', 'خراسان', 'کردستان', + 'گیلان', 'اصفهان', 'البرز', 'ایلام', 'بوشهر', 'تهران', + 'چهارمحال و بختیاری', 'خراسان جنوبی', 'خراسان رضوی', 'خراسان شمالی', + 'خوزستان', 'زنجان', 'سمنان', 'سیستان و بلوچستان', 'فارس', 'قزوین', 'قم', + 'کرمان', 'کرمانشاه', 'کهگیلویه و بویراحمد', 'گلستان', 'لرستان', + 'مازندران', 'مرکزی', 'هرمزگان', 'همدان', 'یزد', + ) + countries = ( + 'جمهوری آذربایجان', 'آرژانتین', 'آفریقای جنوبی', 'جمهوری آفریقای مرکزی', + 'آلبانی', 'آلمان', 'آنتیگوا و باربودا', 'آندورا', 'آنگولا', 'اتریش', + 'اتیوپی', 'اردن', 'ارمنستان', 'اروگوئه', 'اریتره', 'ازبکستان', + 'اسپانیا', 'استرالیا', 'استونی', 'اسرائیل', 'اسلواکی', 'اسلوونی', + 'افغانستان', 'اکوادور', 'الجزایر', 'السالوادور', 'امارات متحده عربی', + 'اندونزی', 'اوکراین', 'اوگاندا', 'ایالات متحده آمریکا', 'ایتالیا', + 'ایران', 'جمهوری ایرلند', 'ایسلند', 'باربادوس', 'باهاما', 'بحرین', + 'برزیل', 'برونئی', 'بریتانیا', 'بلاروس', 'بلژیک', 'بلغارستان', 'بلیز', + 'بنگلادش', 'بنین', 'پادشاهی بوتان', 'بوتسوانا', 'بورکینافاسو', + 'بوروندی', 'بوسنی و هرزگوین', 'بولیوی', 'پاپوآ گینه نو', 'پاراگوئه', + 'پاناما', 'پاکستان', 'پرتغال', 'پرو', 'پورتوریکو', 'تاجیکستان', + 'تانزانیا', 'تایلند', 'جمهوری چین', 'ترکمنستان', 'ترکیه', + 'ترینیداد و توباگو', 'توگو', 'تونس', 'تونگا', 'تووالو', 'تیمور شرقی', + 'جامائیکا', 'جزایر سلیمان', 'جزایر مارشال', 'جمهوری چک', + 'جمهوری دومینیکن', 'جیبوتی', 'چاد', 'چین', 'دانمارک', 'دومینیکا', + 'جمهوری دومینیکن', 'رواندا', 'روسیه', 'رومانی', 'زامبیا', 'نیوزیلند', + 'زیمباوه', 'جمهوری دموکراتیک کنگو (زئیر)', 'ژاپن', 'سائوتومه و پرینسیپ', + 'ساحل عاج', 'ساموآی غربی', 'سن مارینو', 'سری‌لانکا', 'سنت کیتس و نویس', + 'سنت لوسیا', 'سنت وینسنت و گرنادین‌ها', 'سنگاپور', 'سنگال', 'سوئد', + 'سوئیس', 'سوازیلند', 'سودان', 'سودان جنوبی', 'سورینام', 'سوریه', + 'سومالی', 'سیرالئون', 'سیشل', 'شیلی', 'صربستان', 'عراق', + 'عربستان سعودی', 'عمان', 'غنا', 'فرانسه', 'فلسطین', 'فنلاند', 'فیجی', + 'فیلیپین', 'قبرس', 'قرقیزستان', 'قزاقستان', 'قطر', 'کامبوج', 'کامرون', + 'کانادا', 'کره جنوبی', 'کره شمالی', 'کرواسی', 'کاستاریکا', 'کلمبیا', + 'جمهوری کنگو', 'جمهوری دموکراتیک کنگو', 'کنیا', 'کوبا', 'کوزوو', + 'مجمع‌الجزایر قمر', 'کویت', 'کیپ ورد', 'کیریباتی', 'گابن', 'گامبیا', + 'گرجستان', 'گرنادا', 'گرینلند(از مستعمرات دانمارک)', 'گواتمالا', + 'گویان', 'گینه', 'گینه استوایی', 'گینه بیسائو', 'لائوس', 'لبنان', + 'لتونی', 'لسوتو', 'لهستان', 'لوکزامبورگ', 'لیبریا', 'لیبی', 'لیتوانی', + 'لیختن‌اشتاین', 'ماداگاسکار', 'مالاوی', 'مالت', 'مالدیو', 'مالزی', + 'مالی', 'مجارستان', 'مراکش', 'مصر', 'مغولستان', 'مقدونیه', 'مکزیک', + 'موریتانی', 'موریس', 'موزامبیک', 'مولداوی', 'موناکو', 'مونته‌نگرو', + 'میانمار', 'ایالات فدرال میکرونزی', 'نائورو', 'نامیبیا', 'نپال', + 'نروژ', 'نیجریه', 'نیکاراگوئه', 'نیوزیلند', 'واتیکان', 'وانواتو', + 'ونزوئلا', 'ویتنام', 'هائیتی', 'هلند', 'هندوراس', 'هند', 'یمن', 'یونان', + ) + + city_formats = ( + '{{city_prefix}} {{first_name}}', + ) + street_name_formats = ( + '{{first_name}} {{street_suffix}}', + '{{last_name}} {{street_suffix}}' + ) + street_address_formats = ( + '{{building_number}} {{street_name}}', + '{{building_number}} {{street_name}} {{secondary_address}}', + ) + address_formats = ( + "{{street_address}}\n{{city}}, {{state}} {{postcode}}", + ) + secondary_address_formats = ('سوئیت ###', 'واحد ###') + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def state(self): + return self.random_element(self.states) diff --git a/src/faker/providers/fi_FI/address.py b/src/libs/faker/providers/address/fi_FI/__init__.py similarity index 76% rename from src/faker/providers/fi_FI/address.py rename to src/libs/faker/providers/address/fi_FI/__init__.py index 20fdb21..cd8a9e6 100644 --- a/src/faker/providers/fi_FI/address.py +++ b/src/libs/faker/providers/address/fi_FI/__init__.py @@ -1,6 +1,6 @@ -# coding=utf8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -10,139 +10,136 @@ class Provider(AddressProvider): postcode_formats = ('#####', ) city_formats = ('{{city_name}}', ) - + street_name_formats = ('{{fruit}}{{street_suffix}}', ) - + street_address_formats = ('{{street_name}} {{building_number}}',) - + address_formats = ("{{street_address}}\n{{postcode}} {{city}}", ) cities = ( - 'Akaa', 'Alajärvi', 'Alavus', 'Espoo', 'Forssa', 'Haapajärvi', - 'Haapavesi', 'Hämeenlinna', 'Hamina', 'Hanko', 'Harjavalta', - 'Haukipudas', 'Heinola', 'Helsinki', 'Huittinen', 'Hyvinkää', - 'Iisalmi', 'Ikaalinen', 'Imatra', 'Jakobstad', 'Joensuu', 'Juankoski', - 'Jyväskylä', 'Jämsä', 'Järvenpää', 'Kaarina', 'Kajaani', 'Kalajoki', - 'Kankaanpää', 'Kannus', 'Karkkila', 'Kaskinen', 'Kauhajoki', 'Kauhava', - 'Kauniainen', 'Kemi', 'Kemijärvi', 'Kerava', 'Keuruu', 'Kitee', - 'Kiuruvesi', 'Kokemäki', 'Kokkola', 'Kotka', 'Kouvola', 'Kristinestad', - 'Kuhmo', 'Kuopio', 'Kurikka', 'Kuusamo', 'Lahti', 'Laitila', - 'Lappeenranta', 'Lapua', 'Lieksa', 'Lohja', 'Loimaa', 'Loviisa', - 'Mänttä-Vilppula', 'Mariehamn', 'Mikkeli', 'Naantali', 'Närpes', - 'Nilsiä', 'Nivala', 'Nokia', 'Nurmes', 'Nykarleby', 'Orimattila', - 'Orivesi', 'Oulainen', 'Oulu', 'Outokumpu', 'Paimio', 'Pargas', - 'Parkano', 'Pieksämäki', 'Pori', 'Porvoo', 'Pudasjärvi', 'Pyhäjärvi', - 'Raahe', 'Raseborg', 'Rauma', 'Raisio', 'Riihimäki', 'Rovaniemi', - 'Saarijärvi', 'Salo', 'Sastamala', 'Savonlinna', 'Seinäjoki', 'Siuntio', - 'Somero', 'Suonenjoki', 'Tampere', 'Tornio', 'Turku', 'Ulvila', - 'Uusikaupunki', 'Vaasa', 'Valkeakoski', 'Vantaa', 'Varkaus', - 'Viitasaari', 'Virrat', 'Ylivieska', 'Ylöjärvi', 'Äänekoski', 'Ähtäri' + 'Akaa', 'Alajärvi', 'Alavus', 'Espoo', 'Forssa', 'Haapajärvi', + 'Haapavesi', 'Hämeenlinna', 'Hamina', 'Hanko', 'Harjavalta', + 'Haukipudas', 'Heinola', 'Helsinki', 'Huittinen', 'Hyvinkää', + 'Iisalmi', 'Ikaalinen', 'Imatra', 'Jakobstad', 'Joensuu', 'Juankoski', + 'Jyväskylä', 'Jämsä', 'Järvenpää', 'Kaarina', 'Kajaani', 'Kalajoki', + 'Kankaanpää', 'Kannus', 'Karkkila', 'Kaskinen', 'Kauhajoki', 'Kauhava', + 'Kauniainen', 'Kemi', 'Kemijärvi', 'Kerava', 'Keuruu', 'Kitee', + 'Kiuruvesi', 'Kokemäki', 'Kokkola', 'Kotka', 'Kouvola', 'Kristinestad', + 'Kuhmo', 'Kuopio', 'Kurikka', 'Kuusamo', 'Lahti', 'Laitila', + 'Lappeenranta', 'Lapua', 'Lieksa', 'Lohja', 'Loimaa', 'Loviisa', + 'Mänttä-Vilppula', 'Mariehamn', 'Mikkeli', 'Naantali', 'Närpes', + 'Nilsiä', 'Nivala', 'Nokia', 'Nurmes', 'Nykarleby', 'Orimattila', + 'Orivesi', 'Oulainen', 'Oulu', 'Outokumpu', 'Paimio', 'Pargas', + 'Parkano', 'Pieksämäki', 'Pori', 'Porvoo', 'Pudasjärvi', 'Pyhäjärvi', + 'Raahe', 'Raseborg', 'Rauma', 'Raisio', 'Riihimäki', 'Rovaniemi', + 'Saarijärvi', 'Salo', 'Sastamala', 'Savonlinna', 'Seinäjoki', 'Siuntio', + 'Somero', 'Suonenjoki', 'Tampere', 'Tornio', 'Turku', 'Ulvila', + 'Uusikaupunki', 'Vaasa', 'Valkeakoski', 'Vantaa', 'Varkaus', + 'Viitasaari', 'Virrat', 'Ylivieska', 'Ylöjärvi', 'Äänekoski', 'Ähtäri', ) countries = ( - 'Afganistan', 'Alankomaat', 'Albania', 'Algeria', 'Andorra', 'Angola', - 'Antigua ja Barbuda', 'Argentiina', 'Armenia', 'Australia', - 'Azerbaidžan', 'Bahama', 'Bahrain', 'Bangladesh', 'Barbados', 'Belgia', - 'Belize', 'Benin', 'Bhutan', 'Bolivia', 'Bosnia ja Hertsegovina', - 'Botswana', 'Brasilia', 'Brunei', 'Bulgaria', 'Burkina', 'Faso', - 'Burundi', 'Chile', 'Costa', 'Rica', 'Djibouti', 'Dominica', - 'Dominikaaninen tasavalta', 'Ecuador', 'Egypti', 'El', 'Salvador', - 'Eritrea', 'Espanja', 'Etelä-Afrikka', 'Korean tasavalta', - 'Etelä-Sudan', 'Etiopia', 'Fidži', 'Filippiinit', 'Gabon', 'Gambia', - 'Georgia', 'Ghana', 'Grenada', 'Guatemala', 'Guinea-Bissau', 'Guinea', - 'Guyana', 'Haiti', 'Honduras', 'Indonesia', 'Intia', 'Irak', 'Iran', - 'Irlanti', 'Islanti', 'Israel', 'Italia', 'Itä-Timor', 'Itävalta', - 'Jamaika', 'Japani', 'Jemen', 'Jordania', 'Kambodža', 'Kamerun', - 'Kanada', 'Kap', 'Verde', 'Kazakstan', 'Kenia', - 'Keski-Afrikan tasavalta', 'Kiina', 'Kirgisia', 'Kiribati', - 'Kolumbia', 'Komorit', 'Kongon demokraattinen tasavalta', - 'Kongon tasavalta', 'Kosovo', 'Kreikka', 'Kroatia', 'Kuuba', 'Kuwait', - 'Kypros', 'Laos', 'Latvia', 'Lesotho', 'Libanon', 'Liberia', 'Libya', - 'Liechtenstein', 'Liettua', 'Luxemburg', 'Madagaskar', 'Makedonia', - 'Malawi', 'Malediivit', 'Malesia', 'Mali', 'Malta', 'Marokko', - 'Marshallinsaaret', 'Mauritania', 'Mauritius', 'Meksiko', 'Mikronesia', - 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Mosambik', 'Myanmar', - 'Namibia', 'Nauru', 'Nepal', 'Nicaragua', 'Nigeria', 'Niger', 'Norja', - 'Norsunluurannikko', 'Oman', 'Pakistan', 'Palau', 'Panama', - 'Papua-Uusi-Guinea', 'Paraguay', 'Peru', - 'Korean demokraattinen kansantasavalta', 'Portugali', 'Puola', - 'Päiväntasaajan Guinea', 'Qatar', 'Ranska', 'Romania', 'Ruanda', - 'Ruotsi', 'Saint Kitts ja Nevis', 'Saint Lucia', - 'Saint Vincent ja Grenadiinit', 'Saksa', 'Salomonsaaret', 'Sambia', - 'Samoa', 'San Marino', 'São Tomé ja Príncipe', - 'Saudi-Arabia', 'Senegal', 'Serbia', 'Seychellit', 'Sierra', 'Leone', - 'Singapore', 'Slovakia', 'Slovenia', 'Somalia', 'Sri', 'Lanka', 'Sudan', - 'Suomi', 'Suriname', 'Swazimaa', 'Sveitsi', 'Syyria', 'Tadžikistan', - 'Tansania', 'Tanska', 'Thaimaa', 'Togo', 'Tonga', 'Trinidad ja Tobago', - 'Tšad', 'Tšekki', 'Tunisia', 'Turkki', 'Turkmenistan', 'Tuvalu', - 'Uganda', 'Ukraina', 'Unkari', 'Uruguay', 'Uusi-Seelanti', 'Uzbekistan', - 'Valko-Venäjä', 'Vanuatu', 'Vatikaanivaltio', 'Venezuela', 'Venäjä', - 'Vietnam', 'Viro', 'Yhdistyneet arabiemiirikunnat', - 'Yhdistynyt kuningaskunta', 'Yhdysvallat', 'Zimbabwe' + 'Afganistan', 'Alankomaat', 'Albania', 'Algeria', 'Andorra', 'Angola', + 'Antigua ja Barbuda', 'Argentiina', 'Armenia', 'Australia', + 'Azerbaidžan', 'Bahama', 'Bahrain', 'Bangladesh', 'Barbados', 'Belgia', + 'Belize', 'Benin', 'Bhutan', 'Bolivia', 'Bosnia ja Hertsegovina', + 'Botswana', 'Brasilia', 'Brunei', 'Bulgaria', 'Burkina', 'Faso', + 'Burundi', 'Chile', 'Costa', 'Rica', 'Djibouti', 'Dominica', + 'Dominikaaninen tasavalta', 'Ecuador', 'Egypti', 'El', 'Salvador', + 'Eritrea', 'Espanja', 'Etelä-Afrikka', 'Korean tasavalta', + 'Etelä-Sudan', 'Etiopia', 'Fidži', 'Filippiinit', 'Gabon', 'Gambia', + 'Georgia', 'Ghana', 'Grenada', 'Guatemala', 'Guinea-Bissau', 'Guinea', + 'Guyana', 'Haiti', 'Honduras', 'Indonesia', 'Intia', 'Irak', 'Iran', + 'Irlanti', 'Islanti', 'Israel', 'Italia', 'Itä-Timor', 'Itävalta', + 'Jamaika', 'Japani', 'Jemen', 'Jordania', 'Kambodža', 'Kamerun', + 'Kanada', 'Kap', 'Verde', 'Kazakstan', 'Kenia', + 'Keski-Afrikan tasavalta', 'Kiina', 'Kirgisia', 'Kiribati', + 'Kolumbia', 'Komorit', 'Kongon demokraattinen tasavalta', + 'Kongon tasavalta', 'Kosovo', 'Kreikka', 'Kroatia', 'Kuuba', 'Kuwait', + 'Kypros', 'Laos', 'Latvia', 'Lesotho', 'Libanon', 'Liberia', 'Libya', + 'Liechtenstein', 'Liettua', 'Luxemburg', 'Madagaskar', 'Makedonia', + 'Malawi', 'Malediivit', 'Malesia', 'Mali', 'Malta', 'Marokko', + 'Marshallinsaaret', 'Mauritania', 'Mauritius', 'Meksiko', 'Mikronesia', + 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Mosambik', 'Myanmar', + 'Namibia', 'Nauru', 'Nepal', 'Nicaragua', 'Nigeria', 'Niger', 'Norja', + 'Norsunluurannikko', 'Oman', 'Pakistan', 'Palau', 'Panama', + 'Papua-Uusi-Guinea', 'Paraguay', 'Peru', + 'Korean demokraattinen kansantasavalta', 'Portugali', 'Puola', + 'Päiväntasaajan Guinea', 'Qatar', 'Ranska', 'Romania', 'Ruanda', + 'Ruotsi', 'Saint Kitts ja Nevis', 'Saint Lucia', + 'Saint Vincent ja Grenadiinit', 'Saksa', 'Salomonsaaret', 'Sambia', + 'Samoa', 'San Marino', 'São Tomé ja Príncipe', + 'Saudi-Arabia', 'Senegal', 'Serbia', 'Seychellit', 'Sierra', 'Leone', + 'Singapore', 'Slovakia', 'Slovenia', 'Somalia', 'Sri', 'Lanka', 'Sudan', + 'Suomi', 'Suriname', 'Swazimaa', 'Sveitsi', 'Syyria', 'Tadžikistan', + 'Tansania', 'Tanska', 'Thaimaa', 'Togo', 'Tonga', 'Trinidad ja Tobago', + 'Tšad', 'Tšekki', 'Tunisia', 'Turkki', 'Turkmenistan', 'Tuvalu', + 'Uganda', 'Ukraina', 'Unkari', 'Uruguay', 'Uusi-Seelanti', 'Uzbekistan', + 'Valko-Venäjä', 'Vanuatu', 'Vatikaanivaltio', 'Venezuela', 'Venäjä', + 'Vietnam', 'Viro', 'Yhdistyneet arabiemiirikunnat', + 'Yhdistynyt kuningaskunta', 'Yhdysvallat', 'Zimbabwe', ) states = ( - 'Turun ja Porin lääni', 'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni', - 'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni', - 'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni', - 'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni', - 'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni', - 'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni', - 'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni', - 'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni', - 'Itä-Suomen lääni', '', 'Turun ja Porin lääni', - 'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni', - 'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni', - 'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni', - 'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni', - 'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni', - 'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni', - 'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni', - 'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni', + 'Turun ja Porin lääni', 'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni', + 'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni', + 'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni', + 'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni', + 'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni', + 'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni', + 'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni', + 'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni', + 'Itä-Suomen lääni', '', 'Turun ja Porin lääni', + 'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni', + 'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni', + 'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni', + 'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni', + 'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni', + 'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni', + 'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni', + 'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni', 'Itä-Suomen lääni' ) street_suffixes = ('tie', 'katu', 'polku', 'kuja', 'bulevardi') - # Using fruits to generate street names, since it doesn't make + # Using fruits to generate street names, since it doesn't make # much grammatical sense to use first names fruits = ( - 'Ananas', 'Ananaskirsikka', 'Annoona', 'Appelsiini', 'Aprikoosi', - 'Avokado', 'Banaani', 'Cantaloupemeloni', 'Durio', 'Feijoa', - 'Galiameloni', 'Granaattiomena', 'Granadilla', 'Greippi', 'Guava', - 'Hunajameloni', 'Jakkihedelmä', 'Kaki', 'Kaktusviikuna', 'Karambola', - 'Kastanja', 'Keittobanaani', 'Keltainen', 'kiivi', 'Keltapassio', - 'Kiivi', 'Kirsikka', 'Kirsikkaluumu', 'Kiwai', 'Kiwano','Kookospähkinä', - 'Kumkvatti', 'Limetti', 'Limkvatti', 'Litsi', 'Longaani', 'Luumu', - 'Mandariini', 'Mango', 'Mangostaani', 'Maracuya', 'Meloni', 'Nashi', - 'Nektariini', 'Omena', 'Papaija', 'Passionhedelmä', 'Persikka','Pepino', - 'Pikkusitrukset', 'Pitahaya', 'Pomelo', 'Pähkinä', 'Päärynä', - 'Rambutani', 'Rumeliini', 'Sapodilla', 'Salaki', 'Sitruuna', - 'Sokerimeloni', 'Sweetie', 'Taateli', 'Tamarillo', 'Tomaatti', - 'Verkkomeloni', 'Vesimeloni', 'Viikuna', 'Viinirypäle', 'Ananas', - 'Annoona', 'Appelsiini', 'Aprikoosi', 'Avokado', 'Banaani', - 'Cantaloupemeloni', 'Durio', 'Feijoa', 'Galiameloni', 'Granaattiomena', - 'Granadilla', 'Greippi', 'Guava', 'Hunajameloni', 'Jakkihedelmä','Kaki', - 'Kaktusviikuna', 'Karambola', 'Kastanja', 'Keittobanaani','Keltapassio', - 'Kiivi', 'Kirsikka', 'Kirsikkaluumu', 'Kiwai', 'Kiwano','Kookospähkinä', - 'Kumkvatti', 'Limetti', 'Limkvatti', 'Litsi', 'Longaani', 'Luumu', - 'Mandariini', 'Mango', 'Mangostaani', 'Maracuya', 'Meloni', 'Nashi', - 'Nektariini', 'Omena', 'Papaija', 'Passionhedelmä', 'Persikka','Pepino', + 'Ananas', 'Ananaskirsikka', 'Annoona', 'Appelsiini', 'Aprikoosi', + 'Avokado', 'Banaani', 'Cantaloupemeloni', 'Durio', 'Feijoa', + 'Galiameloni', 'Granaattiomena', 'Granadilla', 'Greippi', 'Guava', + 'Hunajameloni', 'Jakkihedelmä', 'Kaki', 'Kaktusviikuna', 'Karambola', + 'Kastanja', 'Keittobanaani', 'Keltainen', 'kiivi', 'Keltapassio', + 'Kiivi', 'Kirsikka', 'Kirsikkaluumu', 'Kiwai', 'Kiwano', 'Kookospähkinä', + 'Kumkvatti', 'Limetti', 'Limkvatti', 'Litsi', 'Longaani', 'Luumu', + 'Mandariini', 'Mango', 'Mangostaani', 'Maracuya', 'Meloni', 'Nashi', + 'Nektariini', 'Omena', 'Papaija', 'Passionhedelmä', 'Persikka', 'Pepino', 'Pikkusitrukset', 'Pitahaya', 'Pomelo', 'Pähkinä', 'Päärynä', - 'Rambutani', 'Rumeliini', 'Sapodilla', 'Salaki', 'Sitruuna', - 'Sokerimeloni', 'Sweetie', 'Taateli', 'Tamarillo', 'Tomaatti', + 'Rambutani', 'Rumeliini', 'Sapodilla', 'Salaki', 'Sitruuna', + 'Sokerimeloni', 'Sweetie', 'Taateli', 'Tamarillo', 'Tomaatti', + 'Verkkomeloni', 'Vesimeloni', 'Viikuna', 'Viinirypäle', 'Ananas', + 'Annoona', 'Appelsiini', 'Aprikoosi', 'Avokado', 'Banaani', + 'Cantaloupemeloni', 'Durio', 'Feijoa', 'Galiameloni', 'Granaattiomena', + 'Granadilla', 'Greippi', 'Guava', 'Hunajameloni', 'Jakkihedelmä', 'Kaki', + 'Kaktusviikuna', 'Karambola', 'Kastanja', 'Keittobanaani', 'Keltapassio', + 'Kiivi', 'Kirsikka', 'Kirsikkaluumu', 'Kiwai', 'Kiwano', 'Kookospähkinä', + 'Kumkvatti', 'Limetti', 'Limkvatti', 'Litsi', 'Longaani', 'Luumu', + 'Mandariini', 'Mango', 'Mangostaani', 'Maracuya', 'Meloni', 'Nashi', + 'Nektariini', 'Omena', 'Papaija', 'Passionhedelmä', 'Persikka', 'Pepino', + 'Pikkusitrukset', 'Pitahaya', 'Pomelo', 'Pähkinä', 'Päärynä', + 'Rambutani', 'Rumeliini', 'Sapodilla', 'Salaki', 'Sitruuna', + 'Sokerimeloni', 'Sweetie', 'Taateli', 'Tamarillo', 'Tomaatti', 'Verkkomeloni', 'Vesimeloni', 'Viikuna', 'Viinirypäle' ) - @classmethod - def fruit(cls): - return cls.random_element(cls.fruits) + def fruit(self): + return self.random_element(self.fruits) - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) + def city_name(self): + return self.random_element(self.cities) - @classmethod - def state(cls): - return cls.random_element(cls.states) + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/fr_CH/__init__.py b/src/libs/faker/providers/address/fr_CH/__init__.py new file mode 100644 index 0000000..f585dc3 --- /dev/null +++ b/src/libs/faker/providers/address/fr_CH/__init__.py @@ -0,0 +1,140 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_suffixes = ('-des-Bois', '-les-Bains', '-la-Ville', '-Dessus', + '-Dessous', ' am Rhein', ' am See', ' am Albis', + ' an der Aare') + city_prefixes = ('Saint ', 'Sainte ', 'San ', 'Ober', 'Unter') + street_prefixes = ('rue', 'rue', 'chemin', 'avenue', 'boulevard') + + address_formats = ("{{street_address}}\n{{postcode}} {{city}}",) + + building_number_formats = ('%', '%#', '%#', '%#', '%##') + + city_formats = ('{{last_name}}', '{{last_name}}', '{{last_name}}', + '{{last_name}}', '{{last_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', + '{{last_name}}{{city_suffix}}', + '{{last_name}}-près-{{last_name}}', + '{{last_name}}-sur-{{last_name}}', + '{{city_prefix}}{{last_name}}', + '{{last_name}} ({{canton_code}})',) + + street_address_formats = ('{{street_name}}', + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}}',) + street_name_formats = ('{{street_prefix}} {{last_name}}', + '{{street_prefix}} {{first_name}} {{last_name}}', + '{{street_prefix}} de {{last_name}}',) + + postcode_formats = ('1###', '2###', '3###', '4###', '5###', '6###', '7###', + '8###', '9###') + + cantons = (('AG', 'Argovie'), ('AI', 'Appenzell Rhodes-Intérieures'), + ('AR', 'Appenzell Rhodes-Extérieures'), ('BE', 'Berne'), + ('BL', 'Bâle-Campagne'), ('BS', 'Bâle-Ville'), ('FR', + 'Fribourg'), + ('GE', 'Genève'), ('GL', 'Glaris'), ('GR', 'Grisons'), ('JU', + 'Jura'), + ('LU', 'Lucerne'), ('NE', 'Neuchâtel'), ('NW', + 'Nidwald'), ('OW', + 'Obwald'), + ('SG', 'Saint-Gall'), ('SH', 'Schaffhouse'), ('SO', 'Soleure'), + ('SZ', 'Schwytz'), ('TG', 'Thurgovie'), ('TI', + 'Tessin'), ('UR', + 'Uri'), + ('VD', 'Vaud'), ('VS', 'Valais'), ('ZG', 'Zoug'), ('ZH', + 'Zurich'),) + + countries = ( + 'Afghanistan', 'Afrique du sud', 'Albanie', 'Algérie', 'Allemagne', + 'Andorre', 'Angola', 'Anguilla', 'Antarctique', 'Antigua et Barbuda', + 'Antilles néerlandaises', 'Arabie saoudite', 'Argentine', 'Arménie', + 'Aruba', 'Australie', 'Autriche', 'Azerbaïdjan', 'Bahamas', 'Bahrain', + 'Bangladesh', 'Belgique', 'Belize', 'Benin', 'Bermudes (Les)', + 'Bhoutan', 'Biélorussie', 'Bolivie', 'Bosnie-Herzégovine', 'Botswana', + 'Bouvet (Îles)', 'Brunei', 'Brésil', 'Bulgarie', 'Burkina Faso', + 'Burundi', 'Cambodge', 'Cameroun', 'Canada', 'Cap Vert', + 'Cayman (Îles)', 'Chili', 'Chine (Rép. pop.)', 'Christmas (Île)', + 'Chypre', 'Cocos (Îles)', 'Colombie', 'Comores', 'Cook (Îles)', + 'Corée du Nord', 'Corée, Sud', 'Costa Rica', 'Croatie', 'Cuba', + 'Côte d\'Ivoire', 'Danemark', 'Djibouti', 'Dominique', 'Égypte', + 'El Salvador', 'Émirats arabes unis', 'Équateur', 'Érythrée', + 'Espagne', 'Estonie', 'États-Unis', 'Ethiopie', 'Falkland (Île)', + 'Fidji (République des)', 'Finlande', 'France', + 'Féroé (Îles)', 'Gabon', 'Gambie', 'Ghana', 'Gibraltar', 'Grenade', + 'Groenland', 'Grèce', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinée', + 'Guinée Equatoriale', 'Guinée-Bissau', 'Guyane', 'Guyane française', + 'Géorgie', 'Géorgie du Sud et Sandwich du Sud (Îles)', 'Haïti', + 'Heard et McDonald (Îles)', 'Honduras', 'Hong Kong', 'Hongrie', + 'Îles Mineures Éloignées des États-Unis', 'Inde', 'Indonésie', 'Irak', + 'Iran', 'Irlande', 'Islande', 'Israël', 'Italie', 'Jamaïque', 'Japon', + 'Jordanie', 'Kazakhstan', 'Kenya', 'Kirghizistan', 'Kiribati', + 'Koweit', 'La Barbad', 'Laos', 'Lesotho', 'Lettonie', 'Liban', 'Libye', + 'Libéria', 'Liechtenstein', 'Lithuanie', 'Luxembourg', 'Macau', + 'Macédoine', 'Madagascar', 'Malaisie', 'Malawi', 'Maldives (Îles)', + 'Mali', 'Malte', 'Mariannes du Nord (Îles)', 'Maroc', + 'Marshall (Îles)', 'Martinique', 'Maurice', 'Mauritanie', 'Mayotte', + 'Mexique', 'Micronésie (États fédérés de)', 'Moldavie', 'Monaco', + 'Mongolie', 'Montserrat', 'Mozambique', 'Myanmar', 'Namibie', 'Nauru', + 'Nepal', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk (Îles)', + 'Norvège', 'Nouvelle Calédonie', 'Nouvelle-Zélande', 'Oman', 'Ouganda', + 'Ouzbékistan', 'Pakistan', 'Palau', 'Panama', + 'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Pays-Bas', 'Philippines', + 'Pitcairn (Îles)', 'Pologne', 'Polynésie française', 'Porto Rico', + 'Portugal', 'Pérou', 'Qatar', 'Roumanie', 'Royaume-Uni', 'Russie', + 'Rwanda', 'Rép. Dém. du Congo', 'République centrafricaine', + 'République Dominicaine', 'République tchèque', 'Réunion (La)', + 'Sahara Occidental', 'Saint Pierre et Miquelon', + 'Saint Vincent et les Grenadines', 'Saint-Kitts et Nevis', + 'Saint-Marin (Rép. de)', 'Sainte Hélène', 'Sainte Lucie', 'Samoa', + 'Samoa', 'Seychelles', 'Sierra Leone', 'Singapour', 'Slovaquie', + 'Slovénie', 'Somalie', 'Soudan', 'Sri Lanka', 'Suisse', 'Suriname', + 'Suède', 'Svalbard et Jan Mayen (Îles)', 'Swaziland', 'Syrie', + 'São Tomé et Príncipe (Rép.)', 'Sénégal', 'Tadjikistan', 'Taiwan', + 'Tanzanie', 'Tchad', 'Territoire britannique de l\'océan Indien', + 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', + 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', + 'Turks et Caïques (Îles)', 'Turquie', 'Tuvalu', 'Ukraine', 'Uruguay', + 'Vanuatu', 'Vatican (Etat du)', 'Venezuela', 'Vierges (Îles)', + 'Vierges britanniques (Îles)', 'Vietnam', 'Wallis et Futuna (Îles)', + 'Yemen', 'Yougoslavie', 'Zambie', 'Zaïre', 'Zimbabwe',) + + def street_prefix(self): + """ + :example 'rue' + """ + return self.random_element(self.street_prefixes) + + def city_prefix(self): + """ + :example 'rue' + """ + return self.random_element(self.city_prefixes) + + def canton(self): + """ + Randomly returns a swiss canton ('Abbreviated' , 'Name'). + :example ('VD' . 'Vaud') + """ + return self.random_element(self.cantons) + + def canton_name(self): + """ + Randomly returns a Swiss canton name. + :example 'Vaud' + """ + return self.canton()[1] + + def canton_code(self): + """ + Randomly returns a Swiss canton code. + :example 'VD' + """ + return self.canton()[0] diff --git a/src/faker/providers/fr_FR/address.py b/src/libs/faker/providers/address/fr_FR/__init__.py similarity index 92% rename from src/faker/providers/fr_FR/address.py rename to src/libs/faker/providers/address/fr_FR/__init__.py index 6a308cf..353d4c7 100644 --- a/src/faker/providers/fr_FR/address.py +++ b/src/libs/faker/providers/address/fr_FR/__init__.py @@ -1,12 +1,15 @@ # coding=utf-8 from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): city_suffixes = ('Ville', 'Bourg', '-les-Bains', '-sur-Mer', '-la-Forêt', 'boeuf', 'nec', 'dan') + city_prefixes = ('Saint', 'Sainte') street_prefixes = ('rue', 'rue', 'chemin', 'avenue', 'boulevard') city_formats = ( + '{{city_prefix}} {{first_name}}', + '{{city_prefix}} {{first_name}}{{city_suffix}}', '{{last_name}}', '{{last_name}}', '{{last_name}}', @@ -107,44 +110,42 @@ class Provider(AddressProvider): ('971', 'Guadeloupe'), ('972', 'Martinique'), ('973', 'Guyane'), ('974', 'La Réunion'), ('976', 'Mayotte') ) - @classmethod - def street_prefix(cls): + def street_prefix(self): """ :example 'rue' """ - return cls.random_element(cls.street_prefixes) + return self.random_element(self.street_prefixes) - @classmethod - def region(cls): + def city_prefix(self): + """ + :example 'rue' + """ + return self.random_element(self.city_prefixes) + + def region(self): """ :example 'Guadeloupe' """ - return cls.random_element(cls.regions) + return self.random_element(self.regions) - @classmethod - def department(cls): + def department(self): """ Randomly returns a french department ('departmentNumber' , 'departmentName'). :example ('2B' . 'Haute-Corse') """ - return cls.random_element(cls.departments) + return self.random_element(self.departments) - @classmethod - def department_name(cls): + def department_name(self): """ Randomly returns a french department name. :example 'Ardèche' """ - return cls.department()[1] + return self.department()[1] - @classmethod - def department_number(cls): + def department_number(self): """ Randomly returns a french department number. :example '59' """ - return cls.department()[0] - - - + return self.department()[0] diff --git a/src/libs/faker/providers/address/he_IL/__init__.py b/src/libs/faker/providers/address/he_IL/__init__.py new file mode 100644 index 0000000..865c778 --- /dev/null +++ b/src/libs/faker/providers/address/he_IL/__init__.py @@ -0,0 +1,624 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_formats = ('{{city_name}}', ) + street_name_formats = ('{{street_title}}', ) + street_address_formats = ('{{street_name}} {{building_number}}', ) + address_formats = ('{{street_address}}, {{city}}, {{postcode}}', ) + postcode_formats = ('#######', ) + + # Data sourced from data.gov.il + # https://data.gov.il/dataset/321 + + street_titles = ( + "אביב", + "אביגיל", + "אבן מסעוד", + "אברבנאל", + "אברהם ברזילי", + "אגוז", + "אדמון", + "אהרון מאיר מזיא", + "אהרונוביץ", + "אולפן", + "אורנים", + "אזור בית הקברות", + "אזור תעשיה א'", + "אזור תעשיה הר יונה", + "אזור תעשייה", + "אזור תעשייה מזרח", + "אח\"י אילת", + "אייזיק ניוטון", + "איילת השחר )מ ק(", + "אייר", + "אילניה", + "אימבר", + "אירוס", + "אירוס", + "אל הודא סמ3", + "אלוורוד", + "אלול", + "אלומה", + "אלזאבוד", + "אל-זהרא'", + "אל זיתון סמ2", + "אלזיתונה סמ7", + "אל חגאג בן יוסף", + "אל-חראיק סמ3", + "אלחרש", + "אל-ט'הרה סמ7", + "אלישר", + "אלכנסת", + "אלכסנדר ינאי", + "אלכרום", + "אלכתאב", + "אל-לימון", + "אלמזדלפה", + "אל-מחאג'ר סמ3", + "אל-מחאג'ר סמ4", + "אלמנשיה-מושירפה", + "אל-מקפה סמ9", + "אל-סביל סמ6", + "אלסלילמה", + "אלסריס", + "אלעמשקה", + "אלעקבה", + "אל-פארוק סמ2", + "אלפג'ר", + "אלרשיד", + "אלתין", + "אלתרמן", + "אסא המלך", + "אפעל", + "ארבל", + "אשדוד", + "אשל", + "אתגר", + "אתר חפץ חיים", + "בועז", + "בורסת היהלומים", + "ביכורים", + "ביל\"ו", + "בילינסון", + "בית אבות", + "בית היוצר", + "בית יצחק-שער חפר", + "בית ראשון במולדת", + "בן יהודה", + "בן ישי", + "בן לברט", + "בן צבי יצחק", + "בן צבי יצחק", + "בן צבי שמעון", + "בקעת הירח", + "ברגמן אליעזר", + "ברוריה", + "ברזיל", + "ברקת", + "בשמת", + "בשמת", + "גבע", + "גבע", + "גבעת חיים )מאוחד(", + "גובר רבקה", + "גוטמכר", + "גולדה מאיר", + "ג'ו עמר", + "גיבתון חנוך", + "גינוסר", + "גפן", + "גפן", + "גרטרוד קראוס", + "גרינבוים", + "דבורה", + "דודו דותן", + "דולב", + "דולצ'ין אריה", + "דחי", + "דיה", + "דימיטר פשב", + "דרב אלברג'", + "דרומית-מג'ד אלכרום", + "דריפוס", + "דרך הארץ", + "דרך הגן", + "דרך חברון", + "דרך חלמית", + "דרך שועפאט סמ4", + "האדמו\"ר מויז'ניץ", + "האודם", + "האורן", + "האורנים", + "האחים בז'רנו", + "האילן", + "האילנות", + "האילתית", + "האלונים", + "האמוראים", + "האצטדיון", + "האצ\"ל", + "הברדלס", + "הברוש", + "הבריגדה", + "הגבורה", + "הגפן", + "הגפן", + "הדגניות", + "הדולב", + "הדייגים", + "הדרך האמריקאית סמ12", + "ההגנה", + "ההגנה", + "הולצברג שמחה", + "הופרט יעקב", + "הורדים", + "הורקנוס יוחנן", + "הזיתים", + "הזמיר", + "החבל", + "החותרים", + "החלוצים", + "החליל", + "החמנית", + "החסידה", + "החצב", + "החצב", + "החרוב", + "החרובים", + "החרמון", + "החשמל", + "היוזם", + "הינשוף", + "היקינטון", + "הל\"ה", + "המאה ואחד", + "המבריא", + "המברק", + "המגינים", + "המגינים", + "המורד", + "המייסדים", + "המלאכה", + "המלאכה", + "המלכים", + "הממונה", + "המנוע", + "המסגר", + "המעיין", + "המפרש", + "המצודה", + "המרגנית", + "המשור", + "הנוטר", + "הנורית", + "הנורית", + "הנקר", + "הנרד", + "הסיגלית", + "הסיפון", + "העבודה", + "העבודה", + "העצמון", + "הפעמון", + "הפרדס", + "הפרדס", + "הפרדס", + "הפרדס", + "הצאלון", + "הצבעוני", + "הקישון", + "הראשונים", + "הרב בידאני עובדיה", + "הרב וולף", + "הרב חכם שמעון", + "הרבי מליובאוויטש", + "הרב ניסים", + "הרב עוזיאל", + "הרב רפאל עבו", + "הרדוף", + "הרדוף", + "הרדוף", + "הרותם", + "הרי גולן", + "הר יהל", + "הרימון", + "הר כנען", + "הרליץ יוסף", + "הר סיני", + "הר עצמון", + "הר צרור", + "הרקפת", + "הרשקו אברהם", + "הרשת", + "השדות", + "השחר", + "השיזף", + "השיח", + "השיטה", + "השעורה", + "השר ברזילי", + "התאנה", + "התבור", + "התקוה", + "ויקטור ויוליוס", + "וערת סעד", + "ז'בוטינסקי", + "זגגי", + "זיגורד", + "זיו", + "ז'ילבר", + "זית", + "זכרון יעקב", + "חוחית", + "חוף הים", + "חושן", + "חזון איש", + "חזן יעקב", + "חיטה", + "חיים וייצמן", + "חלמיש", + "חצב", + "חרת א בוס", + "חתוכה יורם", + "טאבליא", + "טאחונת אלראהיב", + "טביב", + "טופז", + "י\"א באדר", + "יאפא", + "יד העפלה ממרוקו", + "ידידה", + "יהודה הלוי", + "יהודה המכבי", + "יהודה המכבי", + "יואב", + "יונה", + "יזרעאל", + "יחזקאל הנביא", + "יכין", + "ירושלים", + "ירקון", + "ישועת דוד", + "יששכר", + "כאבול", + "כהן אלי", + "כהנא", + "כוכב הצפון", + "כזיב", + "כיסופים", + "ככר ירדן", + "ככר נחשון", + "כנרת", + "כפר ילדים נרדים", + "כרם חמד", + "לב הקריה", + "לביא אריק", + "לבקוביץ", + "לוד הצעירה", + "לוטם", + "לוין מיכאל וחנה", + "לוין שמריהו", + "לוריא", + "לח\"י", + "לילינבלום", + "לכיש", + "לסקוב חיים", + "מבוא הדס", + "מבוא הזיתים", + "מבוא חיים מקובנה", + "מבוא חמה", + "מבצע הראל", + "מבצע חירם", + "מבצע עובדה", + "מגלן", + "מוסיוף שלמה", + "מופק דיאב", + "מוצא", + "מורדי הגטאות", + "מורן", + "מזל שור", + "מזרחי יוסף", + "מיכה", + "מירון", + "מישאל", + "מלון רויאל פארק", + "מנזר המארונים", + "מעבר לים", + "מעוז חיים", + "מעונות ים", + "מעלה כגן הלנה", + "מענית", + "מצדה", + "מצפה גילה", + "מרגיל מחוור", + "מרווה", + "מרחביה )מושב(", + "מרכז", + "משה דיין", + "משואות יצחק", + "משעול אבוקדו", + "משעול האלה", + "משעול המחתרות", + "משעול הסיפן", + "משעול הצופית", + "משעול התפוח", + "משעול מוריה", + "משעול נקר", + "משעול פארן", + "נאות אביבים", + "נאות אשכול", + "נאות הדקל", + "נדב יצחק", + "נהריה", + "נוה עוז", + "נוף כנרת", + "נורית", + "נחל נחשון", + "נחל סרפד", + "נחל ערוגות מ\"ר", + "נחל פארן", + "נחלת צדוק", + "ניר עם", + "נעמ\"ת", + "נצרת עילית", + "נשר", + "נתיב הפורצים", + "נתן", + "סביונים מכבים רעות", + "סומך עובדיה", + "סיתוונית", + "סלא איירין", + "סלעית", + "סמ 20 20", + "סמבורסקי דניאל", + "סמ בני ברית", + "סמ הבוסתן", + "סמ הרכבת", + "סמ השחף", + "סמטת השחר", + "סמ מאלה", + "סמ מסילה א", + "סמ עין גנים", + "סמ עינב", + "סמ שפיפון", + "סנט הלנה", + "עבד אל-גני", + "עגור", + "ע הלל", + "עובדי הנמל", + "עוגן", + "עולש מצוי", + "עומר", + "עידו הנביא", + "עין שביב", + "עירית", + "עמוס", + "עמוס הנביא", + "עמנואל )רינגלבלום(", + "ענזה", + "עפולה", + "עקבת א תות", + "פדויים", + "פטדה", + "פנינה", + "פקוד מרכז", + "פרומקין גד", + "פרופ' בירק יהודית", + "פרופס", + "פרי חדש", + "צדוק הכהן", + "צובה", + "צופית", + "צוקית", + "צור", + "צמחי היהודים", + "צפרירים", + "צפת", + "צפת", + "קבועה )שבט(", + "קדמת צבי", + "קישון אפרים", + "קנין הארץ", + "קרית עקרון", + "קרל נטר", + "קרן היסוד", + "רביבים", + "רבנו תם", + "רבקה אמנו", + "רח 101", + "רח 1043", + "רח 1060", + "רח 12", + "רח 1238", + "רח 124", + "רח 135", + "רח 14", + "רח 16", + "רח 16", + "רח 2001", + "רח 2306", + "רח 5041", + "רח 6020", + "רח 6073", + "רח 6087", + "רח 68", + "רח 7035", + "רח 7038", + "רח 7069", + "רח 71", + "רחבת פנינה", + "רח ה", + "רח מו כ שלם", + "רח רז", + "ריחאניה", + "רלב\"ג", + "רמב\"ם", + "רמב\"ן", + "רמת האירוסים", + "רמת כרמים", + "רקפת", + "רש\"י", + "ש אסבסטונים", + "ש אסבסט צפון", + "שאר ישוב", + "ש בבלי", + "שבזי", + "שבזי", + "שבטי ישראל", + "שבט ראובן", + "שביל הרקפות", + "שביל קליפות התפוזים", + "שד גאולים", + "שד גת", + "שד העצמאות", + "שד ח\"ן", + "שד יוספטל גיורא", + "ש הפועלים", + "שוהם", + "שומרון", + "שושנה דמארי", + "שושנת הכרמל", + "שז\"ר זלמן", + "שיזף", + "שכ 14", + "שכ החלוצים", + "שכ היובל", + "שכ הפועל המזרחי ג'", + "שכ הרכבת", + "שכ זאב", + "שכ חפצי בה", + "שכ מחניים", + "שכ נווה הדקל", + "שכ עראק אלשבאב", + "שכ קחאוש", + "שכ רסקו", + "שלדג", + "שמחוני", + "שמחוני אסף", + "שמעון המכבי", + "שני", + "ש סלע חדש", + "ש פועלים", + "ש\"ץ גרשון", + "ש ציונים כלליים", + "שקד", + "ש קואפרטיבים", + "שריג", + "ש רמת אביב", + "תאנה", + "תל חי", + "תפארת ישראל", + "תרס\"ח", + "תרצ\"ו") + + city_names = ( + "אבו רובייעה )שבט(", + "אביבים", + "אביחיל", + "אודם", + "אור הנר", + "אורטל", + "אטרש )שבט(", + "אליקים", + "אל סייד", + "באר מילכה", + "בית ברל", + "בית הלוי", + "בית חנן", + "בית חנניה", + "בית חשמונאי", + "בני ציון", + "ברקאי", + "ברקת", + "גבעת השלושה", + "גבעת ח\"ן", + "גבעת כ\"ח", + "גדות", + "גונן", + "גינתון", + "גיתית", + "גן שורק", + "גנות הדר", + "גני מודיעין", + "גרופית", + "דוב\"ב", + "דולב", + "האון", + "הסוללים", + "העוגן", + "הר אדר", + "ורד יריחו", + "זוהר", + "חיננית", + "חצור-אשדוד", + "חצור הגלילית", + "חשמונאים", + "טל-אל", + "יד רמב\"ם", + "כסלון", + "כפר אחים", + "כפר הנוער הדתי", + "כפר יונה", + "כפר מסריק", + "כפר סירקין", + "לוזית", + "לקיה", + "מגאר", + "מגן", + "מזכרת בתיה", + "מירון", + "מכמורת", + "מלאה", + "מסד", + "מעונה", + "מרחביה )מושב(", + "משמר העמק", + "נווה חריף", + "נוקדים", + "נורדיה", + "נחלה", + "נטע", + "נירן", + "נתיב השיירה", + "סגולה", + "סער", + "עדי", + "עזר", + "עין אל-אסד", + "עין השופט", + "עין צורים", + "עלי זהב", + "עמוקה", + "עמיר", + "עמקה", + "עספיא", + "עצמון שגב", + "פוריה - נווה עובד", + "פוריידיס", + "פקיעין חדשה", + "צורית", + "צפרירים", + "רגבה", + "רחוב", + "ריינה", + "רימונים", + "רמות מנשה", + "שדה אליהו", + "שדות מיכה", + "שדי תרומות", + "שומרה", + "שיטים", + "שעב", + "שפר", + "שתולים", + "תלמי אליהו") + + def city_name(self): + return self.random_element(self.city_names) + + def street_title(self): + return self.random_element(self.street_titles) diff --git a/src/libs/faker/providers/address/hi_IN/__init__.py b/src/libs/faker/providers/address/hi_IN/__init__.py new file mode 100644 index 0000000..a7f5771 --- /dev/null +++ b/src/libs/faker/providers/address/hi_IN/__init__.py @@ -0,0 +1,53 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + + city_formats = ('{{city_name}}', ) + + street_name_formats = ( + '{{first_name}} {{last_name}}', + '{{last_name}}' + ) + + street_address_formats = ('{{building_number}} {{street_name}}', ) + + address_formats = ('{{street_address}}\n{{city}} {{postcode}}', '{{street_address}}\n{{city}}-{{postcode}}',) + + building_number_formats = ('####', '###', '##', '#', '#/#', '##/##', '##/###', '##/####') + + postcode_formats = ('######', ) + + cities = ( + 'आदिलाबाद', 'अगरतला', 'अहमदाबाद', 'अहमदनगर', 'अजमेर', 'अम्बाजी', 'अमरपुर', 'इलाहाबाद', 'अकोला', 'अखनूर', + 'अन्तर्गत', 'अलांग', 'अलीगढ', 'दादरा और नागर हवेली', 'अमरावती', 'अमरोहा', 'अनन्तपुर', 'करना', 'जिससेबेलारी', + 'अनंतनाग', 'भागलपुर', 'पेपरबोर्डस', 'त्रिबेनी', 'टिसूज', 'भद्रक', 'बचेली', 'बहादुरगंज', 'बहादुरगढ', 'चिरमिरी', 'चिराला', 'चित्रदुर्ग', + 'चित्तूर', 'चित्रकूट', 'देवगढ़', 'दालखोला', 'देवास', 'चंडीगढ', 'फादर', 'चिन्नफ', 'चिपलुन', 'चक्रधरपुर', 'चंबा', 'फतहपुर', 'फतेहपुर', + 'फतेहगढ', 'फतहपुर', 'फतहपुर', 'चित्तूर', 'चित्रकूट', 'सभापतिने', 'देवगढ़', 'द्वारारस्वीकृति', 'दालखोला', + 'धर्मापुरी', 'पाकाला', 'धारवाड', 'असम', 'देहरा', 'रानीताल', 'खडगपुर', 'मोकामा', 'मोकोकचुंग', 'जिलोंपर', 'विस्तारण', 'मोतिहारी', + ) + + states = ( + 'अरूणाचल प्रदेश', 'बिहार', 'असम', 'आंध्र प्रदेश', 'छत्तीसगढ', 'हरियाणा', 'गुजरात', 'हिमाचल प्रदेश', 'गोवा', 'मध्य प्रदेश', 'महाराष्ट्र', 'कश्मीर', + 'केरल', 'कर्नाटक', 'मणिपुर', 'मिजोरम', 'मेघालय', 'सिबक्कम', 'राजस्थान', 'पंजाब', 'उडीसा', 'उत्तरांचल', 'उत्तर प्रदेश', 'तमिलनाडु', 'त्रिपुरा', + 'पश्चिमी बंगाल', 'अंडमान और निकोबार', 'द्वीप समूह', 'दमन और दीव', 'दादरा और नागर हवेली', 'दिल्ली', 'पांडिचेरी', 'लक्षद्वीप' + ) + + countries = ( + 'आर्मेनिया', 'यू.के.', 'फ्रांस', 'अजेपटीना', 'ब्राजील', 'ईरान', 'यूनान', 'स्पेन', 'हमारे', 'जॉजिऩया', 'लेबनान', 'सायप्रस', 'सीरिया', 'कनाडा', 'रूस', + 'संयुक्त राज्य अमरीका', 'नेदर्लान्ड', 'फ्रांस', 'ऑस्ट्रेलिया', 'एंटीगुआ', 'बार्बुडा', 'अर्जेंटीना', 'आर्मेनिया', 'ऑस्ट्रिया', 'अज़रबाइजान', 'बारबाडोस', 'बेलारूस', 'बेल्जियम', + 'बेलीज़', 'बेनिन', 'बहामास', 'बहरीन', 'बांग्लादेश', 'भूटान', 'बोलिविया', 'बोस्निया', 'हर्जेगोविना', 'बोत्सवाना', 'ब्राजील', 'ब्रुनेई', 'बुल्गारिया', 'बुर्किना', 'फ़ासो', + 'बर्मा', 'बुरूंडी', 'डोमिनिकन रिपब्लिक', 'गिनिया', 'टीमोर', 'फ़िनलैंड', 'गेबोन', 'गाम्बिया', 'जर्मनी', 'जार्जिया ग्रेनेडा', 'घाना', 'यूनान', 'ग्रेट ब्रिटेन', 'हंगरी', + 'भारत', 'इराक', 'आयरलैंड', 'इंडोनेशिया', 'इसराइल', 'आइलैंड', 'ईरान', 'इटली', 'जमैका', 'जॉर्डन', 'जापान', 'क़जाख़स्तान', 'केन्या', 'किरिबाती', 'दक्षिण कोरिया', 'लातविया', + 'लाओस', 'उत्तर कोरिया', 'दक्षिण कोसोवो', 'कुवैत', 'लेबनान', 'लिचटीनस्टीन', 'लिथुआनिया', 'लक्समबर्ग', 'लीबिया', 'लाइबेरिया', 'लेसोथो', + 'नेपाल', 'न्यूजीलैंड', 'निकारागुआ', 'नाइजर', 'नाउरू', 'लुसिया', 'रूस', 'रोमानिया', 'अरब', 'अमीरात', 'यूएई', 'युगांडा', 'यूक्रेन', 'उरूग्वे', + 'उज़बेकिस्तान', 'यूनाइटेड किंगडम', 'वानुआतू', 'वेटिकन सिटी', 'वेनेजुएला', 'पश्चिमी सहारा', 'वियतनाम', 'यमन', 'ज़ायर', 'जाबम्बया', 'जिम्बाब्वे', + ) + + def city_name(self): + return self.random_element(self.cities) + + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/hr_HR/__init__.py b/src/libs/faker/providers/address/hr_HR/__init__.py new file mode 100644 index 0000000..e8559e2 --- /dev/null +++ b/src/libs/faker/providers/address/hr_HR/__init__.py @@ -0,0 +1,176 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + + city_formats = ('{{city_name}}', ) + + street_name_formats = ('{{street_name}}', ) + street_address_formats = ('{{street_name}} {{building_number}}', ) + address_formats = ('{{street_address}}\n{{postcode}} {{city}}', ) + + building_number_formats = ('###', '##', '#', '#a', '#b', '#c', + '#a/#', '#b/#', '#c/#') + + postcode_formats = ('#####', ) + + street_suffixes_long = ( + '', 'ulica', 'cesta', 'put', 'avenija', + ) + street_suffixes_short = ( + '', 'ul.', 'c.', 'a.', + ) + + cities = ( + "Bakar", "Beli Manastir", "Belišće", "Benkovac", "Biograd na Moru", + "Bjelovar", "Buje", "Buzet", "Cres", "Crikvenica", "Čabar", "Čakovec", + "Čazma", "Daruvar", "Delnice", "Donja Stubica", "Donji Miholjac", + "Drniš", "Dubrovnik", "Duga Resa", "Dugo Selo", "Đakovo", "Đurđevac", + "Garešnica", "Glina", "Gospić", "Grubišno Polje", + "Hrvatska Kostajnica", "Hvar", "Ilok", "Imotski", "Ivanec", + "Ivanić-Grad", "Jastrebarsko", "Karlovac", "Kastav", "Kaštela", + "Klanjec", "Knin", "Komiža", "Koprivnica", "Korčula", "Kraljevica", + "Krapina", "Križevci", "Krk", "Kutina", "Kutjevo", "Labin", + "Lepoglava", "Lipik", "Ludbreg", "Makarska", "Mali Lošinj", + "Metković", "Mursko Središće", "Našice", "Nin", "Nova Gradiška", + "Novalja", "Novi Marof", "Novi Vinodolski", "Novigrad", "Novska", + "Obrovac", "Ogulin", "Omiš", "Opatija", "Opuzen", "Orahovica", + "Oroslavje", "Osijek", "Otočac", "Otok", "Ozalj", "Pag", "Pakrac", + "Pazin", "Petrinja", "Pleternica", "Ploče", "Popovača", "Poreč", + "Požega", "Pregrada", "Prelog", "Pula", "Rab", "Rijeka", "Rovinj", + "Samobor", "Senj", "Sinj", "Sisak", "Skradin", "Slatina", + "Slavonski Brod", "Slunj", "Solin", "Split", "Stari Grad", + "Supetar", "Sveta Nedelja", "Sveti Ivan Zelina", "Šibenik", + "Trilj", "Trogir", "Umag", "Valpovo", "Varaždin", + "Varaždinske Toplice", "Velika Gorica", "Vinkovci", "Virovitica", + "Vis", "Vodice", "Vodnjan", "Vrbovec", "Vrbovsko", "Vrgorac", + "Vrlika", "Vukovar", "Zabok", "Zadar", "Zagreb", "Zaprešić", "Zlatar", + ) + + streets = ( + "Arnoldova", "Bakačeva", "Bijenička", "Bosanska", "Bučarova", + "Cmrok", "Čačkovićeva", "Davor", "Demetrova", + "Dolac", "Donje Prekrižje", "Draškovićeva", "Dubravkin", + "Dverce", "Dvoranski prečac", "Glogovac", "Golubovac", "Goljačke", + "Goljak", "Gornje Prekrižje", "Gračanska", "Gradec", "Grič", + "Gupčeva zvijezda", "Harmica", "Hercegovačka", "Horvatovac", + "Ilica", "Istarska", "Jabukovac", "Jadranska", "Jagodnjak", + "Javorovac", "Jezuitski trg", "Jurišićeva", "Jurjeve", + "Jurjevska", "Jurkovićeva", "Kamaufova", "Kamenita", "Kamenjak", + "Kaptol", "Kapucinske", "Klanac Grgura Tepečića", "Klenovac", + "Klesarski put", "Kozarčev vijenac", "Kožarska", "Kraljevec", + "Kraljevec II.", "Kraljevečki odvojak", "Kraljevečki ogranak", + "Krležin gvozd", "Krvavi most", "Ksaver", "Ksaverska", "Kurelčeva", + "Lisinskoga", "Lobmayerove", "Ljubinkovac", "Magdićeve", "Mala", + "Male", "Mašekova", "Medvedgradska", "Medveščak", "Mesnička", + "Mihaljevac", "Mirogojska", "Mletačka", "Mlinarska", "Mlinovi", + "Mlinske", "Naumovac", "Nemetova", "Nova Ves", + "Novi Goljak", "Opatička", "Opatovina", "Orlovac", + "Palmotićeva", "Pantovčak", "Paunovac", + "Perivoj biskupa Stjepana II.", "Perivoj srpanjskih žrtava", + "Petrova", "Pod zidom", "Podgaj", "Radnički dol", "Remetska", + "Ribnjak", "Rikardove", "Rockefellerova", "Rokov perivoj", "Rokova", + "Ružičnjak", "Skalinska", "Slavujevac", "Splavnica", + "Srebrnjak", "Streljačka", "Strossmayerovo šetalište", "Svibovac", + "Svibovac", "Šalata", "Šestinski vijenac", "Šestinski vrh", + "Šilobodov put", "Šumski prečac", "Tkalčićeva", "Tošovac", + "Tuškanac", "Vijenac", "Vinogradska", "Visoka", "Višnjica", + "Višnjičke", "Vitezovićeva", "Vlaška", "Voćarska", "Voćarsko naselje", + "Vončinina", "Vrazovo šetalište", "Wickerhauserova", "Zamenhofova", + "Zamenhofove", "Zavojna", "Zelengaj", "Zeleni dol", + "Zelenjak", "Zmajevac", "Zvonarnička", + ) + + states = ( + "Zagrebačka", + "Krapinsko-zagorska", + "Sisačko-moslavačka", + "Karlovačka", + "Varaždinska", + "Koprivničko-križevačka", + "Bjelovarsko-bilogorska", + "Primorsko-goranska", + "Ličko-senjska", + "Virovitičko-podravska", + "Požeško-slavonska", + "Brodsko-posavska", + "Zadarska", + "Osječko-baranjska", + "Šibensko-kninska", + "Vukovarsko-srijemska", + "Splitsko-dalmatinska", + "Istarska", + "Dubrovačko-neretvanska", + "Međimurska", + "Grad Zagreb", + ) + + countries = ( + "Afganistan", "Alandski otoci", "Albanija", "Alžir", "Američka Samoa", + "Američki Djevičanski Otoci", "Andora", "Angola", "Anguila", + "Antarktik", "Antigua i Barbuda", "Argentina", "Armenija", "Aruba", + "Australija", "Austrija", "Azerbajdžan", "Bahami", + "Bahrein", "Bangladeš", "Barbados", "Belgija", "Belize", + "Benin", "Bermuda", "Bjelorusija", "Bocvana", "Bolivija", + "Bosna i Hercegovina", "Božićni Otok", "Brazil", + "Britanski Djevičanski Otoci", "Britanski Teritorij Indijskog Oceana", + "Brunei Darussalam", "Bugarska", "Burkina Faso", "Burundi", "Butan", + "Cipar", "Crna Gora", "Curacao", "Čad", "Čile", "Danska", "Dominika", + "Dominikanska Republika", "Džibuti", "Egipat", "Ekvador", + "Ekvatorska Gvineja", "El Salvador", "Eritreja", "Estonija", + "Etiopija", "Falklandi", "Farski Otoci", "Fidži", "Filipini", "Finska", + "Francuska", "Francuska Gvajana", "Francuska Polinezija", + "Francuski Južni Teritoriji", "Gabon", "Gambija", "Gana", "Gibraltar", + "Vatikan", "Grčka", "Grenada", "Grenland", "Gruzija", "Guadeloupe", + "Guam", "Guernsey", "Gvajana", "Gvatemala", "Gvineja", "Gvineja Bisau", + "Haiti", "Honduras", "Hong Kong", "Hrvatska", "Indija", "Indonezija", + "Irak", "Iran, Islamska Republika", "Irska", "Island", "Isle Of Man", + "Istočni Timor", "Italija", "Izrael", "Jamajka", "Japan", "Jemen", + "Jersey", "Jordan", "Južna Afrika", + "Južna Gruzija i Južni Sendvič Otoci", "Kajmanski Otoci", "Kambodža", + "Kamerun", "Kanada", "Katar", "Kazakstan", "Kenija", "Kina", + "Kirgistan", "Kiribati", "Kokosovi Otoci", "Kolumbija", "Komori", + "Kongo", "Kongo, Demokratska Republika", "Koreja, Južna", + "Koreja, Sjeverna", "Kosovo", "Kostarika", "Kuba", "Kukovi Otoci", + "Kuvajt", "Laoska Narodna Demokratska Republika", "Latvija", "Lesoto", + "Libanon", "Liberija", "Libijska Arapska Džamahirija", "Lihtenštajn", + "Litva", "Luksemburg", "Madagaskar", "Mađarska", "Majote", "Makao", + "Makedonija", "Malavi", "Maldivi Maldives", "Malezija", "Mali", + "Malta", "Maroko", "Maršalovi Otoci", "Martinik", "Mauricijus", + "Mauritanija", "Meksiko", "Mijanmar", "Mikronezija", + "Moldavija, Republika", "Monako", "Mongolija", "Montserat", "Mozambik", + "Namibija", "Nauru", "Nepal", "Niger", "Nigerija", "Nikaragva", "Niue", + "Nizozemska", "Norveška", "Nova Kaledonija", "Novi Zeland", "Njemačka", + "Obala Slonovače", "Oman", "Otok Bouvet", + "Otok Heard i Otoci McDonald", "Otok Norfolk", "Pakistan", "Palau", + "Palestinsko Područje", "Panama", "Papua Nova Gvineja", "Paragvaj", + "Peru", "Pitcairn", "Poljska Poland", "Portoriko", "Portugal", + "Republika Češka", "Reunion", "Ruanda", "Rumunjska", "Rusija", + "Salamunovi Otoci", "Samoa", "San Marino", "São Tomé ai Príncipe", + "Saudijska Arabija", "Sejšeli", "Senegal", "Sijera Leone", "Singapur", + "Sint Maarten", "Sirija", "Sjedinjene Američke Države", + "Sjeverni Marijanski Otoci", "Slovačka", "Slovenija", "Somalija", + "Južni Sudan", "Srbija", "Srednjoafrička Republika", "Sudan", + "Surinam", "Svalbard i Jan Mayen", "Svaziland", "Sveta Helena", + "Sveti Bartolomej", "Sveti Martin", "Sveti Petar i Miguel", + "Sv. Kristofor i Nevis", "Sv. Lucija", "Sv. Vincent i Grenadini", + "Španjolska", "Šri Lanka", "Švedska", "Švicarska", "Tadžikistan", + "Tajland", "Tajvan", "Tanzanija", "Togo", "Tokelau", "Tonga", + "Trinidad i Tobago", "Tunis", "Turkmenistan", "Turkski i Kaikos Otoci", + "Turska", "Tuvalu", "Uganda", + "Ujedinjene Države Manjih Pacifičkih Otoka", + "Ujedinjeni Arapski Emirati", "Ukrajina", "Urugvaj", "Uzbekistan", + "Vanuatu", "Velika Britanija", "Venezuela", "Vijetnam", + "Wallis i Futuna", "Zambija", "Zapadna Sahara", "Zeleni Rt", + ) + + def city_name(self): + return self.random_element(self.cities) + + def street_name(self): + return self.random_element(self.streets) + + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/hu_HU/__init__.py b/src/libs/faker/providers/address/hu_HU/__init__.py new file mode 100644 index 0000000..4e74b61 --- /dev/null +++ b/src/libs/faker/providers/address/hu_HU/__init__.py @@ -0,0 +1,133 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + street_suffixes = OrderedDict( + (('utca', 0.75), ('út', 0.1), ('tér', 0.1), ('köz', 0.001), ('körút', 0.001), ('sétány', 0.001),)) + + street_name_formats = ('{{frequent_street_name}} {{street_suffix}}', '{{real_city_name}}i {{street_suffix}}', + '{{city_part}}{{city_suffix}}i {{street_suffix}}', + '{{city_prefix}}{{city_part}}i {{street_suffix}}') + + # Currently deprecated. + # secondary_address_formats = ("#.em #.", "##. em. #.") + + + city_formats = ('{{city_prefix}}{{city_part}}{{city_suffix}}', '{{city_part}}{{city_suffix}}', '{{real_city_name}}') + + street_address_formats = ('{{street_name}} {{building_number}}',) + + address_formats = ("{{street_address}}\n{{postcode}} {{city}}",) + + frequent_street_names = ( + 'Ady Endre', 'Dózsa György', 'Petőfi', 'Petőfi Sándor', 'Arany János', 'Béke', 'Szabadság', 'Kossuth', + 'József Attila') + + # The 'real city name' generator includes a number of real cities of + # Hungary that no generator could feasibly dispense. Please note that the + # post code generator is, at this point, not capable of generating a + # fitting post code. In Hungary, post codes are determined by the county of + # the place (see the county generator), and for this reason, often there + # will be a discrepancy. A patch is in the works - until then, use + # Wikipedia to resolve postcode issues. + # + # This generator was created by collecting the 30 largest Hungarian places + # by population, based on the Hungarian Gazetteer generated with effect as + # of 01 January 2016 (http://www.ksh.hu/docs/hun/hnk/hnk_2016.pdf). + + real_city_names = ( + 'Budapest', 'Debrecen', 'Szeged', 'Miskolc', 'Pécs', 'Győr', 'Nyíregyháza', 'Kecskemét', 'Székesfehérvár', + 'Szombathely', 'Szolnok', 'Tatabánya', 'Érd', 'Kaposvár', 'Sopron', 'Veszprém', 'Békéscsaba', 'Zalaegerszeg', + 'Eger', 'Nagykanizsa', 'Dunaújváros', 'Hódmezővásárhely', 'Dunakeszi', 'Szigetszentmiklós', 'Cegléd', 'Baja', + 'Salgótarján', 'Ózd', 'Vác', 'Mosonmagyaróvár') + + city_prefs = ( + 'kis', 'nagy', 'szent', 'duna', 'tisza', 'alsó', 'felső', 'belső', 'bakony', 'vác', 'mező', 'nyék', 'nyír', + 'balaton', 'borsod', 'buda', 'hajdú', 'kun', 'moson', 'pilis', 'új', 'egyházas', 'dráva', 'magyar', 'mátra', + 'somogy', 'lajos', 'bács', 'békés', 'puszta', 'orosz', 'rác', 'szerb', 'német', 'török') + + city_parts = ( + 'híd', 'györgy', 'mindszent', 'kereszt', 'márton', 'hát', 'hetven', 'mellék', 'tamási', 'tapolca', 'fürdő', + 'liget', 'szék', 'tót', '') + + city_suffixes = ( + 'háza', 'németi', 'devecser', 'fa', 'nádasd', 'apáti', 'falu', 'falva', 'vég', 'vár', 'vára', 'várad', 'hida', + 'kövesd', 'bánya', 'halas', 'berény', 'kőrös', 'haraszti', 'város') + + counties = ( + 'Bács-Kiskun', 'Baranya', 'Békés', 'Borsod-Abaúj-Zemplén', 'Csongrád', 'Fejér', 'Győr-Moson-Sopron', 'Hajdú-Bihar', + 'Heves', 'Jász-Nagykun-Szolnok', 'Komárom-Esztergom', 'Nógrád', 'Pest', 'Somogy', 'Szabolcs-Szatmár-Bereg', 'Tolna', + 'Vas', 'Veszprém', 'Zala') + + countries = ( + "Afganisztán", "Aland-szigetek", "Albánia", "Algéria", "Amerikai Szamoa", "Amerikai Virgin-szigetek", "Andorra", + "Angola", "Anguilla", "Antarktisz", "Antigua és Barbuda", "Apostoli Szentszék", "Argentína", "Aruba", + "Ausztrália", "Ausztria", "Amerikai Egyesült Államok Külső Szigetei", "Azerbajdzsán", "Bahama-szigetek", + "Bahrein", "Banglades", "Barbados", "Fehéroroszország", "Belgium", "Belize", "Benin", "Bermuda", "Bhután", + "Bissa -Guinea", "Bolívia", "Bosznia-Hercegovina", "Botswana", "Bouvet-sziget", "Brazília", + "Brit Indiai-óceáni Terület", "Brit Virgin - szigetek", "Brunei", "Bulgária", "Burkina Faso", "Burundi", + "Chile", "Ciprus", "Comore-szigetek", "Cook-szigetek", "Costa Rica", "Csád", "Csehország", "Dánia", + "Dél-Afrika", "Dél-Korea", "Dominika", "Dominikai Köztársaság", "Dzsibuti", "Ecuador", "Egyenlítői-Guinea", + "Egyesült Államok", "Egyesült Arab Emírségek", "Egyesült Királyság", "Egyiptom", "Elefántcsontpart", "Eritrea", + "Északi Mariana-szigetek", "Észak-Korea", "Észtország", "Etiópia", "Falkland-szigetek", "Feröer szigetek", + "Fidzsi-szigetek", "Finnország", "Francia Déli Területek", "Francia Guyana", "Francia Polinézia", + "Franciaország", "Fülöp-szigetek", "Gabon", "Gambia", "Ghána", "Gibraltár", "Görögország", "Grenada", + "Grönland", "Grúzia", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guyana", "Haiti", "Holland Antillák", + "Hollandia", "Honduras", "Hongkong", "Horvátország", "India", "Indonézia", "Irak", "Irán", "Írország", "Izland", + "Izrael", "Jamaica", "Japán", "Jemen", "Jordánia", "Kajmán-szigetek", "Kambodzsa", "Kamerun", "Kanada", + "Karácsony-sziget", "Katar", "Kazahsztán", "Kelet-Timor", "Kenya", "Kína", "Kirgizisztán", "Kiribati", + "Keeling-szigetek", "Kolumbia", "Kongó", "Kongói Demokratikus Köztársaság", "Közép-afrikai Köztársaság", "Kuba", + "Kuvait", "Laosz", "Lengyelország", "Lesotho", "Lettország", "Libanon", "Libéria", "Líbia", "Liechtenstein", + "Litvánia", "Luxemburg", "Macedónia", "Madagaszkár", "Magyarország", "Makaó", "Malajzia", "Malawi", + "Maldív-szigetek", "Mali", "Málta", "Marokkó", "Marshall-szigetek", "Martinique", "Mauritánia", "Mauritius", + "Mayotte", "Mexikó", "Mianmar", "Mikronézia", "Moldova", "Monaco", "Mongólia", "Montenegró", "Montserrat", + "Mozambik", "Namíbia", "Nauru", "Németország", "Nepál", "Nicaragua", "Niger", "Nigéria", "Niue", + "Norfolk-sziget", "Norvégia", "Nyugat-Szahara", "Olaszország", "Omán", "Oroszország", "Örményország", + "Pakisztán", "Palau", "Panama", "Pápua", "Új-Guinea", "Paraguay", "Peru", "Pitcairn-szigetek", "Portugália", + "Puerto Rico", "Réunion", "Románia", "Ruanda", "Saint Kitts és Nevis", "Saint Lucia", + "Saint-Pierre és Miquelon", "Saint Vincent és Grenadine-szigetek", "Salamon-szigetek", "Salvador", "San Marino", + "São Tomé és Príncipe", "Seychelle-szigetek", "Sierra Leone", "Spanyolország", "Srí Lanka", "Suriname", "Svájc", + "Svalbard szigetek", "Svédország", "Szamoa", "Szaúdi-Arábia", "Szenegál", "Szent Ilona", "Szerbia", "Szingapúr", + "Szíria", "Szlovákia", "Szlovénia", "Szomália", "Szudán", "Szváziföld", "Tádzsikisztán", "Tajvan", "Tanzánia", + "Thaiföld", "Togo", "Tokelau-szigetek", "Tonga", "Törökország", "Trinidad és Tobago", "Tunézia", + "Turks- és Caicos-szigetek", "Tuvalu", "Türkmenisztán", "Uganda", "Új-Kaledónia", "Új-Zéland", "Ukrajna", + "Uruguay", "Üzbegisztán", "Vanuatu", "Venezuela", "Vietnam", "Wallis és Futuna", "Zambia", "Zimbabwe", + "Zöld-foki szigetek",) + + def county(self): + return self.random_element(self.counties) + + def street_address_with_county(self): + return "{street_address}\n{county} megye\n{postcode} {city}".format(street_address=self.street_address(), + county=self.county(), + postcode=self.postcode(), + city=self.city().capitalize()) + + def city_prefix(self): + return self.random_element(self.city_prefs) + + def city_part(self): + return self.random_element(self.city_parts) + + def real_city_name(self): + return self.random_element(self.real_city_names) + + def frequent_street_name(self): + return self.random_element(self.frequent_street_names) + + def postcode(self): + return "H-{}{}{}{}".format(super(Provider, self).random_digit_not_null(), super(Provider, self).random_digit(), + super(Provider, self).random_digit(), + super(Provider, self).random_digit()) + + def street_name(self): + return super(Provider, self).street_name().capitalize() + + def building_number(self): + numeric_part = super(Provider, self).random_int(1, 250) + return str(numeric_part) + "." diff --git a/src/libs/faker/providers/address/id_ID/__init__.py b/src/libs/faker/providers/address/id_ID/__init__.py new file mode 100644 index 0000000..33b6a54 --- /dev/null +++ b/src/libs/faker/providers/address/id_ID/__init__.py @@ -0,0 +1,162 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AddressProvider + +class Provider(AddressProvider): + + building_number_formats = ('###', '##', '#',) + + city_formats = ('{{city_name}}',) + + postcode_formats = ('#####',) + + street_name_formats = ( + '{{street_prefix_short}} {{street}}', + '{{street_prefix_long}} {{street}}', + ) + + street_address_formats = ( + '{{street_name}} No. {{building_number}}', + ) + + address_formats = ( + '{{street_address}}\n{{city}}, {{state}} {{postcode}}', + '{{street_address}}\n{{city}}, {{state_abbr}} {{postcode}}', + ) + + # From http://elibrary.dephub.go.id/elibrary/media/catalog/0010-021500000000135/swf/618/Lampiran%20E%20Data%20Bandung.pdf + streets = ( + 'Abdul Muis ', 'Antapani Lama', 'Asia Afrika', 'Astana Anyar', 'BKR', + 'Cihampelas', 'Cikapayang', 'Cikutra Barat', 'Cikutra Timur', + 'Ciumbuleuit', 'Ciwastra', 'Dipatiukur', 'Dipenogoro', 'Dr. Djunjunan', + 'Gardujati', 'Gedebage Selatan', 'Gegerkalong Hilir', + 'HOS. Cokroaminoto', 'Ir. H. Djuanda', 'Jakarta ', 'Jamika', + 'Jend. A. Yani', 'Jend. Sudirman', 'K.H. Wahid Hasyim', 'Kebonjati', + 'Kiaracondong', 'Laswi', 'Lembong', 'Merdeka', 'Moch. Ramdan', + 'Moch. Toha', 'Pacuan Kuda', 'Pasir Koja', 'Pasirkoja', 'Pasteur', + 'Pelajar Pejuang', 'Peta', 'PHH. Mustofa ', 'Rajawali Barat', + 'Rajawali Timur', 'Raya Setiabudhi', 'Raya Ujungberung', 'Rumah Sakit', + 'Sadang Serang', 'Sentot Alibasa', 'Setiabudhi', 'Siliwangi', + 'Soekarno Hatta', 'Sukabumi', 'Sukajadi', 'Suniaraja', 'Surapati', + 'Tubagus Ismail', 'Veteran', 'W.R. Supratman', + ) + + # Currently this is my own work + street_prefixes_long = ( + 'Jalan', 'Lorong', 'Gang', + ) + + # Currently this is my own work + street_prefixes_short = ( + 'Jl.', 'Lr.', 'Gg.', + ) + + # From https://id.wikipedia.org/wiki/Daftar_kabupaten_dan_kota_di_Indonesia#Daftar_kota + cities = ( + 'Ambon', 'Balikpapan', 'Banda Aceh', 'Bandar Lampung', 'Bandung', + 'Banjar', 'Banjarbaru', 'Banjarmasin', 'Batam', 'Batu', 'Bau-Bau', + 'Bekasi', 'Bengkulu', 'Bima', 'Binjai', 'Bitung', 'Blitar', 'Bogor', + 'Bontang', 'Bukittinggi', 'Cilegon', 'Cimahi', 'Cirebon', 'Denpasar', + 'Depok', 'Dumai', 'Gorontalo', 'Jambi', 'Jayapura', 'Kediri', 'Kendari', + 'Kota Administrasi Jakarta Barat', 'Kota Administrasi Jakarta Pusat', + 'Kota Administrasi Jakarta Selatan', 'Kota Administrasi Jakarta Timur', + 'Kota Administrasi Jakarta Utara', 'Kotamobagu', 'Kupang', 'Langsa', + 'Lhokseumawe', 'Lubuklinggau', 'Madiun', 'Magelang', 'Makassar', + 'Malang', 'Manado', 'Mataram', 'Medan', 'Metro', 'Meulaboh', + 'Mojokerto', 'Padang', 'Padang Sidempuan', 'Padangpanjang', 'Pagaralam', + 'Palangkaraya', 'Palembang', 'Palopo', 'Palu', 'Pangkalpinang', + 'Parepare', 'Pariaman', 'Pasuruan', 'Payakumbuh', 'Pekalongan', + 'Pekanbaru', 'Pematangsiantar', 'Pontianak', 'Prabumulih', + 'Probolinggo', 'Purwokerto', 'Sabang', 'Salatiga', 'Samarinda', + 'Sawahlunto', 'Semarang', 'Serang', 'Sibolga', 'Singkawang', 'Solok', + 'Sorong', 'Subulussalam', 'Sukabumi', 'Sungai Penuh', 'Surabaya', + 'Surakarta', 'Tangerang', 'Tangerang Selatan', 'Tanjungbalai', + 'Tanjungpinang', 'Tarakan', 'Tasikmalaya', 'Tebingtinggi', 'Tegal', + 'Ternate', 'Tidore Kepulauan', 'Tomohon', 'Tual', 'Yogyakarta', + ) + + # From https://id.wikipedia.org/wiki/Daftar_provinsi_di_Indonesia + states = ( + 'Aceh', 'Bali', 'Banten', 'Bengkulu', 'DI Yogyakarta', 'DKI Jakarta', + 'Gorontalo', 'Jambi', 'Jawa Barat', 'Jawa Tengah', 'Jawa Timur', + 'Kalimantan Barat', 'Kalimantan Selatan', 'Kalimantan Tengah', + 'Kalimantan Timur', 'Kalimantan Utara', 'Kepulauan Bangka Belitung', + 'Kepulauan Riau', 'Lampung', 'Maluku', 'Maluku Utara', + 'Nusa Tenggara Barat', 'Nusa Tenggara Timur', 'Papua', 'Papua Barat', + 'Riau', 'Sulawesi Barat', 'Sulawesi Selatan', 'Sulawesi Tengah', + 'Sulawesi Tenggara', 'Sulawesi Utara', 'Sumatera Barat', + 'Sumatera Selatan', 'Sumatera Utara', + ) + + # Currently this is my own work + states_abbr = ( + 'Aceh', 'Bali', 'Banten', 'Bengkulu', 'DIY', 'DKI', 'Gorontalo', + 'Jambi', 'Jabar', 'Jateng', 'Jatim', 'Kalbar', 'Kalsel', 'Kalteng', + 'Kaltim', 'Kalut', 'Babel', 'Kepri', 'Lampung', 'Maluku', 'Malut', + 'NTB', 'NTT', 'Papua', 'Papbar', 'Riau', 'Sulbar', 'Sulsel', 'Sulteng', + 'Sultra', 'Sulut', 'Sumbar', 'Sumsel', 'Sumut', + ) + + # From https://id.wikipedia.org/wiki/Daftar_negara-negara_di_dunia + countries = ( + 'Afganistan', 'Afrika Selatan', 'Afrika Tengah', 'Albania', 'Aljazair', + 'Amerika Serikat', 'Andorra', 'Angola', 'Antigua dan Barbuda', + 'Arab Saudi', 'Argentina', 'Armenia', 'Australia', 'Austria', + 'Azerbaijan', 'Bahama', 'Bahrain', 'Bangladesh', 'Barbados', 'Belanda', + 'Belarus', 'Belgia', 'Belize', 'Benin', 'Bhutan', 'Bolivia', + 'Bosnia dan Herzegovina', 'Botswana', 'Brasil', 'Britania Raya', + 'Brunei', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Ceko', 'Chad', + 'Chili', 'Denmark', 'Djibouti', 'Dominika', 'Ekuador', 'El Salvador', + 'Eritrea', 'Estonia', 'Ethiopia', 'Federasi Mikronesia', 'Fiji', + 'Filipina', 'Finlandia', 'Gabon', 'Gambia', 'Georgia', 'Ghana', + 'Grenada', 'Guatemala', 'Guinea', 'Guinea Khatulistiwa', + 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', 'Hongaria', 'India', + 'Indonesia', 'Irak', 'Iran', 'Islandia', 'Israel', 'Italia', 'Jamaika', + 'Jepang', 'Jerman', 'Kamboja', 'Kamerun', 'Kanada', 'Kazakhstan', + 'Kenya', 'Kepulauan Marshall', 'Kepulauan Solomon', 'Kirgizstan', + 'Kiribati', 'Kolombia', 'Komoro', 'Korea Selatan', 'Korea Utara', + 'Kosta Rika', 'Kroasia', 'Kuba', 'Kuwait', 'Laos', 'Latvia', 'Lebanon', + 'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lituania', + 'Luksemburg', 'Madagaskar', 'Maladewa', 'Malawi', 'Malaysia', 'Mali', + 'Malta', 'Maroko', 'Mauritania', 'Mauritius', 'Meksiko', 'Mesir', + 'Moldova', 'Monako', 'Mongolia', 'Montenegro', 'Mozambik', 'Myanmar', + 'Namibia', 'Nauru', 'Nepal', 'Niger', 'Nigeria', 'Nikaragua', + 'Norwegia', 'Oman', 'Pakistan', 'Palau', 'Panama', 'Pantai Gading', + 'Papua Nugini', 'Paraguay', 'Perancis', 'Peru', 'Polandia', 'Portugal', + 'Qatar', 'Republik Demokratik Kongo', 'Republik Dominika', + 'Republik Irlandia', 'Republik Kongo', 'Republik Makedonia', + 'Republik Rakyat Tiongkok', 'Rumania', 'Rusia', 'Rwanda', + 'Saint Kitts dan Nevis', 'Saint Lucia', 'Saint Vincent dan Grenadine', + 'Samoa', 'San Marino', 'São Tomé dan Príncipe', 'Selandia Baru', + 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapura', + 'Siprus', 'Slovenia', 'Slowakia', 'Somalia', 'Spanyol', 'Sri Lanka', + 'Sudan', 'Sudan Selatan', 'Suriah', 'Suriname', 'Swaziland', 'Swedia', + 'Swiss', 'Tajikistan', 'Tanjung Verde', 'Tanzania', 'Thailand', + 'Timor Leste', 'Togo', 'Tonga', 'Trinidad dan Tobago', 'Tunisia', + 'Turki', 'Turkmenistan', 'Tuvalu', 'Uganda', 'Ukraina', + 'Uni Emirat Arab', 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Vatikan', + 'Venezuela', 'Vietnam', 'Yaman', 'Yordania', 'Yunani', 'Zambia', + 'Zimbabwe', + ) + + def street(self): + return self.random_element(self.streets) + + def street_prefix_short(self): + return self.random_element(self.street_prefixes_short) + + def street_prefix_long(self): + return self.random_element(self.street_prefixes_long) + + def city_name(self): + return self.random_element(self.cities) + + def state(self): + return self.random_element(self.states) + + def state_abbr(self): + return self.random_element(self.states_abbr) + + def country(self): + return self.random_element(self.countries) diff --git a/src/libs/faker/providers/address/it_IT/__init__.py b/src/libs/faker/providers/address/it_IT/__init__.py new file mode 100644 index 0000000..4eef336 --- /dev/null +++ b/src/libs/faker/providers/address/it_IT/__init__.py @@ -0,0 +1,131 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_prefixes = ('San', 'Borgo', 'Sesto', 'Quarto', 'Settimo') + city_suffixes = ('a mare', 'lido', 'ligure', 'del friuli', 'salentino', + 'calabro', 'veneto', 'nell\'emilia', 'umbro', 'laziale', + 'terme', 'sardo', ) + building_number_formats = ('###', '##', '#') + street_suffixes = ('Piazza', 'Strada', 'Via', 'Borgo', 'Contrada', + 'Rotonda', 'Incrocio', 'Viale', 'Stretto', 'Vicolo', + 'Canale', ) + postcode_formats = ('#####', ) + states = ('Agrigento', 'Alessandria', 'Ancona', 'Aosta', 'Arezzo', + 'Ascoli Piceno', 'Asti', 'Avellino', 'Bari', + 'Barletta-Andria-Trani', 'Belluno', 'Benevento', 'Bergamo', + 'Biella', 'Bologna', 'Bolzano', 'Brescia', 'Brindisi', + 'Cagliari', 'Caltanissetta', 'Campobasso', 'Carbonia-Iglesias', + 'Caserta', 'Catania', 'Catanzaro', 'Chieti', 'Como', 'Cosenza', + 'Cremona', 'Crotone', 'Cuneo', 'Enna', 'Fermo', 'Ferrara', + 'Firenze', 'Foggia', 'Forlì-Cesena', 'Frosinone', 'Genova', + 'Gorizia', 'Grosseto', 'Imperia', 'Isernia', 'La Spezia', + 'L\'Aquila', 'Latina', 'Lecce', 'Lecco', 'Livorno', 'Lodi', + 'Lucca', 'Macerata', 'Mantova', 'Massa-Carrara', 'Matera', + 'Messina', 'Milano', 'Modena', 'Monza e della Brianza', 'Napoli', + 'Novara', 'Nuoro', 'Olbia-Tempio', 'Oristano', 'Padova', + 'Palermo', 'Parma', 'Pavia', 'Perugia', 'Pesaro e Urbino', + 'Pescara', 'Piacenza', 'Pisa', 'Pistoia', 'Pordenone', 'Potenza', + 'Prato', 'Ragusa', 'Ravenna', 'Reggio Calabria', 'Reggio Emilia', + 'Rieti', 'Rimini', 'Roma', 'Rovigo', 'Salerno', + 'Medio Campidano', 'Sassari', 'Savona', 'Siena', 'Siracusa', + 'Sondrio', 'Taranto', 'Teramo', 'Terni', 'Torino', 'Ogliastra', + 'Trapani', 'Trento', 'Treviso', 'Trieste', 'Udine', 'Varese', + 'Venezia', 'Verbano-Cusio-Ossola', 'Vercelli', 'Verona', + 'Vibo Valentia', 'Vicenza', 'Viterbo', ) + states_abbr = ('AG', 'AL', 'AN', 'AO', 'AR', 'AP', 'AT', 'AV', 'BA', 'BT', + 'BL', 'BN', 'BG', 'BI', 'BO', 'BZ', 'BS', 'BR', 'CA', 'CL', + 'CB', 'CI', 'CE', 'CT', 'CZ', 'CH', 'CO', 'CS', 'CR', 'KR', + 'CN', 'EN', 'FM', 'FE', 'FI', 'FG', 'FC', 'FR', 'GE', 'GO', + 'GR', 'IM', 'IS', 'SP', 'AQ', 'LT', 'LE', 'LC', 'LI', 'LO', + 'LU', 'MC', 'MN', 'MS', 'MT', 'ME', 'MI', 'MO', 'MB', 'NA', + 'NO', 'NU', 'OT', 'OR', 'PD', 'PA', 'PR', 'PV', 'PG', 'PU', + 'PE', 'PC', 'PI', 'PT', 'PN', 'PZ', 'PO', 'RG', 'RA', 'RC', + 'RE', 'RI', 'RN', 'RM', 'RO', 'SA', 'VS', 'SS', 'SV', 'SI', + 'SR', 'SO', 'TA', 'TE', 'TR', 'TO', 'OG', 'TP', 'TN', 'TV', + 'TS', 'UD', 'VA', 'VE', 'VB', 'VC', 'VR', 'VV', 'VI', + 'VT', ) + countries = ( + 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', + 'Angola', 'Anguilla', 'Antartide (territori a sud del 60° parallelo)', + 'Antigua e Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', + 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain', 'Bangladesh', + 'Barbados', 'Bielorussia', 'Belgio', 'Belize', 'Benin', 'Bermuda', + 'Bhutan', 'Bolivia', 'Bosnia e Herzegovina', 'Botswana', + 'Bouvet Island (Bouvetoya)', 'Brasile', + 'Territorio dell\'arcipelago indiano', 'Isole Vergini Britanniche', + 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambogia', + 'Cameroon', 'Canada', 'Capo Verde', 'Isole Cayman', + 'Repubblica Centrale Africana', 'Chad', 'Cile', 'Cina', + 'Isola di Pasqua', 'Isola di Cocos (Keeling)', 'Colombia', 'Comoros', + 'Congo', 'Isole Cook', 'Costa Rica', 'Costa d\'Avorio', 'Croazia', + 'Cuba', 'Cipro', 'Repubblica Ceca', 'Danimarca', 'Gibuti', + 'Repubblica Dominicana', 'Equador', 'Egitto', 'El Salvador', + 'Guinea Equatoriale', 'Eritrea', 'Estonia', 'Etiopia', 'Isole Faroe', + 'Isole Falkland (Malvinas)', 'Fiji', 'Finlandia', 'Francia', + 'Guyana Francese', 'Polinesia Francese', 'Territori Francesi del sud', + 'Gabon', 'Gambia', 'Georgia', 'Germania', 'Ghana', 'Gibilterra', + 'Grecia', 'Groenlandia', 'Grenada', 'Guadalupa', 'Guam', 'Guatemala', + 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', + 'Heard Island and McDonald Islands', 'Città del Vaticano', 'Honduras', + 'Hong Kong', 'Ungheria', 'Islanda', 'India', 'Indonesia', 'Iran', + 'Iraq', 'Irlanda', 'Isola di Man', 'Israele', 'Italia', 'Giamaica', + 'Giappone', 'Jersey', 'Giordania', 'Kazakhstan', 'Kenya', 'Kiribati', + 'Korea', 'Kuwait', 'Republicca Kirgiza', 'Repubblica del Laos', + 'Latvia', 'Libano', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', + 'Liechtenstein', 'Lituania', 'Lussemburgo', 'Macao', 'Macedonia', + 'Madagascar', 'Malawi', 'Malesia', 'Maldive', 'Mali', 'Malta', + 'Isole Marshall', 'Martinica', 'Mauritania', 'Mauritius', 'Mayotte', + 'Messico', 'Micronesia', 'Moldova', 'Principato di Monaco', 'Mongolia', + 'Montenegro', 'Montserrat', 'Marocco', 'Mozambico', 'Myanmar', + 'Namibia', 'Nauru', 'Nepal', 'Antille Olandesi', 'Olanda', + 'Nuova Caledonia', 'Nuova Zelanda', 'Nicaragua', 'Niger', 'Nigeria', + 'Niue', 'Isole Norfolk', 'Northern Mariana Islands', 'Norvegia', + 'Oman', 'Pakistan', 'Palau', 'Palestina', 'Panama', + 'Papua Nuova Guinea', 'Paraguay', 'Peru', 'Filippine', + 'Pitcairn Islands', 'Polonia', 'Portogallo', 'Porto Rico', 'Qatar', + 'Reunion', 'Romania', 'Russia', 'Rwanda', 'San Bartolomeo', + 'Sant\'Elena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', + 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', + 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Arabia Saudita', + 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', + 'Slovenia', 'Isole Solomon', 'Somalia', 'Sud Africa', + 'Georgia del sud e South Sandwich Islands', 'Spagna', 'Sri Lanka', + 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', + 'Svezia', 'Svizzera', 'Siria', 'Taiwan', 'Tajikistan', 'Tanzania', + 'Tailandia', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', + 'Trinidad e Tobago', 'Tunisia', 'Turchia', 'Turkmenistan', + 'Isole di Turks and Caicos', 'Tuvalu', 'Uganda', 'Ucraina', + 'Emirati Arabi Uniti', 'Regno Unito', 'Stati Uniti d\'America', + 'United States Minor Outlying Islands', 'Isole Vergini Statunitensi', + 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Venezuela', 'Vietnam', + 'Wallis and Futuna', 'Western Sahara', 'Yemen', 'Zambia', 'Zimbabwe', ) + + city_formats = ('{{city_prefix}} {{first_name}} {{city_suffix}}', + '{{city_prefix}} {{first_name}}', + '{{first_name}} {{city_suffix}}', + '{{last_name}} {{city_suffix}}', ) + street_name_formats = ('{{street_suffix}} {{first_name}}', + '{{street_suffix}} {{last_name}}') + street_address_formats = ( + '{{street_name}} {{building_number}}', + '{{street_name}} {{building_number}} {{secondary_address}}', ) + address_formats = ( + "{{street_address}}\n{{city}}, {{postcode}} {{state}} ({{state_abbr}})", + ) + secondary_address_formats = ('Appartamento ##', 'Piano #') + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def secondary_address(self): + return self.numerify( + self.random_element(self.secondary_address_formats)) + + def state(self): + return self.random_element(self.states) + + def state_abbr(self): + return self.random_element(self.states_abbr) diff --git a/src/libs/faker/providers/address/ja_JP/__init__.py b/src/libs/faker/providers/address/ja_JP/__init__.py new file mode 100644 index 0000000..fb1c65d --- /dev/null +++ b/src/libs/faker/providers/address/ja_JP/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + address_formats = ( + '{{prefecture}}{{city}}{{town}}{{chome}}{{ban}}{{gou}}', + '{{prefecture}}{{city}}{{town}}{{chome}}{{ban}}{{gou}} {{town}}{{building_name}}{{building_number}}', + '{{prefecture}}{{city}}{{town}}{{chome}}{{ban}}{{gou}} {{building_name}}{{town}}{{building_number}}', ) + + building_number_formats = ('###', ) + + countries = ( + 'アフガニスタン', 'アルバニア', 'アルジェリア', 'アメリカ領サモア', 'アンドラ', 'アンゴラ', 'アンギラ', '南極大陸', 'アンティグアバーブーダ', 'アルゼンチン', 'アルメニア', 'アルバ', 'オーストラリア', 'オーストリア', 'アゼルバイジャン', + 'バハマ', 'バーレーン', 'バングラデシュ', 'バルバドス', 'ベラルーシ', 'ベルギー', 'ベリーズ', 'ベナン', 'バミューダ島', 'ブータン', 'ボリビア', 'ボスニア・ヘルツェゴビナ', 'ボツワナ', 'ブーベ島', 'ブラジル', 'イギリス領インド洋地域', 'イギリス領ヴァージン諸島', 'ブルネイ', 'ブルガリア', 'ブルキナファソ', 'ブルンジ', + 'カンボジア', 'カメルーン', 'カナダ', 'カーボベルデ', 'ケイマン諸島', '中央アフリカ共和国', 'チャド', 'チリ', '中国', 'クリスマス島', 'ココス諸島', 'コロンビア', 'コモロ', 'コンゴ共和国', 'クック諸島', 'コスタリカ', 'コートジボワール', 'クロアチア', 'キューバ', 'キプロス共和国', 'チェコ共和国', + 'デンマーク', 'ジブチ共和国', 'ドミニカ国', 'ドミニカ共和国', + 'エクアドル', 'エジプト', 'エルサルバドル', '赤道ギニア共和国', 'エリトリア', 'エストニア', 'エチオピア', + 'フェロー諸島', 'フォークランド諸島', 'フィジー共和国', 'フィンランド', 'フランス', 'フランス領ギアナ', 'フランス領ポリネシア', 'フランス領極南諸島', + 'ガボン', 'ガンビア', 'グルジア', 'ドイツ', 'ガーナ', 'ジブラルタル', 'ギリシャ', 'グリーンランド', 'グレナダ', 'グアドループ', 'グアム', 'グアテマラ', 'ガーンジー', 'ギニア', 'ギニアビサウ', 'ガイアナ', + 'ハイチ', 'ハード島とマクドナルド諸島', 'バチカン市国', 'ホンジュラス', '香港', 'ハンガリー', + 'アイスランド', 'インド', 'インドネシア', 'イラン', 'イラク', 'アイルランド共和国', 'マン島', 'イスラエル', 'イタリア', + 'ジャマイカ', '日本', 'ジャージー島', 'ヨルダン', + 'カザフスタン', 'ケニア', 'キリバス', '朝鮮', '韓国', 'クウェート', 'キルギス共和国', + 'ラオス人民民主共和国', 'ラトビア', 'レバノン', 'レソト', 'リベリア', 'リビア国', 'リヒテンシュタイン', 'リトアニア', 'ルクセンブルク', + 'マカオ', 'マケドニア共和国', 'マダガスカル', 'マラウィ', 'マレーシア', 'モルディブ', 'マリ', 'マルタ共和国', 'マーシャル諸島', 'マルティニーク', 'モーリタニア・イスラム共和国', 'モーリシャス', 'マヨット', 'メキシコ', 'ミクロネシア連邦', 'モルドバ共和国', 'モナコ公国', 'モンゴル', 'モンテネグロ共和国', 'モントセラト', 'モロッコ', 'モザンビーク', 'ミャンマー', + 'ナミビア', 'ナウル', 'ネパール', 'オランダ領アンティル', 'オランダ', 'ニューカレドニア', 'ニュージーランド', 'ニカラグア', 'ニジェール', 'ナイジェリア', 'ニース', 'ノーフォーク島', '北マリアナ諸島', 'ノルウェー', + 'オマーン', + 'パキスタン', 'パラオ', 'パレスチナ自治区', 'パナマ', 'パプアニューギニア', 'パラグアイ', 'ペルー', 'フィリピン', 'ピトケアン諸島', 'ポーランド', 'ポルトガル', 'プエルトリコ', + 'カタール', + 'レユニオン', 'ルーマニア', 'ロシア', 'ルワンダ', + 'サン・バルテルミー島', 'セントヘレナ', 'セントクリストファー・ネイビス連邦', 'セントルシア', 'セント・マーチン島', 'サンピエール島・ミクロン島', 'セントビンセント・グレナディーン', 'サモア', 'サンマリノ', 'サントメプリンシペ', 'サウジアラビア', 'セネガル', 'セルビア', 'セイシェル', 'シエラレオネ', 'シンガポール', 'スロバキア', 'スロベニア', 'ソロモン諸島', 'ソマリア', '南アフリカ共和国', 'サウスジョージア・サウスサンドウィッチ諸島', 'スペイン', 'スリランカ', 'スーダン', 'スリナム', 'スヴァールバル諸島およびヤンマイエン島', 'スワジランド王国', 'スウェーデン', 'スイス', 'シリア', + '台湾', 'タジキスタン共和国', 'タンザニア', 'タイ', '東ティモール', 'トーゴ', 'トケラウ', 'トンガ', 'トリニダード・トバゴ', 'チュニジア', 'トルコ', 'トルクメニスタン', 'タークス・カイコス諸島', 'ツバル', + 'ウガンダ', 'ウクライナ', 'アラブ首長国連邦', 'イギリス', 'アメリカ合衆国', '合衆国領有小離島', 'アメリカ領ヴァージン諸島', 'ウルグアイ', 'ウズベキスタン', + 'バヌアツ', 'ベネズエラ', 'ベトナム', + 'ウォリス・フツナ', '西サハラ', 'イエメン', 'ザンビア', 'ジンバブエ', + ) + + prefectures = ( + '北海道', '青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県', '茨城県', '栃木県', '群馬県', + '埼玉県', '千葉県', '東京都', '神奈川県', '新潟県', '富山県', '石川県', '福井県', '山梨県', '長野県', + '岐阜県', '静岡県', '愛知県', '三重県', '滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県', + '鳥取県', '島根県', '岡山県', '広島県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '福岡県', + '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県', '沖縄県' + ) + + cities = ( + '八千代市', '我孫子市', '鴨川市', '鎌ケ谷市', '君津市', '富津市', '浦安市', '四街道市', '袖ケ浦市', + '八街市', '印西市', '白井市', '富里市', '南房総市', '匝瑳市', '香取市', '山武市', 'いすみ市', '大網白里市', + '印旛郡酒々井町', '印旛郡印旛村', '印旛郡本埜村', '印旛郡栄町', '香取郡神崎町', '香取郡多古町', '香取郡東庄町', + '山武郡九十九里町', '山武郡芝山町', '山武郡横芝光町', '長生郡一宮町', '長生郡睦沢町', '長生郡長生村', + '長生郡白子町', '長生郡長柄町', '長生郡長南町', '夷隅郡大多喜町', '夷隅郡御宿町', '安房郡鋸南町', '千代田区', + '中央区', '港区', '新宿区', '文京区', '台東区', '墨田区', '江東区', '品川区', '目黒区', '大田区', + '世田谷区', '渋谷区', '中野区', '杉並区', '豊島区', '北区', '荒川区', '板橋区', '練馬区', '足立区', + '葛飾区', '江戸川区', '八王子市', '立川市', '武蔵野市', '三鷹市', '青梅市', '府中市', '昭島市', '調布市', + '町田市', '小金井市', '小平市', '日野市', '東村山市', '国分寺市', '国立市', '福生市', '狛江市', '東大和市', + '清瀬市', '東久留米市', '武蔵村山市', '多摩市', '稲城市', '羽村市', 'あきる野市', '西東京市', '西多摩郡瑞穂町', + '西多摩郡日の出町', '西多摩郡檜原村', '西多摩郡奥多摩町', '大島町', '利島村', '新島村', '神津島村', '三宅島三宅村', + '御蔵島村', '八丈島八丈町', '青ヶ島村', '小笠原村', '横浜市鶴見区', '横浜市神奈川区', '横浜市西区', '横浜市中区', + '横浜市南区', '横浜市保土ケ谷区', '横浜市磯子区', '横浜市金沢区', '横浜市港北区', '横浜市戸塚区', '横浜市港南区', + '横浜市旭区', '横浜市緑区', '横浜市瀬谷区', '横浜市栄区', '横浜市泉区', '横浜市青葉区', '横浜市都筑区', + '川崎市川崎区', '川崎市幸区', '川崎市中原区', '川崎市高津区', '川崎市多摩区', '川崎市宮前区' + ) + + towns = ( + '丹勢', '中宮祠', '手岡', '東和町', '所野', '土沢', '独鈷沢', '轟', '土呂部', '中小来川', '長畑', '中鉢石町', + '中三依', '西小来川', '西川', '日光', '東三島', '東大和町', '蟇沼', '二つ室', '方京', '細竹', '前弥六', + '前弥六南町', '松浦町', '南赤田', '南郷屋', '美原町', '無栗屋', '睦', '百村', '箭坪', '山中新田', '油井', + '湯宮', '豊町', '湯本塩原', '横林', '四区町', '渡辺', '氏家', '氏家新田', '卯の里', '小入', '大中', '押上', + '柿木沢', '柿木沢新田', '鍛冶ケ沢', '上高野', '上吉羽', '木立', '権現堂', '幸手', '下宇和田', '下吉羽', '神明内', + '外国府間', '千塚', '天神島', '戸島', '中川崎', '長間', '西関宿', '花島', '平須賀', '細野', '松石', '太田ヶ谷', + '上広谷', '五味ヶ谷', '脚折', '脚折町', '鶴ヶ丘', '羽折町', '藤金', '九段南', '皇居外苑', '麹町', '猿楽町', + '外神田', '西神田', '隼町', '東神田', '一ツ橋', '日比谷公園', '平河町', '丸の内', '丸の内JPタワー', '四番町', + '六番町', '明石町', '勝どき', '京橋', '月島', '北青山', '港南', '芝浦', '芝公園', '芝大門', '白金', '白金台', + '台場', '高輪', '虎ノ門', '虎ノ門虎ノ門ヒルズ森タワー', '大京町', '高田馬場', '箪笥町', '津久戸町', '筑土八幡町', + '戸塚町', '富久町', '戸山', '秋葉原', '浅草', '浅草橋', '池之端', '今戸', '入谷', '上野公園', '上野桜木', + '雷門', '北上野', '蔵前', '千束', '台東', '鳥越', '西浅草', '日本堤', '橋場', '花川戸', '東浅草', '東上野', + '松が谷', '三筋', '三ノ輪', '元浅草', '竜泉', '吾妻橋' + ) + + building_names = ( + 'パレス', 'ハイツ', 'コーポ', 'アーバン', 'クレスト', 'パーク', 'シティ', 'シャルム', 'コート', + ) + + def prefecture(self): + """ + :example '東京都' + """ + return self.random_element(self.prefectures) + + def city(self): + """ + :example '台東区' + """ + return self.random_element(self.cities) + + def town(self): + """ + :example '浅草' + """ + return self.random_element(self.towns) + + def chome(self): + """ + :example '1丁目' + """ + return "%d丁目" % self.generator.random.randint(1, 42) + + def ban(self): + """ + :example '3番' + """ + return "%d番" % self.generator.random.randint(1, 27) + + def gou(self): + """ + :example '10号' + """ + return "%d号" % self.generator.random.randint(1, 20) + + def building_name(self): + """ + :example 'コーポ芝浦' + """ + return self.random_element(self.building_names) + + def zipcode(self): + """ + :example '101-1212' + """ + return "%03d-%04d" % (self.generator.random.randint(0, 999), self.generator.random.randint(0, 9999)) diff --git a/src/libs/faker/providers/address/ka_GE/__init__.py b/src/libs/faker/providers/address/ka_GE/__init__.py new file mode 100644 index 0000000..203968a --- /dev/null +++ b/src/libs/faker/providers/address/ka_GE/__init__.py @@ -0,0 +1,307 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_formats = ['{{city_name}}'] + street_name_formats = ['{{street_title}} {{street_suffix}}'] + street_address_formats = ['{{street_name}} {{building_number}}'] + address_formats = ['{{street_address}}, {{city}}'] + building_number_formats = ['##'] + street_suffixes = ['ქ.'] + + # Source: Wikipedia's list of sovereign states + # https://en.wikipedia.org/wiki/List_of_sovereign_states + countries = ( + 'ავსტრალია', 'ავსტრია', 'ავღანეთი', 'აზერბაიჯანი', 'ალბანეთი', 'ალჟირი', + 'ამერიკის სამოა', 'ამერიკის ვირჯინიის კუნძულები', + 'ამერიკის შეერთებული შტატები', 'ანგილია', 'ანგოლა', 'ანდორა', + 'ანტიგუა და ბარბუდა', 'არაბთა გაერთიანებული საამიროები', 'არგენტინა', + 'არუბა', 'აღმოსავლეთი ტიმორი', 'ახალი ზელანდია', 'ახალი კალედონია', + 'ბანგლადეში', 'ბარბადოსი', 'ბასას-და-ინდია', 'ბაჰამის კუნძულები', + 'ბაჰრეინი', 'ბელარუსი', 'ბელგია', 'ბელიზი', 'ბენინი', 'ბერმუდა', + 'ბოლივია', 'ბოსნია და ჰერცეგოვინა', 'ბოტსვანა', 'ბრაზილია', + 'ბრიტანეთის ვირჯინიის კუნძულები', + 'ბრიტანეთის ინდოეთის ოკეანის ტერიტორია', 'ბრუნეი', 'ბულგარეთი', + 'ბურკინა ფასო', 'ბურუნდი', 'ბუვე', 'ბჰუტანი', 'გაბონი', 'გაიანა', + 'გამბია', 'განა', 'გერმანია', 'გვადელუპა', 'გვატემალა', 'გვინეა', + 'გვინეა-ბისაუ', 'გიბრალტარი', 'გრენადა', 'გრენლანდია', 'გუამი', 'დანია', + 'დიდი ბრიტანეთი', 'დომინიკელთა რესპუბლიკა', 'დომინიკა', 'ეგვიპტე', + 'ევროპა (კუნძული)', 'ეთიოპია', 'ეკვადორი', 'ეკვატორული გვინეა', 'ერაყი', + 'ერიტრეა', 'ესპანეთი', 'ესტონეთი', 'ეშმორის და კარტიეს კუნძულები', + 'უოლისი და ფუტუნა', 'ვანუატუ', 'ვატიკანი', 'ვენესუელა', 'ვიეტნამი', + 'ზამბია', 'ზიმბაბვე', 'თურქეთი', 'თურქმენეთი', 'იამაიკა', 'იან მაიენი', + 'იაპონია', 'იემენი', 'ინდოეთი', 'ინდონეზია', 'იორდანია', 'ირანი', + 'ირლანდია', 'ისლანდია', 'ისრაელი', 'იტალია', 'კაბო-ვერდე', + 'კაიმანის კუნძულები', 'კამბოჯა', 'კამერუნი', 'კანადა', 'კატარი', + 'კენია', 'კვიპროსი', 'კინგმენის რიფი', 'კირიბატი', 'ქოქოსის კუნძულები', + 'კოლუმბია', 'კომორის კუნძულები', 'კონგოს დემოკრატიული რესპუბლიკა', + 'კონგოს რესპუბლიკა', 'კორეის რესპუბლიკა', 'ჩრდილოეთი კორეა', + 'კოსტა-რიკა', 'კოტ-დ’ივუარი', 'კუბა', 'კუკის კუნძულები', 'ლაოსი', + 'ლატვია', 'ლესოთო', 'ლიბანი', 'ლიბერია', 'ლიბია', 'ლიტვა', + 'ლიხტენშტაინი', 'ლუქსემბურგი', 'მადაგასკარი', 'მავრიკი', 'მავრიტანია', + 'მაიოტა', 'მაკაო', 'მაკედონია', 'მალავი', 'მალაიზია', 'მალდივი', 'მალი', + 'მალტა', 'მაროკო', 'მარშალის კუნძულები', 'მარჯნის ზღვის კუნძულები', + 'მექსიკა', 'მიანმარი', 'მიკრონეზია', 'მოზამბიკი', 'მოლდოვა', 'მონაკო', + 'მონსერატი', 'მონღოლეთი', 'ნამიბია', 'ნაურუ', 'ნეპალი', 'ნიგერი', + 'ნიგერია', 'ნიდერლანდი', 'ნიდერლანდის ანტილები', 'ნიკარაგუა', 'ნიუე', + 'ნორვეგია', 'ნორფოლკის კუნძული', 'ომანი', 'პაკისტანი', 'პალაუ', + 'პალმირა (ატოლი)', 'პანამა', 'პაპუა-ახალი გვინეა', 'პარაგვაი', 'პერუ', + 'პიტკერნის კუნძულები', 'პოლონეთი', 'პორტუგალია', + 'პრინც-ედუარდის კუნძული', 'პუერტო-რიკო', 'ჟუან-დი-ნოვა', 'რეიუნიონი', + 'რუანდა', 'რუმინეთი', 'რუსეთი', 'საბერძნეთი', 'სალვადორი', 'სამოა', + 'სამხრეთ აფრიკის რესპუბლიკა', + 'სამხრეთი გეორგია და სამხრეთ სენდვიჩის კუნძულები', 'სამხრეთი სუდანი', + 'სან-მარინო', 'სან-ტომე და პრინსიპი', 'საუდის არაბეთი', 'საფრანგეთი', + 'საფრანგეთის გვიანა', 'საფრანგეთის პოლინეზია', + 'საფრანგეთის სამხრეთული და ანტარქტიდული ტერიტორია', 'საქართველო', + 'სეიშელის კუნძულები', 'სენეგალი', 'სენ-პიერი და მიკელონი', + 'სენტ-ვინსენტი და გრენადინები', 'სენტ-კიტსი და ნევისი', 'სენტ-ლუსია', + 'სერბეთი', 'სეუტა', 'სვაზილენდი', 'სვალბარდი', 'სიერა-ლეონე', + 'სინგაპური', 'სირია', 'სლოვაკეთი', 'სლოვენია', 'სოლომონის კუნძულები', + 'სომალი', 'სომხეთი', 'სუდანი', 'სურინამი', 'ტაივანი', 'ტაილანდი', + 'ტანზანია', 'ტაჯიკეთი', 'ტერქსისა და კაიკოსის კუნძულები', 'ტოგო', + 'ტოკელაუ', 'ტონგა', 'ტრინიდადი და ტობაგო', 'ტუვალუ', 'ტუნისი', 'უგანდა', + 'უზბეკეთი', 'უკრაინა', 'უნგრეთი', 'ურუგვაი', 'ფარერის კუნძულები', + 'ფილიპინები', 'ფინეთი', 'ფიჯი', 'ფოლკლენდის კუნძულები', 'ქუვეითი', + 'ღაზის სექტორი', 'ყაზახეთი', 'ყირგიზეთი', 'შვეიცარია', 'შვედეთი', + 'შობის კუნძული', 'შრი-ლანკა', 'ჩადი', 'ჩერნოგორია', 'ჩეხეთი', + 'ჩეჩნეთის რესპუბლიკა იჩქერია', 'ჩილე', 'ჩინეთი', + 'ჩრდილოეთი მარიანას კუნძულები', 'ცენტრალური აფრიკის რესპუბლიკა', + 'წმინდა ელენე, ამაღლება და ტრისტანი-და-კუნია', + 'წყნარი ოკეანის კუნძულები', 'ხორვატია', 'ჯერსი', 'ჯიბუტი', 'ჰაიტი', + 'ჰონდურასი', 'ჰონკონგი', 'ჰერდი და მაკდონალდის კუნძულები', + ) + + # Source: Tbilisi city directory + # http://directory.ge/map/index.php?lang=eng + street_titles = ( + '300 არაგველის', '8 მარტის', 'აბაკელიას', 'აბანოს', 'აბასთუმანის', + 'აბაშელის', 'აბაშის', 'აბაშიძე გრიგოლის', 'აბაშიძე დოდოს', + 'აბაშიძე ირაკლის', 'აბაშიძე ჰეიდარის', 'აბაშიძის', + 'აბდუშელიშვილი მალხაზის', 'აბესაძე გიას', 'აბზიანიძის', 'აბო ტბილელის', + 'აბოვიანის', 'აბუსერიძე-ტბელის', 'აგარის', 'აგლაძე რაფიელის', + 'ადიგენის', 'ავთანდილის', 'ავლაბრის', 'ავლევის', 'ათონელის', 'აკეთის', + 'აკოფიანის', 'აკურის', 'ალადაშვილის', 'ალაზნის', 'ალგეთის', + 'ალექსიძე მერაბის', 'ალვანის', 'ალიხანიანის', 'ალმასიანის', 'ამაღლების', + 'ამბროლაურის', 'ამირანაშვილი პეტრეს', 'ამირეჯიბის', 'ანაკლიის', + 'ანანურის', 'ანდრონიკაშვილის', 'ანდღულაძის', 'ანტონ კატალიკოსის', + 'ანტონოვსკაიას', 'ანჯაფარიძე ვერიკოს', 'არაგვის', 'არაგვისპირელი შიოს', + 'არალეთის', 'არარატის', 'არაყიშვილი დიმიტრის', 'არბოს', 'არბოშიკის', + 'არგვეთის', 'არდაზიანის', 'არდონის', 'არეშიძის', 'არველაძის', + 'ართვინის', 'არმაზის', 'არსენალის', 'ასათიანი ლადოს', 'ასკანის', + 'ასურეთის', 'ასხინის', 'ატენის', 'აფანასიევის', 'აფხაზეთის', 'აწყურის', + 'აჭარის', 'ახალარსენალის', 'ახალდაბის', 'ახალუბნის', 'ახალქალაქის', + 'ახვლედიანი ელენეს', 'ახვლედიანი გიორგის', 'ახვლედიანის', 'ახმეტელის', + 'ახმეტის', 'ახოსპირელის', 'ახტალის', 'ახუთის', 'ახუნდოვის', 'აჯამეთის', + 'ბააზოვის', 'ბაგინეთის', 'ბადიაურის', 'ბაზალეთის', 'ბათუმის', + 'ბაკურიანის', 'ბაკურციხის', 'ბალადინის', 'ბალანჩივაძე მელიტონის', + 'ბარათაშვილი ნოკოლოზის', 'ბარათაშვილის', 'ბარალეთის', + 'ბარამიძე ალექსანდრეს', 'ბარისახოს', 'ბარნოვის', 'ბაქოს', + 'ბაქრაძე დავითის', 'ბაქრაძე დიმიტრის', 'ბაღდათის', 'ბაღნარის', + 'ბახმაროს', 'ბახტრიონის', 'ბედიის', 'ბევრეთის', 'ბეთანიის', 'ბეთლემის', + 'ბელიაშვილი აკაკის', 'ბენაშვილის', 'ბენდელიანი ჭიჭიკოს', + 'ბეჟანიშვილი ეკას', 'ბერბუქის', 'ბერიაშვილის', 'ბერიკაშვილის', + 'ბერიტაშვილის', 'ბერიძე ვუკოლის', 'ბერძენიშვილის', 'ბესიკის', + 'ბექა ოპიზარის', 'ბეღლეთის', 'ბზიფის', 'ბიჭვინთის', 'ბოგვის', 'ბოდავის', + 'ბოდბის', 'ბოლნისის', 'ბორბალოს', 'ბოროდინოს', 'მ. ლებანიძის', + 'ბოტანიკურის', 'ბოცვაძის', 'ბოჭორიშვილის', 'ბოჭორმის', 'ბჟოლეთის', + 'ბროლოსანის', 'ბროსეს', 'ბუაჩიძე თენგიზის', 'ბუდაპეშტის', 'ბულაჩაურის', + 'ბურკიაშვილის', 'ბურძგლას', 'ბუღეულის', 'ბუხაიძის', + 'გაბაშვილი ეკატერინეს', 'გაგარინი იურის', 'გალავნის', + 'გალაქტიონ ტაბიძის', 'გალის', 'გამრეკელის', 'გამყრელიძის', + 'გამცემლიძე შოთას', 'განთიადის', 'გარე კახეთის', 'გარეჯელი დავითის', + 'გარიყული მარიამის', 'გაფრინდაულის', 'გახოკიძე აკაკის', 'გახოკიძის', + 'გეგუთის', 'გედევანიშვილის', 'გეზათის', 'გელათის', 'გერგეტის', + 'გვაზაურის', 'გვეტაძე რაჟდენის', 'გივიშვილის', 'გიორგაძის', + 'გიორგი ბრწყინვალის', 'გიორგი მერჩულეს', 'გლინკას', 'გოგაშენის', + 'გოგებაშვილის იაკობის', 'გოგიბერიძის', 'გოგოლაურის', 'გოგოლის', + 'გოგჩის', 'გოთუას', 'გოკიელის', 'გომარეთის', 'გომბორის', 'გომის', + 'გონაშვილი ჰამლეტის', 'გორგასლის', 'გორდის', 'გორის', 'გორკის', + 'გოცირიძის', 'გოძიაშვილის', 'გრანელი ტერენტის', 'გრიბოედოვის', + 'გრიშაშვილის', 'გროზნოს', 'გრუზინსკი პეტრეს', 'გუდამაყრის', 'გუდარეხის', + 'გუდარის', 'გუდაუთის', 'გუდიაშვილი ლადოს', 'გუთნის', 'გულიას', + 'გულისაშვილის', 'გულუა გიას', 'გუმათის', 'გუმათჰესის', 'გუმბრის', + 'გუნიას', 'გურგენიძის', 'გურიელის', 'გურიის', 'გურჯაანის', 'დაბახანას', + 'დადიანი შალვას', 'დადიანი ცოტნეს', 'დაისის', 'ლ. ელიავას', 'დარკვეთის', + 'დგებუაძის', 'დედოფლისწყაროს', 'დეკაბრისტების', 'დელისის', 'დეპოს', + 'დვალის', 'დვირის', 'დიდგორის', 'დიდხევის', 'დიდი ხეივნის', + 'დიდი ჯიხაიშის', 'დ. ყიფიანის', 'დიმიტრი თავდადებულის', 'დირსიჭალას', + 'დიუმა ალექსანდრეს', 'დმანისის', 'დობროლიუბოვის', 'დოდაშვილი სოლომონის', + 'დოესის', 'დოლიძე გოგის', 'დოლიძის', 'დოქის', 'დოღუმბარის', + 'დუტუ მეგრელის', 'დუშეთის', 'ედისის', 'ევდოშვილის', 'ეკალაძის', + 'ელდარის', 'ენგურის', 'ენგურჰესის', 'ენისელის', 'ენუქიძის', 'ერევნის', + 'ერისთავი თორნიკეს', 'ერისთავი კონსტანტინეს', 'ერისთავ-ხოშტარიას', + 'ერწოს', 'ესენინის', 'სანდრო ეულის', 'ეფრემ მცირის', 'ექიმის', + 'ვაზიანის', 'ვაზისუბნის', 'ვაკელი იონას', 'ვანის', 'ვარდევანის', + 'ვარდისუბნის', 'ვართაგავას', 'რომის', 'ვასაძის', 'ვაშლოვანის', + 'ვახტანგ VI–ის', 'ვეზიროვის', 'ვეკუა ვოვას', 'ვერცხლის', 'ვერჰარნის', + 'ვეძათხევის', 'ვეძინის', 'ვირსალაძის', 'ვორონინის', 'საარბრჯუკენის', + 'ზაზიშვილი გიგოს', 'ზალდასტანიშვილის', 'ზანდუკელი მიხეილის', 'ზარზმის', + 'ზაქარიაძე სერგოს', 'ზედაზნის', 'ზედამზის', 'ზედაუბნის', 'ზეინკლის', + 'ზეკარის', 'ზემო ვაკის', 'ზემო ვეძისის', 'ზესტაფონის', 'ზვარეთის', + 'ზიარის', 'ზიგზაგის', 'ზინდისის', 'ზიჩი მიხაის', 'ზოვრეთის', + 'ზუბალაშვილების', 'ზუგდიდის', 'ზურაბიშვილი ავლიპის', + 'თაბუკაშვილი რეზოს', 'თავაძე ფერდინანდის', 'თამარაშენის', + 'თამარაშვილი მიხეილის', 'გ. სვანიძის', 'თარხნიშვილის', 'თაქთაქიშვილის', + 'თაყაიშვილი სესილიას', 'თევდორე მღვდლის', 'თეთნულდის', 'თეთრიწყაროს', + 'თეკლათის', 'თელავის', 'ხახანაშვილის', 'თელეთის', 'თერგის', 'თეძმის', + 'თვალჭრელიძის', 'თიანეთის', 'თმოგველის', 'თმოგვის', 'თოდრიას', 'თოიძის', + 'თონეს', 'თორაძის', 'თოფურიას', 'თრიალეთის', 'თუმანიანის', 'თხინვალის', + 'იალბუზის', 'იამანიძე შოთას', 'იაშვილი პაოლოს', 'იბრაჰიმ ისპაჰანელის', + 'იდუმალას', 'იეთიმ გურჯის', 'იერუსალიმის', 'ივერიის', 'ივლეთის', + 'იზაშვილის', 'ილორის', 'ილურიძე კონსტანტინეს', 'იმედაშვილი გაიოზის', + 'იმერეთის', 'ინანიშვილი რამაზის', 'ინაშვილის', 'ინგოროყვა პავლეს', + 'ინტერნატის', 'იორის', 'იოსებიძის', 'იოსელიანის', 'იპოლიტე-ივანოვის', + 'ირბაქი ნიკიფორეს', 'ირგვლივის', 'ისაკიანის', 'ისნის', 'იფნის', + 'იყალთოს', 'კავთისხევის', 'კავსაძის', 'კაიშაურის', + 'კაკაბაძე პოლიკარპეს', 'კაკაბაძეების', 'კაკლიანის', 'კოტე ხიმშიაშვილის', + 'კალატოზის', 'კალიუჟნის', 'კალოუბნის', 'კანდელაკის', 'კანდელაკის', + 'კანკავას', 'კაპანაძის', 'კარალეთის', 'კარგარეთელის', 'კასპის', + 'კაჭრეთის', 'კახიანის', 'კედია სპირიდონის', 'კეკელიძე კორნელის', + 'კელაპტრიშვილი ომარის', 'კერესელიძე არჩილის', 'კერესელიძის', + 'კეცხოველი ნიკოს', 'კვალეთის', 'კვალის', 'კვანტალიანის', 'კვერნაულის', + 'კვესეთის', 'კიევის', 'კიკეთის', 'კიკვიძის', 'კისისხევის', 'კიშინიოვის', + 'კლდეკარის', 'კლდიაშვილის', 'კნოლევის', 'კობახიძის', 'კობერიძის', + 'კოდალოს', 'კოდორის', 'კოკინაკის', 'კოლმეურნეობის ველის', 'კოლხეთის', + 'კომუნის', 'კონდოლის', 'კონსტიტუციის', 'კოფცოვის', 'კოსტავას', + 'კოტეტიშვილი ვახტანგის', 'კოშკოვანის', 'კოხრეიძის', 'კოჯრის', + 'ჯ. კახიძის', 'კრწანისის', 'კუმისის', 'კუპრაძის', 'კურნატოვსკის', + 'კურსების', 'კურსკის', 'კუფტინის', 'ლაგოდეხის', 'ლაზოს', 'ლაითურის', + 'ლაილაშის', 'ლალიონის', 'ლამის', 'ლამისყანის', 'ლანჩხუთის', 'ლარეხის', + 'ლარსის', 'ლაღიძე მიტროფანეს', 'ლაღიძე რევაზის', 'ლებარდეს', + 'ლეკიშვილის', 'ლენტეხის', 'ლეონიძე გიორგის', 'ლეჟავას', 'ლერმონტოვის', + 'ლერწმის', 'ლესელიძის', 'ლესია უკრაინკას', 'ლეჩხუმის', 'ლიახვის', + 'ლიბანის', 'ლიკანის', 'ლისაშვილის', 'ლიუბოვსკის', 'ლიხაურის', 'ლიხის', + 'ლომაურის', 'ლომთათიძის', 'ლომონოსოვის', 'ლორთქიფანიძე გრიგოლის', + 'ლორთქიფანიძის', 'ლოჭინის', 'ლუბლიანას', 'ლუსიანინის', 'მაზნიაშვილის', + 'მათიაშვილის', 'მაიაკოვსკის', 'მამასახლისოვის', 'მამკოდის', 'მამკოდის', + 'მამრაძის', 'მანაგაძე ალეხსანდეს', 'მანავის', 'მანგლისის', + 'მანიჯაშვილი კახას', 'მანჯგალაძე ეროსის', 'მარაბდის', + 'მარგიანი რევაზის', 'მარელისის', 'მარი ნიკოს', 'მარიჯანის', 'მარტვილის', + 'მარტყოფის', 'მარუაშვილი გიორგის', 'მარუხის გმირების', + 'მარჯანიშვილი კოტეს', 'მარჯანიშვილი კოტეს', 'მაღალაშვილის', 'მაღაროს', + 'მაჩაბელი ივანეს', 'მაჩხაანის', 'მაცესტის', 'მაჭრის', 'მახათას', + 'მახინჯაურის', 'მგალობლიშვილის', 'მებაღიშვილის', 'მეგობრობის', + 'მეგრელაძის', 'მეველეს', 'მელაანის', 'მელიქიშვილის', 'მესხეთის', + 'მესხიას', 'მესხიშვილი ალექსის', 'მესხიშვილის', 'მეტეხის', 'მეუნარგიას', + 'მექანიზაციის', 'მეჯვრისხევის', 'მთავარანგელოზის', 'მთაწმინდის', + 'მთისძირის', 'მიმინოშვილი რომანის', 'მინდელაურის', 'მინდელის', + 'მირზა მეფის', 'მირზაანის', 'მიროტაძის', 'მიტინგის', 'მიქატაძის', + 'მიქატაძის', 'მიქელაძე ევგენის', 'მიქელაძის', 'მიშველაძე არჩილის', + 'მიჩურინის', 'მიცკევიჩის', 'მნათობის', 'მოლითის', 'მოლოკოვის', + 'მორეტის', 'მოსაშვილის', 'მოსე ხონელის', 'მოსიძე ვახტანგის', + 'მოსტკოვის', 'მოსულიშვილის', 'მრევლიშვილის', 'მტკვრის', 'მუკუზანის', + 'მუსხელიშვილის', 'მუხაძის', 'მუხაძის', 'მუხრანის', 'მშველიძის', + 'მცხეთის', 'ნაბახტაურის', 'ნაგომარის', 'ნადიკვარის', 'ნადირაძე კოლაუს', + 'ნავთლუღის', 'ნათაძის', 'ნაკადულის', 'ნიშნიანიძის', + 'ნანეიშვილი ვიქტორის', 'ნანეიშვილი ვლადიმერის', 'ნარგიზის', + 'ნასაკირალის', 'ნასიძე სულხანის', 'ნაქალაქევის', 'ნაქერალას', 'ნიაბის', + 'ნიაღვრის', 'ნიზამის', 'ნიკოლაძე ნიკოს', 'ნინიძის', 'ნიორაძის', + 'ნოვოროსისკის', 'ნონეშვილი იოსების', 'ნოსირის', 'ნოსტეს', 'ნუცუბიძის', + 'ობსერვატორიის', 'ოდესის', 'ონიაშვილის', 'ონის', 'ოჟიოს', 'ორბეთის', + 'ორბელების', 'ორთაჭალის', 'ორპირის', 'ორხევის', 'ოსეთის', 'ოსიაურის', + 'ოფრეთის', 'ოქრომჭედლების', 'ოქროყანის', 'ოჩამჩირის', 'ოცხელების', + 'ოძელაშვილის', 'ოძისის', 'პაიჭაძის', 'პალიასტომის', 'პანკისის', + 'პასტერის', 'პატარიძის', 'პატარძეულის', 'პეტეფი შანდორის', + 'პეტრე იბერის', 'პეტრიაშვილის', 'პეტრიწის', 'პიატიგორსკის', 'პიონერის', + 'პისარევის', 'პლატონის', 'პუშკინი ალექსანდრეს', 'ჟველაურის', 'ჟინვალის', + 'ჟონეთის', 'ჟორესის', 'ჟღენტის', 'რადიანი შალვას', 'რაზიკაშვილის', + 'რაზმაძის', 'რატევანის', 'რატილის', 'რაჭის', 'რევოლუცის', 'რთველაძის', + 'რიონის', 'რიონჰესის', 'რიწის', 'რკინიგზის', 'რკინის', 'როდენის', + 'როსტოვის', 'როსტომაშვილის', 'რუისპირის', 'რუსთაველის', 'რჩეულიშვილის', + 'საადის', 'სააკაძე პაატას', 'სააკაძის', 'საბადურის', 'საბანისძის', + 'საბაშვილის', 'საგარეჯოს', 'საგურამოს', 'სადმელის', 'სავანელის', + 'სათემოს', 'საიათნოვას', 'საირმის', 'სალამის', 'სალხინოს', + 'სამამულო ომის გმირების', 'სამგორის', 'სამტრედიის', 'სამურზაყანოს', + 'სამურის', 'სამღებროს', 'სამღერეთის', 'სამშვილდეს', 'სანავარდოს', + 'სანკტ-პეტერბურგის', 'სარაჯიშვილი დავითის', 'სარაჯიშვილი პეტრეს', + 'სართანიას', 'სართიჭალის', 'სარკინეთის', 'საქანელას', 'საქარის', + 'საყვირის', 'საჩხერის', 'საცხენისის', 'საჭილაოს', 'სახოკიას', 'სევანის', + 'სენაკის', 'სვანეთის', 'გუდაურის', 'სვირის', 'სიონის', 'სიღნაღის', + 'სიხარულიძის', 'სკოლის', 'სომხეთის', 'სოხუმის', 'სოღანლუღის', + 'სპანდარიანის', 'სპარტაკის', 'სტამბის', 'სტანისლავსკის', 'სტურუას', + 'სუვოროვის', 'სულიაშვილის', 'სულხანიშვილის', 'სულხან-საბას', + 'სუმბატაშვილ-იუჟინსკის', 'სუნდუკიანის', 'სურამის', 'სურგულაძის', + 'სხვიტორის', 'სხირტლაძის', 'სხულუხიას', 'ტაბახმელას', 'ტაბიძე ტიციანის', + 'ტანძიის', 'ტარიელის', 'ტატიშვილი ერეკლეს', 'ტატიშვილის', 'ტაშირის', + 'ტაშკენტის', 'ტელეგრაფის', 'ტეტელაშვილის', 'ტეხურის', 'ტვიშის', + 'ტიბაანის', 'ტირიფონის', 'ტიულენევის', 'ტიხონოვის', 'ტოლენჯის', + 'ტოლსტოის', 'ტოლსტონოგოვის', 'ტრანსპორტის', 'ტრაქტორის', 'ტრიკოტაჟის', + 'ტურგენევის', 'ტუსკიას', 'ტყავის', 'ტყეკულტურის', 'ტყვარჩელის', + 'ტყვიავის', 'ტყიბულის', 'ტყის', 'უბილავას', 'უზნაძე დიმიტრის', + 'უზნაძის', 'უიარაღოს', 'უკლება კირილეს', 'უმიკაშვილის', 'უნივერსიტეტის', + 'ურბნისის', 'ურეკის', 'ურიდიას', 'ურიცკის', 'უფლისციხის', 'უშაკოვის', + 'უჩანეიშვილი ირაკლის', 'უწერის', 'უჯარმის', 'ფაბრიკის', 'ფალიაშვილის', + 'ფანასკერტელ-ციციშვილის', 'ფანჯიკიძის', 'ფარავნის', 'ფასანაურის', + 'ფაღავა ირაკლის', 'ფერისცვალების', 'ფიზკულტურის', 'ფილიას', 'ფირდოუსის', + 'ფიროსმანის', 'ფიფიას', 'ფოთის', 'ფოსტის', 'ფოცხვერაშვილის', + 'ფოცხიაშვილი მორისის', 'ფურცელაძის', 'ფშავის', 'ქავთარაძის', 'ქარელის', + 'ქართველიშვილი ლევანის', 'ქართლის', 'ქებურიას', 'ქედის', 'ქერჩის', + 'ქვალონის', 'ქვიშხეთის', 'ქიაჩელის', 'ქიზიყის', 'ქინქლაძე ოთარის', + 'ქინძმარაულის', 'ქიქოძე გერონტის', 'ქობულაძის', 'ქობულეთის', 'ქსნის', + 'ქსოვრელის', 'ქუთათელაძის', 'ქუთათელაძე აპოლონის', 'ქუთაისის', + 'ქუმსიაშვილის', 'ქურდიანი არჩილის', 'ქურდიანი ზაქარიას', 'ქურხულის', + 'ქუჩიშვილის', 'ღამბაშიძის', 'ღრმაღელეს', 'ღუდუშაური ოთარის', + 'ყავლაშვილი შოთას', 'ყარყარაშვილის', 'ყვარელის', 'ყირიმის', 'ყიფიანის', + 'ყიფშიძის', 'ყუშიტაშვილის', 'შავგულიძის', 'შავთელის', 'შავი ზღვის', + 'შავიშვილის', 'შავნაბადას', 'შავსოფელის', 'შანიძე აკაკის', + 'შანშიაშვილის', 'შარაშიძის', 'შარდენის', 'შარტავა ჟიულის', + 'შატბერაშვილის', 'შატილის', 'შაქრიანის', 'შევჩენკო ტარასის', + 'შენგელაიას', 'შერვაშიძის', 'შილდის', 'შინდისის', 'შიო მღვიმელის', + 'შირაქის', 'შოვის', 'შორაპნის', 'შროშის', 'შუამთის', 'შურდულის', + 'შხეფის', 'ჩაიკოვსკის', 'ჩაილურის', 'ჩაისუბნის', 'ჩანჩიბაძის', + 'ჩარგლის', 'ჩარხის', 'ჩაქვის', 'ჩაჩავას', 'ჩახრუხაძის', 'ჩერნიშევსკის', + 'ჩერქეზიშვილის', 'ჩეჩელაშვილის', 'ჩეხოვის', 'ჩიკვანიას', 'ჩიტაიას', + 'ჩიტაძის', 'ჩიქობავა არნოლდის', 'ჩიქოვანის', 'ჩკალოვის', + 'ჩოლოყაშვილი ქაიხოსროს', 'ჩოჩუას', 'ჩოხატაურის', 'ჩოხელის', + 'ჩუბინაშვილი გიორგის', 'ჩუბინიძის', 'ჩხიკვაძის', 'ცაბაძე გიორგის', + 'ცაგარელი არჩილის', 'ცაგერის', 'ცაიშის', 'ცემის', 'ციმაკურიძის', + 'ცინცაძე კალისტრატეს', 'ცისარტკელას', 'ცისკრის', 'ციხისძირის', + 'ცოდნისკარის', 'ცურტაველი იაკობის', 'ცუცქირიძის', 'ცხემის', 'ცხვედაძის', + 'ცხრა აპრილის', 'ცხრა ძმის', 'ძეგამის', 'ძევერის', 'ძმობის', + 'ძოწენიძის', 'წავკისის', 'წალენჯიხის', 'წალკის', 'წაღვერის', 'წერეთლის', + 'წერნაკის', 'წერონისის', 'წიკლაურის', 'წინამძღვრიშვილის', + 'წინამძღვრიშვილის', 'წინანაურის', 'წინანდლის', 'წინაუბნის', + 'წიწამურის', 'წმ. ნიკოლოზის', 'წნორისწყლის', 'წრომის', 'წულაძის', + 'წულუკიძის', 'წურწუმიას', 'წუწუნავას', 'წუწხვატის', 'წყალსადენის', + 'წყალტუბოს', 'წყაროს', 'ჭაბუკიანი ვახტანგის', 'ჭავჭავაძე ზურაბის', + 'ჭავჭავაძე ალექსანდრეს', 'ჭალადიდის', 'ჭანტურია გიას', 'ჭიათურის', + 'ჭიაურელი მიხეილის', 'ჭიჭინაძე ზაქარიას', 'ჭოველიძე თამარის', + 'ჭონქაძე დანიელის', 'ჭოპორტის', 'ჭოროხის', 'ჭრებალოს', 'ჭრელაშვილის', + 'ხაბეიშვილის', 'ხაზინის', 'ხანძთელი გრიგოლის', 'ხარაბაძის', + 'ხარაგაულის', 'ხარფუხის', 'ხაჩატურიანის', 'ხევის', 'ხევისუბნის', + 'ხევსურეთის', 'ხევძმარის', 'ხეთაგუროვის', 'ხერგიანის', 'ხერთვისის', + 'ხერხეულიძეების', 'ხეჩუაშვილის', 'ხვამლის', 'ხვანჭკარის', 'ხვედელიანის', + 'ხვინგიას', 'ხვიჩია იპოლიტეს', 'ხიდის', 'ხიდისთავის', 'ხივინის', + 'ხიმშიაშვილის', 'ხმელნიცკის', 'ხოდაშენის', 'ხომლელის', 'ხონის', + 'ხორავა აკაკის', 'ხორნაბუჯის', 'ხოშარაულის', 'ხრამჰესის', 'ხრესილის', + 'ხუდადოვის', 'ჯაბაურის', 'ჯაბიძის', 'ჯავახეთის', 'ჯავახიშვილი ივანეს', + 'ჯავახიშვილი მიხეილის', 'ჯავის', 'ჯამბულის', 'ჯანაშვილის', 'ჯანაშიას', + 'ჯანჯღავას', 'ჯვარედინის', 'პოლიტკოვსკაიას', 'ჯიქიას', 'ჯორბენაძის', + 'ჯორჯაძის', 'ჰოსპიტალის', + ) + + # Source: List of cities and towns in Georgia (Wikipedia) + # https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Georgia_(country) + city_names = ( + 'აბაშა', 'ამბროლაური', 'ახალი ათონი', 'ახალქალაქი', 'ახალციხე', + 'ახმეტა', 'ბათუმი', 'ბაღდათი', 'ბოლნისი', 'ბორჯომი', 'გაგრა', 'გალი', + 'გარდაბანი', 'გორი', 'გუდაუთა', 'გურჯაანი', 'დედოფლისწყარო', 'დმანისი', + 'დუშეთი', 'ვალე', 'ვანი', 'ზესტაფონი', 'ზუგდიდი', 'თბილისი', + 'თეთრიწყარო', 'თელავი', 'თერჯოლა', 'კასპი', 'ლაგოდეხი', 'ლანჩხუთი', + 'მარნეული', 'მარტვილი', 'მცხეთა', 'ნინოწმინდა', 'ოზურგეთი', 'ონი', + 'ოჩამჩირე', 'რუსთავი', 'საგარეჯო', 'სამტრედია', 'საჩხერე', 'სენაკი', + 'სიღნაღი', 'სოხუმი', 'ტყვარჩელი', 'ტყიბული', 'ფოთი', 'ქარელი', + 'ქობულეთი', 'ქუთაისი', 'ყვარელი', 'ცაგერი', 'ცხინვალი', 'წალენჯიხა', + 'წალკა', 'წნორი', 'წყალტუბო', 'ჭიათურა', 'ხაშური', 'ხობი', 'ხონი', + 'ჯვარი', + ) + + def street_title(self): + return self.random_element(self.street_titles) + + def city_name(self): + return self.random_element(self.city_names) diff --git a/src/libs/faker/providers/address/ko_KR/__init__.py b/src/libs/faker/providers/address/ko_KR/__init__.py new file mode 100644 index 0000000..952572e --- /dev/null +++ b/src/libs/faker/providers/address/ko_KR/__init__.py @@ -0,0 +1,388 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + """ + Korean Address Provider + ======================= + + Korea has two address and postal code system. + + Address + ------- + + - Address based on land parcel numbers + (지번 주소, OLD, but someone use consistently) + - Address based on road names and building numbers (도로명 주소, NEW) + + :meth:`land_address` generate Address based on land parcel numbers and + :meth:`road_address` generate Address based on road names and building + numbers. + + Postal code + ----------- + + - Old postal code (6-digit, OLD and dead) + - New postal code (5-digit, New) + + :meth:`old_postal_code` and :meth:`postcode` generate old 6-digit code + and :meth:`postal_code` generate newer 5-digit code. + + Reference + --------- + + - `Official Confirmation Prividing that Old and New Addresses are Identical`__ + (warn: cert error) + + __ https://www.juso.go.kr/addridentity/AddrIdentityHelp.htm + + """ + + building_suffixes = ( + '빌라', + '아파트', + '연립', + '마을', + '타운', + '타워', + ) + road_suffixes = ('로', '길', '거리', '가') + town_suffixes = ('동', '리', '마을') + postcode_formats = ('###-###',) + new_postal_code_formats = ('#####',) + metropolitan_cities = ( + '서울특별시', + '부산광역시', + '대구광역시', + '인천광역시', + '광주광역시', + '대전광역시', + '울산광역시', + '세종특별자치시', + ) + provinces = ( + '경기도', + '강원도', + '충청북도', + '충청남도', + '전라북도', + '전라남도', + '경상북도', + '경상남도', + '제주특별자치도', + ) + cities = ( + '파주시', + '수원시', + '수원시 권선구', + '수원시 팔달구', + '수원시 영통구', + '성남시', + '성남시 수정구', + '성남시 중원구', + '화성시', + '성남시 분당구', + '안양시', + '안양시 만안구', + '안양시 동안구', + '부천시', + '부천시 원미구', + '부천시 소사구', + '부천시 오정구', + '광명시', + '평택시', + '이천시', + '동두천시', + '안산시', + '안산시 상록구', + '안산시 단원구', + '안성시', + '고양시', + '고양시 덕양구', + '고양시 일산동구', + '고양시 일산서구', + '과천시', + '구리시', + '남양주시', + '오산시', + '시흥시', + '군포시', + '의왕시', + '하남시', + '김포시', + '용인시', + '용인시 처인구', + '용인시 기흥구', + '용인시 수지구', + '연천군', + '가평군', + '양평군', + '광주시', + '포천시', + '양주시', + '수원시 장안구', + '의정부시', + '여주시', + ) + road_names = ( + '압구정', + '도산대', + '학동', + '봉은사', + '테헤란', + '역삼', + '논현', + '언주', + '강남대', + '양재천', + '삼성', + '영동대', + '개포', + '선릉', + '반포대', + '서초중앙', + '서초대', + '잠실', + '석촌호수', + '백제고분', + '가락', + '오금', + ) + boroughs = ( + '종로구', + '중구', + '용산구', + '성동구', + '광진구', + '동대문구', + '중랑구', + '성북구', + '강북구', + '도봉구', + '노원구', + '은평구', + '서대문구', + '마포구', + '양천구', + '강서구', + '구로구', + '금천구', + '영등포구', + '동작구', + '관악구', + '서초구', + '강남구', + '송파구', + '강동구', + '동구', + '서구', + '남구', + '북구', + ) + countries = ('가나', '가봉', '가이아나', '감비아', '과테말라', '그레나다', '그리스', '기니', '기니비사우', + '나미비아', '나우루', '나이지리아', '남수단', '남아프리카 공화국', '네덜란드 왕국', '네팔', + '노르웨이', '뉴질랜드', '니제르', '니카라과', '대한민국', '덴마크', '도미니카 공화국', + '도미니카 연방', '독일', '동티모르', '라오스', '라이베리아', '라트비아', '러시아', '레바논', + '레소토', '루마니아', '룩셈부르크', '르완다', '리비아', '리투아니아', '리히텐슈타인', + '마다가스카르', '마셜 제도', '마케도니아 공화국', '말라위', '말레이시아', '말리', '멕시코', + '모나코', '모로코', '모리셔스', '모리타니', '모잠비크', '몬테네그로', '몰도바', '몰디브', + '몰타', '몽골', '미국', '미얀마', '미크로네시아 연방', '바누아투', '바레인', '바베이도스', + '바하마', '방글라데시', '베냉', '베네수엘라', '베트남', '벨기에', '벨라루스', '벨리즈', + '보스니아 헤르체고비나', '보츠와나', '볼리비아', '부룬디', '부르키나파소', '부탄', '불가리아', + '브라질', '브루나이', '사모아', '사우디아라비아', '산마리노', '상투메 프린시페', '세네갈', + '세르비아', '세이셸', '세인트루시아', '세인트빈센트 그레나딘', '세인트키츠 네비스', + '소말리아', '솔로몬 제도', '수단', '수리남', '스리랑카', '스와질란드', '스웨덴', '스위스', + '스페인', '슬로바키아', '슬로베니아', '시리아', '시에라리온 공화국', '싱가포르', + '아랍에미리트', '아르메니아', '아르헨티나', '아이슬란드', '아이티', '아일랜드', + '아제르바이잔', '아프가니스탄', '안도라', '알바니아', '알제리', '앙골라', '앤티가 바부다', + '에리트레아', '에스토니아', '에콰도르', '에티오피아', '엘살바도르', '영국', '예멘', '오만', + '오스트레일리아', '오스트리아', '온두라스', '요르단', '우간다', '우루과이', '우즈베키스탄', + '우크라이나', '이라크', '이란', '이스라엘', '이집트', '이탈리아', '인도네시아', '일본', + '자메이카', '잠비아', '적도 기니', '조선민주주의인민공화국', '조지아', '중앙아프리카 공화국', + '중화인민공화국', '지부티', '짐바브웨', '차드', '체코', '칠레', '카메룬', '카보베르데', + '카자흐스탄', '카타르', '캄보디아', '캐나다', '케냐', '코모로', '코스타리카', '코트디부아르', + '콜롬비아', '콩고 공화국', '콩고 민주 공화국', '쿠바', '쿠웨이트', '크로아티아', + '키르기스스탄', '키리바시', '키프로스', '타이', '타지키스탄', '탄자니아', '터키', + '토고', '통가', '투르크메니스탄', '투발루', '튀니지', '트리니다드 토바고', '파나마', + '파라과이', '파키스탄', '파푸아 뉴기니', '팔라우', '페루', '포르투갈', '폴란드', '프랑스', + '피지', '핀란드', '필리핀', '헝가리' + ) + building_dongs = ( + '가', + '나', + '다', + '라', + '마', + '바', + '##', + '###', + ) + land_numbers = ( + '###', + '###-#', + '###-##', + ) + road_numbers = ( + '#', + '##', + '###', + ) + + town_formats = ( + '{{first_name}}{{last_name}}{{town_suffix}}', + '{{first_name}}{{last_name}}{{last_name}}{{town_suffix}}', + ) + building_name_formats = ( + '{{first_name}}{{last_name}}{{building_suffix}}', + '{{first_name}}{{last_name}}{{last_name}}{{building_suffix}}', + ) + address_detail_formats = ( + '{{building_name}}', + '{{building_name}} ###호', + '{{building_name}} {{building_dong}}동 ###호', + ) + road_formats = ( + '{{road_name}}{{road_suffix}}', + '{{road_name}}{{road_number}}{{road_suffix}}', + ) + road_address_formats = ( + '{{metropolitan_city}} {{borough}} {{road}}', + '{{province}} {{city}} {{road}}', + '{{metropolitan_city}} {{borough}} {{road}} ({{town}})', + '{{province}} {{city}} {{road}} ({{town}})', + ) + land_address_formats = ( + '{{metropolitan_city}} {{borough}} {{town}} {{land_number}}', + '{{province}} {{city}} {{town}} {{land_number}}', + ) + + # Keep backward compatibility + city_suffixes = ('시',) + street_suffixes = road_suffixes + street_name_formats = ('{{road_name}}',) + street_address_formats = road_address_formats + address_formats = road_address_formats + + def land_number(self): + """ + :example 507 + """ + return self.bothify(self.random_element(self.land_numbers)) + + def land_address(self): + """ + :example 세종특별자치시 어진동 507 + """ + pattern = self.random_element(self.land_address_formats) + return self.generator.parse(pattern) + + def road_number(self): + """ + :example 24 + """ + return self.bothify(self.random_element(self.road_numbers)) + + def road_address(self): + """ + :example 세종특별자치시 도움5로 19 (어진동) + """ + pattern = self.random_element(self.road_address_formats) + return self.generator.parse(pattern) + + def address_detail(self): + """ + :example 가나아파트 가동 102호 + """ + pattern = self.bothify(self.random_element( + self.address_detail_formats)) + return self.generator.parse(pattern) + + def road(self): + """ + :example 도움5로 + """ + pattern = self.random_element(self.road_formats) + return self.generator.parse(pattern) + + def road_name(self): + """ + :example 압구정 + """ + return self.random_element(self.road_names) + + def road_suffix(self): + """ + :example 길 + """ + return self.random_element(self.road_suffixes) + + def metropolitan_city(self): + """ + :example 서울특별시 + """ + return self.random_element(self.metropolitan_cities) + + def province(self): + """ + :example 경기도 + """ + return self.random_element(self.provinces) + + def city(self): + """ + :example 고양시 + """ + pattern = self.random_element(self.cities) + return self.generator.parse(pattern) + + def borough(self): + """ + :example 중구 + """ + return self.random_element(self.boroughs) + + def town(self): + """ + :example 가나동 + """ + pattern = self.random_element(self.town_formats) + return self.generator.parse(pattern) + + def town_suffix(self): + """ + :example 동 + """ + return self.random_element(self.town_suffixes) + + def building_name(self): + """ + :example 김구아파트 + """ + pattern = self.random_element(self.building_name_formats) + return self.generator.parse(pattern) + + def building_suffix(self): + """ + :example 아파트 + """ + return self.random_element(self.building_suffixes) + + def building_dong(self): + """ + :example 가 + """ + return self.bothify(self.random_element(self.building_dongs)) + + def old_postal_code(self): + """ + :example 123-456 + """ + return self.bothify(self.random_element(self.postcode_formats)) + + def postal_code(self): + """ + :example 12345 + """ + return self.bothify(self.random_element(self.new_postal_code_formats)) diff --git a/src/libs/faker/providers/address/ne_NP/__init__.py b/src/libs/faker/providers/address/ne_NP/__init__.py new file mode 100644 index 0000000..38d1a7b --- /dev/null +++ b/src/libs/faker/providers/address/ne_NP/__init__.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + building_number_formats = ('#', '##', '###') + street_name_formats = ('{{last_name}} {{street_suffix}}',) + street_address_formats = ('{{street_name}}',) + city_formats = ('{{city}}',) + # http://www.nepalpost.gov.np/index.php/postal-codes-of-nepal + postcode_formats = ('#####',) + + address_formats = ( + "{{street_name}} {{building_prefix}} {{building_number}} \n{{city}}\n{{district}} {{postcode}}", + ) + + street_suffixes = ( + 'मार्ग', 'आश्रम', 'बाटो', 'पथ', 'गल्ली', 'गेट', 'हाईट', 'टार', 'रोड', 'कुना', 'चौर', 'निवास', + ) + + building_prefixes = ('वडा', 'घर') + # https://en.wikipedia.org/wiki/List_of_sovereign_states + countries = ( + 'अंगोला', 'अक्रोटिरी र धेकेलिया', 'अजरबैजान', 'अफगानिस्तान', 'अमेरिकी सामोआ', 'अरुबा', 'अर्जेन्टिना', 'अर्मेनिया', 'अलडेर्नी', 'अल्जेरिया', 'अल्बानिया', 'अस्ट्रिया', + 'अस्ट्रेलिया', 'आइजल अफ म्यान', 'आइभोरी कोस्ट', 'आइसल्याण्ड', 'आजाद कश्मीर', 'आयरल्याण्ड', 'इक्वेटोरियल गिनी', 'इक्वेडर', 'इजरायल', 'इटाली', 'इण्डोनेशिया', + 'इथियोपिया', 'इराक', 'इरान', 'इस्टोनिया', 'उज्बेकिस्तान', 'उत्तर कोरिया', 'उत्तरी मारिआना टापु', 'उत्तरी साइप्रस', 'उरुग्वे', 'एङगुइला', 'एण्डोरा', 'एन्टिगुआ र बर्बुडा', + 'एरिट्रिया', 'एल साल्भादोर', 'एशमोर र कर्टियर टापु', 'ओमान', 'कजाख्स्तान', 'कतार', 'कम्बोडिया', 'किरिबाटी', 'किर्गिजस्तान', 'कुक द्वीप', 'कुराकाओ', 'कुवैत', 'केन्या', + 'केप भर्ड', 'केम्यान टापु', 'कोकोस टापु', 'कोटे डी आइभोरी', 'कोमोरोस', 'कोरल सी टापु क्षेत्र', 'कोलम्बिया', 'कोसोभो', 'कोस्टारिका', 'क्यानडा', 'क्यामेरून', 'क्युबा', + 'क्रिसमस टापु', 'क्रोएसिया', 'क्लिप्परटन द्वीप', 'क्वीन माउड ल्याण्ड', 'गणतन्त्र कङ्गो', 'गणतन्त्र कोरिया', 'गणतन्त्र स्पर्स्का', 'गाबोन', 'गिनी', 'गिब्राल्टार', 'गिलगीत', + 'गुयना', 'गुर्न्जी', 'ग्रिनाडा', 'ग्रीनल्याण्ड', 'ग्रीस', 'ग्वाटेमाला', 'ग्वाम', 'घाना', 'चाड', 'चिली', 'चीन', 'चेक गणतन्त्र', 'जमैका', 'जर्मनी', 'जर्सी', 'जापान', 'जाम्बिया', + 'जिबुटी', 'जोर्डन', 'टर्की', 'टिमोर', 'टुभालु', 'टुर्क्स तथा काइकोस टापु', 'टोंगा', 'टोकेलाउ', 'टोगो', 'ट्युनिसिया', 'ट्रान्सनिसट्रिया', 'ट्रिनिडाड र टोबागो', 'डेनमार्क', + 'डोमिनिकन गणतन्त्र', 'डोमिनिका', 'तन्जानिया', 'ताइवान', 'ताजिकिस्तान', 'तुर्कमेनिस्तान', 'थाइल्याण्ड', 'दक्षिण अफ्रिका', 'दक्षिण ओसेटिया', 'दक्षिण कोरिया', + 'दक्षिण जर्जिया तथा दक्षिण स्याण्डवीच टापु', 'दक्षिणी सुडान', 'नर्वे', 'नर्वेको', 'नाइजर', 'नाइजेरिया', 'नाउरु', 'नागोर्नो', 'नामिबिया', 'निकाराग्वा', 'नियु', + 'नेदरल्याण्ड', 'नेपाल', 'नोर्फोक टापु', 'न्यु क्यालोडेनिया', 'न्युजिल्यान्ड', 'पपुवा न्युगिनी', 'पलाउ', 'पाकिस्तान', 'पानामा', 'पाराग्वे', 'पिटकेर्न टापु', 'पिटर द्वीप', + 'पूर्वी टिमोर', 'पेरु', 'पोर्चुगल', 'पोल्याण्ड', 'प्यालेस्टाइन', 'प्युर्तो रिको', 'प्रजातान्त्रिक गणतन्त्र कंगो', 'प्रजातान्त्रिक गणतन्त्र कोरिया', 'प्रिडेनेस्ट्रोभी', + 'फकल्याण्ड टापु', 'फरोइ टापु', 'फिजी', 'फिनल्याण्ड', 'फिलिपिन्स', 'फ्रान्स', 'फ्रेन्च दक्षिणी र अन्टार्कटिक द्वीप', 'फ्रेन्च पोलिनेसिया', 'बंगलादेश', 'बर्मा', + 'बर्मुडा', 'बहराइन', 'बहामस', 'बार्बाडोस', 'बुरुन्डी', 'बुर्किना फासो', 'बुल्गेरिया', 'बेनिन', 'बेलारूस', 'बेलिज', 'बेल्जियम', 'बोत्स्वाना', 'बोलिभिया', + 'बोस्निया र हर्जगोभिना', 'बोस्निया र हर्जगोभिना संघ', 'बौभेट द्वीप', 'ब्राजिल', 'ब्रिटिस भर्जिन टापु', 'ब्रुनेई', 'भानुअटु', 'भारत', 'भियतनाम', 'भुटान', + 'भेनेजुएला', 'भ्याटिकन', 'भ्याटिकन सिटी', 'मकाउ', 'मङ्गोलिया', 'मध्य अफ्रिकी गणतन्त्र', 'मलावी', 'मलेशिया', 'माइक्रोनेसियाको संघीय राज्य', 'माडागास्कर', + 'मार्शल द्वीप', 'माली', 'माल्टा', 'माल्दिभ्स', 'मिश्र', 'मेक्सिको', 'मोजाम्बिक', 'मोनाको', 'मोन्टसेराट', 'मोन्टेनेग्रो', 'मोरक्को', 'मोल्डोभा', 'मौरिसनिया', 'मौरिसस', + 'म्यानमार', 'म्यासेडोनिया', 'यमन', 'युक्रेन', 'युगान्डा', 'रसिया', 'रुवाण्डा', 'रोमानिया', 'रोस डिपेन्डेन्सी', 'लक्जेम्बर्ग', 'लाईबेरिया', 'लाओस', 'लात्भिया', 'लिचटेन्स्टाइन', + 'लिथुआनिया', 'लिबिया', 'लेबनान', 'लेसोथो', 'वाल्लिस र फुटुना', 'श्रीलंका', 'संघीय राज्य माइक्रोनेसिया', 'संयुक्त अधिराज्य', 'संयुक्त अरब इमिरेट्स', 'संयुक्त राज्य अमेरिका', + 'संयुक्त राज्य भर्जिन टापु', 'सर्बिया', 'साइप्रस', 'साउदी अरब', 'साओ टोमे र प्रिन्सिपे', 'सान मारिनो', 'साबा', 'सामोआ', 'साहरवी अरब लोकतान्त्रिक गणतन्त्र', 'सिंगापुर', + 'सिन्ट मार्टिन', 'सीरियन कुर्दिस्तान', 'सीरिया', 'सुडान', 'सुरिनेम', 'सेनेगल', 'सेन्ट किट्स र नेभिस', 'सेन्ट पियेर्रे र मिकुएलन', 'सेन्ट बार्थेलेमी', 'सेन्ट भिन्सेन्ट र ग्रेनाडाइन्स', + 'सेन्ट मार्टिन', 'सेन्ट लुसिया', 'सेन्ट हेलेना', 'सेरा लियोन', 'सेसेल्स', 'सोमालिया', 'सोमालील्याण्ड', 'सोलोमन द्वीप', 'स्पेन', 'स्लोभाकिया', 'स्लोभेनिया', 'स्वाजिल्याण्ड', + 'स्विजरल्याण्ड', 'स्वीडेन', 'हंगेरी', 'हङकङ', 'हर्म', 'हाइटी', 'हेयर्ड द्वीप र म्याकडोनाल्ड टापु', 'होन्डुरस', + 'अबखाजिया', 'जर्जिया', + ) + + # cities are taken from https://en.wikipedia.org/wiki/List_of_cities_in_Nepal + cities = ( + 'मिर्चैया', 'प्युठान', 'कञ्चनपुर', 'लुम्बिनी सांस्कृतिक', 'बागलुङ', 'इलाम', 'भक्तपुर', 'भद्रपुर', 'घोराही', 'स्याङ्जा', + 'खैरहानी नगरपालिका', 'म्याग्दी', 'रंगेली', 'काठमाडौं', 'शनि-अर्जुन', 'पर्वत', 'सप्तरी', 'पनौती', 'जयपृथ्वी', 'लहान', 'वालिङ', + 'बर्दघाट', 'डोटी', 'धरान', 'पथरी शनिश्चरे', 'चन्दननाथ', 'नवलपरासी', 'किर्तिपुर', 'दैलेख', 'सुनसरी', 'बेलौरी', 'कुस्मा', 'मकवानपुर', 'कञ्चनरूप', + 'गुलरिया', 'टीकापुर', 'राजापुर', 'फिदिम', 'खोटाङ', 'धनुषाधाम', 'झापा', 'पुनर्वास', 'भक्तपुर', 'बर्दिया', 'बागलुङ', 'दमक', 'तेह्रथुम', 'नारायण', + 'ताप्लेजुङ', 'तानसेन', 'पाँचखाल', 'बनेपा', 'म्याङ्लुङ', 'ललितपुर', 'दिपायल', 'अपी', 'दाङ', 'सन्धिखर्क', 'धनकुटा', 'बिरेन्द्रनगर', 'गौर', 'मोरङ', + 'सङ्खुवासभा', 'लम्की-चुहा', 'बारा', 'हरिवन नगरपालिका', 'मलङ्वा', 'सिराहा', 'जनकपुर', 'सल्यान', 'सिन्धुपाल्चोक', 'दुल्लु', 'ओखलढुङ्गा', 'पाल्पा', + 'इटहरी', 'रेसुङगा', 'कृष्णनगर', 'शुक्लगण्डकी', + 'नुवाकोट', 'साँफेबगर', 'राजविराज', 'नेपालगंज', 'भिमेश्वर', 'ताप्लेजुङ', 'धुलिखेल', 'व्यास', 'भोजपुर', 'धादिङ', 'बेनी', 'अर्घाखाँची', 'भीमदत्त', 'रौतहट', + 'जलेश्वर', 'देवदह', 'बेलवारी', 'बुटवल', 'सुर्खेत', 'मङ्गलसेन', 'कैलाली', 'धनकुटा', 'रुपन्देही', 'सल्यान', 'रामपुर', 'बिराटनगर', 'चौतारा', + 'देवचुली', 'कपिलवस्तु', 'सुनवल', 'शिवराज', 'चम्पापुर (चापागाउँ)', 'भरतपुर', 'गढिमाई', 'उर्लावारी', 'लेखनाथ', 'सिद्धिचरण', 'मेचीनगर', + 'चित्रवन', 'कास्की', 'गौशाला', 'पुतलीबजार', 'बिदुर', 'शम्भुनाथ', 'पर्सा', 'प्युठान', 'निजगढ', 'डडेलधुरा', 'कन्काई', 'गैंडाकोट', 'पाल्पा', 'कार्यविनायक*', + 'तिलोत्तमा', 'तुलसीपुर', 'वीरगञ्ज', 'शंखरपुर*', 'अत्तरिया', 'बझाङ', 'मन्थली*', 'कपिलवस्तु', 'कटारी', + 'हेटौडा', 'कलैया', 'सुन्दर दुलारी', 'सिन्धुली', 'थाहा', 'बाँके', 'ललितपुर', 'दार्चुला', 'पोखरा', 'बन्दीपुर', 'सर्लाही', + 'कोहलपुर', 'सैनामैना', 'अमरागढी', 'उदयपुर', 'काठमाडौं', 'सुर्योदय', 'सिराहा', + 'महोत्तरी', 'धनगढी', 'शारदा', 'काभ्रेपलाञ्चोक', 'त्रियुगा', 'रामेछाप', 'पाँचथर', 'इलाम', 'भोजपुर', + 'मध्यपुर ठिमी', 'दुहवी-भलुवा', 'दशरथचन्द', 'बैतडी', 'कोशी हरैंचा', 'चापाकोट', 'दिक्तेल', + 'चन्द्रपुर', 'लालबन्दी', 'चितवन', 'रत्ननगर', 'पृथ्वीनारायण', 'धनुषा', 'गुल्मी', 'बेंसीशहर', 'लमजुङ', 'अछाम', + 'तनहुँ', 'खाँदबारी', 'बिर्तामोड', 'कमलामाई', 'छिरेश्वरनाथ', 'सिद्धार्थनगर', 'निलकण्ठ', 'गोर्खा', 'दोलखा', 'रामग्राम', + 'इनरूवा', 'कावासोती', 'बेल्टार बसाहा', 'जुम्ला', 'ईश्वरपुर', + ) + + districts = ( + 'अछाम', 'अर्घाखाँची', 'इलाम', 'उदयपुर', 'ओखलढुङ्गा', 'कञ्चनपुर', 'कपिलवस्तु', 'काठमाडौं', 'काभ्रेपलाञ्चोक', 'कालीकोट', 'कास्की', 'कैलाली', 'खोटाङ', 'गुल्मी', + 'गोर्खा', 'चितवन', 'जाजरकोट', 'जुम्ला', 'झापा', 'डडेल्धुरा', 'डोटी', 'डोल्पा', 'तनहुँ', 'ताप्लेजुङ', 'तेह्रथुम', 'दाङ', 'दार्चुला', 'दैलेख', 'दोलखा', 'धनकुटा', 'धनुषा', 'धादिङ', 'नवलपरासी', + 'नुवाकोट', 'पर्वत', 'पर्सा', 'पाँचथर', 'पाल्पा', 'प्युठान', 'बझाङ', 'बर्दिया', 'बाँके', 'बाग्लुङ', 'बाजुरा', 'बारा', 'भक्तपुर', 'भोजपुर', 'मकवानपुर', 'मनाङ', 'महोत्तरी', 'मुगु', 'मुस्ताङ', + 'मोरङ', 'म्याग्दी', 'रसुवा', 'रामेछाप', 'रुकुम', 'रूपन्देही', 'रोल्पा', 'रौतहट', 'लमजुङ्', 'ललितपुर', 'वैतडी', 'संखुवासभा', 'सप्तरी', 'सर्लाही', 'सल्यान', 'सिन्धुपलाञ्चोक', 'सिन्धुली', + 'सिराहा', 'सुनसरी', 'सुर्खेत', 'सोलुखुम्बु', 'स्याङ्जा', 'हुम्ला', + ) + + def district(self): + """ + :example अछाम + """ + return self.random_element(self.districts) + + def city(self): + """ + :example कावासोत + """ + return self.random_element(self.cities) + + def building_prefix(self): + """ + :example वडा + """ + return self.random_element(self.building_prefixes) diff --git a/src/libs/faker/providers/address/nl_BE/__init__.py b/src/libs/faker/providers/address/nl_BE/__init__.py new file mode 100644 index 0000000..21b79ac --- /dev/null +++ b/src/libs/faker/providers/address/nl_BE/__init__.py @@ -0,0 +1,799 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AddressProvider + +class Provider(AddressProvider): + building_number_formats = ('#', '##', '###', '#', '##', '###',) + + street_suffixes = ( + 'baan', 'boulevard', 'dreef', 'hof', 'laan', 'lei', 'pad', + 'ring', 'singel', 'steeg', 'straat', 'weg', + ) + + # the 4 digit numerical part of Belgium postal codes is between 1000 and 9999; + # see https://nl.wikipedia.org/wiki/Postcode#Postnummers_in_België + postcode_formats = ('%###',) + + city_formats = ('{{city}}',) + + # countries are from http://nl.wikipedia.org/wiki/ISO_3166-1 + countries = ( + 'Afghanistan', 'Albanië', 'Algerije', 'Amerikaans-Samoa', + 'Amerikaanse Maagdeneilanden', 'Andorra', 'Angola', 'Anguilla', + 'Antarctica', 'Antigua en Barbuda', 'Argentinië', 'Armenië', 'Aruba', + 'Australië', 'Azerbeidzjan', "Bahama's", 'Bahrein', 'Bangladesh', + 'Barbados', 'België', 'Belize', 'Benin', 'Bermuda', 'Bhutan', + 'Bolivia', 'Bonaire, Sint Eustatius en Saba', 'Bosnië en Herzegovina', + 'Botswana', 'Bouveteiland', 'Brazilië', + 'Brits Indische Oceaanterritorium', 'Britse Maagdeneilanden', 'Brunei', + 'Bulgarije', 'Burkina Faso', 'Burundi', 'Cambodja', 'Canada', + 'Centraal-Afrikaanse Republiek', 'Chili', 'China', 'Christmaseiland', + 'Cocoseilanden', 'Colombia', 'Comoren', 'Congo-Brazzaville', + 'Congo-Kinshasa', 'Cookeilanden', 'Costa Rica', 'Cuba', 'Curaçao', + 'Cyprus', 'Denemarken', 'Djibouti', 'Dominica', + 'Dominicaanse Republiek', 'Duitsland', 'Ecuador', 'Egypte', + 'El Salvador', 'Equatoriaal-Guinea', 'Eritrea', 'Estland', 'Ethiopië', + 'Faeröer', 'Falklandeilanden', 'Fiji', 'Filipijnen', 'Finland', + 'Frankrijk', 'Frans-Guyana', 'Frans-Polynesië', + 'Franse Zuidelijke en Antarctische Gebieden', 'Gabon', 'Gambia', + 'Georgië', 'Ghana', 'Gibraltar', 'Grenada', 'Griekenland', 'Groenland', + 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinee', + 'Guinee-Bissau', 'Guyana', 'Haïti', 'Heard en McDonaldeilanden', + 'Honduras', 'Hongarije', 'Hongkong', 'IJsland', 'Ierland', 'India', + 'Indonesië', 'Irak', 'Iran', 'Israël', 'Italië', 'Ivoorkust', + 'Jamaica', 'Japan', 'Jemen', 'Jersey', 'Jordanië', 'Kaaimaneilanden', + 'Kaapverdië', 'Kameroen', 'Kazachstan', 'Kenia', 'Kirgizië', + 'Kiribati', 'Kleine Pacifische eilanden van de Verenigde Staten', + 'Koeweit', 'Kroatië', 'Laos', 'Lesotho', 'Letland', 'Libanon', + 'Liberia', 'Libië', 'Liechtenstein', 'Litouwen', 'Luxemburg', 'Macau', + 'Macedonië', 'Madagaskar', 'Malawi', 'Maldiven', 'Maleisië', 'Mali', + 'Malta', 'Man', 'Marokko', 'Marshalleilanden', 'Martinique', + 'Mauritanië', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', + 'Moldavië', 'Monaco', 'Mongolië', 'Montenegro', 'Montserrat', + 'Mozambique', 'Myanmar', 'Namibië', 'Nauru', 'Nederland', 'Nepal', + 'Nicaragua', 'Nieuw-Caledonië', 'Nieuw-Zeeland', 'Niger', 'Nigeria', + 'Niue', 'Noord-Korea', 'Noordelijke Marianen', 'Noorwegen', 'Norfolk', + 'Oeganda', 'Oekraïne', 'Oezbekistan', 'Oman', 'Oost-Timor', + 'Oostenrijk', 'Pakistan', 'Palau', 'Palestina', 'Panama', + 'Papoea-Nieuw-Guinea', 'Paraguay', 'Peru', 'Pitcairneilanden', 'Polen', + 'Portugal', 'Puerto Rico', 'Qatar', 'Roemenië', 'Rusland', 'Rwanda', + 'Réunion', 'Saint Kitts en Nevis', 'Saint Lucia', + 'Saint Vincent en de Grenadines', 'Saint-Barthélemy', + 'Saint-Pierre en Miquelon', 'Salomonseilanden', 'Samoa', 'San Marino', + 'Sao Tomé en Principe', 'Saoedi-Arabië', 'Senegal', 'Servië', + 'Seychellen', 'Sierra Leone', 'Singapore', 'Sint Maarten', + 'Sint-Helena, Ascension en Tristan da Cunha', 'Sint-Maarten', + 'Slovenië', 'Slowakije', 'Soedan', 'Somalië', 'Spanje', + 'Spitsbergen en Jan Mayen', 'Sri Lanka', 'Suriname', 'Swaziland', + 'Syrië', 'Tadzjikistan', 'Taiwan', 'Tanzania', 'Thailand', 'Togo', + 'Tokelau', 'Tonga', 'Trinidad en Tobago', 'Tsjaad', 'Tsjechië', + 'Tunesië', 'Turkije', 'Turkmenistan', 'Turks- en Caicoseilanden', + 'Tuvalu', 'Uruguay', 'Vanuatu', 'Vaticaanstad', 'Venezuela', + 'Verenigd Koninkrijk', 'Verenigde Arabische Emiraten', + 'Verenigde Staten', 'Vietnam', 'Wallis en Futuna', 'Westelijke Sahara', + 'Wit-Rusland', 'Zambia', 'Zimbabwe', 'Zuid-Afrika', + 'Zuid-Georgia en de Zuidelijke Sandwicheilanden', 'Zuid-Korea', + 'Zuid-Soedan', 'Zweden', 'Zwitserland', 'Åland', + ) + + # cities as listed on "postcodezoeker" + # http://www.postcodes-maps.be/postcodelijst.php + cities = ( + "'s Herenelderen","'s-Gravenvoeren","'s-Gravenwezel","Aaigem", + "Aalbeke","Aalst","Aalter","Aarschot", + "Aarsele","Aartrijke","Aartselaar","Abolens", + "Abée","Achel","Achet","Achêne", + "Acosse","Acoz","Adegem","Adinkerke", + "Affligem","Afsnee","Agimont","Aineffe", + "Aische-en-Refail","Aiseau","Aiseau-Presles","Aisemont", + "Alken","Alle","Alleur","Alsemberg", + "Alveringem","Amay","Amberloup","Ambly", + "Ambresin","Amel","Amonines","Amougies", + "Ampsin","Andenne","Anderlecht","Anderlues", + "Andrimont","Angleur","Angre","Angreau", + "Anhée","Anlier","Anloy","Annevoie-Rouillon", + "Ans","Anseremme","Anseroeul","Antheit", + "Anthisnes","Anthée","Antoing","Antwerpen", + "Anvaing","Anzegem","Appels","Appelterre-Eichem", + "Arbre","Arbrefontaine","Arc-Ainières","Arc-Wattripont", + "Archennes","Ardooie","Arendonk","Argenteau", + "Arlon","Arquennes","Arsimont","Arville", + "As","Aspelare","Asper","Asquillies", + "Asse","Assebroek","Assenede","Assenois", + "Assent","Assesse","Astene","Ath", + "Athis","Athus","Attenhoven","Attenrode", + "Attert","Attre","Aubange","Aubechies", + "Aubel","Aublain","Auby-sur-Semois","Audregnies", + "Aulnois","Autelbas","Autre-Eglise","Autreppe", + "Auvelais","Ave-et-Auffe","Avekapelle","Avelgem", + "Avennes","Averbode","Avernas-le-Bauduin","Avin", + "Awans","Awenne","Awirs","Aye", + "Ayeneux","Aywaille","Baaigem","Baal", + "Baardegem","Baarle-Hertog","Baasrode","Bachte-Maria-Leerne", + "Baelen","Bagimont","Baileux","Bailièvre", + "Baillamont","Bailleul","Baillonville","Baisieux", + "Baisy-Thy","Balegem","Balen","Balâtre", + "Bambrugge","Bande","Barbençon","Barchon", + "Baronville","Barry","Barvaux-Condroz","Barvaux-sur-Ourthe", + "Bas-Oha","Basse-Bodeux","Bassenge","Bassevelde", + "Bassilly","Bastogne","Basècles","Batsheers", + "Battice","Battignies","Baudour","Bauffe", + "Baugnies","Baulers","Bavegem","Bavikhove", + "Bazel","Beaufays","Beaumont","Beauraing", + "Beausaint","Beauvoorde","Beauwelz","Beclers", + "Beek","Beerlegem","Beernem","Beerse", + "Beersel","Beerst","Beert","Beervelde", + "Beerzel","Beez","Beffe","Begijnendijk", + "Beho","Beigem","Bekegem","Bekkerzeel", + "Bekkevoort","Belgrade","Bellaire","Bellecourt", + "Bellefontaine","Bellegem","Bellem","Bellevaux", + "Bellevaux-Ligneuville","Bellingen","Beloeil","Belsele", + "Ben-Ahin","Bende","Berbroek","Berchem", + "Berendrecht","Berg","Bergilers","Beringen", + "Berlaar","Berlare","Berlingen","Berloz", + "Berneau","Bernissart","Bersillies-l'Abbaye","Bertem", + "Bertogne","Bertrix","Bertrée","Berzée", + "Beselare","Betekom","Bettincourt","Beuzet", + "Bevekom","Bevel","Bever","Bevercé", + "Bevere","Beveren-Leie","Beveren-Roeselare","Beveren-Waas", + "Beveren-aan-den-Ijzer","Beverlo","Beverst","Beyne-Heusay", + "Bienne-lez-Happart","Bierbeek","Biercée","Bierges", + "Bierghes","Bierset","Bierwart","Biesme", + "Biesme-sous-Thuin","Biesmerée","Biez","Bihain", + "Bikschote","Bilstain","Bilzen","Binche", + "Binderveld","Binkom","Bioul","Bissegem", + "Bizet","Bièvre","Blaasveld","Blaimont", + "Blandain","Blanden","Blankenberge","Blaregnies", + "Blaton","Blaugies","Blehen","Bleid", + "Bleret","Blicquy","Blégny","Bléharies", + "Bocholt","Boechout","Boekhout","Boekhoute", + "Boezinge","Bogaarden","Bohan","Boignée", + "Boirs","Bois-d'Haine","Bois-de-Lessines","Bois-de-Villers", + "Bois-et-Borsu","Bolinne","Bolland","Bomal", + "Bomal-sur-Ourthe","Bombaye","Bommershoven","Bon-Secours", + "Boncelles","Boneffe","Bonheiden","Boninne", + "Bonlez","Bonnert","Bonneville","Bonsin", + "Booischot","Booitshoeke","Boom","Boorsem", + "Boortmeerbeek","Borchtlombeek","Borgerhout","Borgloon", + "Borlez","Borlo","Borlon","Bornem", + "Bornival","Borsbeek","Borsbeke","Bossière", + "Bossuit","Bossut-Gottechain","Bost","Bothey", + "Bottelare","Bouffioulx","Bouge","Bougnies", + "Bouillon","Bourlers","Bourseigne-Neuve","Bourseigne-Vieille", + "Boussoit","Boussu","Boussu-en-Fagne","Boussu-lez-Walcourt", + "Bousval","Boutersem","Bouvignes-sur-Meuse","Bouvignies", + "Bouwel","Bovekerke","Bovelingen","Bovenistier", + "Bovesse","Bovigny","Boëlhe","Bra", + "Braffe","Braibant","Braine-l'Alleud","Braine-le-Château", + "Braine-le-Comte","Braives","Brakel","Branchon", + "Bras","Brasmenil","Brasschaat","Bray", + "Brecht","Bredene","Bree","Breendonk", + "Bressoux","Briegden","Brielen","Broechem", + "Broekom","Brugelette","Brugge","Brunehaut", + "Brussegem","Brussel","Brustem","Bruyelle", + "Brye","Brûly","Brûly-de-Pesche","Budingen", + "Buggenhout","Buissenal","Buissonville","Buizingen", + "Buken","Bulskamp","Bunsbeek","Burcht", + "Burdinne","Bure","Burg-Reuland","Burst", + "Bury","Buvingen","Buvrinnes","Buzenol", + "Buzet","Büllingen","Bütgenbach","Callenelle", + "Calonne","Cambron-Casteau","Cambron-Saint-Vincent","Carlsbourg", + "Carnières","Casteau","Castillon","Celles", + "Cerfontaine","Chaineux","Chairière","Champion", + "Champlon","Chanly","Chantemelle","Chapelle-lez-Herlaimont", + "Chapelle-à-Oie","Chapelle-à-Wattines","Chapon-Seraing","Charleroi", + "Charneux","Chassepierre","Chastre","Chastre-Villeroux-Blanmont", + "Chastrès","Chaudfontaine","Chaumont-Gistoux", + "Chaussée-Notre-Dame-Louvignies","Cherain","Cheratte","Chercq", + "Chevetogne","Chevron","Chimay","Chiny","Chièvres", + "Chokier","Châtelet","Châtelineau","Châtillon", + "Chênée","Ciergnon","Ciney","Ciplet", + "Ciply","Clabecq","Clavier","Clermont", + "Clermont-sous-Huy","Cognelée","Colfontaine","Comblain-Fairon", + "Comblain-au-Pont","Comblain-la-Tour","Conneux","Corbais", + "Corbion","Cordes","Corenne","Cornesse", + "Cornimont","Corroy-le-Château","Corroy-le-Grand","Corswarem", + "Cortil-Noirmont","Cortil-Wodon","Couillet","Cour-sur-Heure", + "Courcelles","Courrière","Court-Saint-Etienne","Couthuin", + "Coutisse","Couture-Saint-Germain","Couvin","Cras-Avernas", + "Crehen","Crisnée","Croix-lez-Rouveroy","Crombach", + "Crupet","Cuesmes","Cugnon","Cul-des-Sarts", + "Custinne","Cérexhe-Heuseux","Céroux-Mousty","Dadizele", + "Dailly","Daknam","Dalhem","Damme", + "Dampicourt","Dampremy","Darion","Daussois", + "Daussoulx","Dave","Daverdisse","De Haan", + "De Klinge","De Moeren","De Panne","De Pinte", + "Deerlijk","Deftinge","Deinze","Denderbelle", + "Denderhoutem","Denderleeuw","Dendermonde","Denderwindeke", + "Dentergem","Denée","Dergneau","Dessel", + "Desselgem","Destelbergen","Desteldonk","Deurle", + "Deurne","Deux-Acren","Dhuy","Diepenbeek", + "Diest","Diets-Heur","Dikkebus","Dikkele", + "Dikkelvenne","Diksmuide","Dilbeek","Dilsen-Stokkem", + "Dinant","Dion","Dion-Valmont","Dison", + "Dochamps","Doel","Dohan","Doische", + "Dolembreux","Donceel","Dongelberg","Donk", + "Donstiennes","Dorinne","Dormaal","Dottenijs", + "Dour","Dourbes","Dranouter","Driekapellen", + "Drieslinter","Drogenbos","Drongen","Dréhance", + "Dudzele","Duffel","Duisburg","Duras", + "Durbuy","Durnal","Dworp","Eben-Emael", + "Ebly","Ecaussinnes","Ecaussinnes-Lalaing","Ecaussinnes-d'Enghien", + "Edegem","Edelare","Edingen","Eeklo", + "Eernegem","Egem","Eggewaartskapelle","Eghezée", + "Ehein","Eigenbilzen","Eindhout","Eine", + "Eisden","Eke","Ekeren","Eksaarde", + "Eksel","Elen","Elene","Elewijt", + "Eliksem","Elingen","Ellemelle","Ellezelles", + "Ellignies-Sainte-Anne","Ellignies-lez-Frasnes","Ellikom","Elouges", + "Elsegem","Elsenborn","Elsene","Elst", + "Elverdinge","Elversele","Emblem","Embourg", + "Emelgem","Emines","Emptinne","Ename", + "Engelmanshoven","Engis","Enines","Ensival", + "Epinois","Eppegem","Eprave","Erbaut", + "Erbisoeul","Ere","Erembodegem","Erezée", + "Ermeton-sur-Biert","Ernage","Erneuville","Ernonheid", + "Erondegem","Erpe","Erpe-Mere","Erpent", + "Erpion","Erps-Kwerps","Erquelinnes","Erquennes", + "Ertvelde","Erwetegem","Escanaffles","Esen", + "Esneux","Esplechin","Esquelmes","Essen", + "Essene","Estaimbourg","Estaimpuis","Estinnes", + "Estinnes-au-Mont","Estinnes-au-Val","Etalle","Ethe", + "Etikhove","Ettelgem","Etterbeek","Eugies", + "Eupen","Evegnée","Evelette","Everbeek", + "Everberg","Evere","Evergem","Evregnies", + "Evrehailles","Eynatten","Ezemaal","Fagnolle", + "Faimes","Falaën","Falisolle","Fallais", + "Falmagne","Falmignoul","Familleureux","Farciennes", + "Faulx-les-Tombes","Fauroeulx","Fauvillers","Faymonville", + "Fays-les-Veneurs","Fayt-le-Franc","Fayt-lez-Manage","Felenne", + "Feluy","Feneur","Fernelmont","Ferrières", + "Feschaux","Fexhe-Slins","Fexhe-le-Haut-Clocher","Filot", + "Finnevaux","Fize-Fontaine","Fize-le-Marsal","Flamierge", + "Flavion","Flawinne","Fleurus","Floreffe", + "Florennes","Florenville","Floriffoux","Florée", + "Flostoy","Flémalle","Flémalle-Grande","Flémalle-Haute", + "Flénu","Fléron","Flône","Focant", + "Folx-les-Caves","Fontaine-Valmont","Fontaine-l'Evêque","Fontenelle", + "Fontenoille","Fontenoy","Fooz","Forchies-la-Marche", + "Forest","Forges","Forges-Philippe","Forrières", + "Forville","Forêt","Fosse","Fosses-la-Ville", + "Fouleng","Fourbechies","Foy-Notre-Dame","Fraipont", + "Fraire","Fraiture","Frameries","Framont", + "Franc-Waret","Franchimont","Francorchamps","Franière", + "Frasnes","Frasnes-lez-Anvaing","Frasnes-lez-Buissenal", + "Frasnes-lez-Gosselies","Freloux","Freux","Froidchapelle", + "Froidfontaine","Froidmont","Fronville","Froyennes","Fumal", + "Furfooz","Furnaux","Gaasbeek","Gages", + "Gallaix","Galmaarden","Ganshoren","Gaurain-Ramecroix", + "Gavere","Gedinne","Geel","Geer", + "Geest-Gérompont-Petit-Rosière","Geetbets","Gelbressée","Gelinden", + "Gellik","Gelrode","Geluveld","Geluwe", + "Gembes","Gembloux","Gemmenich","Genappe", + "Genk","Genly","Genoelselderen","Gent", + "Gentbrugge","Gentinnes","Genval","Geraardsbergen", + "Gerdingen","Gerin","Gerpinnes","Gestel", + "Gesves","Ghislenghien","Ghlin","Ghoy", + "Gibecq","Gierle","Gijverinkhove","Gijzegem", + "Gijzelbrechtegem","Gijzenzele","Gilly","Gimnée", + "Gingelom","Gistel","Gits","Givry", + "Glabais","Glabbeek-Zuurbemde","Glain","Gleixhe", + "Glimes","Glons","Gochenée","Godarville", + "Godinne","Godveerdegem","Goeferdinge","Goegnies-Chaussée", + "Goesnes","Goetsenhoven","Gomzé-Andoumont","Gondregnies", + "Gonrieux","Gontrode","Gooik","Gors-Opleeuw", + "Gorsem","Gosselies","Gotem","Gottem", + "Gottignies","Gougnies","Gourdinne","Goutroux", + "Gouvy","Gouy-lez-Piéton","Gozée","Goé", + "Graide","Grammene","Grand-Axhe","Grand-Hallet", + "Grand-Halleux","Grand-Leez","Grand-Manil","Grand-Rechain", + "Grand-Reng","Grand-Rosière-Hottomont","Grandglise","Grandhan", + "Grandmenil","Grandmetz","Grandrieu","Grandville", + "Grandvoir","Grapfontaine","Graty","Graux", + "Grazen","Grembergen","Grez-Doiceau","Grimbergen", + "Grimminge","Grivegnée","Grobbendonk","Groot-Bijgaarden", + "Groot-Gelmen","Groot-Loon","Gros-Fays","Grosage", + "Grote-Brogel","Grote-Spouwen","Grotenberge","Gruitrode", + "Grune","Grupont","Grâce-Berleur","Grâce-Hollogne", + "Guignies","Guigoven","Guirsch","Gullegem", + "Gutschoven","Gérompont","Gérouville","Haacht", + "Haaltert","Haasdonk","Haasrode","Habay", + "Habay-la-Neuve","Habay-la-Vieille","Habergy","Haccourt", + "Hachy","Hacquegnies","Haillot","Haine-Saint-Paul", + "Haine-Saint-Pierre","Hainin","Hakendover","Halanzy", + "Halen","Hallaar","Halle","Halle-Booienhoven", + "Halleux","Halma","Halmaal","Haltinne", + "Ham","Ham-sur-Heure","Ham-sur-Heure-Nalinnes","Ham-sur-Sambre", + "Hamipré","Hamme","Hamme-Mille","Hamoir", + "Hamois","Hamont","Hamont-Achel","Hampteau", + "Han-sur-Lesse","Handzame","Haneffe","Hannut", + "Hannêche","Hanret","Hansbeke","Hantes-Wihéries", + "Hanzinelle","Hanzinne","Harchies","Harelbeke", + "Haren","Haren-Borgloon","Haren-Tongeren","Hargimont", + "Harmignies","Harnoncourt","Harre","Harsin", + "Harveng","Harzé","Hasselt","Hastière", + "Hastière-Lavaux","Hastière-par-Delà","Hatrival","Haulchin", + "Hauset","Haut-Fays","Haut-Ittre","Haut-le-Wastia", + "Hautrage","Havay","Havelange","Haversin", + "Havinnes","Havré","Hechtel","Hechtel-Eksel", + "Heer","Heers","Hees","Heestert", + "Heffen","Heikruis","Heindonk","Heinsch", + "Heist-aan-Zee","Heist-op-den-Berg","Hekelgem","Heks", + "Helchteren","Heldergem","Helen-Bos","Helkijn", + "Hellebecq","Hemelveerdegem","Hemiksem","Hemptinne", + "Hemptinne-lez-Florennes","Hendrieken","Henis","Hennuyères", + "Henri-Chapelle","Henripont","Hensies","Heppen", + "Heppenbach","Heppignies","Herbeumont","Herchies", + "Herderen","Herdersem","Herent","Herentals", + "Herenthout","Herfelingen","Hergenrath","Herk-de-Stad", + "Hermalle-sous-Argenteau","Hermalle-sous-Huy","Hermeton-sur-Meuse", + "Hermée","Herne","Herquegies","Herseaux","Herselt", + "Herstal","Herstappe","Hertain","Herten", + "Hertsberge","Herve","Herzele","Heule", + "Heure","Heure-le-Romain","Heurne","Heusden", + "Heusden-Zolder","Heusy","Heuvelland","Hever", + "Heverlee","Heyd","Hillegem","Hingene", + "Hingeon","Hives","Hoboken","Hodeige", + "Hodister","Hody","Hoegaarden","Hoeilaart", + "Hoeke","Hoelbeek","Hoeleden","Hoepertingen", + "Hoeselt","Hoevenen","Hofstade","Hogne", + "Hognoul","Hollain","Hollange","Hollebeke", + "Hollogne-aux-Pierres","Hollogne-sur-Geer","Holsbeek","Hombeek", + "Hombourg","Hompré","Hondelange","Honnay", + "Honnelles","Hooglede","Hoogstade","Hoogstraten", + "Horebeke","Horion-Hozémont","Hornu","Horpmaal", + "Horrues","Hotton","Houdemont","Houdeng-Aimeries", + "Houdeng-Goegnies","Houdremont","Houffalize","Hour", + "Housse","Houtain-Saint-Siméon","Houtain-le-Val","Houtaing", + "Houtave","Houtem","Houthalen","Houthalen-Helchteren", + "Houthem","Houthulst","Houtvenne","Houwaart", + "Houx","Houyet","Hove","Hoves", + "Howardries","Huccorgne","Huise","Huissignies", + "Huizingen","Huldenberg","Hulshout","Hulsonniaux", + "Hulste","Humain","Humbeek","Hundelgem", + "Huppaye","Huy","Hyon","Hélécine", + "Hérinnes-lez-Pecq","Héron","Hévillers","Ichtegem", + "Iddergem","Idegem","Ieper","Impe", + "Incourt","Ingelmunster","Ingooigem","Irchonwelz", + "Isières","Isnes","Itegem","Itterbeek", + "Ittre","Ivoz-Ramet","Izegem","Izel", + "Izenberge","Izier","Jabbeke","Jalhay", + "Jallet","Jamagne","Jambes","Jamiolle", + "Jamioulx","Jamoigne","Jandrain-Jandrenouille","Jauche", + "Jauchelette","Javingue","Jehay","Jehonville", + "Jemappes","Jemelle","Jemeppe-sur-Meuse","Jemeppe-sur-Sambre", + "Jeneffe","Jesseren","Jette","Jeuk", + "Jodoigne","Jodoigne-Souveraine","Jollain-Merlin","Joncret", + "Julémont","Jumet","Jupille-sur-Meuse","Juprelle", + "Jurbise","Juseret","Kaaskerke","Kachtem", + "Kaggevinne","Kain","Kalken","Kallo", + "Kallo-Kieldrecht","Kalmthout","Kampenhout","Kanegem", + "Kanne","Kapelle-op-den-Bos","Kapellen","Kaprijke", + "Kaster","Kasterlee","Kaulille","Keerbergen", + "Keiem","Kelmis","Kemexhe","Kemmel", + "Kemzeke","Kerkhove","Kerkom","Kerkom-bij-Sint-Truiden", + "Kerksken","Kermt","Kerniel","Kersbeek-Miskom", + "Kessel","Kessel-Lo","Kessenich","Kester", + "Kettenis","Keumiée","Kieldrecht","Kinrooi", + "Klein-Gelmen","Kleine-Brogel","Kleine-Spouwen","Klemskerke", + "Klerken","Kluisbergen","Kluizen","Knesselare", + "Knokke","Knokke-Heist","Kobbegem","Koekelare", + "Koekelberg","Koersel","Koksijde","Kolmont-Borgloon", + "Kolmont-Tongeren","Komen","Komen-Waasten","Koningshooikt", + "Koninksem","Kontich","Kooigem","Koolkerke", + "Koolskamp","Korbeek-Dijle","Korbeek-Lo","Kortemark", + "Kortenaken","Kortenberg","Kortessem","Kortijs", + "Kortrijk","Kortrijk-Dutsel","Kozen","Kraainem", + "Krombeke","Kruibeke","Kruishoutem","Kumtich", + "Kuringen","Kuttekoven","Kuurne","Kwaadmechelen", + "Kwaremont","La","La Bruyère","La Glanerie", + "La Gleize","La Hestre","La Hulpe","La Louvière", + "La bouverie","La-Roche-en-Ardenne","Laakdal","Laar", + "Laarne","Labuissière","Lacuisine","Ladeuze", + "Laforêt","Lahamaide","Laken","Lamain", + "Lambermont","Lambusart","Lamine","Lamontzée", + "Lamorteau","Lampernisse","Lanaken","Lanaye", + "Landegem","Landelies","Landen","Landenne", + "Landskouter","Laneffe","Langdorp","Langemark", + "Langemark-Poelkapelle","Lanklaar","Lanquesaint","Lantin", + "Lantremange","Laplaigne","Lapscheure","Lasne", + "Lasne-Chapelle-Saint-Lambert","Lathuy","Latinne","Latour", + "Lauw","Lauwe","Lavacherie","Lavaux-Sainte-Anne", + "Lavoir","Le Mesniel","Le Roeulx","Le Roux", + "Lebbeke","Lede","Ledeberg","Ledegem", + "Leefdaal","Leerbeek","Leernes","Leers-Nord", + "Leers-et-Fosteau","Leest","Leeuwergem","Leffinge", + "Leignon","Leisele","Leke","Lembeek", + "Lembeke","Lemberge","Lendelede","Lennik", + "Lens","Lens-Saint-Remy","Lens-Saint-Servais","Lens-sur-Geer", + "Leopoldsburg","Les Avins","Les Bons","Les Bulles", + "Les Hayons","Les Waleffes","Lesdain","Lessines", + "Lessive","Lesterny","Lesve","Lettelingen", + "Letterhoutem","Leugnies","Leupegem","Leut", + "Leuven","Leuze","Leuze-en-Hainaut","Leval-Chaudeville", + "Leval-Trahegnies","Liberchies","Libin","Libramont", + "Libramont-Chevigny","Lichtaart","Lichtervelde","Liedekerke", + "Lieferinge","Lier","Lierde","Lierneux", + "Liernu","Liers","Liezele","Ligne", + "Ligney","Ligny","Lille","Lillo", + "Lillois-Witterzée","Limal","Limbourg","Limelette", + "Limerlé","Limont","Lincent","Linden", + "Linkebeek","Linkhout","Linsmeau","Lint", + "Linter","Lippelo","Lisogne","Lissewege", + "Lives-sur-Meuse","Lixhe","Liège","Lo", + "Lo-Reninge","Lobbes","Lochristi","Lodelinsart", + "Loenhout","Loker","Lokeren","Loksbergen", + "Lombardsijde","Lombise","Lommel","Lommersweiler", + "Lompret","Lomprez","Loncin","Londerzeel", + "Longchamps","Longlier","Longueville","Longvilly", + "Lontzen","Lonzée","Loonbeek","Loppem", + "Lorcé","Lot","Lotenhulle","Louette-Saint-Denis", + "Louette-Saint-Pierre","Loupoigne","Louvain-la-Neuve", + "Louveigné","Lovendegem","Lovenjoel","Loverval","Loyers", + "Lubbeek","Luingne","Lummen","Lustin", + "Luttre","Léglise","Maarke-Kerkem","Maarkedal", + "Maaseik","Maasmechelen","Mabompré","Machelen", + "Macon","Macquenoise","Maffe","Maffle", + "Magnée","Maillen","Mainvault","Maisières", + "Maissin","Maizeret","Mal","Maldegem", + "Malderen","Malempré","Malle","Malmedy", + "Malonne","Malvoisin","Malèves-Sainte-Marie-Wastines","Manage", + "Manderfeld","Manhay","Mannekensvere","Maransart", + "Marbais","Marbaix","Marbehan","Marche-en-Famenne", + "Marche-les-Dames","Marche-lez-Ecaussinnes","Marchienne-au-Pont", + "Marchin","Marchipont","Marchovelette","Marcinelle","Marcourt", + "Marenne","Mariakerke","Mariekerke","Mariembourg", + "Marilles","Mark","Marke","Markegem", + "Marneffe","Marquain","Martelange","Martenslinde", + "Martouzin-Neuville","Masbourg","Masnuy-Saint-Jean", + "Masnuy-Saint-Pierre","Massemen","Massenhoven","Matagne-la-Grande", + "Matagne-la-Petite","Mater","Maubray","Maulde","Maurage", + "Mazenzele","Mazy","Mazée","Mechelen", + "Mechelen-Bovelingen","Mechelen-aan-de-Maas","Meeffe", + "Meensel-Kiezegem","Meer","Meerbeek","Meerbeke","Meerdonk", + "Meerhout","Meerle","Meeswijk","Meetkerke", + "Meeuwen","Meeuwen-Gruitrode","Mehaigne","Meigem", + "Meilegem","Meise","Meix-devant-Virton","Meix-le-Tige", + "Melden","Meldert","Melen","Melkwezer", + "Melle","Mellery","Melles","Mellet", + "Mellier","Melsbroek","Melsele","Melsen", + "Membach","Membre","Membruggen","Mendonk", + "Menen","Merbes-Sainte-Marie","Merbes-le-Château","Merchtem", + "Merdorp","Mere","Merelbeke","Merendree", + "Merkem","Merksem","Merksplas","Merlemont", + "Mesen","Meslin-l'Evêque","Mesnil-Eglise","Mesnil-Saint-Blaise", + "Mespelare","Messancy","Messelbroek","Mesvin", + "Mettekoven","Mettet","Meulebeke","Meux", + "Meyerode","Michelbeke","Micheroux","Middelburg", + "Middelkerke","Mielen-boven-Aalst","Mignault","Millen", + "Milmort","Minderhout","Mirwart","Miécret", + "Modave","Moelingen","Moen","Moerbeke", + "Moerbeke-Waas","Moere","Moerkerke","Moerzeke", + "Moeskroen","Moha","Mohiville","Moignelée", + "Moircy","Mol","Molenbaix","Molenbeek-Wersbeek", + "Molenbeersel","Molenstede","Mollem","Momalle", + "Momignies","Monceau-Imbrechies","Monceau-en-Ardenne", + "Monceau-sur-Sambre","Mons","Mons-lez-Liège","Monstreux","Mont", + "Mont-Gauthier","Mont-Saint-André","Mont-Saint-Aubert", + "Mont-Saint-Guibert","Mont-Sainte-Aldegonde","Mont-Sainte-Geneviève", + "Mont-de-l'Enclus","Mont-sur-Marchienne","Montbliart","Montegnée", + "Montenaken","Montignies-Saint-Christophe","Montignies-lez-Lens", + "Montignies-sur-Roc","Montignies-sur-Sambre","Montigny-le-Tilleul", + "Montleban","Montroeul-au-Bois","Montroeul-sur-Haine","Montzen", + "Moorsel","Moorsele","Moorslede","Moortsele", + "Mopertingen","Moregem","Moresnet","Morhet", + "Morialmé","Morkhoven","Morlanwelz","Morlanwelz-Mariemont", + "Mormont","Mornimont","Mortier","Mortroux", + "Mortsel","Morville","Moulbaix","Mourcourt", + "Moustier","Moustier-sur-Sambre","Mouzaive","Moxhe", + "Mozet","Muizen","Mullem","Munkzwalm", + "Muno","Munsterbilzen","Munte","Musson", + "Mussy-la-Ville","My","Méan","Mélin", + "Mévergnies-lez-Lens","Naast","Nadrin","Nafraiture", + "Nalinnes","Namur","Namêche","Nandrin", + "Naninne","Naomé","Nassogne","Natoye", + "Nazareth","Neder-over-Heembeek","Nederboelare","Nederbrakel", + "Nederename","Nederhasselt","Nederokkerzeel","Nederzwalm-Hermelgem", + "Neerglabbeek","Neerharen","Neerhespen","Neerheylissem", + "Neerijse","Neerlanden","Neerlinter","Neeroeteren", + "Neerpelt","Neerrepen","Neervelp","Neerwaasten", + "Neerwinden","Neigem","Nerem","Nessonvaux", + "Nethen","Nettinne","Neu-Moresnet","Neufchâteau", + "Neufmaison","Neufvilles","Neupré","Neuville", + "Neuville-en-Condroz","Nevele","Niel","Niel-bij-As", + "Niel-bij-Sint-Truiden","Nieuwenhove","Nieuwenrode","Nieuwerkerken", + "Nieuwkapelle","Nieuwkerke","Nieuwkerken-Waas","Nieuwmunster", + "Nieuwpoort","Nieuwrode","Nijlen","Nil-Saint-Vincent-Saint-Martin", + "Nimy","Ninove","Nismes","Nivelles", + "Niverlée","Nives","Nobressart","Nodebais", + "Noduwez","Noirchain","Noirefontaine","Noiseux", + "Nokere","Nollevaux","Noorderwijk","Noordschote", + "Nossegem","Nothomb","Nouvelles","Noville", + "Noville-les-Bois","Noville-sur-Méhaigne","Nukerke","Néchin", + "Obaix","Obigies","Obourg","Ochamps", + "Ocquier","Odeigne","Odeur","Oedelem", + "Oekene","Oelegem","Oeren","Oeselgem", + "Oetingen","Oeudeghien","Oevel","Offagne", + "Ogy","Ohain","Ohey","Oignies-en-Thiérache", + "Oisquercq","Oizy","Okegem","Olen", + "Oleye","Ollignies","Olloy-sur-Viroin","Olmen", + "Olne","Olsene","Omal","Ombret", + "Omezée","On","Onhaye","Onkerzele", + "Onnezies","Onoz","Onze-Lieve-Vrouw-Lombeek", + "Onze-Lieve-Vrouw-Waver","Ooigem","Ooike","Oombergen","Oorbeek", + "Oordegem","Oostakker","Oostduinkerke","Oosteeklo", + "Oostende","Oosterzele","Oostham","Oostkamp", + "Oostkerke-Damme","Oostkerke-Diksmuide","Oostmalle","Oostnieuwkerke", + "Oostrozebeke","Oostvleteren","Oostwinkel","Opbrakel", + "Opdorp","Opglabbeek","Opgrimbie","Ophain-Bois-Seigneur-Isaac", + "Ophasselt","Opheers","Opheylissem","Ophoven", + "Opitter","Oplinter","Opoeteren","Opont", + "Opprebais","Oppuurs","Opvelp","Opwijk", + "Orbais","Orchimont","Orcq","Ordingen", + "Oret","Oreye","Orgeo","Ormeignies", + "Orp-Jauche","Orp-le-Grand","Orroir","Orsmaal-Gussenhoven", + "Ortho","Ostiches","Otegem","Oteppe", + "Othée","Otrange","Ottenburg","Ottergem", + "Ottignies","Ottignies-Louvain-la-Neuve","Oud-Heverlee", + "Oud-Turnhout","Oudegem","Oudekapelle","Oudenaarde","Oudenaken", + "Oudenburg","Oudergem","Ouffet","Ougrée", + "Oupeye","Outer","Outgaarden","Outrelouxhe", + "Outrijve","Ouwegem","Overboelare","Overhespen", + "Overijse","Overmere","Overpelt","Overrepen", + "Overwinden","Paal","Paifve","Pailhe", + "Paliseul","Pamel","Papignies","Parike", + "Passendale","Patignies","Paturages","Paulatem", + "Pecq","Peer","Peissant","Pellaines", + "Pellenberg","Pepingen","Pepinster","Perk", + "Pervijze","Perwez","Perwez-Haillot","Pesche", + "Pessoux","Petegem-aan-de-Leie","Petegem-aan-de-Schelde","Petigny", + "Petit-Fays","Petit-Hallet","Petit-Rechain","Petit-Roeulx-lez-Braine", + "Petit-Roeulx-lez-Nivelles","Petit-Thier","Petite-Chapelle","Peutie", + "Philippeville","Pipaix","Piringen","Pironchamps", + "Pittem","Piéton","Piétrain","Piétrebais", + "Plainevaux","Plancenoit","Ploegsteert","Plombières", + "Poederlee","Poeke","Poelkapelle","Poesele", + "Pollare","Polleur","Pollinkhove","Pommeroeul", + "Pondrôme","Pont-de-Loup","Pont-à-Celles","Pontillas", + "Poperinge","Poppel","Popuelles","Porcheresse", + "Pottes","Poucet","Poulseur","Poupehan", + "Pousset","Presgaux","Presles","Profondeville", + "Proven","Pry","Pulderbos","Pulle", + "Purnode","Pussemange","Putte","Puurs", + "Péronnes-lez-Antoing","Péronnes-lez-Binche","Péruwelz","Quaregnon", + "Quartes","Quenast","Queue-du-Bois","Quevaucamps", + "Quiévrain","Quévy","Quévy-le-Grand","Quévy-le-Petit", + "Rachecourt","Racour","Raeren","Ragnies", + "Rahier","Ramegnies","Ramegnies-Chin","Ramelot", + "Ramillies-Offus","Ramsdonk","Ramsel","Ramskapelle-Knokke-Heist", + "Ramskapelle-Nieuwpoort","Rance","Ransart","Ransberg", + "Ranst","Ravels","Rebaix","Rebecq", + "Rebecq-Rognon","Recht","Recogne","Redu", + "Reet","Rekem","Rekkem","Relegem", + "Remagne","Remersdaal","Remicourt","Rendeux", + "Reninge","Reningelst","Renlies","Reppel", + "Ressaix","Ressegem","Resteigne","Retie", + "Retinne","Reuland","Rhisnes","Richelle", + "Riemst","Rienne","Rijkel","Rijkevorsel", + "Rijkhoven","Rijmenam","Riksingen","Rillaar", + "Rivière","Rixensart","Rièzes","Robechies", + "Robelmont","Robertville","Roborst","Rochefort", + "Rochehaut","Rocherath","Roclenge-sur-Geer","Rocourt", + "Roesbrugge-Haringe","Roeselare","Rognée","Roisin", + "Roksem","Rollegem","Rollegem-Kapelle","Roloux", + "Roly","Romedenne","Romershoven","Romerée", + "Romsée","Rongy","Ronquières","Ronse", + "Ronsele","Roosbeek","Roosdaal","Roselies", + "Rosières","Rosmeer","Rosoux-Crenwick","Rossignol", + "Rosée","Rotem","Rotheux-Rimière","Rotselaar", + "Roucourt","Rouveroy","Rouvreux","Rouvroy", + "Roux","Roux-Miroir","Roy","Rozebeke", + "Ruddervoorde","Ruette","Ruien","Ruisbroek", + "Ruiselede","Rukkelingen-Loon","Rulles","Rumbeke", + "Rumes","Rumillies","Rummen","Rumsdorp", + "Rumst","Runkelen","Rupelmonde","Russeignies", + "Rutten","Rèves","Saint-Amand","Saint-André", + "Saint-Aubin","Saint-Denis","Saint-Denis-Bovesse", + "Saint-Georges-sur-Meuse","Saint-Germain","Saint-Ghislain", + "Saint-Gérard","Saint-Géry","Saint-Hubert","Saint-Jean-Geest", + "Saint-Léger","Saint-Marc","Saint-Mard","Saint-Martin","Saint-Maur", + "Saint-Médard","Saint-Nicolas","Saint-Pierre","Saint-Remy", + "Saint-Remy-Geest","Saint-Sauveur","Saint-Servais","Saint-Symphorien", + "Saint-Séverin","Saint-Vaast","Saint-Vincent","Sainte-Cécile", + "Sainte-Marie-Chevigny","Sainte-Marie-sur-Semois","Sainte-Ode", + "Saintes","Saive","Salles","Samart","Sambreville","Samrée", + "Sankt-Vith","Sars-la-Bruyère","Sars-la-Buissière","Sart-Bernard", + "Sart-Custinne","Sart-Dames-Avelines","Sart-Eustache", + "Sart-Saint-Laurent","Sart-en-Fagne","Sart-lez-Spa","Sautin", + "Sautour","Sauvenière","Schaarbeek","Schaffen","Schalkhoven", + "Schaltin","Schelderode","Scheldewindeke","Schelle", + "Schellebelle","Schendelbeke","Schepdaal","Scherpenheuvel", + "Scherpenheuvel-Zichem","Schilde","Schoonaarde","Schore", + "Schorisse","Schoten","Schriek","Schuiferskapelle", + "Schulen","Schönberg","Sclayn","Scy", + "Seilles","Seloignes","Semmerzake","Seneffe", + "Sensenruth","Seny","Senzeille","Septon", + "Seraing","Seraing-le-Château","Serinchamps","Serskamp", + "Serville","Sibret","Signeulx","Sijsele", + "Silenrieux","Silly","Sinaai-Waas","Sinsin", + "Sint-Agatha-Berchem","Sint-Agatha-Rode","Sint-Amands", + "Sint-Amandsberg","Sint-Andries","Sint-Antelinks","Sint-Baafs-Vijve", + "Sint-Blasius-Boekel","Sint-Denijs","Sint-Denijs-Boekel", + "Sint-Denijs-Westrem","Sint-Eloois-Vijve","Sint-Eloois-Winkel", + "Sint-Genesius-Rode","Sint-Gillis","Sint-Gillis-Waas", + "Sint-Gillis-bij-Dendermonde","Sint-Goriks-Oudenhove", + "Sint-Huibrechts-Hern","Sint-Huibrechts-Lille","Sint-Jacobs-Kapelle", + "Sint-Jan","Sint-Jan-in-Eremo","Sint-Jans-Molenbeek", + "Sint-Job-in-'t-Goor","Sint-Joost-ten-Node","Sint-Joris-Beernem", + "Sint-Joris-Nieuwpoort","Sint-Joris-Weert","Sint-Joris-Winge", + "Sint-Katelijne-Waver","Sint-Katherina-Lombeek", + "Sint-Kornelis-Horebeke","Sint-Kruis","Sint-Kruis-Winkel", + "Sint-Kwintens-Lennik","Sint-Lambrechts-Herk", + "Sint-Lambrechts-Woluwe","Sint-Laureins","Sint-Laureins-Berchem", + "Sint-Lenaarts","Sint-Lievens-Esse","Sint-Lievens-Houtem", + "Sint-Margriete","Sint-Margriete-Houtem","Sint-Maria-Horebeke", + "Sint-Maria-Latem","Sint-Maria-Lierde","Sint-Maria-Oudenhove-Brakel", + "Sint-Maria-Oudenhove-Zottegem","Sint-Martens-Bodegem", + "Sint-Martens-Latem","Sint-Martens-Leerne","Sint-Martens-Lennik", + "Sint-Martens-Lierde","Sint-Martens-Voeren","Sint-Michiels", + "Sint-Niklaas","Sint-Pauwels","Sint-Pieters-Kapelle", + "Sint-Pieters-Leeuw","Sint-Pieters-Rode","Sint-Pieters-Voeren", + "Sint-Pieters-Woluwe","Sint-Rijkers","Sint-Stevens-Woluwe", + "Sint-Truiden","Sint-Ulriks-Kapelle","Sippenaeken","Sirault","Sivry", + "Sivry-Rance","Sleidinge","Slijpe","Slins","Sluizen", + "Smeerebbe-Vloerzegem","Smetlede","Smuid","Snaaskerke", + "Snellegem","Soheit-Tinlot","Sohier","Soignies", + "Soiron","Solre-Saint-Géry","Solre-sur-Sambre","Sombreffe", + "Somme-Leuze","Sommethonne","Sommière","Somzée", + "Sorinne-la-Longue","Sorinnes","Sorée","Sosoye", + "Sougné-Remouchamps","Soulme","Soumagne","Soumoy", + "Sourbrodt","Souvret","Sovet","Soy", + "Soye","Spa","Spalbeek","Spermalie", + "Spiennes","Spiere","Spiere-Helkijn","Spontin", + "Spouwen","Sprimont","Spy","Stabroek", + "Staden","Stalhille","Stambruges","Stave", + "Stavele","Stavelot","Steendorp","Steenhuffel", + "Steenhuize-Wijnhuize","Steenkerke","Steenkerque","Steenokkerzeel", + "Stekene","Stembert","Stene","Sterrebeek", + "Stevoort","Stokrooie","Stoumont","Straimont", + "Strijpen","Strijtem","Strombeek-Bever","Strée", + "Strée-lez-Huy","Strépy-Bracquegnies","Stuivekenskerke","Suarlée", + "Sugny","Surice","Suxy","Sélange", + "Tailles","Taintignies","Tamines","Tarcienne", + "Tavier","Taviers","Tavigny","Tellin", + "Templeuve","Temploux","Temse","Tenneville", + "Teralfene","Terhagen","Termes","Ternat", + "Tertre","Tervuren","Terwagne","Tessenderlo", + "Testelt","Teuven","Theux","Thiaumont", + "Thieu","Thieulain","Thieusies","Thimister", + "Thimister-Clermont","Thimougies","Thiméon","Thines", + "Thirimont","Thisnes","Thommen","Thon", + "Thorembais-Saint-Trond","Thorembais-les-Béguines", + "Thoricourt","Thuillies","Thuin","Thulin","Thumaide","Thy-le-Bauduin", + "Thy-le-Château","Thynes","Thys","Tiegem", + "Tielen","Tielrode","Tielt","Tielt-Winge", + "Tienen","Tignée","Tihange","Tildonk", + "Tilff","Tillet","Tilleur","Tillier", + "Tilly","Tinlot","Tintange","Tintigny", + "Tisselt","Toernich","Tohogne","Tollembeek", + "Tongeren","Tongerlo","Tongre-Notre-Dame","Tongre-Saint-Martin", + "Tongrinne","Tontelange","Torgny","Torhout", + "Tourinne","Tourinnes-Saint-Lambert","Tournai","Tournay", + "Tourpes","Transinne","Trazegnies","Treignes", + "Trembleur","Tremelo","Trivières","Trognée", + "Trois-Ponts","Trooz","Tubize","Turnhout", + "Ucimont","Uikhoven","Uitbergen","Uitkerke", + "Ukkel","Ulbeek","Upigny","Ursel", + "Vaalbeek","Val-Meer","Vance","Varendonk", + "Varsenare","Vaucelles","Vaulx","Vaulx-lez-Chimay", + "Vaux-Chavanne","Vaux-et-Borset","Vaux-lez-Rosières", + "Vaux-sous-Chèvremont","Vaux-sur-Sûre","Vechmaal","Vedrin","Veerle", + "Velaine-sur-Sambre","Velaines","Veldegem","Veldwezelt", + "Vellereille-le-Sec","Vellereille-les-Brayeux","Velm","Velroux", + "Veltem-Beisem","Velzeke-Ruddershove","Vencimont","Vergnies", + "Verlaine","Verlée","Verrebroek","Vertrijk", + "Verviers","Vesqueville","Veulen","Veurne", + "Vezin","Vezon","Viane","Vichte", + "Vielsalm","Viemme","Viersel","Vierset-Barse", + "Vierves-sur-Viroin","Viesville","Vieux-Genappe","Vieux-Waleffe", + "Vieuxville","Villance","Ville-Pommeroeul","Ville-en-Hesbaye", + "Ville-sur-Haine","Villerot","Villers-Deux-Eglises", + "Villers-Notre-Dame","Villers-Perwin","Villers-Poterie", + "Villers-Saint-Amand","Villers-Saint-Ghislain", + "Villers-Saint-Siméon","Villers-Sainte-Gertrude","Villers-aux-Tours", + "Villers-devant-Orval","Villers-en-Fagne","Villers-l'Evêque", + "Villers-la-Bonne-Eau","Villers-la-Loue","Villers-la-Tour", + "Villers-la-Ville","Villers-le-Bouillet","Villers-le-Gambon", + "Villers-le-Peuplier","Villers-le-Temple","Villers-lez-Heest", + "Villers-sur-Lesse","Villers-sur-Semois","Vilvoorde","Vinalmont", + "Vinderhoute","Vinkem","Vinkt","Virelles","Virginal-Samme", + "Viroinval","Virton","Vissenaken","Visé", + "Vitrival","Vivegnis","Vivy","Vladslo", + "Vlamertinge","Vlekkem","Vleteren","Vlezenbeek", + "Vliermaal","Vliermaalroot","Vlierzele","Vlijtingen", + "Vlimmeren","Vlissegem","Vloesberg","Vodecée", + "Vodelée","Voeren","Vogenée","Volkegem", + "Vollezele","Vonêche","Voorde","Voormezele", + "Voort","Voroux-Goreux","Voroux-lez-Liers","Vorselaar", + "Vorsen","Vorst","Vosselaar","Vosselare", + "Vossem","Vottem","Vrasene","Vremde", + "Vreren","Vresse-sur-Semois","Vroenhoven","Vucht", + "Vurste","Vyle-et-Tharoul","Waanrode","Waarbeke", + "Waardamme","Waarloos","Waarmaarde","Waarschoot", + "Waasmont","Waasmunster","Waasten","Wachtebeke", + "Wadelincourt","Wagnelée","Waha","Waillet", + "Wakken","Walcourt","Walem","Walhain", + "Walhain-Saint-Paul","Walhorn","Walsbets","Walshoutem", + "Waltwilder","Wambeek","Wancennes","Wandre", + "Wanfercée-Baulet","Wange","Wangenies","Wanlin", + "Wanne","Wannebecq","Wannegem-Lede","Wansin", + "Wanze","Wanzele","Warchin","Warcoing", + "Wardin","Waregem","Waremme","Waret-l'Evêque", + "Waret-la-Chaussée","Warisoulx","Warnant","Warnant-Dreye", + "Warquignies","Warsage","Warzée","Wasmes", + "Wasmes-Audemez-Briffoeil","Wasmuel","Wasseiges","Waterland-Oudeman", + "Waterloo","Watermaal-Bosvoorde","Watervliet","Watou", + "Wattripont","Waudrez","Waulsort","Wauthier-Braine", + "Waver","Wavreille","Wayaux","Ways", + "Webbekom","Wechelderzande","Weelde","Weerde", + "Weert","Wegnez","Weillen","Weismes", + "Welden","Welkenraedt","Welle","Wellen", + "Wellin","Wemmel","Wenduine","Werbomont", + "Werchter","Werken","Werm","Wervik", + "Wespelaar","Westende","Westerlo","Westkapelle", + "Westkerke","Westmalle","Westmeerbeek","Westouter", + "Westrem","Westrozebeke","Westvleteren","Wetteren", + "Wevelgem","Wez-Velvain","Wezemaal","Wezembeek-Oppem", + "Wezeren","Wibrin","Wichelen","Widooie", + "Wiekevorst","Wielsbeke","Wierde","Wiers", + "Wiesme","Wieze","Wihogne","Wihéries", + "Wijchmaal","Wijer","Wijgmaal","Wijnegem", + "Wijshagen","Wijtschate","Wilderen","Willaupuis", + "Willebringen","Willebroek","Willemeau","Willerzie", + "Wilrijk","Wilsele","Wilskerke","Wimmertingen", + "Winenne","Wingene","Winksele","Wintershoven", + "Witry","Wodecq","Woesten","Wolkrange", + "Wolvertem","Wommelgem","Wommersom","Wonck", + "Wondelgem","Wontergem","Wortegem","Wortegem-Petegem", + "Wortel","Woubrechtegem","Woumen","Wulpen", + "Wulvergem","Wulveringem","Wuustwezel","Wépion", + "Wéris","Xhendelesse","Xhendremael","Xhoris", + "Yernée-Fraineux","Yves-Gomezée","Yvoir","Zaffelare", + "Zandbergen","Zande","Zandhoven","Zandvliet", + "Zandvoorde-Oostende","Zandvoorde-Zonnebeke","Zarlardinge","Zarren", + "Zaventem","Zedelgem","Zeebrugge","Zegelsem", + "Zele","Zelem","Zellik","Zelzate", + "Zemst","Zepperen","Zerkegem","Zevekote", + "Zeveneken","Zeveren","Zevergem","Zichem", + "Zichen-Zussen-Bolder","Zillebeke","Zingem","Zoerle-Parwijs", + "Zoersel","Zolder","Zomergem","Zonhoven", + "Zonnebeke","Zonnegem","Zottegem","Zoutenaaie", + "Zoutleeuw","Zuidschote","Zuienkerke","Zulte", + "Zulzeke","Zutendaal","Zwalm","Zwevegem", + "Zwevezele","Zwijnaarde","Zwijndrecht","Zétrud-Lumay", + "l'Escaillère" + ) + + provinces = ( + "Antwerpen", "Henegouwen", "Limburg", "Luik", "Luxemburg", "Namen", + "Oost-Vlaanderen", "Vlaams-Brabant", "Waals-Brabant", "West-Vlaanderen" + ) + + street_name_formats = ( + '{{first_name}}{{street_suffix}}', + ) + + street_address_formats = ( + '{{street_name}} {{building_number}}', + ) + + address_formats = ( + "{{street_address}}\n{{postcode}}\n{{city}}","{{street_address}}\n{{postcode}} {{city}}", + ) + + def province(self): + return self.random_element(self.provinces) + + def city(self): + return self.random_element(self.cities) diff --git a/src/faker/providers/nl_NL/address.py b/src/libs/faker/providers/address/nl_NL/__init__.py similarity index 99% rename from src/faker/providers/nl_NL/address.py rename to src/libs/faker/providers/address/nl_NL/__init__.py index efb0061..ece01df 100644 --- a/src/faker/providers/nl_NL/address.py +++ b/src/libs/faker/providers/address/nl_NL/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -583,10 +583,8 @@ class Provider(AddressProvider): "{{street_address}}\n{{postcode}}\n{{city}}", ) - @classmethod - def province(cls): - return cls.random_element(cls.provinces) + def province(self): + return self.random_element(self.provinces) - @classmethod - def city(cls): - return cls.random_element(cls.cities) + def city(self): + return self.random_element(self.cities) diff --git a/src/faker/providers/no_NO/address.py b/src/libs/faker/providers/address/no_NO/__init__.py similarity index 57% rename from src/faker/providers/no_NO/address.py rename to src/libs/faker/providers/address/no_NO/__init__.py index b3ddf2c..2259624 100644 --- a/src/faker/providers/no_NO/address.py +++ b/src/libs/faker/providers/address/no_NO/__init__.py @@ -1,9 +1,7 @@ +# coding=utf-8 from __future__ import unicode_literals -from decimal import Decimal -import random - -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -23,17 +21,22 @@ class Provider(AddressProvider): city_formats = [ '{{first_name}}{{city_suffix}}', '{{last_name}}'] street_name_formats = [ - '{{last_name}}{{street_suffix}}', + '{{last_name}}{{street_suffix}}', ] - street_address_formats = ['{{street_name}} {{building_number}}',] - address_formats = ['{{street_address}}, {{postcode}} {{city}}', ] - building_number_formats = ['#', '#', '#', '#?', '##', '##', '##?'] - postcode_formats = ['####', ] + street_address_formats = ('{{street_name}} {{building_number}}',) + address_formats = ('{{street_address}}, {{postcode}} {{city}}',) + building_number_formats = ('%', '%', '%', '%?', '##', '##', '##?', '###',) + building_number_suffixes = { + 'A': 0.2, 'B': 0.2, 'C': 0.2, 'D': 0.1, 'E': 0.1, 'F': 0.1, 'G': 0.05, + 'H': 0.05} + postcode_formats = ('####',) - @classmethod - def postcode(cls): - """ - :example 0234 - """ - return cls.random_element(cls.postcode_formats) + def building_number(self): + suffix = self.random_element(self.building_number_suffixes) + return self.numerify(self.random_element(self.building_number_formats)).replace('?', suffix) + def city_suffix(self): + return self.random_element(self.city_suffixes) + + def street_suffix(self): + return self.random_element(self.street_suffixes) diff --git a/src/libs/faker/providers/address/pl_PL/__init__.py b/src/libs/faker/providers/address/pl_PL/__init__.py new file mode 100644 index 0000000..a1d0e73 --- /dev/null +++ b/src/libs/faker/providers/address/pl_PL/__init__.py @@ -0,0 +1,189 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + cities = ( + 'Warszawa', 'Kraków', 'Łódź', 'Wrocław', 'Poznań', 'Gdańsk', + 'Szczecin', + 'Bydgoszcz', 'Lublin', 'Katowice', 'Białystok', 'Gdynia', + 'Częstochowa', 'Radom', 'Sosnowiec', 'Toruń', 'Kielce', 'Gliwice', + 'Rzeszów', 'Zabrze', 'Bytom', 'Olsztyn', 'Bielsko-Biała', + 'Ruda Śląska', + 'Rybnik', 'Tychy', 'Dąbrowa Górnicza', 'Gorzów Wielkopolski', + 'Elbląg', + 'Płock', 'Opole', 'Wałbrzych', 'Zielona Góra', 'Włocławek', 'Tarnów', + 'Chorzów', 'Koszalin', 'Kalisz', 'Legnica', 'Grudziądz', 'Słupsk', + 'Jaworzno', 'Jastrzębie-Zdrój', 'Nowy Sącz', 'Jelenia Góra', 'Konin', + 'Piotrków Trybunalski', 'Siedlce', 'Inowrocław', 'Mysłowice', 'Piła', + 'Lubin', 'Ostrów Wielkopolski', 'Ostrowiec Świętokrzyski', 'Gniezno', + 'Stargard Szczeciński', 'Siemianowice Śląskie', 'Suwałki', 'Głogów', + 'Pabianice', 'Chełm', 'Zamość', 'Tomaszów Mazowiecki', 'Leszno', + 'Przemyśl', 'Stalowa Wola', 'Kędzierzyn-Koźle', 'Łomża', 'Żory', + 'Mielec', 'Tarnowskie Góry', 'Tczew', 'Bełchatów', 'Świdnica', + 'Ełk', 'Pruszków', 'Będzin', 'Biała Podlaska', 'Zgierz', + 'Piekary Śląskie', 'Racibórz', 'Legionowo', 'Ostrołęka', + 'Świętochłowice', 'Starachowice', 'Zawiercie', 'Wejherowo', + 'Puławy', 'Wodzisław Śląski', 'Starogard Gdański', 'Skierniewice', + 'Tarnobrzeg', 'Skarżysko-Kamienna', 'Radomsko', 'Krosno', 'Rumia', + 'Dębica', 'Kołobrzeg', 'Kutno', 'Nysa', 'Ciechanów', 'Otwock', + 'Piaseczno', 'Zduńska Wola', 'Sieradz', 'Świnoujście', 'Żyrardów', + 'Szczecinek', 'Świdnik', 'Chojnice', 'Nowa Sól', 'Oświęcim', + 'Bolesławiec', 'Mińsk Mazowiecki', 'Mikołów', 'Jarosław', 'Sanok', + 'Knurów', 'Malbork', 'Żary', 'Kwidzyn', 'Chrzanów', 'Sopot', + 'Sochaczew', 'Wołomin', 'Oleśnica', 'Brzeg', 'Olkusz', 'Jasło', + 'Cieszyn', 'Kraśnik', 'Lębork', 'Czechowice-Dziedzice', 'Dzierżoniów', + 'Ostróda', 'Police', 'Nowy Targ', 'Iława', 'Czeladź', 'Myszków', + 'Żywiec', 'Zgorzelec', 'Oława', 'Bielawa', 'Swarzędz', 'Mława', + 'Ząbki', 'Łuków', 'Augustów', 'Śrem', 'Bochnia', 'Luboń', 'Giżycko', + 'Grodzisk Mazowiecki', 'Łowicz', 'Krotoszyn', 'Września', + 'Turek', 'Pruszcz Gdański', 'Brodnica', 'Gorlice', + 'Czerwionka-Leszczyny', 'Kłodzko', 'Marki', 'Nowy Dwór Mazowiecki', + 'Kętrzyn', 'Zakopane', 'Wyszków', 'Biłgoraj', 'Żagań', + 'Bielsk Podlaski', 'Świecie', 'Wałcz', 'Jarocin', 'Pszczyna', + 'Wągrowiec', 'Szczytno', 'Białogard', 'Sandomierz', 'Bartoszyce', + 'Kluczbork', 'Lubliniec', 'Skawina', 'Jawor', 'Kościan', 'Wieluń', + 'Kościerzyna', 'Nowa Ruda', 'Świebodzice', 'Koło', 'Piastów', + 'Goleniów', 'Ostrów Mazowiecka', 'Polkowice', 'Lubartów', 'Zambrów', + 'Płońsk', 'Reda', 'Łaziska Górne', 'Środa Wielkopolska' + ) + + street_prefixes = ( + 'ulica', 'aleja', 'plac', + ) + + streets = ( + 'Polna', 'Leśna', 'Słoneczna', 'Krótka', 'Szkolna', 'Ogrodowa', + 'Lipowa', 'Brzozowa', 'Łąkowa', 'Kwiatowa', 'Sosnowa', 'Kościelna', + 'Akacjowa', 'Parkowa', 'Zielona', 'Kolejowa', 'Sportowa', 'Dębowa', + 'Kościuszki', 'Maja', 'Mickiewicza', 'Cicha', 'Spokojna', 'Klonowa', + 'Spacerowa', 'Swierkowa', 'Kasztanowa', 'Nowa', 'Piaskowa', + 'Sienkiewicza', 'Rózana', 'Topolowa', 'Wiśniowa', 'Dworcowa', + 'Wiejska', 'Graniczna', 'Słowackiego', 'Długa', 'Wrzosowa', + 'Konopnickiej', 'Boczna', 'Wąska', 'Wierzbowa', 'Jaśminowa', + 'Wspólna', 'Modrzewiowa', 'Kopernika', 'Jana Pawła II', + 'Poprzeczna', 'Wesoła', 'Pogodna', 'Żeromskiego', 'Rynek', 'Bukowa', + 'Wojska Polskiego', 'Sadowa', 'Górna', 'Jodłowa', 'Wolności', + 'Glówna', 'Młyńska', 'Strażacka', 'Prusa', 'Jesionowa', 'Przemysłowa', + 'Osiedlowa', 'Wiosenna', 'Sikorskiego', 'Chopina', 'Południowa', + 'Malinowa', 'Stawowa', 'Reymonta', 'Piłsudskiego', 'Zacisze', + 'Cmentarna', 'Okrężna', 'Kochanowskiego', 'Armii Krajowej', 'Miła', + 'Jasna', 'Wodna', 'Zamkowa', 'Witosa', 'Reja', 'Warszawska', + 'Miodowa', 'Partyzantów', 'Krzywa', 'Kilińskiego', 'Dolna', + 'Podgórna', 'Kreta', 'Jarzębinowa', 'Moniuszki', 'Targowa', 'Prosta', + 'Orzeszkowej', 'Spółdzielcza', 'Jagodowa', 'Działkowa', 'Staszica', + 'Orzechowa', 'Rzemieślnicza', 'Rzeczna', 'Bolesława Chrobrego', + 'Fabryczna', 'Tęczowa', 'Chabrowa', 'Poziomkowa', 'Konwaliowa', + 'Wyszyńskiego', 'Kalinowa', 'Północna', 'Matejki', 'Grunwaldzka', + 'Cisowa', 'Nadrzeczna', 'Pocztowa', 'Zachodnia', 'Dąbrowskiego', + 'Grabowa', 'Norwida', 'Źródlana', 'Asnyka', 'Gajowa', 'Paderewskiego', + 'Listopada', 'Wyspiańskiego', 'Mostowa', 'Broniewskiego', 'Tuwima', + 'Wschodnia', 'Jaworowa', 'Poznańska', 'Makowa', 'Bema', 'Jeziorna', + 'Piękna', 'Czereśniowa', 'Mała', 'Krakowska', 'Radosna', + 'Leszczynowa', 'Traugutta', 'Jadwigi', 'Rolna', 'Wyzwolenia', + 'Piastowska', 'Grzybowa', 'Krasickiego', 'Podleśna', 'Żytnia', + 'Złota', 'Bursztynowa', 'Żwirowa', 'Stycznia', 'Widokowa', + 'Kazimierza Wielkiego', 'Kamienna', 'Jałowcowa', 'Morelowa', + 'Mieszka I', 'Myśliwska', 'Łączna', 'Szpitalna', 'Wczasowa', + 'Żurawia', 'Fiołkowa', 'Głowackiego', 'Rolnicza', 'Tulipanowa', + 'Władysława Jagiełły', 'Dworska', 'Letnia', 'Liliowa', 'Owocowa', + 'Pułaskiego', 'Stefana Batorego', 'Harcerska', 'Kołłątaja', + 'Strzelecka', 'Kraszewskiego', 'Władysława Łokietka', + 'Żwirki i Wigury', 'Wrocławska', 'Gdańska', 'Turystyczna', + 'Niepodległości', 'Poniatowskiego', 'Korczaka', 'Rybacka', + 'Narutowicza', 'Okrzei', 'Krucza', 'Jagiellońska', 'Świerczewskiego', + 'Kasprowicza', 'Szeroka', 'Jana III Sobieskiego', 'Młynarska', + 'Olchowa', 'Powstańców Śląskich', 'Rumiankowa', 'Stroma', + 'Starowiejska', 'Mazowiecka', + 'Lawendowa', 'Robotnicza', 'Zbożowa', 'Mokra', + 'Powstańców Wielkopolskich', 'Towarowa', 'Dobra', 'Środkowa', + 'Willowa', 'Zielna', 'Zdrojowa', 'Opolska', 'Agrestowa', 'Księżycowa', + 'Zwycięstwa', 'Fredry', 'Letniskowa', 'Andersa', 'Baczynskiego', + 'Batalionów Chłopskich', 'Dąbrowskiej', 'Orla', 'Skłodowskiej-Curie', + 'Błękitna', 'Rubinowa', 'Brzoskwiniowa', 'Urocza', 'Gałczynskiego', + 'Krasińskiego', 'Pomorska', 'Szymanowskiego', 'Jeżynowa', + 'Czarnieckiego', 'Nałkowskiej', 'Zaciszna', 'Porzeczkowa', + 'Krańcowa', 'Jesienna', 'Klasztorna', 'Irysowa', 'Niecała', + 'Wybickiego', 'Nadbrzeżna', 'Szarych Szeregów', 'Wałowa', + 'Słowicza', 'Strumykowa', 'Drzymały', 'Gołębia', 'Torowa', + 'Cegielniana', 'Cyprysowa', 'Słowianska', 'Diamentowa', 'Waryńskiego', + 'Częstochowska', 'Dojazdowa', 'Przechodnia', 'Hallera', 'Lubelska', + 'Plater', 'Popiełuszki', 'Borówkowa', 'Chełmońskiego', 'Daszyńskiego', + 'Plażowa', 'Tartaczna', 'Jabłoniowa', 'Kossaka', 'Skargi', 'Ludowa', + 'Sokola', 'Azaliowa', 'Szmaragdowa', 'Lipca', 'Staffa', 'Tysiąclecia', + 'Brzechwy', 'Jastrzębia', 'Kusocińskiego', 'Storczykowa', 'Wilcza', + 'Górnicza', 'Szafirowa', 'Długosza', 'Handlowa', 'Krokusowa', + 'Składowa', 'Widok', 'Perłowa', 'Skośna', 'Wypoczynkowa', 'Chmielna', + 'Jaskółcza', 'Nowowiejska', 'Piwna', 'Śląska', 'Zaułek', 'Głogowa', + 'Górska', 'Truskawkowa', 'Kaszubska', 'Kosynierów', 'Mazurska', + 'Srebrna', 'Bociania', 'Ptasia', 'Cedrowa', 'Rycerska', + 'Wieniawskiego', 'Żabia', 'Toruńska', 'Podmiejska', 'Słonecznikowa', + 'Sowia', 'Stolarska', 'Powstańców', 'Sucharskiego', + 'Bolesława Krzywoustego', 'Konarskiego', + 'Szczęśliwa', 'Lazurowa', 'Miarki', 'Narcyzowa', 'Browarna', + 'Konstytucji 3 Maja', 'Majowa', 'Miłosza', 'Malczewskiego', 'Orkana', + 'Skrajna', 'Bankowa', 'Bydgoska', 'Piekarska', 'Żeglarska', 'Jana', + 'Turkusowa', 'Tylna', 'Wysoka', 'Zakątek', 'Maczka', 'Morska', + 'Rataja', 'Szewska', 'Podwale', 'Pałacowa', 'Magnoliowa', 'Ceglana', + 'Sawickiej', 'Ściegiennego', 'Wiklinowa', 'Zakole', 'Borowa', + 'Kolorowa', 'Lisia', 'Lotnicza', 'Sarnia', 'Wiązowa', 'Grottgera', + 'Kolonia', 'Królewska', 'Promienna', 'Daleka', 'Jana Sobieskiego', + 'Rejtana', 'Wiatraczna', 'Kaliska', 'Łanowa', 'Średnia', 'Wiślana', + 'Wróblewskiego', 'Koralowa', 'Kruczkowskiego', 'Lelewela', + 'Makuszyńskiego', 'Sybiraków', 'Kowalska', 'Morcinka', 'Odrzańska', + 'Okulickiego', 'Solidarnosci', 'Zapolskiej', 'Łabędzia', 'Wojciecha', + 'Bałtycka', 'Lwowska', 'Rajska', 'Korfantego', 'Pszenna', 'Ciasna', + 'Floriana', 'Hutnicza', 'Kielecka' + ) + + regions = ( + "Dolnośląskie", "Kujawsko - pomorskie", "Lubelskie", "Lubuskie", + "Łódzkie", "Małopolskie", "Mazowieckie", "Opolskie", "Podkarpackie", + "Podlaskie", "Pomorskie", "Śląskie", "Świętokrzyskie", + "Warmińsko - mazurskie", "Wielkopolskie", "Zachodniopomorskie", + ) + + building_number_formats = ('##', '###', "##/##",) + postcode_formats = ('##-###',) + street_address_formats = ( + '{{street_prefix}} {{street_name}} {{building_number}}', + '{{street_prefix_short}} {{street_name}} {{building_number}}', + ) + address_formats = ( + "{{street_address}}\n{{postcode}} {{city}}", + ) + + def street_prefix(self): + """ + Randomly returns a street prefix + :example 'aleja' + """ + return self.random_element(self.street_prefixes) + + def street_prefix_short(self): + """ + Randomly returns an abbreviation of the street prefix. + :example 'al.' + """ + return self.random_element(self.street_prefixes)[:2]+'.' + + def street_name(self): + """ + Randomly returns a street name + :example 'Wróblewskiego' + """ + return self.random_element(self.streets) + + def city(self): + """ + Randomly returns a street name + :example 'Konin' + """ + return self.random_element(self.cities) + + def region(self): + """ + :example 'Wielkopolskie' + """ + return self.random_element(self.regions) diff --git a/src/faker/providers/pt_BR/address.py b/src/libs/faker/providers/address/pt_BR/__init__.py similarity index 72% rename from src/faker/providers/pt_BR/address.py rename to src/libs/faker/providers/address/pt_BR/__init__.py index 045dad9..3c50ba2 100644 --- a/src/faker/providers/pt_BR/address.py +++ b/src/libs/faker/providers/address/pt_BR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -147,46 +147,47 @@ class Provider(AddressProvider): 'Alto Barroca', 'Nova Vista', 'Coração De Jesus', 'Coração Eucarístico', 'Funcionários', 'Cruzeiro', 'João Pinheiro', 'Nova Granada', 'Nova Suíça', 'Itaipu' ) - countries = ('Afeganistão', 'África do Sul', 'Akrotiri', 'Albânia', 'Alemanha', 'Andorra', 'Angola', 'Anguila', - 'Antártica', 'Antígua e Barbuda', 'Antilhas Holandesas', 'Arábia Saudita', 'Argélia', 'Argentina', - 'Armênia', 'Aruba', 'Ashmore and Cartier Islands', 'Austrália', 'Áustria', 'Azerbaijão', 'Bahamas', - 'Bangladesh', 'Barbados', 'Barein', 'Bélgica', 'Belize', 'Benim', 'Bermudas', 'Bielorrússia', - 'Birmânia', 'Bolívia', 'Bósnia e Herzegovina', 'Botsuana', 'Brasil', 'Brunei', 'Bulgária', - 'Burquina Faso', 'Burundi', 'Butão', 'Cabo Verde', 'Camarões', 'Camboja', 'Canadá', 'Catar', - 'Cazaquistão', 'Chade', 'Chile', 'China', 'Chipre', 'Clipperton Island', 'Colômbia', 'Comores', - 'Congo-Brazzaville', 'Congo-Kinshasa', 'Coral Sea Islands', 'Coreia do Norte', 'Coreia do Sul', - 'Costa do Marfim', 'Costa Rica', 'Croácia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Domínica', 'Egito', - 'Costa do Marfim', 'Costa Rica', 'Croácia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Domínica', 'Egito', - 'Emirados Árabes Unidos', 'Equador', 'Eritreia', 'Eslováquia', 'Eslovênia', 'Espanha', - 'Estados Unidos', - 'Estônia', 'Etiópia', 'Faroé', 'Fiji', 'Filipinas', 'Finlândia', 'França', 'Gabão', 'Gâmbia', 'Gana', - 'Geórgia', 'Geórgia do Sul e Sandwich do Sul', 'Gibraltar', 'Granada', 'Grécia', 'Gronelândia', - 'Guam', 'Guatemala', 'Guernsey', 'Guiana', 'Guiné', 'Guiné Equatorial', 'Guiné-Bissau', 'Haiti', - 'Honduras', 'Hong Kong', 'Hungria', 'Iêmen', 'Ilha Bouvet', 'Ilha do Natal', 'Ilha Norfolk', - 'Ilhas Caiman', 'Ilhas Cook', 'Ilhas dos Cocos', 'Ilhas Falkland', 'Ilhas Heard e McDonald', - 'Ilhas Marshall', 'Ilhas Salomão', 'Ilhas Turcas e Caicos', 'Ilhas Virgens Americanas', - 'Ilhas Virgens Britânicas', 'Índia', 'Indonésia', 'Iran', 'Iraque', 'Irlanda', 'Islândia', 'Israel', - 'Itália', 'Jamaica', 'Jan Mayen', 'Japão', 'Jersey', 'Jibuti', 'Jordânia', 'Kuwait', 'Laos', 'Lesoto', - 'Letônia', 'Líbano', 'Libéria', 'Líbia', 'Liechtenstein', 'Lituânia', 'Luxemburgo', 'Macau', - 'Macedônia', - 'Madagáscar', 'Malásia', 'Malávi', 'Maldivas', 'Mali', 'Malta', 'Man, Isle of', 'Marianas do Norte', - 'Marrocos', 'Maurícia', 'Mauritânia', 'Mayotte', 'México', 'Micronésia', 'Moçambique', 'Moldávia', - 'Mônaco', 'Mongólia', 'Monserrate', 'Montenegro', 'Namíbia', 'Nauru', 'Navassa Island', 'Nepal', - 'Nicarágua', 'Níger', 'Nigéria', 'Niue', 'Noruega', 'Nova Caledónia', 'Nova Zelândia', 'Omã', - 'Países Baixos', 'Palau', 'Panamá', 'Papua-Nova Guiné', 'Paquistão', 'Paracel Islands', 'Paraguai', - 'Peru', 'Pitcairn', 'Polinésia Francesa', 'Polônia', 'Porto Rico', 'Portugal', 'Quênia', - 'Quirguizistão', - 'Quiribáti', 'Reino Unido', 'República Centro-Africana', 'República Checa', 'República Dominicana', - 'Roménia', 'Ruanda', 'Rússia', 'Salvador', 'Samoa', 'Samoa Americana', 'Santa Helena', 'Santa Lúcia', - 'São Cristóvão e Neves', 'São Marinho', 'São Pedro e Miquelon', 'São Tomé e Príncipe', - 'São Vicente e Granadinas', 'Sara Ocidental', 'Seicheles', 'Senegal', 'Serra Leoa', 'Sérvia', - 'Singapura', 'Síria', 'Somália', 'Sri Lanka', 'Suazilândia', 'Sudão', 'Suécia', 'Suíça', 'Suriname', - 'Svalbard e Jan Mayen', 'Tailândia', 'Taiwan', 'Tajiquistão', 'Tanzânia', - 'Território Britânico do Oceano Índico', - 'Territórios Austrais Franceses', 'Timor Leste', 'Togo', 'Tokelau', 'Tonga', 'Trindade e Tobago', - 'Tunísia', 'Turquemenistão', 'Turquia', 'Tuvalu', 'Ucrânia', 'Uganda', 'União Europeia', 'Uruguai', - 'Usbequistão', 'Vanuatu', 'Vaticano', 'Venezuela', 'Vietnam', 'Wake Island', 'Wallis e Futuna', - 'Zâmbia', 'Zimbabué' + countries = ( + 'Afeganistão', 'África do Sul', 'Akrotiri', 'Albânia', 'Alemanha', 'Andorra', 'Angola', 'Anguila', + 'Antártica', 'Antígua e Barbuda', 'Antilhas Holandesas', 'Arábia Saudita', 'Argélia', 'Argentina', + 'Armênia', 'Aruba', 'Ashmore and Cartier Islands', 'Austrália', 'Áustria', 'Azerbaijão', 'Bahamas', + 'Bangladesh', 'Barbados', 'Barein', 'Bélgica', 'Belize', 'Benim', 'Bermudas', 'Bielorrússia', + 'Birmânia', 'Bolívia', 'Bósnia e Herzegovina', 'Botsuana', 'Brasil', 'Brunei', 'Bulgária', + 'Burquina Faso', 'Burundi', 'Butão', 'Cabo Verde', 'Camarões', 'Camboja', 'Canadá', 'Catar', + 'Cazaquistão', 'Chade', 'Chile', 'China', 'Chipre', 'Clipperton Island', 'Colômbia', 'Comores', + 'Congo-Brazzaville', 'Congo-Kinshasa', 'Coral Sea Islands', 'Coreia do Norte', 'Coreia do Sul', + 'Costa do Marfim', 'Costa Rica', 'Croácia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Domínica', 'Egito', + 'Costa do Marfim', 'Costa Rica', 'Croácia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Domínica', 'Egito', + 'Emirados Árabes Unidos', 'Equador', 'Eritreia', 'Eslováquia', 'Eslovênia', 'Espanha', + 'Estados Unidos', + 'Estônia', 'Etiópia', 'Faroé', 'Fiji', 'Filipinas', 'Finlândia', 'França', 'Gabão', 'Gâmbia', 'Gana', + 'Geórgia', 'Geórgia do Sul e Sandwich do Sul', 'Gibraltar', 'Granada', 'Grécia', 'Gronelândia', + 'Guam', 'Guatemala', 'Guernsey', 'Guiana', 'Guiné', 'Guiné Equatorial', 'Guiné-Bissau', 'Haiti', + 'Honduras', 'Hong Kong', 'Hungria', 'Iêmen', 'Ilha Bouvet', 'Ilha do Natal', 'Ilha Norfolk', + 'Ilhas Caiman', 'Ilhas Cook', 'Ilhas dos Cocos', 'Ilhas Falkland', 'Ilhas Heard e McDonald', + 'Ilhas Marshall', 'Ilhas Salomão', 'Ilhas Turcas e Caicos', 'Ilhas Virgens Americanas', + 'Ilhas Virgens Britânicas', 'Índia', 'Indonésia', 'Iran', 'Iraque', 'Irlanda', 'Islândia', 'Israel', + 'Itália', 'Jamaica', 'Jan Mayen', 'Japão', 'Jersey', 'Jibuti', 'Jordânia', 'Kuwait', 'Laos', 'Lesoto', + 'Letônia', 'Líbano', 'Libéria', 'Líbia', 'Liechtenstein', 'Lituânia', 'Luxemburgo', 'Macau', + 'Macedônia', + 'Madagáscar', 'Malásia', 'Malávi', 'Maldivas', 'Mali', 'Malta', 'Man, Isle of', 'Marianas do Norte', + 'Marrocos', 'Maurícia', 'Mauritânia', 'Mayotte', 'México', 'Micronésia', 'Moçambique', 'Moldávia', + 'Mônaco', 'Mongólia', 'Monserrate', 'Montenegro', 'Namíbia', 'Nauru', 'Navassa Island', 'Nepal', + 'Nicarágua', 'Níger', 'Nigéria', 'Niue', 'Noruega', 'Nova Caledónia', 'Nova Zelândia', 'Omã', + 'Países Baixos', 'Palau', 'Panamá', 'Papua-Nova Guiné', 'Paquistão', 'Paracel Islands', 'Paraguai', + 'Peru', 'Pitcairn', 'Polinésia Francesa', 'Polônia', 'Porto Rico', 'Portugal', 'Quênia', + 'Quirguizistão', + 'Quiribáti', 'Reino Unido', 'República Centro-Africana', 'República Checa', 'República Dominicana', + 'Roménia', 'Ruanda', 'Rússia', 'Salvador', 'Samoa', 'Samoa Americana', 'Santa Helena', 'Santa Lúcia', + 'São Cristóvão e Neves', 'São Marinho', 'São Pedro e Miquelon', 'São Tomé e Príncipe', + 'São Vicente e Granadinas', 'Sara Ocidental', 'Seicheles', 'Senegal', 'Serra Leoa', 'Sérvia', + 'Singapura', 'Síria', 'Somália', 'Sri Lanka', 'Suazilândia', 'Sudão', 'Suécia', 'Suíça', 'Suriname', + 'Svalbard e Jan Mayen', 'Tailândia', 'Taiwan', 'Tajiquistão', 'Tanzânia', + 'Território Britânico do Oceano Índico', + 'Territórios Austrais Franceses', 'Timor Leste', 'Togo', 'Tokelau', 'Tonga', 'Trindade e Tobago', + 'Tunísia', 'Turquemenistão', 'Turquia', 'Tuvalu', 'Ucrânia', 'Uganda', 'União Europeia', 'Uruguai', + 'Usbequistão', 'Vanuatu', 'Vaticano', 'Venezuela', 'Vietnam', 'Wake Island', 'Wallis e Futuna', + 'Zâmbia', 'Zimbabué', ) estados = ( @@ -200,46 +201,48 @@ class Provider(AddressProvider): ('SE', 'Sergipe'), ('TO', 'Tocantins') ) - @classmethod - def street_prefix(cls): + def street_prefix(self): """ :example 'rua' """ - return cls.random_element(cls.street_prefixes) + return self.random_element(self.street_prefixes) - @classmethod - def estado(cls): + def estado(self): """ Randomly returns a Brazilian State ('sigla' , 'nome'). :example ('MG' . 'Minas Gerais') """ - return cls.random_element(cls.estados) + return self.random_element(self.estados) - @classmethod - def estado_nome(cls): + def estado_nome(self): """ Randomly returns a Brazilian State Name :example 'Minas Gerais' """ - return cls.estado()[1] + return self.estado()[1] - @classmethod - def estado_sigla(cls): + def estado_sigla(self): """ Randomly returns the abbreviation of a Brazilian State :example 'MG' """ - return cls.estado()[0] + return self.estado()[0] - @classmethod - def bairro(cls): + def bairro(self): """ Randomly returns a bairro (neighborhood) name. The names were taken from the city of Belo Horizonte - Minas Gerais :example 'Serra' """ - return cls.random_element(cls.bairros) + return self.random_element(self.bairros) + # aliases + def neighborhood(self): + return self.bairro() + def state(self): + return self.estado_nome() + def state_abbr(self): + return self.estado_sigla() diff --git a/src/libs/faker/providers/address/pt_PT/__init__.py b/src/libs/faker/providers/address/pt_PT/__init__.py new file mode 100644 index 0000000..19a8482 --- /dev/null +++ b/src/libs/faker/providers/address/pt_PT/__init__.py @@ -0,0 +1,130 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + street_prefixes = ('Av', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo') + + city_formats = ('{{city_name}}',) + street_name_formats = ( + '{{street_prefix}} {{last_name}}', + '{{street_prefix}} {{first_name}} {{last_name}}', + '{{street_prefix}} de {{last_name}}', + ) + + street_address_formats = ( + '{{street_name}}, {{building_number}}', + ) + + address_formats = ( + "{{street_address}}\n{{postcode}} {{city}}", + ) + + building_number_formats = ('S/N', '%', '%#', '%#', '%#', '%##') + + postcode_formats = ('####-###',) + + cities = ( + 'Abrantes', 'Agualva-Cacém', 'Albufeira', 'Alcobaça', 'Alcácer do Sal', + 'Almada', 'Almeirim', 'Alverca do Ribatejo', 'Amadora', 'Amarante', + 'Amora', 'Anadia', 'Angra do Heroísmo', 'Aveiro', 'Barcelos', + 'Barreiro', 'Beja', 'Braga', 'Bragança', 'Caldas da Rainha', 'Caniço', + 'Cantanhede', 'Cartaxo', 'Castelo Branco', 'Chaves', 'Coimbra', + 'Costa da Caparica', 'Covilhã', 'Câmara de Lobos', 'Elvas', + 'Entroncamento', 'Ermesinde', 'Esmoriz', 'Espinho', 'Esposende', + 'Estarreja', 'Estremoz', 'Fafe', 'Faro', 'Felgueiras', + 'Figueira da Foz', 'Fiães', 'Freamunde', 'Funchal', 'Fundão', 'Fátima', + 'Gafanha da Nazaré', 'Gandra', 'Gondomar', 'Gouveia', 'Guarda', + 'Guimarães', 'Horta', 'Lagoa', 'Lagos', 'Lamego', 'Leiria', 'Lisboa', + 'Lixa', 'Loulé', 'Loures', 'Lourosa', 'Macedo de Cavaleiros', 'Maia', + 'Mangualde', 'Marco de Canaveses', 'Marinha Grande', 'Matosinhos', + 'Mealhada', 'Miranda do Douro', 'Mirandela', 'Montemor-o-Novo', + 'Montijo', 'Moura', 'Mêda', 'Odivelas', 'Olhão', 'Oliveira de Azeméis', + 'Oliveira do Bairro', 'Oliveira do Hospital', 'Ourém', 'Ovar', + 'Paredes', 'Paços de Ferreira', 'Penafiel', 'Peniche', 'Peso da Régua', + 'Pinhel', 'Pombal', 'Ponta Delgada', 'Ponte de Sor', 'Portalegre', + 'Portimão', 'Porto', 'Porto Santo', 'Praia da Vitória', + 'Póvoa de Santa Iria', 'Póvoa de Varzim', 'Quarteira', 'Queluz', + 'Rebordosa', 'Reguengos de Monsaraz', 'Ribeira Grande', 'Rio Maior', + 'Rio Tinto', 'Sabugal', 'Sacavém', 'Santa Comba Dão', 'Santa Cruz', + 'Santa Maria da Feira', 'Santana', 'Santarém', 'Santiago do Cacém', + 'Santo Tirso', 'Seia', 'Seixal', 'Serpa', 'Setúbal', 'Silves', 'Sines', + 'Sintra', 'São João da Madeira', 'São Mamede de Infesta', + 'São Salvador de Lordelo', 'Tarouca', 'Tavira', 'Tomar', 'Tondela', + 'Torres Novas', 'Torres Vedras', 'Trancoso', 'Trofa', 'Valbom', + 'Vale de Cambra', 'Valongo', 'Valpaços', 'Vendas Novas', + 'Viana do Castelo', 'Vila Franca de Xira', 'Vila Nova de Famalicão', + 'Vila Nova de Foz Côa', 'Vila Nova de Gaia', 'Vila Nova de Santo André', + 'Vila Real', 'Vila Real de Santo António', 'Vila do Conde', 'Viseu', + 'Vizela', 'Évora', 'Ílhavo', + ) + + countries = ( + 'Afeganistão', 'África do Sul', 'Akrotiri', 'Albânia', 'Alemanha', + 'Andorra', 'Angola', 'Anguila', 'Antárctida', 'Antígua e Barbuda', + 'Antilhas Neerlandesas', 'Arábia Saudita', 'Arctic Ocean', 'Argélia', + 'Argentina', 'Arménia', 'Aruba', 'Ashmore and Cartier Islands', + 'Atlantic Ocean', 'Austrália', 'Áustria', 'Azerbaijão', 'Baamas', + 'Bangladeche', 'Barbados', 'Barém', 'Bélgica', 'Belize', 'Benim', + 'Bermudas', 'Bielorrússia', 'Birmânia', 'Bolívia', + 'Bósnia e Herzegovina', 'Botsuana', 'Brasil', 'Brunei', 'Bulgária', + 'Burquina Faso', 'Burúndi', 'Butão', 'Cabo Verde', 'Camarões', + 'Camboja', 'Canadá', 'Catar', 'Cazaquistão', 'Chade', 'Chile', 'China', + 'Chipre', 'Clipperton Island', 'Colômbia', 'Comores', + 'Congo-Brazzaville', 'Congo-Kinshasa', 'Coral Sea Islands', + 'Coreia do Norte', 'Coreia do Sul', 'Costa do Marfim', 'Costa Rica', + 'Croácia', 'Cuba', 'Dhekelia', 'Dinamarca', 'Domínica', 'Egipto', + 'Emiratos Árabes Unidos', 'Equador', 'Eritreia', 'Eslováquia', + 'Eslovénia', 'Espanha', 'Estados Unidos', 'Estónia', 'Etiópia', 'Faroé', + 'Fiji', 'Filipinas', 'Finlândia', 'França', 'Gabão', 'Gâmbia', 'Gana', + 'Gaza Strip', 'Geórgia', 'Geórgia do Sul e Sandwich do Sul', + 'Gibraltar', 'Granada', 'Grécia', 'Gronelândia', 'Guame', 'Guatemala', + 'Guernsey', 'Guiana', 'Guiné', 'Guiné Equatorial', 'Guiné-Bissau', + 'Haiti', 'Honduras', 'Hong Kong', 'Hungria', 'Iémen', 'Ilha Bouvet', + 'Ilha do Natal', 'Ilha Norfolk', 'Ilhas Caimão', 'Ilhas Cook', + 'Ilhas dos Cocos', 'Ilhas Falkland', 'Ilhas Heard e McDonald', + 'Ilhas Marshall', 'Ilhas Salomão', 'Ilhas Turcas e Caicos', + 'Ilhas Virgens Americanas', 'Ilhas Virgens Britânicas', 'Índia', + 'Indian Ocean', 'Indonésia', 'Irão', 'Iraque', 'Irlanda', 'Islândia', + 'Israel', 'Itália', 'Jamaica', 'Jan Mayen', 'Japão', 'Jersey', 'Jibuti', + 'Jordânia', 'Kuwait', 'Laos', 'Lesoto', 'Letónia', 'Líbano', 'Libéria', + 'Líbia', 'Listenstaine', 'Lituânia', 'Luxemburgo', 'Macau', 'Macedónia', + 'Madagáscar', 'Malásia', 'Malávi', 'Maldivas', 'Mali', 'Malta', + 'Man, Isle of', 'Marianas do Norte', 'Marrocos', 'Maurícia', + 'Mauritânia', 'Mayotte', 'México', 'Micronésia', 'Moçambique', + 'Moldávia', 'Mónaco', 'Mongólia', 'Monserrate', 'Montenegro', 'Mundo', + 'Namíbia', 'Nauru', 'Navassa Island', 'Nepal', 'Nicarágua', 'Níger', + 'Nigéria', 'Niue', 'Noruega', 'Nova Caledónia', 'Nova Zelândia', 'Omã', + 'Pacific Ocean', 'Países Baixos', 'Palau', 'Panamá', 'Papua-Nova Guiné', + 'Paquistão', 'Paracel Islands', 'Paraguai', 'Peru', 'Pitcairn', + 'Polinésia Francesa', 'Polónia', 'Porto Rico', 'Portugal', 'Quénia', + 'Quirguizistão', 'Quiribáti', 'Reino Unido', + 'República Centro-Africana', 'República Checa', 'República Dominicana', + 'Roménia', 'Ruanda', 'Rússia', 'Salvador', 'Samoa', 'Samoa Americana', + 'Santa Helena', 'Santa Lúcia', 'São Cristóvão e Neves', 'São Marinho', + 'São Pedro e Miquelon', 'São Tomé e Príncipe', + 'São Vicente e Granadinas', 'Sara Ocidental', 'Seicheles', 'Senegal', + 'Serra Leoa', 'Sérvia', 'Singapura', 'Síria', 'Somália', + 'Southern Ocean', 'Spratly Islands', 'Sri Lanca', 'Suazilândia', + 'Sudão', 'Suécia', 'Suíça', 'Suriname', 'Svalbard e Jan Mayen', + 'Tailândia', 'Taiwan', 'Tajiquistão', 'Tanzânia', + 'Território Britânico do Oceano Índico', + 'Territórios Austrais Franceses', 'Timor Leste', 'Togo', 'Tokelau', + 'Tonga', 'Trindade e Tobago', 'Tunísia', 'Turquemenistão', 'Turquia', + 'Tuvalu', 'Ucrânia', 'Uganda', 'União Europeia', 'Uruguai', + 'Usbequistão', 'Vanuatu', 'Vaticano', 'Venezuela', 'Vietname', + 'Wake Island', 'Wallis e Futuna', 'West Bank', 'Zâmbia', 'Zimbabué', + ) + + def street_prefix(self): + """ + :example 'Rua' + """ + return self.random_element(self.street_prefixes) + + def city_name(self): + """ + :example Amora + """ + return self.random_element(self.cities) diff --git a/src/libs/faker/providers/address/ru_RU/__init__.py b/src/libs/faker/providers/address/ru_RU/__init__.py new file mode 100644 index 0000000..884364f --- /dev/null +++ b/src/libs/faker/providers/address/ru_RU/__init__.py @@ -0,0 +1,264 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + +class Provider(AddressProvider): + #city_suffixes = [] + street_suffixes = [ 'ул.', ] + city_formats = ('{{city_prefix}} {{city_name}}', ) + street_name_formats = ('{{street_suffix}} {{street_title}}', ) + street_address_formats = ('{{street_name}}, д. {{building_number}}', ) + address_formats = ('{{city}}, {{street_address}}, {{postcode}}', ) + #building_number_formats = ('##', ) + postcode_formats = ('######', ) + + city_prefixes = ( + 'г.', 'п.', 'к.', 'с.', 'д.', 'клх', 'ст.' + ) + + street_titles = ( + 'Советская', 'Молодежная', 'Центральная', 'Школьная', 'Новая', + 'Садовая', 'Лесная', 'Набережная', 'Ленина', 'Мира', 'Октябрьская', + 'Зеленая', 'Комсомольская', 'Заречная', 'Первомайская', 'Гагарина', + 'Полевая', 'Луговая', 'Пионерская', 'Кирова', 'Юбилейная', 'Северная', + 'Пролетарская', 'Степная', 'Пушкина', 'Калинина', 'Южная', 'Колхозная', + 'Рабочая', 'Солнечная', 'Железнодорожная', 'Восточная', 'Заводская', + 'Чапаева', 'Нагорная', 'Строителей', 'Береговая', 'Победы', 'Горького', + 'Кооперативная', 'Красноармейская', 'Совхозная', 'Речная', + 'Спортивная', 'Озерная', 'Строительная', 'Парковая', 'Чкалова', + 'Мичурина', 'Подгорная', 'Дружбы', 'Почтовая', 'Партизанская', + 'Вокзальная', 'Лермонтова', 'Свободы', 'Дорожная', 'Дачная', + 'Маяковского', 'Западная', 'Фрунзе', 'Дзержинского', 'Московская', + 'Свердлова', 'Некрасова', 'Гоголя', 'Красная', 'Трудовая', 'Шоссейная', + 'Чехова', 'Коммунистическая', 'Труда', 'Комарова', 'Матросова', + 'Островского', 'Сосновая', 'Клубная', 'Куйбышева', 'Крупской', + 'Березовая', 'Карла Маркса', '8 Марта', 'Больничная', + 'Интернациональная', 'Суворова', 'Цветочная', 'Трактовая', + 'Ломоносова', 'Горная', 'Космонавтов', 'Энергетиков', 'Шевченко', + 'Весенняя', 'Механизаторов', 'Коммунальная', '40 лет Победы', + 'Майская', 'Энгельса', 'Привокзальная', 'Таежная', 'Транспортная', + 'Овражная', 'Светлая', '1 Мая', 'Вишневая', 'Чернышевского', + 'Урицкого', 'Ключевая', 'Ворошилова', 'Тургенева', 'Толстого', + 'Песчаная', 'Ленинградская', 'Профсоюзная', 'Буденного', + 'Орджоникидзе', 'Герцена', 'Верхняя', 'Ленинская', 'Кирпичная', + 'Мостовая', 'Щорса', 'Станционная', 'Луначарского', 'Энтузиастов', + 'Титова', 'Лазо', '50 лет Октября', 'Уральская', 'Линейная', + 'Пугачева', 'Володарского', 'Кутузова', 'Фабричная', 'Чайковского', + 'Магистральная', 'Сибирская', 'Крестьянская', 'Мелиораторов', + 'Российская', 'Новоселов', 'Тихая', 'Широкая', 'Нижняя', 'Белинского', + 'Тельмана', 'Тимирязева', 'Котовского', 'Народная', '60 лет Октября', + 'Промышленная', 'Кольцевая', 'Есенина', 'К.Маркса', 'Дальняя', + '40 лет Октября', 'Крылова', 'Декабристов', 'Базарная', 'Целинная', + 'Родниковая', '70 лет Октября', 'Фурманова', 'Революционная', + 'Социалистическая', 'Звездная', 'Студенческая', 'Гайдара', 'Мирная', + 'Терешковой', 'Кубанская', 'Гаражная', 'Фестивальная', 'Гражданская', + 'Песочная', 'Сиреневая', 'Ватутина', 'Сельская', 'Кузнечная', + 'Пушкинская', 'Крайняя', 'Коммунаров', 'Гвардейская', 'Веселая', + 'Загородная', 'Олимпийская', 'Гастелло', 'Жданова', 'Радищева', + 'Нефтяников', 'Осипенко', 'Приозерная', 'Рябиновая', 'Заозерная', + 'Нахимова', 'Боровая', 'Жукова', 'Павлова', 'Степана Разина', + 'Урожайная', 'Попова', 'Торговая', 'Жуковского', 'Королева', 'Донская', + 'Пограничная', 'Огородная', 'Пригородная', 'Грибоедова', 'Стадионная', + 'Менделеева', 'Достоевского', 'Репина', 'Виноградная', 'Циолковского', + 'Воровского', 'Киевская', 'Максима Горького', 'Революции', + 'Индустриальная', 'Красногвардейская', 'Волжская', 'Кошевого', + 'Пархоменко', 'Свободная', 'Кедровая', 'Подлесная', 'Полярная', + 'Раздольная', 'Карьерная', 'Мельничная', 'Серова', 'Украинская', + 'Шахтерская', 'Запрудная', 'Элеваторная', 'Театральная', 'Добролюбова', + 'Геологическая', '50 лет Победы', 'Болотная', 'Красина', 'Коминтерна', + 'Придорожная', '30 лет Победы', 'Кленовая', 'Разина', 'Черняховского', + 'Казачья', 'Ветеранов', 'Малая', 'Пирогова', 'Льва Толстого', + 'Геологов', 'Тукая', 'Морская', 'Волгоградская', 'Димитрова', + 'Средняя', 'М.Горького', 'Безымянная', 'Краснофлотская', 'Братская', + 'Розы Люксембург', 'Тенистая', 'Учительская', 'Маркса', 'Кавказская', + 'Ушакова', 'Короткая', 'Деповская', 'Амурская', 'Сенная', 'Поселковая', + '9 Мая', 'Юности', 'Короленко', 'Прудовая', 'Шолохова', 'Депутатская', + 'Авиационная', '50 лет ВЛКСМ', 'Черемушки', 'Кольцова', 'Плеханова', + 'Аэродромная', 'Большая', 'Приморская', 'Алтайская', 'Макаренко', + 'Глинки', 'Специалистов', 'Халтурина', 'Морозова', 'Тополиная', + 'Ростовская', 'Тракторная', 'Коммуны', 'Мелиоративная', 'Ольховая', + 'Славянская', 'Красных Партизан', 'Зои Космодемьянской', 'Карбышева', + 'Баумана', 'Радужная', 'Марта 8', 'Правды', 'Маркса Карла', + 'Краснодарская', 'Фадеева', '60 лет СССР', 'Стахановская', + 'Ярославская', 'Челюскинцев', 'Коллективная', 'Ангарская', + 'Олега Кошевого', 'Новостройка', 'Шмидта', 'Кузнецова', 'Локомотивная', + 'Войкова', 'Панфилова', 'Ягодная', 'Смоленская', 'Тепличная', + 'Карла Либкнехта', 'Парижской Коммуны', 'Водопроводная', + 'Республиканская', 'Автомобилистов', 'Космодемьянской', 'Осенняя', + 'Байкальская', 'Седова', 'Саратовская', 'Казанская', 'Блюхера', + 'Воронежская', 'Демьяна Бедного', 'Брянская', 'Производственная', + 'Спартака', 'Техническая', 'Енисейская', 'Николаева', 'Бабушкина', + 'Севастопольская', 'Окружная', 'Октября', 'Щетинкина', 'Орловская', + 'Хуторская', 'Тупиковая', 'Каштановая', 'Омская', 'Гончарова', + 'Привольная', 'Щербакова', 'Курортная', 'Ивановская', 'Выгонная', + 'Крымская', 'Путейская', 'Азина', 'Проезжая', 'Сурикова', + 'Краснознаменная', 'Одесская', '9 Января', 'Подстанция', + 'Логовая', 'Высокая', 'Ясная', 'Портовая', 'Снежная', 'Санаторная', + 'Союзная', 'Волкова', 'Ульяновская', 'Никитина', 'Сахалинская', + 'Горняцкая', 'Рылеева', 'Прибрежная', 'Химиков', 'Рыбацкая', + 'Полтавская', 'Тамбовская', 'Красноярская', 'Новосельская', + 'Проточная', 'Черноморская', 'Курчатова', 'Минская', 'Микрорайон', + 'Главная', 'Докучаева', 'Вольная', 'Просвещения', 'Смирнова', + 'Хвойная', 'Космическая', 'Моховая', 'Макарова', 'Курская', + 'Курганная', 'Угловая', 'Камская', 'Инженерная', 'Лесозаводская', + 'Астраханская', 'Иванова', 'Л.Толстого', 'Гафури', 'Высоцкого', + 'Белорусская', 'Бажова', 'Кочубея', 'Заовражная', 'Азовская', + 'Ручейная', 'Леонова', 'Волочаевская', 'Надежды', 'Ставропольская', + 'Металлистов', 'Вавилова', 'Слободская', 'Ульянова', 'Тульская', + 'Харьковская', 'Петровская', 'Павлика Морозова', 'Владимирская', + 'Семашко', 'Высоковольтная', 'Шаумяна', 'Чайкиной', 'Лазурная', + 'Ермака', 'Дорожников', 'Покровская', 'Новгородская', 'Ленская', + 'Советской Армии', 'Сплавная', 'Ударная', 'Калужская', 'Монтажников', + 'Прудная', 'Шишкина', 'Краснопартизанская', 'Ореховая', 'Таманская', + 'Иркутская', 'Металлургов', 'Отрадная', 'Беляева', 'Большевистская', + 'Троицкая', 'Лесхозная', 'Дружба', 'Васильковая', 'Серафимовича', + 'Ильича', 'Мусы Джалиля', 'Механическая', 'Невского', 'Путевая', + 'Клары Цеткин', 'Кузнецкая', 'Физкультурная', 'Леваневского', + 'Водников', 'Вахитова', 'Станиславского', 'Черемуховая', 'Советов', + 'Флотская', 'Угольная', 'Восьмого Марта', 'Пожарского', 'Папанина', + 'Просторная', 'Поперечная', 'Городская', 'Победа', '8-е Марта', + 'Абрикосовая', 'Бульварная', 'Прохладная', 'Томская', 'Энергетическая', + 'Литейная', 'Медицинская', 'Заливная', 'Журавлева', 'Бригадная', + 'Культуры', 'Мая 1', 'Минина', 'Машиностроителей', 'Детская', 'ДОС', + 'Тюленина', 'Запорожская', 'Дальневосточная', 'Громова', 'О.Кошевого', + 'Балтийская', 'Р.Люксембург', 'Февральская', 'Толбухина', 'Лунная', + 'Дарвина', 'З.Космодемьянской', 'Высотная', 'Рязанская', 'Малиновая' + ) + + city_names = ( + 'Абакан', 'Абинск', 'Агата', 'Агинское (Забайк.)', 'Адлер', 'Адыгейск', + 'Азов (Рост.)', 'Алагир', 'Алапаевск', 'Алдан', 'Александров', + 'Александров Гай', 'Александровск', 'Александровск-Сахалинский', + 'Алексин', 'Амдерма', 'Амурск', 'Анадырь', 'Анапа', 'Ангарск', + 'Андреаполь', 'Анива', 'Апатиты', 'Апрелевка', 'Апшеронск', 'Аргаяш', + 'Ардон', 'Арзамас', 'Армавир', 'Арсеньев', 'Артем', 'Архангельск', + 'Архыз', 'Аршан (Бурят.)', 'Асбест', 'Асино', 'Астрахань', 'Ахтубинск', + 'Ачинск', 'Ачхой Мартан', 'Аша', 'Бавлы', 'Байкальск', 'Баксан', + 'Балашиха', 'Балашов', 'Балтийск', 'Баргузин', 'Барнаул', 'Батайск', + 'Белгород', 'Белогорск (Амур.)', 'Белокуриха', 'Беломорск', 'Белорецк', + 'Белореченск', 'Белоярский', 'Белый Яр (Томск.)', 'Березники', + 'Беслан', 'Бийск', 'Билибино', 'Биробиджан', 'Бирск', + 'Благовещенск (Амур.)', 'Богучар', 'Бодайбо', 'Бологое', 'Бомнак', + 'Борзя', 'Боровск', 'Братск', 'Бреды', 'Бронницы', 'Брянск', + 'Бугульма', 'Бугуруслан', 'Буденновск', 'Бузулук', 'Буйнакск', + 'Быково (метеост.)', 'Валаам', 'Валдай', 'Ведено', 'Великие Луки', + 'Великий Устюг', 'Вендинга', 'Верещагино (Перм.)', 'Верхнее Пенжино', + 'Верхний Баскунчак', 'Верхний Тагил', 'Верхний Уфалей', 'Верхотурье', + 'Верхоянск', 'Видное', 'Вилюйск', 'Витим', 'Владивосток', + 'Владикавказ', 'Владимир', 'Внуково (метеост.)', 'Волгоград', + 'Волгодонск', 'Вологда', 'Волоколамск', 'Волхов', 'Воркута', + 'Воронеж', 'Воскресенск', 'Воткинск', 'Всеволожск', 'Вуктыл', 'Выборг', + 'Вытегра', 'Вязьма', 'Гаврилов-Ям', 'Гагарин', 'Галич', 'Гатчина', + 'Гдов', 'Геленджик', 'Глазов', 'Голицыно', 'Горно-Алтайск', + 'Городовиковск', 'Горячий Ключ', 'Горячинск', 'Гремячинск (Бурят.)', + 'Гремячинск (Перм.)', 'Грозный', 'Губаха', 'Губкин', 'Губкинский', + 'Гудермес', 'Гусь-Хрустальный', 'Дагомыс', 'Далматово', 'Данков', + 'Двинской', 'Дербент', 'Джейрах', 'Джубга', 'Дзержинск', 'Дивногорск', + 'Диксон', 'Дмитров', 'Дно', 'Добрянка', 'Долинск', 'Домбай', + 'Домодедово', 'Дубна', 'Дудинка', 'Егорьевск', 'Ейск', 'Екатеринбург', + 'Елабуга', 'Елатьма', 'Елец', 'Ельня', 'Енисейск', 'Ербогачен', + 'Ершов', 'Ессентуки', 'Железногорск(Курск.)', 'Жиганск', 'Жигулевск', + 'Жуковский', 'Забайкальск', 'Заводоуковск', 'Завьялиха', 'Зарайск', + 'Звенигород', 'Зеленогорск (Ленин.)', 'Зеленоград', 'Златоуст', + 'Змеиногорск', 'Иваново', 'Ивдель', 'Игарка', 'Игнашино', 'Ижевск', + 'Избербаш', 'Инта', 'Ирбит', 'Иркутск', 'Истра', 'Ишим', 'Йошкар-Ола', + 'Кабанск', 'Кажим', 'Казань', 'Калач', 'Калач-на-Дону', 'Калачинск', + 'Калевала', 'Калининград', 'Калуга', 'Калязин', 'Каменномостский', + 'Каменск-Уральский', 'Каменск-Шахтинский', 'Камень-на-Оби', 'Камышин', + 'Камышлов', 'Кандалакша', 'Каневская', 'Канск', 'Карабудахкент', + 'Карабулак', 'Карачаевск', 'Каргасок', 'Каргополь', 'Карпинск', + 'Карталы', 'Касимов', 'Каспийск', 'Катав-Ивановск', 'Катайск', + 'Качканар', 'Кашира', 'Кашхатау', 'Кедровый', 'Кежма', 'Кемерово', + 'Кетченеры', 'Кижи', 'Кизел', 'Кизилюрт', 'Кизляр', 'Кимры', + 'Кингисепп', 'Кинешма', 'Киренск', 'Киржач', 'Кириши', 'Киров (Вятка)', + 'Кирово-Чепецк', 'Кировск (Мурм.)', 'Кировск (Ленин.)', 'Кисловодск', + 'Клин', 'Ковров', 'Когалым', 'Коломна', 'Колпашево', + 'Комсомольск-на-Амуре', 'Кондопога', 'Королев', 'Корсаков', + 'Костомукша', 'Кострома', 'Котельнич', 'Котлас', 'Кош-Агач', + 'Красная Поляна', 'Красновишерск', 'Красногорск (Моск.)', 'Краснодар', + 'Краснокамск', 'Красноселькуп', 'Краснотурьинск', 'Красноуральск', + 'Красноуфимск', 'Красноярск', 'Кропоткин (Краснод.)', 'Крымск', + 'Кудымкар', 'Кузнецк', 'Кулу', 'Кулунда', 'Кунгур', 'Курган', + 'Курганинск', 'Курильск', 'Курск', 'Куртамыш', 'Курумкан', 'Курчатов', + 'Кущевская', 'Кызыл', 'Кырен', 'Кыштым', 'Кяхта', 'Лабинск', + 'Лабытнанги', 'Лагань', 'Лазаревское', 'Лесной (Сверд.)', 'Липецк', + 'Листвянка (Иркут.)', 'Лодейное Поле', 'Лотошино', 'Луга', 'Луховицы', + 'Лысьва', 'Льгов', 'Любань', 'Люберцы', 'Лянтор', 'Магадан', 'Магас', + 'Магнитогорск', 'Майкоп', 'Макаров', 'Макушино', 'Малая Вишера', + 'Малгобек', 'Малоярославец', 'Махачкала', 'Медногорск', + 'Междуреченский', 'Мезень', 'Мелеуз', 'Меренга', 'Миасс', + 'Миллерово', 'Минеральные Воды', 'Минусинск', 'Мирный', 'Мичуринск', + 'Можайск', 'Можга', 'Моздок', 'Мокшан', 'Мончегорск', 'Морозовск', + 'Моршанск', 'Москва', 'Москва, МГУ', 'Мостовской', 'Муравленко', + 'Мураши', 'Мурманск', 'Муром', 'Мценск', 'Мыс Шмидта', 'Мытищи', + 'Набережные Челны', 'Надым', 'Назрань', 'Нальчик', 'Наро-Фоминск', + 'Нарткала', 'Нарым', 'Нарьян-Мар', 'Находка', 'Невельск', + 'Невинномысск', 'Невьянск', 'Неплюевка', 'Нерчинск', 'Нефедова', + 'Нефтегорск (Самар.)', 'Нефтекамск', 'Нефтеюганск', 'Нижневартовск', + 'Нижнекамск', 'Нижнеудинск', 'Нижний Новгород', 'Нижний Тагил', + 'Новая Игирма', 'Новгород Великий', 'Новокузнецк', 'Новомичуринск', + 'Новомосковск', 'Новороссийка', 'Новороссийск', 'Новосибирск', + 'Новочеркасск', 'Новый Оскол', 'Новый Уренгой', 'Ногинск (Моск.)', + 'Ноглики', 'Норильск', 'Ноябрьск', 'Нурлат', 'Нягань', 'Нязепетровск', + 'Обнинск', 'Обоянь', 'Объячево', 'Одинцово', 'Озеры', 'Оймякон', + 'Октябрьский (Башк.)', 'Октябрьское (Хант.)', 'Октябрьское (Челяб.)', + 'Оленегорск (Якут.)', 'Оленек', 'Омск', 'Онега', 'Орел', 'Оренбург', + 'Орехово-Зуево', 'Орск', 'Оса', 'Осташков', 'Оха', 'Охотск', + 'Павловская', 'Павловский Посад', 'Палана', 'Партизанск', 'Певек', + 'Пенза', 'Переславль-Залесский', 'Пермь', 'Петрозаводск', + 'Петропавловск-Камчатский', 'Петухово', 'Петушки', 'Печенга', 'Печора', + 'Пинега', 'Плес', 'Плесецк', 'Подольск', 'Поронайск', 'Поярково', + 'Приморско-Ахтарск', 'Приозерск', 'Прохладный', 'Псебай', 'Псков', + 'Пушкин', 'Пушкино (Моск.)', 'Пушкинские Горы', 'Пышма', 'Пятигорск', + 'Радужный', 'Раменское', 'Ребриха', 'Ревда (Сверд.)', 'Ржев', + 'Рославль', 'Россошь', 'Ростов', 'Ростов-на-Дону', 'Рубцовск', 'Руза', + 'Рыбинск', 'Рыльск', 'Ряжск', 'Рязань', 'Салават', 'Салехард', + 'Сальск', 'Самара', 'Санкт-Петербург', 'Саранск', 'Сарапул', 'Саратов', + 'Саров (Морд.)', 'Сасово', 'Саянск', 'Светлогорск (Калин.)', + 'Северо-Курильск', 'Северобайкальск', 'Северодвинск', 'Североморск', + 'Североуральск', 'Сеймчан', 'Семлячики', 'Серафимович', + 'Сергиев Посад', 'Серебряные Пруды', 'Середниково', 'Серов', + 'Серпухов', 'Сибай', 'Сковородино', 'Славгород', 'Славянск-на-Кубани', + 'Сладково', 'Слюдянка', 'Смирных', 'Смоленск', 'Снежинск', + 'Снежногорск (Мурм.)', 'Соболево', 'Советский', 'Соликамск', + 'Солнечногорск', 'Соловки', 'Соль-Илецк', 'Сорочинск', 'Сортавала', + 'Сосновый Бор', 'Сосногорск', 'Сосьва (Хант.)', 'Сочи', 'Ставрополь', + 'Старая Русса', 'Старый Оскол', 'Стерлитамак', 'Стрежевой', 'Ступино', + 'Суздаль', 'Сузун', 'Сунтар', 'Сургут (Хант.)', 'Сусуман', 'Сухиничи', + 'Сызрань', 'Сыктывкар', 'Тавда', 'Таганрог', 'Тайшет', 'Талдом', + 'Тамбей', 'Тамбов', 'Тарко-Сале', 'Таштагол', 'Тверь', 'Теберда', + 'Темрюк', 'Териберка', 'Терней', 'Терскол', 'Тикси', 'Тимашевск', + 'Тихвин', 'Тихорецк', 'Тобольск', 'Токма', 'Токсово', 'Тольятти', + 'Томари', 'Томпа', 'Томск', 'Торжок', 'Тосно', 'Тотьма', + 'Троицк (Челяб.)', 'Троицк (Моск.)', 'Троицко-Печорск', 'Туапсе', + 'Тула', 'Тулпан', 'Тулун', 'Тура', 'Туруханск', 'Тутаев', 'Тутончаны', + 'Тымовское', 'Тында', 'Тырныауз', 'Тюмень', 'Уварово', 'Углегорск', + 'Углич', 'Улан-Удэ', 'Ульяновск', 'Урай', 'Уренгой', 'Урус-Мартан', + 'Урюпинск', 'Усинск', 'Усмань', 'Усолье Сибирское', 'Уссурийск', + 'Усть-Баргузин', 'Усть-Джегута', 'Усть-Илимск', 'Усть-Ишим', + 'Усть-Калманка', 'Усть-Камчатск', 'Усть-Катав', 'Усть-Кулом', + 'Усть-Кут', 'Усть-Ордынский', 'Устюжна', 'Уфа', 'Ухта', 'Учалы', + 'Уэлен', 'Фатеж', 'Хабаровск', 'Ханты-Мансийск', 'Хасавюрт', + 'Хасан', 'Хатанга', 'Химки', 'Холмогоры', 'Холмск', 'Хоста', + 'Хужир', 'Цимлянск', 'Чайковский', 'Чебаркуль', 'Чебоксары', + 'Чегем', 'Челюскин', 'Челябинск', 'Черемхово', 'Череповец', + 'Черкесск', 'Чермоз', 'Черняховск', 'Черский', 'Черусти', 'Чехов', + 'Чикола', 'Чита', 'Чокурдах', 'Чулым', 'Чусовой', 'Шадринск', 'Шали', + 'Шамары', 'Шарья', 'Шатки', 'Шатой', 'Шатура', 'Шаховская', 'Шахты', + 'Шелагонцы', 'Шелехов', 'Шенкурск', 'Шерегеш', 'Шереметьево', 'Шилка', + 'Шумиха', 'Шуя', 'Щелково', 'Щельяюр', 'Элиста', 'Эльбрус', 'Эльтон', + 'Энгельс', 'Югорск', 'Южно-Курильск', 'Южно-Сахалинск', 'Южноуральск', + 'Юровск', 'Юрьев-Польский', 'Юрьевец (Иван.)', 'Юрюзань', 'Якутск', + 'Якша', 'Ялуторовск', 'Ямбург', 'Яр-Сале', 'Ярославль', + 'Ясный (Оренб.)', 'Яхрома', 'Яшалта', 'Яшкуль' + ) + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def city_name(self): + return self.random_element(self.city_names) + + def street_title(self): + return self.random_element(self.street_titles) diff --git a/src/libs/faker/providers/address/sk_SK/__init__.py b/src/libs/faker/providers/address/sk_SK/__init__.py new file mode 100644 index 0000000..830799e --- /dev/null +++ b/src/libs/faker/providers/address/sk_SK/__init__.py @@ -0,0 +1,1157 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_formats = ('{{city_name}}', ) + + street_name_formats = ('{{street_name}}', ) + street_address_formats = ('{{street_name}} {{building_number}}', ) + address_formats = ('{{street_address}}\n{{postcode}} {{city}}', ) + + building_number_formats = ('####', '###', '##', '#', '#/#') + + street_suffixes_long = ('ulica', ) + street_suffixes_short = ('ul.', ) + + postcode_formats = ('### ##', ) + + cities = ( + 'Ábelová', 'Abovce', 'Abrahám', 'Abrahámovce', 'Abrahámovce', + 'Abramová', 'Abranovce', 'Adidovce', 'Alekšince', 'Andovce', + 'Andrejová', 'Ardanovce', 'Ardovo', 'Arnutovce', 'Báb', 'Babie', + 'Babín', 'Babiná', 'Babindol', 'Babinec', 'Bacúch', 'Bacúrov', 'Báč', + 'Bačka', 'Bačkov', 'Bačkovík', 'Badín', 'Baďan', 'Báhoň', 'Bajany', + 'Bajč', 'Bajerov', 'Bajerovce', 'Bajka', 'Bajtava', 'Baka', 'Baláže', + 'Baldovce', 'Balog nad Ipľom', 'Baloň', 'Banka', 'Bánov', + 'Bánovce nad Bebravou', 'Bánovce nad Ondavou', 'Banská Belá', + 'Banská Štiavnica', 'Banská Bystrica', 'Banské', 'Banský Studenec', + 'Baňa', 'Bara', 'Barca', 'Bartošovce', 'Bardoňovo', + 'Bartošova Lehôtka', 'Bardejov', 'Baška', 'Baškovce', 'Baškovce', + 'Bašovce', 'Batizovce', 'Bátorová', 'Bátka', 'Bátorove Kosihy', + 'Bátovce', 'Beharovce', 'Beckov', 'Becherov', 'Belá', 'Belá', + 'Belá - Dulice', 'Belá nad Cirochou', 'Beladice', 'Belejovce', 'Belín', + 'Belina', 'Belince', 'Bellova Ves', 'Beloveža', 'Beluj', 'Beluša', + 'Belža', 'Beniakovce', 'Benice', 'Benkovce', 'Beňadiková', + 'Beňadikovce', 'Beňadovo', 'Beňatina', 'Beňuš', 'Bernolákovo', + 'Bertotovce', 'Beša', 'Beša', 'Bešeňov', 'Bešeňová', 'Betlanovce', + 'Betliar', 'Bežovce', 'Bidovce', 'Biel', 'Bielovce', 'Biely Kostol', + 'Bijacovce', 'Bílkove Humence', 'Bíňa', 'Bíňovce', 'Biskupice', + 'Biskupová', 'Bitarová', 'Blahová', 'Blatná na Ostrove', + 'Blatná Polianka', 'Blatné', 'Blatné Remety', 'Blatné Revištia', + 'Blatnica', 'Blažice', 'Blažovce', 'Blesovce', 'Blhovce', 'Bobot', + 'Bobrov', 'Bobrovček', 'Bobrovec', 'Bobrovník', 'Bočiar', 'Bodíky', + 'Bodiná', 'Bodorová', 'Bodovce', 'Bodružal', 'Bodza', + 'Bodzianske Lúky', 'Bogliarka', 'Bohdanovce', 'Bohdanovce nad Trnavou', + 'Boheľov', 'Bohunice', 'Bohunice', 'Bohúňovo', 'Bojná', 'Bojnice', + 'Bojničky', 'Boldog', 'Boleráz', 'Bolešov', 'Boliarov', 'Boľ', + 'Boľkovce', 'Borcová', 'Borčany', 'Borčice', 'Borinka', 'Borová', + 'Borovce', 'Borský Mikuláš', 'Borský Svätý Jur', 'Borša', 'Bory', + 'Bošáca', 'Bošany', 'Bottovo', 'Boťany', 'Bôrka', 'Bracovce', 'Branč', + 'Branovo', 'Bratislava', 'Okres Bratislava II', 'Okres Bratislava III', + 'Okres Bratislava IV', 'Okres Bratislava V', 'Braväcovo', 'Brdárka', + 'Brehov', 'Brehy', 'Brekov', 'Brestov', 'Brestov', + 'Brestov nad Laborcom', 'Brestovany', 'Brestovec', 'Brestovec', + 'Bretejovce', 'Bretka', 'Breza', 'Brezany', 'Brezina', 'Breziny', + 'Breznica', 'Breznička', 'Breznička', 'Brezno', 'Brezolupy', 'Brezov', + 'Brezová pod Bradlom', 'Brezovec', 'Brezovica', 'Brezovica', + 'Brezovička', 'Brezovka', 'Brežany', 'Brhlovce', 'Brieštie', 'Brodské', + 'Brodzany', 'Brunovce', 'Brusnica', 'Brusník', 'Brusno', 'Brutovce', + 'Bruty', 'Brvnište', 'Brzotín', 'Buclovany', 'Búč', 'Bučany', 'Budča', + 'Budikovany', 'Budimír', 'Budiná', 'Budince', 'Budiš', 'Budkovce', + 'Budmerice', 'Buglovce', 'Buková', 'Bukovce', 'Bukovec', 'Bukovec', + 'Bukovina', 'Bulhary', 'Bunetice', 'Bunkovce', 'Bušince', 'Bušovce', + 'Buzica', 'Buzitka', 'Bystrá', 'Bystrá', 'Bystrany', 'Bystré', + 'Bystričany', 'Bystrička', 'Byšta', 'Bytča', 'Bzenica', 'Bzenov', + 'Bzince pod Javorinou', 'Bziny', 'Bzovík', 'Bzovská Lehôtka', 'Bžany', + 'Cabaj - Čápor', 'Cabov', 'Cakov', 'Cejkov', 'Cernina', 'Cerová', + 'Cerovo', 'Cestice', 'Cífer', 'Cigeľ', 'Cigeľka', 'Cigla', 'Cimenná', + 'Cinobaňa', 'Čabalovce', 'Čabiny', 'Čabradský Vrbovok', 'Čadca', + 'Čachtice', 'Čajkov', 'Čaka', 'Čakajovce', 'Čakanovce', 'Čakanovce', + 'Čakany', 'Čaklov', 'Čalovec', 'Čamovce', 'Čaňa', 'Čaradice', 'Čáry', + 'Častá', 'Častkov', 'Častkovce', 'Čata', 'Čataj', 'Čavoj', 'Čebovce', + 'Čečehov', 'Čečejovce', 'Čechy', 'Čechynce', 'Čekovce', 'Čeláre', + 'Čelkova Lehota', 'Čelovce', 'Čelovce', 'Čeľadice', 'Čeľadince', + 'Čeľovce', 'Čenkovce', 'Čerenčany', 'Čereňany', 'Čerhov', 'Čerín', + 'Čermany', 'Černík', 'Černina', 'Černochov', 'Čertižné', + 'Červená Voda', 'Červenica', 'Červenica pri Sabinove', 'Červeník', + 'Červený Hrádok', 'Červený Kameň', 'Červený Kláštor', 'Červeňany', + 'České Brezovo', 'Čičarovce', 'Čičava', 'Čičmany', 'Číčov', 'Čierna', + 'Čierna Lehota', 'Čierna Lehota', 'Čierna nad Tisou', 'Čierna Voda', + 'Čierne', 'Čierne Kľačany', 'Čierne nad Topľou', 'Čierne Pole', + 'Čierny Balog', 'Čierny Brod', 'Čierny Potok', 'Čifáre', + 'Čiližská Radvaň', 'Čimhová', 'Čirč', 'Číž', 'Čižatice', 'Čoltovo', + 'Čremošné', 'Čučma', 'Čukalovce', 'Dačov Lom', 'Daletice', 'Danišovce', + 'Dargov', 'Davidov', 'Debraď', 'Dedačov', 'Dedina Mládeže', 'Dedinka', + 'Dedinky', 'Dechtice', 'Dekýš', 'Demandice', 'Demänovská Dolina', + 'Demjata', 'Detrík', 'Detva', 'Detvianska Huta', 'Devičany', 'Devičie', + 'Dežerice', 'Diaková', 'Diakovce', 'Diviacka Nová Ves', + 'Diviaky nad Nitricou', 'Divín', 'Divina', 'Divinka', 'Dlhá', + 'Dlhá nad Kysucou', 'Dlhá nad Oravou', 'Dlhá nad Váhom', 'Dlhá Ves', + 'Dlhé Klčovo', 'Dlhé nad Cirochou', 'Dlhé Pole', 'Dlhé Stráže', + 'Dlhoňa', 'Dlžín', 'Dobrá', 'Dobrá Niva', 'Dobrá Voda', 'Dobroč', + 'Dobrohošť', 'Dobroslava', 'Dobšiná', 'Dohňany', 'Dojč', 'Dolinka', + 'Dolná Breznica', 'Dolná Krupá', 'Dolná Lehota', 'Dolná Mariková', + 'Dolná Mičiná', 'Dolná Poruba', 'Dolná Seč', 'Dolná Streda', + 'Dolná Strehová', 'Dolná Súča', 'Dolná Tižina', 'Dolná Trnávka', + 'Dolná Ves', 'Dolná Ždaňa', 'Dolné Dubové', 'Dolné Kočkovce', + 'Dolné Lefantovce', 'Dolné Lovčice', 'Dolné Mladonice', + 'Dolné Naštice', 'Dolné Obdokovce', 'Dolné Orešany', 'Dolné Otrokovce', + 'Dolné Plachtince', 'Dolné Saliby', 'Dolné Semerovce', 'Dolné Srnie', + 'Dolné Strháre', 'Dolné Trhovište', 'Dolné Vestenice', 'Dolné Zahorany', + 'Dolné Zelenice', 'Dolný Badín', 'Dolný Bar', 'Dolný Harmanec', + 'Dolný Hričov', 'Dolný Chotár', 'Dolný Kalník', 'Dolný Kubín', + 'Dolný Lieskov', 'Dolný Lopašov', 'Dolný Ohaj', 'Dolný Pial', + 'Dolný Štál', 'Dolný Vadičov', 'Doľany', 'Doľany', 'Domadice', + 'Domaníky', 'Domaniža', 'Domaňovce', 'Donovaly', 'Drábsko', 'Drahňov', + 'Drahovce', 'Dravce', 'Dražice', 'Dražkovce', 'Drážovce', 'Drienčany', + 'Drienica', 'Drienov', 'Drienovec', 'Drienovo', 'Drienovská Nová Ves', + 'Drietoma', 'Drnava', 'Drňa', 'Družstevná pri Hornáde', 'Drženice', + 'Držkovce', 'Dubinné', 'Dubnica nad Váhom', 'Dubnička', 'Dubník', + 'Dubno', 'Dubodiel', 'Dubová', 'Dubová', 'Dubovany', 'Dubovce', + 'Dubové', 'Dubové', 'Dubovec', 'Dubovica', 'Dúbrava', 'Dúbrava', + 'Dúbrava', 'Dúbravica', 'Dúbravka', 'Dúbravy', 'Ducové', 'Dudince', + 'Dukovce', 'Dulov', 'Dulova Ves', 'Dulovce', 'Dulovo', + 'Dunajská Lužná', 'Dunajov', 'Dunajská Streda', 'Dunajský Klátov', + 'Duplín', 'Dvorany nad Nitrou', 'Dvorec', 'Dvorianky', 'Dvorníky', + 'Dvorníky - Včeláre', 'Dvory nad Žitavou', 'Ďačov', 'Ďanová', + 'Ďapalovce', 'Ďubákovo', 'Ďurčiná', 'Ďurďoš', 'Ďurďošík', 'Ďurďové', + 'Ďurkov', 'Ďurková', 'Ďurkovce', 'Egreš', 'Fačkov', 'Falkušovce', + 'Farná', 'Fekišovce', 'Figa', 'Fijaš', 'Fiľakovo', 'Fiľakovské Kováče', + 'Fintice', 'Folkušová', 'Forbasy', 'Frička', 'Fričkovce', 'Fričovce', + 'Fulianka', 'Gabčíkovo', 'Gaboltov', 'Gajary', 'Galanta', 'Galovany', + 'Gánovce', 'Gáň', 'Gbelce', 'Gbely', 'Gbeľany', 'Geča', 'Gelnica', + 'Gemer', 'Gemerček', 'Gemerská Hôrka', 'Gemerská Panica', + 'Gemerská Poloma', 'Gemerská Ves', 'Gemerské Dechtáre', + 'Gemerské Michalovce', 'Gemerské Teplice', 'Gemerský Jablonec', + 'Gemerský Sad', 'Geraltov', 'Gerlachov', 'Gerlachov', 'Giglovce', + 'Giraltovce', 'Girovce', 'Glabušovce', 'Gočaltovo', 'Gočovo', + 'Golianovo', 'Gortva', 'Gôtovany', 'Granč - Petrovce', + 'Gregorova Vieska', 'Gregorovce', 'Gribov', 'Gruzovce', 'Gyňov', + 'Habovka', 'Habura', 'Hačava', 'Háj', 'Háj', 'Hajná Nová Ves', + 'Hajnáčka', 'Hájske', 'Hajtovka', 'Haláčovce', 'Halič', 'Haligovce', + 'Haluzice', 'Hamuliakovo', 'Handlová', 'Hanigovce', 'Haniska', + 'Haniska', 'Hanková', 'Hankovce', 'Hankovce', 'Hanušovce nad Topľou', + 'Harakovce', 'Harhaj', 'Harichovce', 'Harmanec', 'Hatalov', 'Hatné', + 'Havaj', 'Havka', 'Havranec', 'Hažín', 'Hažín nad Cirochou', 'Hažlín', + 'Helcmanovce', 'Heľpa', 'Henckovce', 'Henclová', 'Hencovce', + 'Hendrichovce', 'Herľany', 'Hermanovce', 'Hermanovce nad Topľou', + 'Hertník', 'Hervartov', 'Hiadeľ', 'Hincovce', 'Hladovka', 'Hlboké', + 'Hliník nad Hronom', 'Hlinné', 'Hlivištia', 'Hlohovec', 'Hniezdne', + 'Hnilčík', 'Hnilec', 'Hnojné', 'Hnúšťa', 'Hodejov', 'Hodejovec', + 'Hodkovce', 'Hodruša - Hámre', 'Hokovce', 'Holčíkovce', 'Holiare', + 'Holice', 'Holíč', 'Holiša', 'Holumnica', 'Honce', 'Hontianska Vrbica', + 'Hontianske Moravce', 'Hontianske Nemce', 'Hontianske Tesáre', + 'Hontianske Trsťany', 'Horná Breznica', 'Horná Kráľová', 'Horná Krupá', + 'Horná Lehota', 'Horná Lehota', 'Horná Mariková', 'Horná Mičiná', + 'Horná Poruba', 'Horná Potôň', 'Horná Seč', 'Horná Streda', + 'Horná Strehová', 'Horná Súča', 'Horná Štubňa', 'Horná Ves', + 'Horná Ves', 'Horná Ždaňa', 'Horné Dubové', 'Horné Hámre', + 'Horné Chlebany', 'Horné Lefantovce', 'Horné Mladonice', 'Horné Mýto', + 'Horné Naštice', 'Horné Obdokovce', 'Horné Orešany', 'Horné Otrokovce', + 'Horné Plachtince', 'Horné Pršany', 'Horné Saliby', 'Horné Semerovce', + 'Horné Srnie', 'Horné Strháre', 'Horné Štitáre', 'Horné Trhovište', + 'Horné Turovce', 'Horné Vestenice', 'Horné Zahorany', 'Horné Zelenice', + 'Horný Badín', 'Horný Bar', 'Horný Hričov', 'Horný Kalník', + 'Horný Lieskov', 'Horný Pial', 'Horný Tisovník', 'Horný Vadičov', + 'Horňa', 'Horňany', 'Horovce', 'Horovce', 'Hoste', 'Hostice', 'Hostie', + 'Hostišovce', 'Hostovice', 'Hosťová', 'Hosťovce', 'Hosťovce', + 'Hozelec', 'Hôrka', 'Hôrka nad Váhom', 'Hôrky', 'Hrabičov', 'Hrabkov', + 'Hrabová Roztoka', 'Hrabovčík', 'Hrabovec', 'Hrabovec nad Laborcom', + 'Hrabské', 'Hrabušice', 'Hradisko', 'Hradište', 'Hradište', + 'Hradište pod Vrátnom', 'Hrádok', 'Hrachovište', 'Hrachovo', + 'Hraničné', 'Hranovnica', 'Hraň', 'Hrašné', 'Hrašovík', 'Hrčeľ', + 'Hrhov', 'Hriadky', 'Hričovské Podhradie', 'Hriňová', 'Hrišovce', + 'Hrkovce', 'Hrlica', 'Hrnčiarovce nad Parnou', 'Hrnčiarska Ves', + 'Hrnčiarske Zalužany', 'Hrochoť', 'Hromoš', 'Hronec', 'Hronovce', + 'Hronsek', 'Hronská Breznica', 'Hronská Dúbrava', 'Hronské Kľačany', + 'Hronské Kosihy', 'Hronský Beňadik', 'Hrubá Borša', 'Hruboňovo', + 'Hrubov', 'Hrubý Šúr', 'Hrušov', 'Hrušov', 'Hrušovany', 'Hrušovo', + 'Hruštín', 'Hubice', 'Hubina', 'Hubošovce', 'Hubová', 'Hubovo', + 'Hucín', 'Hudcovce', 'Hul', 'Humenné', 'Huncovce', 'Hunkovce', + 'Hurbanova Ves', 'Hurbanovo', 'Husák', 'Husiná', 'Hutka', 'Huty', + 'Hviezdoslavov', 'Hvozdnica', 'Hybe', 'Hýľov', 'Chanava', 'Chlebnice', + 'Chlmec', 'Chľaba', 'Chmeľnica', 'Chmeľov', 'Chmeľová', 'Chmeľovec', + 'Chminianska Nová Ves', 'Chminianske Jakubovany', 'Chmiňany', 'Choča', + 'Chocholná - Velčice', 'Choňkovce', 'Chorvátsky Grob', 'Chorváty', + 'Chotča', 'Chotín', 'Chrabrany', 'Chrámec', 'Chrastince', 'Chrastné', + 'Chrasť nad Hornádom', 'Chrenovec - Brusno', 'Chropov', 'Chrťany', + 'Chtelnica', 'Chudá Lehota', 'Chvalová', 'Chvojnica', 'Chvojnica', + 'Chynorany', 'Chyžné', 'Igram', 'Ihľany', 'Ihráč', 'Ilava', 'Iliašovce', + 'Ilija', 'Imeľ', 'Inovce', 'Iňa', 'Iňačovce', 'Ipeľské Predmostie', + 'Ipeľské Úľany', 'Ipeľský Sokolec', 'Istebné', 'Ivachnová', 'Ivančiná', + 'Ivanice', 'Ivanka pri Dunaji', 'Ivanka pri Nitre', 'Ivanovce', 'Iža', + 'Ižipovce', 'Ižkovce', 'Jablonec', 'Jablonica', 'Jablonka', 'Jablonov', + 'Jablonov nad Turňou', 'Jablonové', 'Jablonové', 'Jabloň', 'Jabloňovce', + 'Jacovce', 'Jahodná', 'Jaklovce', 'Jakovany', 'Jakubany', 'Jakubov', + 'Jakubova Voľa', 'Jakubovany', 'Jakubovany', 'Jakušovce', 'Jalová', + 'Jalovec', 'Jalovec', 'Jalšové', 'Jalšovík', 'Jamník', 'Jamník', + 'Janice', 'Janík', 'Janíky', 'Jankovce', 'Janov', 'Janova Lehota', + 'Janovce', 'Jánovce', 'Jánovce', 'Janovík', 'Jarabá', 'Jarabina', + 'Jarok', 'Jarovnice', 'Jasenica', 'Jasenie', 'Jasenov', 'Jasenov', + 'Jasenová', 'Jasenovce', 'Jasenové', 'Jasenovo', 'Jaslovské Bohunice', + 'Jasov', 'Jasová', 'Jastrabá', 'Jastrabie nad Topľou', + 'Jastrabie pri Michalovciach', 'Jatov', 'Javorina (vojenský obvod)', + 'Jazernica', 'Jedlinka', 'Jedľové Kostoľany', 'Jelenec', 'Jelka', + 'Jelšava', 'Jelšovce', 'Jelšovec', 'Jenkovce', 'Jesenské', 'Jesenské', + 'Jestice', 'Ješkova Ves', 'Jezersko', 'Jovice', 'Jovsa', + 'Jur nad Hronom', 'Jurkova Voľa', 'Jurová', 'Jurské', 'Juskova Voľa', + 'Kačanov', 'Kajal', 'Kalameny', 'Kalinkovo', 'Kalinov', 'Kalinovo', + 'Kalná nad Hronom', 'Kalná Roztoka', 'Kálnica', 'Kalnište', 'Kalonda', + 'Kalša', 'Kaloša', 'Kaluža', 'Kaľamenová', 'Kaľava', 'Kamanová', + 'Kamenec pod Vtáčnikom', 'Kamenica', 'Kamenica nad Cirochou', + 'Kamenica nad Hronom', 'Kameničany', 'Kameničná', 'Kamenín', + 'Kamenná Poruba', 'Kamenná Poruba', 'Kamenné Kosihy', 'Kamenný Most', + 'Kameňany', 'Kamienka', 'Kamienka', 'Kanianka', 'Kapišová', 'Kaplna', + 'Kapušany', 'Kapušianske Kľačany', 'Karlová', 'Karná', 'Kašov', + 'Kátlovce', 'Kátov', 'Kazimír', 'Kecerovce', 'Kecerovský Lipovec', + 'Kečkovce', 'Kečovo', 'Kechnec', 'Kendice', 'Kesovce', 'Keť', + 'Kežmarok', 'Kiarov', 'Kladzany', 'Klasov', 'Kláštor pod Znievom', + 'Klátova Nová Ves', 'Klčov', 'Klenov', 'Klenová', 'Klenovec', + 'Kleňany', 'Klieština', 'Klin', 'Klin nad Bodrogom', 'Klížska Nemá', + 'Klokoč', 'Klokočov', 'Klokočov', 'Klubina', 'Kluknava', 'Kľačany', + 'Kľače', 'Kľačno', 'Kľak', 'Kľúčovec', 'Kľušov', 'Kmeťovo', + 'Kobeliarovo', 'Kobylnice', 'Kobyly', 'Koceľovce', 'Kociha', + 'Kocurany', 'Kočín - Lančár', 'Kočovce', 'Kochanovce', 'Kochanovce', + 'Kojatice', 'Kojšov', 'Kokava nad Rimavicou', 'Kokošovce', + 'Kokšov - Bakša', 'Kolačkov', 'Kolačno', 'Koláre', 'Kolárovice', + 'Kolárovo', 'Kolbasov', 'Kolbovce', 'Kolibabovce', 'Kolinovce', + 'Kolíňany', 'Kolonica', 'Kolta', 'Komárany', 'Komárno', 'Komárov', + 'Komárovce', 'Komjatice', 'Komjatná', 'Komoča', 'Koniarovce', + 'Konrádovce', 'Konská', 'Konská', 'Koňuš', 'Kopčany', 'Kopernica', + 'Koplotovce', 'Koprivnica', 'Kordíky', 'Korejovce', 'Korňa', 'Koromľa', + 'Korunková', 'Korytárky', 'Korytné', 'Kosihovce', 'Kosihy nad Ipľom', + 'Kosorín', 'Kostolec', 'Kostolište', 'Kostolná pri Dunaji', + 'Kostolná Ves', 'Kostolná - Záriečie', 'Kostolné', 'Kostolné Kračany', + 'Kostoľany pod Tribečom', 'Koš', 'Košariská', 'Košarovce', 'Košeca', + 'Košecké Podhradie', 'Košice', 'Okres Košice II', 'Okres Košice III', + 'Okres Košice IV', 'Košická Belá', 'Košická Polianka', + 'Košické Oľšany', 'Košický Klečenov', 'Koškovce', 'Košolná', 'Košúty', + 'Košťany nad Turcom', 'Kotešová', 'Kotmanová', 'Kotrčiná Lúčka', + 'Kováčová', 'Kováčová', 'Kováčovce', 'Koválov', 'Koválovec', 'Kovarce', + 'Kozárovce', 'Kozelník', 'Kozí Vrbovok', 'Kožany', 'Kožuchov', + 'Kožuchovce', 'Kračúnovce', 'Krahule', 'Krajná Bystrá', 'Krajná Poľana', + 'Krajná Porúbka', 'Krajné', 'Krajné Čierno', 'Krakovany', 'Králiky', + 'Kráľ', 'Kráľov Brod', 'Kráľova Lehota', 'Kráľová nad Váhom', + 'Kráľová pri Senci', 'Kraľovany', 'Kráľovce', 'Kráľovce - Krnišov', + 'Kráľovičove Kračany', 'Kráľovský Chlmec', 'Kraskovo', 'Krásna Lúka', + 'Krásna Ves', 'Krásno', 'Krásno nad Kysucou', 'Krásnohorská Dlhá Lúka', + 'Krásnohorské Podhradie', 'Krásnovce', 'Krásny Brod', 'Krasňany', + 'Kravany', 'Kravany', 'Kravany nad Dunajom', 'Krčava', 'Kremná', + 'Kremnica', 'Kremnické Bane', 'Kristy', 'Krišľovce', + 'Krišovská Liesková', 'Krivá', 'Krivany', 'Kriváň', 'Krivé', + 'Krivoklát', 'Krivosúd - Bodovka', 'Kríže', 'Krížová Ves', 'Krížovany', + 'Križovany nad Dudváhom', 'Krná', 'Krnča', 'Krokava', 'Krompachy', + 'Krpeľany', 'Krškany', 'Krtovce', 'Kručov', 'Krupina', 'Krušetnica', + 'Krušinec', 'Krušovce', 'Kružlov', 'Kružlová', 'Kružná', 'Kružno', + 'Kšinná', 'Kubáňovo', 'Kučín', 'Kučín', 'Kuchyňa', 'Kuklov', 'Kuková', + 'Kukučínov', 'Kunerad', 'Kunešov', 'Kunova Teplica', 'Kuraľany', + 'Kurima', 'Kurimany', 'Kurimka', 'Kurov', 'Kusín', 'Kútniky', 'Kúty', + 'Kuzmice', 'Kuzmice', 'Kvačany', 'Kvačany', 'Kvakovce', 'Kvašov', + 'Kvetoslavov', 'Kyjatice', 'Kyjov', 'Kynceľová', 'Kysak', 'Kyselica', + 'Kysta', 'Kysucké Nové Mesto', 'Kysucký Lieskovec', 'Láb', 'Lackov', + 'Lacková', 'Lada', 'Ladce', 'Ladice', 'Ladmovce', 'Ladomerská Vieska', + 'Ladomirov', 'Ladomirová', 'Ladzany', 'Lakšárska Nová Ves', 'Lascov', + 'Laskár', 'Lastomír', 'Lastovce', 'Laškovce', 'Látky', 'Lazany', + 'Lazisko', 'Lazy pod Makytou', 'Lažany', 'Lednica', 'Lednické Rovne', + 'Legnava', 'Lehnice', 'Lehota', 'Lehota nad Rimavicou', + 'Lehota pod Vtáčnikom', 'Lehôtka', 'Lehôtka pod Brehmi', 'Lechnica', + 'Lekárovce', 'Leles', 'Leľa', 'Lemešany', 'Lenartov', 'Lenartovce', + 'Lendak', 'Lenka', 'Lentvora', 'Leopoldov', 'Lesenice', 'Lesíček', + 'Lesné', 'Lesnica', 'Leštiny', 'Lešť (vojenský obvod)', 'Letanovce', + 'Letničie', 'Leváre', 'Levice', 'Levkuška', 'Levoča', 'Ležiachov', + 'Libichava', 'Licince', 'Ličartovce', 'Liesek', 'Lieskovany', + 'Lieskovec', 'Lieskovec', 'Liešno', 'Liešťany', 'Lietava', + 'Lietavská Lúčka', 'Lietavská Svinná - Babkov', 'Likavka', 'Limbach', + 'Lipany', 'Lipník', 'Lipníky', 'Lipová', 'Lipová', 'Lipovany', + 'Lipovce', 'Lipové', 'Lipovec', 'Lipovec', 'Lipovník', 'Lipovník', + 'Liptovská Anna', 'Liptovská Kokava', 'Liptovská Lúžna', + 'Liptovská Osada', 'Liptovská Porúbka', 'Liptovská Sielnica', + 'Liptovská Štiavnica', 'Liptovská Teplá', 'Liptovská Teplička', + 'Liptovské Beharovce', 'Liptovské Kľačany', 'Liptovské Matiašovce', + 'Liptovské Revúce', 'Liptovské Sliače', 'Liptovský Hrádok', + 'Liptovský Ján', 'Liptovský Michal', 'Liptovský Mikuláš', + 'Liptovský Ondrej', 'Liptovský Peter', 'Liptovský Trnovec', 'Lisková', + 'Lišov', 'Litava', 'Litmanová', 'Livina', 'Livinské Opatovce', 'Livov', + 'Livovská Huta', 'Lodno', 'Lok', 'Lokca', 'Lom nad Rimavicou', 'Lomná', + 'Lomné', 'Lomnička', 'Lontov', 'Lopašov', 'Lopúchov', 'Lopušné Pažite', + 'Lošonec', 'Lovce', 'Lovča', 'Lovčica - Trubín', 'Lovinobaňa', + 'Lozorno', 'Ložín', 'Lubeník', 'Lubina', 'Lúč na Ostrove', 'Lučatín', + 'Lučenec', 'Lúčina', 'Lučivná', 'Lúčka', 'Lúčka', 'Lúčka', 'Lúčka', + 'Lúčky', 'Lúčky', 'Lúčky', 'Lúčnica nad Žitavou', 'Ludanice', + 'Ludrová', 'Luhyňa', 'Lúka', 'Lukačovce', 'Lukáčovce', 'Lukavica', + 'Lukavica', 'Lukov', 'Lukovištia', 'Lúky', 'Lula', 'Lupoč', 'Lutila', + 'Lutiše', 'Lužany', 'Lužany pri Topli', 'Lužianky', 'Lysá pod Makytou', + 'Lysica', 'Ľubá', 'Ľubela', 'Ľubica', 'Ľubietová', 'Ľubiša', 'Ľubochňa', + 'Ľuboreč', 'Ľuboriečka', 'Ľubotice', 'Ľubotín', 'Ľubovec', 'Ľudovítová', + 'Ľutina', 'Ľutov', 'Macov', 'Mad', 'Madunice', 'Magnezitovce', + 'Machulince', 'Majcichov', 'Majere', 'Majerovce', 'Makov', 'Makovce', + 'Malacky', 'Malachov', 'Malá Čalomija', 'Malá Čausa', 'Malá Čierna', + 'Malá Domaša', 'Malá Franková', 'Malá Hradná', 'Malá Ida', + 'Malá Lehota', 'Malá Lodina', 'Malá nad Hronom', 'Malá Poľana', + 'Malá Tŕňa', 'Málaš', 'Malatiná', 'Malatíny', 'Malcov', 'Malčice', + 'Malé Borové', 'Malé Dvorníky', 'Malé Chyndice', 'Malé Hoste', + 'Malé Kosihy', 'Malé Kozmálovce', 'Malé Kršteňany', 'Malé Lednice', + 'Malé Leváre', 'Malé Ludince', 'Malé Ozorovce', 'Malé Raškovce', + 'Malé Ripňany', 'Malé Straciny', 'Malé Trakany', 'Malé Uherce', + 'Malé Vozokany', 'Malé Zálužie', 'Malé Zlievce', 'Málinec', 'Malinová', + 'Malinovo', 'Malužiná', 'Malý Cetín', 'Malý Čepčín', 'Malý Horeš', + 'Malý Kamenec', 'Malý Krtíš', 'Malý Lapáš', 'Malý Lipník', + 'Malý Slavkov', 'Malý Slivník', 'Malý Šariš', 'Malženice', 'Mankovce', + 'Maňa', 'Marcelová', 'Margecany', 'Marhaň', 'Marianka', 'Markovce', + 'Markuška', 'Markušovce', 'Maršová - Rašov', 'Martin', + 'Martin nad Žitavou', 'Martinček', 'Martinová', 'Martovce', 'Mašková', + 'Maškovce', 'Matejovce nad Hornádom', 'Matiaška', 'Matiašovce', + 'Matovce', 'Matúškovo', 'Matysová', 'Maťovské Vojkovce', 'Medovarce', + 'Medvedie', 'Medveďov', 'Medzany', 'Medzev', 'Medzianky', 'Medzibrod', + 'Medzibrodie nad Oravou', 'Medzilaborce', 'Melčice - Lieskové', 'Melek', + 'Meliata', 'Mengusovce', 'Merašice', 'Merník', 'Mestečko', 'Mestisko', + 'Mičakovce', 'Mierovo', 'Miezgovce', 'Michajlov', 'Michal na Ostrove', + 'Michal nad Žitavou', 'Michalková', 'Michalok', 'Michalová', + 'Michalovce', 'Michaľany', 'Miklušovce', 'Miková', 'Mikulášová', + 'Mikušovce', 'Mikušovce', 'Milhosť', 'Miloslavov', 'Milpoš', 'Miňovce', + 'Mirkovce', 'Miroľa', 'Mládzovo', 'Mlynárovce', 'Mlynčeky', 'Mlynica', + 'Mlynky', 'Mníchova Lehota', 'Mníšek nad Hnilcom', + 'Mníšek nad Popradom', 'Moča', 'Močenok', 'Močiar', 'Modra', + 'Modra nad Cirochou', 'Modrany', 'Modrová', 'Modrovka', 'Modrý Kameň', + 'Mojmírovce', 'Mojš', 'Mojtín', 'Mojzesovo', 'Mokrá Lúka', 'Mokrance', + 'Mokroluh', 'Mokrý Háj', 'Moldava nad Bodvou', 'Moravany', + 'Moravany nad Váhom', 'Moravské Lieskové', 'Moravský Svätý Ján', + 'Most pri Bratislave', 'Mostová', 'Moškovec', 'Mošovce', 'Moštenica', + 'Mošurov', 'Motešice', 'Motyčky', 'Môlča', 'Mrázovce', 'Mučín', + 'Mudroňovo', 'Mudrovce', 'Muľa', 'Muráň', 'Muránska Dlhá Lúka', + 'Muránska Huta', 'Muránska Lehota', 'Muránska Zdychava', 'Mútne', + 'Mužla', 'Myjava', 'Myslina', 'Mýtna', 'Mýtne Ludany', + 'Mýto pod Ďumbierom', 'Nacina Ves', 'Nadlice', 'Naháč', 'Nálepkovo', + 'Námestovo', 'Nána', 'Nandraž', 'Necpaly', 'Nedanovce', 'Nedašovce', + 'Neded', 'Nededza', 'Nedožery - Brezany', 'Nechválova Polianka', + 'Nemce', 'Nemcovce', 'Nemcovce', 'Nemčice', 'Nemčiňany', 'Nemecká', + 'Nemečky', 'Nemešany', 'Nemšová', 'Nenince', 'Neporadza', 'Neporadza', + 'Nesvady', 'Nesluša', 'Neverice', 'Nevidzany', 'Nevidzany', 'Nevoľné', + 'Nezbudská Lúčka', 'Nimnica', 'Nitra', 'Nitra nad Ipľom', + 'Nitrianska Blatnica', 'Nitrianska Streda', 'Nitrianske Hrnčiarovce', + 'Nitrianske Pravno', 'Nitrianske Rudno', 'Nitrianske Sučany', 'Nitrica', + 'Nižná', 'Nižná', 'Nižná Boca', 'Nižná Hutka', 'Nižná Jablonka', + 'Nižná Jedľová', 'Nižná Kamenica', 'Nižná Myšľa', 'Nižná Olšava', + 'Nižná Pisaná', 'Nižná Polianka', 'Nižná Rybnica', 'Nižná Sitnica', + 'Nižná Slaná', 'Nižná Voľa', 'Nižné Ladičkovce', 'Nižné Nemecké', + 'Nižné Repaše', 'Nižné Ružbachy', 'Nižný Čaj', 'Nižný Hrabovec', + 'Nižný Hrušov', 'Nižný Klátov', 'Nižný Komárnik', 'Nižný Kručov', + 'Nižný Lánec', 'Nižný Mirošov', 'Nižný Orlík', 'Nižný Skálnik', + 'Nižný Slavkov', 'Nižný Tvarožec', 'Nižný Žipov', 'Nolčovo', 'Norovce', + 'Nová Baňa', 'Nová Bašta', 'Nová Bošáca', 'Nová Bystrica', + 'Nová Dedina', 'Nová Dedinka', 'Nová Dubnica', 'Nová Kelča', + 'Nová Lehota', 'Nová Lesná', 'Nová Ľubovňa', 'Nová Polhora', + 'Nová Polianka', 'Nová Sedlica', 'Nová Ves', 'Nová Ves nad Váhom', + 'Nová Ves nad Žitavou', 'Nová Vieska', 'Nováčany', 'Nováky', 'Nové Hony', + 'Nové Mesto nad Váhom', 'Nové Sady', 'Nové Zámky', 'Novosad', 'Novoť', + 'Nový Ruskov', 'Nový Salaš', 'Nový Tekov', 'Nový Život', 'Nýrovce', + 'Ňagov', 'Ňárad', 'Obeckov', 'Obišovce', 'Oborín', 'Obručné', 'Obyce', + 'Očkov', 'Očová', 'Odorín', 'Ohrady', 'Ohradzany', 'Ochodnica', + 'Ochtiná', 'Okoč', 'Okoličná na Ostrove', 'Okrúhle', 'Okružná', + 'Olcnava', 'Olejníkov', 'Olešná', 'Olováry', 'Olšovany', 'Oľdza', + 'Oľka', 'Oľšavce', 'Oľšavica', 'Oľšavka', 'Oľšavka', 'Oľšinkov', + 'Oľšov', 'Omastiná', 'Omšenie', 'Ondavka', 'Ondavské Matiašovce', + 'Ondrašovce', 'Ondrašová', 'Ondrejovce', 'Opátka', 'Opatovce', + 'Opatovce nad Nitrou', 'Opatovská Nová Ves', 'Opava', 'Opiná', 'Opoj', + 'Oponice', 'Oravce', 'Orávka', 'Oravská Jasenica', 'Oravská Lesná', + 'Oravská Polhora', 'Oravská Poruba', 'Oravský Biely Potok', + 'Oravský Podzámok', 'Ordzovany', 'Orechová', 'Orechová Potôň', + 'Oravské Veselé', 'Oreské', 'Oreské', 'Orešany', 'Orlov', 'Orovnica', + 'Ortuťová', 'Osádka', 'Osadné', 'Osikov', 'Oslany', 'Osrblie', + 'Ostrá Lúka', 'Ostratice', 'Ostrov', 'Ostrov', 'Ostrovany', + 'Ostrý Grúň', 'Osturňa', 'Osuské', 'Oščadnica', 'Otrhánky', 'Otročok', + 'Ovčiarsko', 'Ovčie', 'Ozdín', 'Ožďany', 'Pača', 'Padáň', 'Padarovce', + 'Pakostov', 'Palárikovo', 'Palín', 'Palota', 'Panické Dravce', 'Paňa', + 'Paňovce', 'Papín', 'Papradno', 'Parchovany', 'Parihuzovce', 'Párnica', + 'Partizánska Ľupča', 'Partizánske', 'Pastovce', 'Pastuchov', 'Pašková', + 'Paština Závada', 'Pata', 'Pataš', 'Pavčina Lehota', 'Pavlice', + 'Pavlová', 'Pavlova Ves', 'Pavlovce', 'Pavlovce', 'Pavlovce nad Uhom', + 'Pavľany', 'Pažiť', 'Pčoliné', 'Pečenice', 'Pečeňady', 'Pečeňany', + 'Pečovská Nová Ves', 'Peder', 'Perín - Chym', 'Pernek', 'Petkovce', + 'Petrikovce', 'Petrová', 'Petrova Lehota', 'Petrova Ves', 'Petrovany', + 'Petrovce', 'Petrovce', 'Petrovce', 'Petrovce nad Laborcom', + 'Petrovice', 'Petrovo', 'Pezinok', 'Piešťany', 'Pichne', 'Píla', + 'Píla', 'Píla', 'Pinciná', 'Pinkovce', 'Piskorovce', 'Pitelová', + 'Plášťovce', 'Plavé Vozokany', 'Plavecké Podhradie', 'Plavecký Mikuláš', + 'Plavecký Peter', 'Plavecký Štvrtok', 'Plaveč', 'Plavnica', + 'Plechotice', 'Pleš', 'Plešivec', 'Plevník - Drienové', 'Pliešovce', + 'Ploské', 'Ploské', 'Pobedim', 'Počarová', 'Počúvadlo', 'Podbiel', + 'Podbranč', 'Podbrezová', 'Podhájska', 'Podhorany', 'Podhorany', + 'Podhorany', 'Podhorie', 'Podhorie', 'Podhoroď', 'Podhradie', + 'Podhradie', 'Podhradie', 'Podhradík', 'Podkonice', 'Podkriváň', + 'Podkylava', 'Podlužany', 'Podlužany', 'Podolie', 'Podolínec', + 'Podrečany', 'Podskalie', 'Podtureň', 'Podvysoká', 'Podzámčok', + 'Pohorelá', 'Pohranice', 'Pohronská Polhora', 'Pohronský Bukovec', + 'Pohronský Ruskov', 'Pochabany', 'Pokryváč', 'Poliakovce', 'Polianka', + 'Polichno', 'Polina', 'Poloma', 'Polomka', 'Poltár', 'Poluvsie', + 'Poľanovce', 'Poľany', 'Poľný Kesov', 'Pongrácovce', 'Poniky', + 'Poprad', 'Poproč', 'Poproč', 'Popudinské Močidľany', 'Poráč', + 'Poriadie', 'Porostov', 'Poruba', 'Poruba pod Vihorlatom', 'Porúbka', + 'Porúbka', 'Porúbka', 'Porúbka', 'Poša', 'Potok', 'Potok', 'Potoky', + 'Potôčky', 'Potvorice', 'Považany', 'Považská Bystrica', 'Povina', + 'Povoda', 'Povrazník', 'Pozba', 'Pozdišovce', 'Pôtor', 'Praha', + 'Prakovce', 'Prašice', 'Prašník', 'Pravenec', 'Pravica', 'Pravotice', + 'Práznovce', 'Prečín', 'Predajná', 'Predmier', 'Prenčov', 'Preseľany', + 'Prestavlky', 'Prešov', 'Príbelce', 'Pribeník', 'Pribeta', 'Pribiš', + 'Príbovce', 'Pribylina', 'Priechod', 'Priekopa', 'Priepasné', + 'Prietrž', 'Prietržka', 'Prievaly', 'Prievidza', 'Prihradzany', + 'Príkra', 'Príslop', 'Prituľany', 'Proč', 'Prochot', 'Prosačov', + 'Prosiek', 'Prša', 'Pruské', 'Prusy', 'Pružina', 'Pstriná', 'Ptičie', + 'Ptrukša', 'Pucov', 'Púchov', 'Pukanec', 'Pusté Čemerné', 'Pusté Pole', + 'Pusté Sady', 'Pusté Úľany', 'Pušovce', 'Rabča', 'Rabčice', 'Rad', + 'Radatice', 'Radava', 'Radimov', 'Radnovce', 'Radobica', 'Radoľa', + 'Radoma', 'Radošina', 'Radošovce', 'Radošovce', 'Radôstka', + 'Radvanovce', 'Radvaň nad Dunajom', 'Radvaň nad Laborcom', 'Radzovce', + 'Rafajovce', 'Rajčany', 'Rajec', 'Rajecká Lesná', 'Rajecké Teplice', + 'Rákoš', 'Rákoš', 'Raková', 'Rakovčík', 'Rakovec nad Ondavou', + 'Rakovice', 'Rakovnica', 'Rakovo', 'Rakša', 'Rakúsy', 'Rakytník', + 'Rankovce', 'Rapovce', 'Raslavice', 'Rastislavice', 'Rašice', 'Ratka', + 'Ratková', 'Ratkovce', 'Ratkovo', 'Ratkovská Lehota', 'Ratkovská Suchá', + 'Ratkovské Bystré', 'Ratnovce', 'Ratvaj', 'Ráztočno', 'Ráztoka', + 'Ražňany', 'Reca', 'Regetovka', 'Rejdová', 'Reľov', 'Remeniny', + 'Remetské Hámre', 'Renčišov', 'Repejov', 'Repište', 'Rešica', 'Rešov', + 'Revúca', 'Revúcka Lehota', 'Riečka', 'Riečka', 'Richnava', 'Richvald', + 'Rimavská Baňa', 'Rimavská Seč', 'Rimavská Sobota', 'Rimavské Brezovo', + 'Rimavské Janovce', 'Rimavské Zalužany', 'Rohov', 'Rohovce', 'Rohožník', + 'Rohožník', 'Rochovce', 'Rokycany', 'Rokytov', 'Rokytov pri Humennom', + 'Rokytovce', 'Rosina', 'Roškovce', 'Roštár', 'Rovensko', 'Rovinka', + 'Rovné', 'Rovné', 'Rovné', 'Rovňany', 'Rozhanovce', 'Rozložná', + 'Roztoky', 'Rožkovany', 'Rožňava', 'Rožňavské Bystré', 'Rúbaň', + 'Rudina', 'Rudinka', 'Rudinská', 'Rudlov', 'Rudná', 'Rudnianska Lehota', + 'Rudník', 'Rudník', 'Rudno', 'Rudno nad Hronom', 'Rudňany', 'Rumanová', + 'Rumince', 'Runina', 'Ruská', 'Ruská Bystrá', 'Ruská Kajňa', + 'Ruská Nová Ves', 'Ruská Poruba', 'Ruská Volová', 'Ruská Voľa', + 'Ruská Voľa nad Popradom', 'Ruskov', 'Ruskovce', 'Ruskovce', + 'Ruský Hrabovec', 'Ruský Potok', 'Ružiná', 'Ružindol', 'Ružomberok', + 'Rybany', 'Rybky', 'Rybník', 'Rybník', 'Rykynčice', 'Sabinov', + 'Sačurov', 'Sádočné', 'Sady nad Torysou', 'Salka', 'Santovka', 'Sap', + 'Sása', 'Sása', 'Sasinkovo', 'Sazdice', 'Sebedín - Bečov', 'Sebedražie', + 'Sebechleby', 'Seč', 'Sečianky', 'Sečovce', 'Sečovská Polianka', + 'Sedliacka Dubová', 'Sedliská', 'Sedmerovec', 'Sejkov', 'Sekule', + 'Selce', 'Selce', 'Selce', 'Selec', 'Selice', 'Seľany', 'Semerovo', + 'Senec', 'Seniakovce', 'Senica', 'Senné', 'Senné', 'Senohrad', 'Seňa', + 'Sereď', 'Sielnica', 'Sihelné', 'Sihla', 'Sikenica', 'Sikenička', + 'Siladice', 'Silica', 'Silická Brezová', 'Silická Jablonica', 'Sirk', + 'Sirník', 'Skačany', 'Skalica', 'Skalité', 'Skalka nad Váhom', 'Skároš', + 'Skerešovo', 'Sklabiná', 'Sklabinský Podzámok', 'Sklabiňa', 'Sklené', + 'Sklené Teplice', 'Skrabské', 'Skýcov', 'Sládkovičovo', 'Slančík', + 'Slanec', 'Slanská Huta', 'Slanské Nové Mesto', 'Slaská', 'Slatina', + 'Slatina nad Bebravou', 'Slatinka nad Bebravou', 'Slatinské Lazy', + 'Slatvina', 'Slavec', 'Slavkovce', 'Slavnica', 'Slavoška', 'Slavošovce', + 'Slepčany', 'Sliač', 'Sliepkovce', 'Slizké', 'Slivník', 'Slopná', + 'Slovany', 'Slovenská Kajňa', 'Slovenská Ľupča', 'Slovenská Nová Ves', + 'Slovenská Ves', 'Slovenská Volová', 'Slovenské Ďarmoty', + 'Slovenské Kľačany', 'Slovenské Krivé', 'Slovenské Nové Mesto', + 'Slovenské Pravno', 'Slovenský Grob', 'Slovinky', 'Sľažany', 'Smilno', + 'Smižany', 'Smolenice', 'Smolinské', 'Smolnícka Huta', 'Smolník', + 'Smrdáky', 'Smrečany', 'Snakov', 'Snežnica', 'Snina', 'Socovce', + 'Soblahov', 'Soboš', 'Sobotište', 'Sobrance', 'Sokolce', 'Sokolovce', + 'Sokoľ', 'Sokoľany', 'Solčany', 'Solčianky', 'Sološnica', 'Soľ', + 'Soľnička', 'Soľník', 'Somotor', 'Sopkovce', 'Spišská Belá', + 'Spišská Nová Ves', 'Spišská Stará Ves', 'Spišská Teplica', + 'Spišské Bystré', 'Spišské Hanušovce', 'Spišské Podhradie', + 'Spišské Tomášovce', 'Spišské Vlachy', 'Spišský Hrhov', 'Spišský Hrušov', + 'Spišský Štiavnik', 'Spišský Štvrtok', 'Stakčín', 'Stakčínska Roztoka', + 'Stanča', 'Stankovany', 'Stankovce', 'Stará Bašta', 'Stará Bystrica', + 'Stará Halič', 'Stará Huta', 'Stará Kremnička', 'Stará Lehota', + 'Stará Lesná', 'Stará Ľubovňa', 'Stará Myjava', 'Stará Turá', + 'Stará Voda', 'Staré', 'Staré Hory', 'Starina', 'Starý Hrádok', + 'Starý Tekov', 'Staškov', 'Staškovce', 'Stebnícka Huta', 'Stebník', + 'Stožok', 'Stráne pod Tatrami', 'Stránska', 'Stránske', 'Stráňany', + 'Stráňavy', 'Stratená', 'Stráža', 'Strážne', 'Strážske', 'Strečno', + 'Streda nad Bodrogom', 'Stredné Plachtince', 'Strekov', 'Strelníky', + 'Stretava', 'Stretavka', 'Streženice', 'Strihovce', 'Stročín', + 'Stropkov', 'Studená', 'Studenec', 'Studienka', 'Stuľany', 'Stupava', + 'Stupné', 'Sučany', 'Sudince', 'Súdovce', 'Suchá Dolina', 'Suchá Hora', + 'Suchá nad Parnou', 'Sucháň', 'Suché', 'Suché Brezovo', 'Suchohrad', + 'Sukov', 'Sulín', 'Súlovce', 'Súľov - Hradná', 'Sušany', 'Sútor', + 'Svätá Mária', 'Svätoplukovo', 'Svätuš', 'Svätuše', 'Svätý Anton', + 'Svätý Jur', 'Svätý Kríž', 'Svätý Peter', 'Svederník', 'Sverepec', + 'Sveržov', 'Svetlice', 'Svidnička', 'Svidník', 'Svinia', 'Svinica', + 'Svinice', 'Svinná', 'Svit', 'Svodín', 'Svrbice', 'Svrčinovec', 'Šahy', + 'Šajdíkove Humence', 'Šalgovce', 'Šalgočka', 'Šalov', 'Šaľa', 'Šambron', + 'Šamorín', 'Šamudovce', 'Šandal', 'Šarbov', 'Šarišská Poruba', + 'Šarišská Trstená', 'Šarišské Bohdanovce', 'Šarišské Čierne', + 'Šarišské Dravce', 'Šarišské Jastrabie', 'Šarišské Michaľany', + 'Šarišské Sokolovce', 'Šarišský Štiavnik', 'Šarkan', 'Šarovce', + 'Šašová', 'Šaštín - Stráže', 'Šávoľ', 'Šelpice', 'Šemetkovce', 'Šemša', + 'Šenkvice', 'Šiatorská Bukovinka', 'Šiba', 'Šíd', 'Šimonovce', + 'Šindliar', 'Šintava', 'Šípkov', 'Šípkové', 'Širákov', 'Širkovce', + 'Široké', 'Šišov', 'Šivetice', 'Šmigovec', 'Šoltýska', 'Šoporňa', + 'Špačince', 'Špania Dolina', 'Španie Pole', 'Šrobárová', 'Štefanov', + 'Štefanov nad Oravou', 'Štefanová', 'Štefanovce', 'Štefanovce', + 'Štefanovičová', 'Štefurov', 'Šterusy', 'Štiavnické Bane', + 'Štiavnička', 'Štiavnik', 'Štítnik', 'Štós', 'Štôla', 'Štrba', + 'Štrkovec', 'Štúrovo', 'Štvrtok', 'Štvrtok na Ostrove', 'Šuľa', + 'Šumiac', 'Šuňava', 'Šurany', 'Šurianky', 'Šurice', 'Šúrovce', + 'Šútovo', 'Šútovce', 'Švábovce', 'Švedlár', 'Švošov', 'Tachty', + 'Tajná', 'Tajov', 'Tarnov', 'Tatranská Javorina', 'Tašuľa', 'Tehla', + 'Tekolďany', 'Tekovská Breznica', 'Tekovské Lužany', 'Tekovské Nemce', + 'Tekovský Hrádok', 'Telgárt', 'Telince', 'Temeš', 'Teplička', + 'Teplička nad Váhom', 'Tepličky', 'Teplý Vrch', 'Terany', 'Terchová', + 'Teriakovce', 'Terňa', 'Tesáre', 'Tesárske Mlyňany', 'Tešedíkovo', + 'Tibava', 'Tichý Potok', 'Timoradza', 'Tisinec', 'Tisovec', 'Tlmače', + 'Točnica', 'Tokajík', 'Tomášikovo', 'Tomášov', 'Tomášovce', + 'Tomášovce', 'Topoľa', 'Topoľčany', 'Topoľčianky', 'Topoľnica', + 'Topoľníky', 'Topoľovka', 'Toporec', 'Tornaľa', 'Torysa', 'Torysky', + 'Tovarné', 'Tovarnianska Polianka', 'Tovarníky', 'Tôň', 'Trakovice', + 'Trávnica', 'Trávnik', 'Trebatice', 'Trebejov', 'Trebeľovce', + 'Trebichava', 'Trebišov', 'Trebostovo', 'Trebušovce', 'Trenč', + 'Trenčianska Teplá', 'Trenčianska Turná', 'Trenčianske Bohuslavice', + 'Trenčianske Jastrabie', 'Trenčianske Mitice', 'Trenčianske Stankovce', + 'Trenčianske Teplice', 'Trenčín', 'Trhová Hradská', 'Trhovište', + 'Trnava', 'Trnavá Hora', 'Trnava pri Laborci', 'Trnávka', 'Trnávka', + 'Trnkov', 'Trnovec', 'Trnovec nad Váhom', 'Trnovo', 'Tročany', 'Trpín', + 'Trstená', 'Trstená na Ostrove', 'Trstené', 'Trstené pri Hornáde', + 'Trstice', 'Trstín', 'Trsťany', 'Tŕnie', 'Tuhár', 'Tuhrina', 'Tuchyňa', + 'Tulčík', 'Tupá', 'Turá', 'Turany', 'Turany nad Ondavou', 'Turcovce', + 'Turček', 'Turčianky', 'Turčianska Štiavnička', 'Turčianske Jaseno', + 'Turčianske Kľačany', 'Turčianske Teplice', 'Turčiansky Ďur', + 'Turčiansky Peter', 'Turčok', 'Turecká', 'Tureň', 'Turie', 'Turík', + 'Turnianska Nová Ves', 'Turňa nad Bodvou', 'Turová', 'Turzovka', + 'Tušice', 'Tušická Nová Ves', 'Tužina', 'Tvarožná', 'Tvrdomestice', + 'Tvrdošín', 'Tvrdošovce', 'Ťapešovo', 'Ubľa', 'Úbrež', 'Udavské', + 'Udiča', 'Údol', 'Uhliská', 'Úhorná', 'Uhorská Ves', 'Uhorské', + 'Uhrovec', 'Uhrovské Podhradie', 'Ulič', 'Uličské Krivé', 'Uloža', + 'Úľany nad Žitavou', 'Unín', 'Uňatín', 'Urmince', 'Utekáč', 'Uzovce', + 'Uzovská Panica', 'Uzovské Pekľany', 'Uzovský Šalgov', 'Vaďovce', + 'Vagrinec', 'Váhovce', 'Vajkovce', 'Valaliky', 'Valaská', + 'Valaská Belá', 'Valaská Dubová', 'Valaškovce (vojenský obvod)', + 'Valča', 'Valentovce', 'Valice', 'Valkovce', 'Vaľkovňa', 'Vaniškovce', + 'Vápeník', 'Varadka', 'Varechovce', 'Varhaňovce', 'Varín', 'Vasiľov', + 'Vavrečka', 'Vavrinec', 'Vavrišovo', 'Važec', 'Vechec', 'Velčice', + 'Veličná', 'Velušovce', 'Veľaty', 'Veľká Čausa', 'Veľká Čierna', + 'Veľká Dolina', 'Veľká Franková', 'Veľká Hradná', 'Veľká Ida', + 'Veľká Lesná', 'Veľká Lodina', 'Veľká Lomnica', 'Veľká Mača', + 'Veľká Paka', 'Veľká Tŕňa', 'Veľké Bierovce', 'Veľké Blahovo', + 'Veľké Borové', 'Veľké Držkovce', 'Veľké Dvorany', 'Veľké Dvorníky', + 'Veľké Hoste', 'Veľké Chlievany', 'Veľké Chyndice', 'Veľké Kapušany', + 'Veľké Kosihy', 'Veľké Kostoľany', 'Veľké Kozmálovce', 'Veľké Kršteňany', + 'Veľké Leváre', 'Veľké Lovce', 'Veľké Ludince', 'Veľké Orvište', + 'Veľké Ozorovce', 'Veľké Raškovce', 'Veľké Revištia', 'Veľké Ripňany', + 'Veľké Rovné', 'Veľké Slemence', 'Veľké Trakany', 'Veľké Turovce', + 'Veľké Uherce', 'Veľké Úľany', 'Veľké Vozokany', 'Veľké Zálužie', + 'Veľkrop', 'Veľký Biel', 'Veľký Cetín', 'Veľký Čepčín', 'Veľký Ďur', + 'Veľký Folkmar', 'Veľký Grob', 'Veľký Horeš', 'Veľký Kamenec', + 'Veľký Klíž', 'Veľký Krtíš', 'Veľký Kýr', 'Veľký Lapáš', 'Veľký Lipník', + 'Veľký Meder', 'Veľký Slavkov', 'Veľký Slivník', 'Veľký Šariš', + 'Veľopolie', 'Vernár', 'Veselé', 'Veterná Poruba', 'Vieska', 'Vieska', + 'Vieska nad Žitavou', 'Vikartovce', 'Vinica', 'Viničky', 'Viničné', + 'Vinné', 'Vinodol', 'Vinohrady nad Váhom', 'Vinosady', 'Virt', + 'Vislanka', 'Vislava', 'Visolaje', 'Višňov', 'Višňové', 'Višňové', + 'Vištuk', 'Vitanová', 'Vítkovce', 'Víťaz', 'Víťazovce', 'Vlača', + 'Vladiča', 'Vlachovo', 'Vlachy', 'Vlčany', 'Vlčkovce', 'Vlkas', + 'Vlková', 'Vlkovce', 'Vlky', 'Voderady', 'Vojany', 'Vojčice', 'Vojka', + 'Vojka nad Dunajom', 'Vojkovce', 'Vojnatina', 'Vojňany', 'Vojtovce', + 'Volica', 'Volkovce', 'Voľa', 'Vozokany', 'Vozokany', 'Vráble', + 'Vrádište', 'Vrakúň', 'Vranov nad Topľou', 'Vrbnica', 'Vrbov', + 'Vrbovce', 'Vrbová nad Váhom', 'Vrbové', 'Vrchteplá', 'Vrícko', + 'Vršatské Podhradie', 'Vrútky', 'Vtáčkovce', 'Výborná', + 'Výčapy - Opatovce', 'Vydrany', 'Vydrná', 'Vydrník', 'Východná', + 'Výrava', 'Vysočany', 'Vysoká', 'Vysoká', 'Vysoká nad Kysucou', + 'Vysoká nad Uhom', 'Vysoká pri Morave', 'Vysoké Tatry', 'Vyškovce', + 'Vyškovce nad Ipľom', 'Vyšná Boca', 'Vyšná Hutka', 'Vyšná Jablonka', + 'Vyšná Jedľová', 'Vyšná Kamenica', 'Vyšná Myšľa', 'Vyšná Olšava', + 'Vyšná Pisaná', 'Vyšná Polianka', 'Vyšná Rybnica', 'Vyšná Sitnica', + 'Vyšná Slaná', 'Vyšná Šebastová', 'Vyšná Voľa', 'Vyšné Ladičkovce', + 'Vyšné nad Hronom', 'Vyšné Nemecké', 'Vyšné Remety', 'Vyšné Repaše', + 'Vyšné Ružbachy', 'Vyšný Čaj', 'Vyšný Hrabovec', 'Vyšný Hrušov', + 'Vyšný Kazimír', 'Vyšný Klátov', 'Vyšný Komárnik', 'Vyšný Kručov', + 'Vyšný Kubín', 'Vyšný Mirošov', 'Vyšný Orlík', 'Vyšný Slavkov', + 'Vyšný Tvarožec', 'Vyšný Žipov', 'Zábiedovo', 'Záborie', 'Záborské', + 'Zádiel', 'Záhor', 'Záhorie (vojenský obvod)', 'Záhorská Ves', + 'Záhradné', 'Zákamenné', 'Zákopčie', 'Zalaba', 'Zálesie', 'Zálesie', + 'Zalužice', 'Zamarovce', 'Zámutov', 'Záriečie', 'Záskalie', 'Zatín', + 'Závada', 'Závada', 'Závadka', 'Závadka', 'Závadka', 'Zavar', + 'Závažná Poruba', 'Závod', 'Zázrivá', 'Zbehňov', 'Zbehy', 'Zboj', + 'Zbojné', 'Zborov', 'Zborov nad Bystricou', 'Zbrojníky', + 'Zbudská Belá', 'Zbudské Dlhé', 'Zbudza', 'Zbyňov', 'Zeleneč', + 'Zemianska Olča', 'Zemianske Kostoľany', 'Zemianske Podhradie', + 'Zemianske Sady', 'Zemné', 'Zemplín', 'Zemplínska Nová Ves', + 'Zemplínska Široká', 'Zemplínska Teplica', 'Zemplínske Hámre', + 'Zemplínske Hradište', 'Zemplínske Jastrabie', 'Zemplínske Kopčany', + 'Zemplínsky Branč', 'Zlatá Baňa', 'Zlatá Idka', 'Zlaté', 'Zlaté Klasy', + 'Zlaté Moravce', 'Zlatná na Ostrove', 'Zlatník', 'Zlatníky', 'Zlatno', + 'Zlatno', 'Zliechov', 'Zohor', 'Zubák', 'Zuberec', 'Zubné', + 'Zubrohlava', 'Zvolen', 'Zvončín', 'Žabokreky', 'Žabokreky nad Nitrou', + 'Žakarovce', 'Žakovce', 'Žalobín', 'Žarnov', 'Žarnovica', 'Žaškov', + 'Žbince', 'Ždaňa', 'Ždiar', 'Žehňa', 'Žehra', 'Železník', 'Želiezovce', + 'Želmanovce', 'Žemberovce', 'Žemliare', 'Žiar', 'Žiar', + 'Žiar nad Hronom', 'Žihárec', 'Žikava', 'Žilina', 'Žipov', 'Žirany', + 'Žitavany', 'Žitavce', 'Žitná - Radiša', 'Žlkovce', 'Župčany', ) + + streets = ( + 'Adámiho', 'Agátová', 'Ahoj', 'Albánska', 'Albrechtova', 'Alejová', + 'Alešova', 'Alstrova', 'Alžbetínska', 'Alžbety Gwerkovej', + 'Amarelková', 'Ambroseho', 'Ambrova', 'Ambrušova', 'Americká', + 'Americké námestie', 'Americké námestie', 'Amurská', 'Andreja Mráza', + 'Andreja Plávku', 'Andrusovova', 'Anenská', 'Anenská', 'Anízová', + 'Antická', 'Antolská', 'Arménska', 'Astronomická', 'Astrová', + 'Avarská', 'Azalková', 'Azovská', 'Babuškova', 'Bagarova', 'Báger', + 'Bahniatková', 'Bachova', 'Bajkalská', 'Bajkalská', 'Bajkalská', + 'Bajkalská', 'Bajkalská', 'Bajkalská', 'Bajzova', 'Bakošova', + 'Balkánska', 'Baltská', 'Bancíkovej', 'Banícka', 'Baničova', + 'Baníkova', 'Banskobystrická', 'Banšelova', 'Bardejovská', 'Bárdošova', + 'Barónka', 'Bartókova', 'Bartoňova', 'Bartoškova', 'Baštová', + 'Batkova', 'Bazalková', 'Bazová', 'Bazovského', 'Bažantia', + 'Beblavého', 'Bebravská', 'Beckovská', 'Bedľová', 'Begóniová', + 'Belániková', 'Belehradská', 'Belianska', 'Belinského', 'Bellova', + 'Belopotockého', 'Beňadická', 'Bencúrova', 'Benediktiho', 'Beniakova', + 'Beňovského', 'Bernolákova', 'Beskydská', 'Betliarska', 'Bezekova', + 'Bezručova', 'Biela', 'Bielkova', 'Bieloruská', 'Bilíkova', + 'Biskupická', 'Björnsonova', 'Blagoevova', 'Blatnická', 'Blatúchová', + 'Bleduľová', 'Blumentálska', 'Blyskáčová', 'Bočná', 'Bodliaková', + 'Bodrocká', 'Bodvianska', 'Bohrova', 'Bohúňova', 'Bojnická', + 'Boragová', 'Borekova', 'Borievková', 'Borinská', 'Borodáčova', + 'Borovicová', 'Borská', 'Bosákova', 'Boskovičova', 'Bošániho', + 'Botanická', 'Bottova', 'Boženy Němcovej', 'Bôrik', 'Bradáčova', + 'Bradlianska', 'Brančská', 'Bratislava-Vinohrady', 'Bratislavská', + 'Bratská', 'Brečtanová', 'Brestová', 'Brezová', 'Brezovská', 'Brežná', + 'Bridlicová', 'Briežky', 'Brigádnická', 'Brižitská', 'Brnianska', + 'Brodná', 'Brodská', 'Brokolicová', 'Bronzová', 'Broskyňová', + 'Bršlenová', 'Brumovická', 'Brusnicová', 'Břeclavská', 'Bučinová', + 'Budatínska', 'Budatínska', 'Budatínska', 'Búdkova cesta', + 'Budovateľská', 'Budyšínska', 'Budyšínska', 'Bujnáková', 'Buková', + 'Bukovinská', 'Bukureštská', 'Bulharská', 'Bulíkova', 'Bullova', + 'Burgundská', 'Buzalkova', 'Bystrého', 'Bystrická', 'BzovIcka', + 'Cabanova', 'Cablkova', 'Cádrova', 'Cesta mládeže', 'Cesta mládeže', + 'Cesta na Červený most', 'Cesta na Červený most', 'Cesta na Kamzík', + 'Cesta na Klanec', 'Cesta na Senec', 'Cígeľská', 'Cikkerova', + 'Cintorínska', 'Cintulova', 'Colnícka', 'Cukrová', 'Cyklámenová', + 'Cyprichova', 'Cyprichova', 'Cyrilova', 'Čachtická', 'Čajakova', + 'Čajakova', 'Čajkovského', 'Čakanková', 'Čaklovská', 'Čalovská', + 'Čapajevova', 'Čapkova', 'Čárskeho', 'Čavojského', 'Čečinová', + 'Čelakovského', 'Čerešňová', 'Černicová', 'Černockého', 'Černockého', + 'Černyševského', 'Červená', 'Červeňákova', 'Červeňova', 'Česká', + 'Československých par', 'Československých tan', 'Čiernohorská', + 'Čiernovodská', 'Čierny chodník', 'Čiližská', 'Čipkárska', 'Čmelíkova', + 'Čmeľovec', 'Čremchová', 'Čučoriedková', 'Čulenova', + 'Daliborovo námestie', 'Damborského', 'Dankovského', 'Dargovská', + 'Ďatelinová', 'Daxnerovo námestie', 'Delená', 'Delená cesta', + 'Demänovská', 'Desiata', 'Detvianska', 'Devätinová', 'Deviata', + 'Devínska cesta', 'Devínska cesta - kam', 'Devínske jazero', 'Dlhá', + 'Dlhé diely I.', 'Dlhé diely II.', 'Dlhé diely III.', 'Dneperská', + 'Dobrovičova', 'Dobrovičova', 'Dobrovského', 'Dobšinského', + 'Dohnalova', 'Dohnányho', 'Doležalova', 'Dolná', 'Dolné Koruny', + 'Dolnokorunská', 'Dolnozemská cesta', 'Domašská', 'Domkárska', + 'Domové role', 'Donnerova', 'Donovalova', 'Donská', 'Dopravná', + 'Dorastenecká', 'Dostojevského rad', 'Dr. Vladimíra Clemen', + 'Dražická', 'Drevená', 'Drieňová', 'Drieňová', 'Drieňová', 'Drobného', + 'Drotárska cesta', 'Drotárska cesta', 'Drotárska cesta', 'Druhá', + 'Druidská', 'Družicová', 'Družobná', 'Družstevná', 'Dubnická', + 'Dubová', 'Dúbravčická', 'Dúbravská cesta', 'Dudova', 'Dudvážska', + 'Dulovo námestie', 'Dulovo námestie', 'Ďumbierska', 'Dunajská', + 'Ďurgalova', 'Dvanásta', 'Dvojkrížna', 'Dvojkrížna', + 'Dvořákovo nábrežie', 'Edisonova', 'Egrešová', 'Einsteinova', + 'Eisnerova', 'Elektrárenská', 'Estónska', 'Estónska', 'Exnárova', + 'F. Kostku', 'Fadruszova', 'Fajnorovo nábrežie', 'Fándlyho', 'Farebná', + 'Farská', 'Farského', 'Fazuľová', 'Fedákova', 'Fedinova', + 'Ferienčíkova', 'Fialkové údolie', 'Fibichova', 'Fikusová', + 'Filiálne nádražie', 'Fláviovská', 'Flöglova', 'Floriánske námestie', + 'Fraňa Kráľa', 'Francisciho', 'Francúzskych partizá', 'Frankovská', + 'Františkánska', 'Františkánske námest', 'Františka Schmuckera', + 'Furdekova', 'Furdekova', 'Furmanská', 'Furmintská', 'Gabčíkova', + 'Gagarinova', 'Gagarinova', 'Gagarinova', 'Gajarská', 'Gajc', 'Gajova', + 'Galaktická', 'Galandova', 'Galbavého', 'Gallayova', 'Gallova', + 'Galvaniho', 'Gašparíkova', 'Gaštanová', 'Gavlovičova', 'Gbelská', + 'Gelnická', 'Gemerská', 'Geologická', 'Georgínová', 'Gercenova', + 'Gerulatská', 'Gessayova', 'Gettingová', 'Glavica', 'Godrova', + 'Gogoľova', 'Goláňova', 'Gondova', 'Goralská', 'Gorazdova', 'Gorkého', + 'Gregorovej', 'Gronárska', 'Grösslingova', 'Gruzínska', 'Gunduličova', + 'Guothova', 'Gusevova', 'Haanova', 'Haburská', 'Hadia cesta', + 'Hadriánová', 'Hagarova', 'Hagarova', 'Hájová', 'Halašova', 'Hálkova', + 'Hálova', 'Hamuliakova', 'Hanácka', 'Handlovská', 'Hanulova', + 'Hanulova', 'Hany Meličkovej', 'Hargašova', 'Harmanecká', 'Harmincova', + 'Hasičská', 'Hattalova', 'Havelkova', 'Havlíčkova', 'Havrania', + 'Haydnova', 'Hečkova', 'Herlianska', 'Herlianska', 'Heydukova', + 'Heyrovského', 'Hlaváčikova', 'Hlavatého', 'Hlavná', 'Hlavné námestie', + 'Hlbinná', 'Hlboká cesta', 'Hlboká cesta', 'Hlinická', 'Hlinická', + 'Hlivová', 'Hlohová', 'Hlučínska', 'Hnilecká', 'Hodálova', + 'Hodonínska', 'Hodonínska', 'Hodonínska', 'Hodžovo námestie', + 'Holekova', 'Holíčska', 'Hollého', 'Holubyho', 'Homolova', + 'Hontianska', 'Horárska', 'Horcová', 'Horčičná', 'Horná', + 'Horná Vančurová', 'Hornádska', 'Horné Židiny', 'Horská', 'Horská', + 'Horská', 'Hospodárska', 'Hrabový chodník', 'Hrad', 'Hradištná', + 'Hradná', 'Hradné údolie', 'Hradská', 'Hrachová', 'Hraničiarska', + 'Hraničná', 'Hraničný priechod-Ču', 'Hrdličkova', 'Hrebendova', + 'Hríbová', 'Hriňovská', 'Hrobákova', 'Hrobárska', 'Hroboňova', + 'Hronska', 'Hroznová', 'Hrušková', 'Hrušovská', 'Hubeného', 'Hubeného', + 'Hudecova', 'Humenské námestie', 'Hummelova', 'Hurbanovo námestie', + 'Hurbanovo námestie', 'Husova', 'Húščavova', 'Hutnícka', 'Hviezdna', + 'Hviezdicová', 'Hviezdoslavova', 'Hviezdoslavovo námes', 'Hyacintová', + 'Hybešova', 'Hydinárska', 'Hýrošova', 'Chalupkova', 'Charkovská', + 'Chemická', 'Chladná', 'Chlumeckého', 'Chmeľová', 'Chorvátska', + 'Chorvátska', 'Chotárna', 'Chrasťová', 'Chrenová', 'Chrobákova', + 'Ihličnatá', 'Ihrisková', 'Iľjušinova', 'Ilkovičova', 'Ílová', + 'Ilýrska', 'Imelová', 'Inovecká', 'Inovecká', 'Ipeľská', 'Irisová', + 'Irkutská', 'Iršajská', 'Iskerníková', 'Istrijská', 'Ivana Blazeviča', + 'Ivana Bukovčana', 'Ivana Horvátha', 'Ivánska cesta', 'J.C.Hronského', + 'Jabloňová', 'Jačmenná', 'Jadranská', 'Jadrová', 'Jahodová', + 'Jakabova', 'Jakubíkova', 'Jakubovo námestie', 'Jakubská', 'Jalovcová', + 'Jamnického', 'Jána Jonáša', 'Jána Poničana', 'Jána Raka', + 'Jána Smreka', 'Jána Stanislava', 'Janáčkova', 'Jančova', + 'Janíkove role', 'Janka Kráľa', 'Jankolova', 'Jánošíkova', 'Jánoškova', + 'Janotova', 'Janšákova', 'Jantárová', 'Jantárová', 'Jantárová cesta', + 'Jarabinková', 'Jarná', 'Jaroslavova', 'Jarošova', 'Jasencová', + 'Jaseňová', 'Jaskový rad', 'Jasná', 'Jasovská', 'Jastrabia', 'Jašíkova', + 'Javorinská', 'Javorová', 'Jazdecká', 'Jazerná', 'Jazmínová', + 'Jedenásta', 'Jedlíkova', 'Jedľová', 'Jégého', 'Jegeneš', 'Jelačičova', + 'Jelenia', 'Jelšová', 'Jeséniova', 'Jesenná', 'Jesenského', + 'Jesienková', 'Jiráskova', 'Jiskrova', 'Jókaiho', 'Jozefa Mikisitsa', + 'Jozefa Vachovského', 'Jozefská', 'Júlová', 'Junácka', 'Jungmannova', + 'Júnová', 'Jurigovo námestie', 'Jurkovičova', 'Jurovského', 'Jurská', + 'Justičná', 'K horárskej studni', 'K lomu', 'K pasienkom', + 'K Železnej studienke', 'Kadnárova', 'Kadnárova', 'Kadnárova', + 'Kadnárova', 'Kadnárova', 'Kafendova', 'Kalinčiakova', 'Kalinová', + 'Kalištná', 'Kaméliová', 'Kamenárska', 'Kamenné námestie', 'Kamilková', + 'Kamilková', 'Kamzík', 'Kapicova', 'Kapitulská', 'Kapitulský dvor', + 'Kaplinská', 'Kapucínska', 'Kapušianska', 'Karadžičova', 'Karadžičova', + 'Karadžičova', 'Karadžičova', 'Karloveská', 'Karloveské rameno', + 'Karpatská', 'Karpatské námestie', 'Kašmírska', 'Kaštielska', + 'Kataríny Brúderovej', 'Kaukazská', 'Kazanská', 'Kazanská', 'Kazanská', + 'Keltská', 'Kempelenova', 'Ketelec', 'Kežmarské námestie', + 'Kladnianska', 'Klariská', 'Klásková', 'Kláštorská', 'Klatovská', + 'Klatovská', 'Klemensova', 'Klenová', 'Klimkovičova', 'Klincová', + 'Klobučnícka', 'Klokočova', 'Kľukatá', 'Kĺzavá', 'Kmeťovo námestie', + 'Knižková dolina', 'Koceľova', 'Kočánkova', 'Kohútova', 'Koľajná', + 'Kolárska', 'Kolískova', 'Kollárova', 'Kollárovo námestie', + 'Kollárovo námestie', 'Kolmá', 'Komárňanská', 'Komárnická', + 'Komárnická', 'Komárovská', 'Komenského námestie', 'Kominárska', + 'Komonicová', 'Koncová', 'Koniarkova', 'Konopná', 'Konvalinková', + 'Konventná', 'Kopanice', 'Kopčianska', 'Koperníkova', 'Koprivnická', + 'Koprivnická', 'Koprivnická', 'Korabinského', 'Kórejská', 'Koreničova', + 'Koreňová', 'Korunská', 'Korytnická', 'Kosatcová', 'Kosodrevinová', + 'Kostlivého', 'Kostolná', 'Košická', 'Košická', 'Košická', 'Kovácsova', + 'Kováčska', 'Kovorobotnícka', 'Kovová', 'Kozia', 'Koziarka', + 'Kozičova', 'Kozmonautická', 'Kožušnícka', 'Kôprová', 'Kôstková', + 'Krahulčia', 'Krajinská', 'Krajinská cesta', 'Krajná', 'Krakovská', + 'Kráľovské údolie', 'Krasinského', 'Kraskova', 'Krásna', + 'Krásnohorská', 'Krasovského', 'Kratiny', 'Krátka', 'Krčméryho', + 'Kremeľská', 'Kremencová', 'Kremnická', 'Kresánkova', 'Kríková', + 'Krivá', 'Križkova', 'Krížna', 'Krížna', 'Krížna', 'Krížna', + 'Krmanova', 'Krokusová', 'Krompašská', 'Krupinská', 'Kubačova', + 'Kubániho', 'Kubínska', 'Kudlákova', 'Kuklovská', 'Kúkoľová', + 'Kukučínova', 'Kukuričná', 'Kulíškova', 'Kultúrna', 'Kuneradská', + 'Kupeckého', 'Kúpeľná', 'Kurucova', 'Kutlíkova', 'Kútska', + 'Kutuzovova', 'Kuzmányho', 'Kvačalova', 'Kvetinárska', 'Kvetná', + 'Kýčerského', 'Kyjevská', 'Kysucká', 'Laborecká', 'Lackova', + 'Ladislava Batthyányh', 'Ladislava Dérera', 'Ladislava Sáru', 'Ľadová', + 'Ladzianskeho', 'Lachova', 'Ľaliová', 'Lamačská cesta', + 'Lamačská cesta', 'Lamačská cesta', 'Lamanského', 'Landauova', + 'Landererova', 'Langsfeldova', 'Ľanová', 'Laskomerského', 'Laténská', + 'Latorická', 'Laučekova', 'Laurinská', 'Lazaretská', 'Lazaretská', + 'Leánska', 'Lediny', 'Legerského', 'Legionárska', 'Legionárska', + 'Lehotského', 'Lehotského', 'Leknová', 'Lenardova', 'Lermontovova', + 'Lesná', 'Lesnícka', 'Leškova', 'Letecká', 'Letisko M.R.Štefánik', + 'Letná', 'Levanduľová', 'Levárska', 'Levická', 'Levočská', 'Lidická', + 'Lieskovec', 'Lieskovcová', 'Lieskovská cesta', 'Lietavská', + 'Lichardova', 'Likavská', 'Limbová', 'Linzbothova', 'Lipnicová', + 'Lipová', 'Lipského', 'Liptovská', 'Lisovňa', 'Listová', 'Líščie nivy', + 'Líščie údolie', 'Litovská', 'Lodná', 'Lombardiniho', 'Lomnická', + 'Lomonosovova', 'Longobardská', 'Lónyaiová', 'Lopenícka', 'Lotyšská', + 'Lovinského', 'Lozornianská', 'Ľubietovská', 'Ľubinská', 'Ľubľanská', + 'Ľubochnianska', 'Ľubovnianska', 'Ľubovníková', 'Ľudové námestie', + 'Ľudovíta Fullu', 'Luhačovická', 'Lužická', 'Lúčna', 'Lužná', + 'Lýcejná', 'Lykovcová', 'Lysákova', 'M. Hella', 'Madáchova', 'Maďarská', + 'Magnetová', 'Magnezitová', 'Magnóliová', 'Magurská', 'Macharova', + 'Máchova', 'Majakovského', 'Majerníkova', 'Majerská', 'Májkova', + 'Majoránová', 'Májová', 'Maková', 'Makovického', 'Malá', 'Malagová', + 'Malé pálenisko', 'Malinová', 'Malodunajská', 'Malokarpatské námest', + 'Malý Draždiak', 'Malý trh', 'Mamateyova', 'Mamateyova', 'Mandľová', + 'Mandľovníková', 'Mánesovo námestie', 'Margarétková', 'Marhuľová', + 'Mariánska', 'Marie Curie-Sklodows', 'Márie Medveďovej', 'Markova', + 'Marótyho', 'Martákovej', 'Martinčekova', 'Martinčekova', + 'Martinengova', 'Martinská', 'Mateja Bela', 'Matejkova', 'Matičná', + 'Mätová', 'Matúškova', 'Matúšova', 'Mečíkova', 'Medená', 'Medová', + 'Medovková', 'Medzierka', 'Medzilaborecká', 'Mesačná', 'Mestská', + 'Meteorová', 'Metodova', 'Mickiewiczova', 'Mierová', 'Michalská', + 'Mikovíniho', 'Mikulášska', 'Milana Marečka', 'Milana Pišúta', + 'Miletičova', 'Miletičova', 'Mišíkova', 'Mišíkova', 'Mišíkova', + 'Mládežnícka', 'Mliekárenská', 'Mlynarovičova', 'Mlynská', + 'Mlynská dolina', 'Mlynská dolina', 'Mlynská dolina', 'Mlynské luhy', + 'Mlynské nivy', 'Mlynské nivy', 'Mlynské nivy', 'Mlynské nivy', + 'Mlynské nivy', 'Modranská', 'Modricová', 'Modrý chodník', 'Mojmírova', + 'Mokráň záhon', 'Mokrohájska cesta', 'Moldavská', 'Molecova', + 'Monardová', 'Morava', 'Moravská', 'Morušova', 'Moskovská', 'Most SNP', + 'Mostná', 'Mostová', 'Mošovského', 'Motýlia', 'Moyšova', 'Moyzesova', + 'Mozartova', 'Mramorová', 'Mraziarenská', 'Mrázova', 'Mudrochova', + 'Mudroňova', 'Mudroňova', 'Mudroňova', 'Muchovo námestie', 'Muránska', + 'Murgašova', 'Murnice', 'Muškátová', 'Muštová', 'Múzejná', 'Myjavská', + 'Mýtna', 'Mýtna', 'Na Baránku', 'Na barine', 'Na Brezinách', + 'Na doline', 'Na grbe', 'Na Grunte', 'Na Holom vrchu', 'Na hrádzi', + 'Na Hrebienku', 'Na hriadkach', 'Na Kalvárii', 'Na kaštieli', + 'Na kopci', 'Na križovatkách', 'Na lánoch', 'Na medzi', 'Na mýte', + 'Na pántoch', 'Na pasekách', 'Na paši', 'Na pažiti', 'Na piesku', + 'Na Revíne', 'Na Riviére', 'Na rozhliadke', 'Na Sitine', 'Na skale', + 'Na Slanci', 'Na Slavíne', 'Na spojke', 'Na stráni', 'Na Štyridsiatku', + 'Na úvrati', 'Na varte', 'Na Vlkovkách', 'Na vrátkach', 'Na vŕšku', + 'Na vyhliadke', 'Na výslní', 'Na Zlatej nohe', 'Nábělkova', + 'Nábrežie arm. gen. L', 'Nábrežná', 'Nad Dunajom', 'Nad Gronárom', + 'Nad jazierkom', 'Nad kúriou', 'Nad lomom', 'Nad lúčkami', + 'Nad lúčkami', 'Nad ostrovom', 'Nad Sihoťou', 'Nákovná', 'Nákupná', + 'Námestie 1. mája', 'Námestie 6. apríla', 'Námestie Alexandra D', + 'Námestie Andreja Hli', 'Námestie Biely kríž', 'Námestie Hraničiarov', + 'Námestie Jána Kostru', 'Námestie Jána Pavla', 'Námestie Ľudovíta Št', + 'Námestie Martina Ben', 'Námestie Rodiny', 'Námestie slobody', + 'Námestie slobody', 'Námestie SNP', 'Námestie SNP', + 'Námestie sv. Františ', 'Námestie sv. Petra a', 'Narcisová', + 'Nedbalova', 'Nechtíková', 'Nejedlého', 'Nekrasovova', 'Nemčíkova', + 'Nerudova', 'Nevädzová', 'Nevská', 'Nezábudková', 'Nezvalova', + 'Niťová', 'Nitrianska', 'Nížinná', 'Nobelova', 'Nobelovo námestie', + 'Nová', 'Nová Bellova', 'Nová hora', 'Novackého', 'Nové pálenisko', + 'Nové záhrady I', 'Nové záhrady II', 'Nové záhrady III', + 'Nové záhrady IV', 'Nové záhrady V', 'Nové záhrady VI', + 'Nové záhrady VII', 'Novinárska', 'Novobanská', 'Novodvorská', + 'Novohorská', 'Novohradská', 'Novosadná', 'Novosvetská', 'Novosvetská', + 'Novosvetská', 'Novoveská', 'Nový záhon', 'Obežná', 'Obchodná', + 'Oblačná', 'Oblúková', 'Očovská', 'Odbojárov', 'Odborárska', + 'Odborárske námestie', 'Odborárske námestie', 'Odeská', 'Ohnicová', + 'Okánikova', 'Okružná', 'Olbrachtova', 'Oleandrová', 'Olejkárska', + 'Olivová', 'Olšová', 'Ondavská', 'Ondrejovova', 'Ondrejská', 'Opavská', + 'Opletalova', 'Oráčska', 'Oravská', 'Orechová', 'Orechová cesta', + 'Orechový rad', 'Orenburská', 'Orgovánová', 'Orchideová', 'Oriešková', + 'Ormisova', 'Osadná', 'Osiková', 'Oskorušová', 'Osloboditeľská', + 'Ostravská', 'Ostredková', 'Ostružinová', 'Osuského', 'Osvetová', + 'Otonelská', 'Ovčiarska', 'Ovocná', 'Ovručská', 'Ovsená', + 'Ovsištské námestie', 'Ožvoldíkova', 'Ôsma', 'Pajštúnska', 'Palackého', + 'Palárikova', 'Palárikova', 'Palinová', 'Palisády', 'Palisády', + 'Palisády', 'Palkovičova', 'Palmová', 'Panenská', 'Pankúchova', + 'Panónska cesta', 'Panská', 'Papánkovo námestie', 'Papraďová', + 'Parcelná', 'Páričkova', 'Parková', 'Partizánska', 'Pasienková', + 'Pasienky', 'Pastierska', 'Paulínyho', 'Pave Vukoviča', 'Pavla Blaha', + 'Pavla Horova', 'Pavlovičova', 'Pavlovova', 'Pavlovská', 'Pažického', + 'Pažítková', 'Pečnianska', 'Pekná cesta', 'Pekná cesta', 'Pekná cesta', + 'Pekná vyhliadka', 'Pekníkova', 'Pernecká', 'Perličková', + 'Pestovateľská', 'Petara Pasicha', 'Peterská', 'Petöfiho', + 'Petržalská', 'Petúniová', 'Pezinská', 'Piata', 'Pieskovcová', + 'Piesočná', 'Piešťanská', 'Pifflova', 'Pilárikova', 'Pílová', + 'Píniová', 'Pionierska', 'Pionierska', 'Pivoňková', 'Plachého', + 'Plachého', 'Planckova', 'Planét', 'Plánky', 'Platanová', 'Plátenícka', + 'Plavecká', 'Plickova', 'Pluhová', 'Plynárenská', 'Plzenská', + 'Pobrežná', 'Pod agátmi', 'Pod Bôrikom', 'Pod brehmi', 'Pod gaštanmi', + 'Pod Kalváriou', 'Pod Klepáčom', 'Pod Kobylou', 'Pod Krásnou hôrkou', + 'Pod lesom', 'Pod lipami', 'Pod Lipovým', 'Pod násypom', + 'Pod Rovnicami', 'Pod skalou', 'Pod srdcom', 'Pod Strážami', + 'Pod Vachmajstrom', 'Pod Válkom', 'Pod vinicami', 'Pod záhradami', + 'Pod záhradami', 'Pod Zečákom', 'Podbeľová', 'Podbrezovská', 'Podháj', + 'Podhorská', 'Podhorského', 'Podjavorinskej', 'Podkarpatská', + 'Podkerepušky', 'Podkolibská', 'Podkorunská', 'Podlesná', + 'Podlučinského', 'Podniková', 'Podpriehradná', 'Podtatranského', + 'Podunajská', 'Podunajská', 'Podzáhradná', 'Pohánková', 'Pohraničníkov', + 'Pohronská', 'Polárna', 'Polianky', 'Poľná', 'Poľnohospodárska', + 'Poľný mlyn', 'Poloreckého', 'Poľská', 'Poludníková', 'Poniklecová', + 'Popolná', 'Popovova', 'Popradská', 'Porubského', 'Poštová', 'Potočná', + 'Považanova', 'Považská', 'Povoznícka', 'Povraznícka', 'Povraznícka', + 'Požiarnická', 'Pračanská', 'Prasličková', 'Pražská', 'Pražská', + 'Predstaničné námesti', 'Prepoštská', 'Prešernova', 'Prešovská', + 'Prešovská', 'Prešovská', 'Pri Bielom kríži', 'Pri dvore', + 'Pri Dynamitke', 'Pri Habánskom mlyne', 'Pri hradnej studni', + 'Pri hrádzi', 'Pri kolíske', 'Pri kríži', 'Pri mlyne', 'Pri Rochu', + 'Pri seči', 'Pri Starej Prachárni', 'Pri Starom háji', + 'Pri starom letisku', 'Pri Starom Mýte', 'Pri strelnici', 'Pri Struhe', + 'Pri Suchom mlyne', 'Pri Šajbách', 'Pri tehelni', 'Pri trati', + 'Pri vinohradoch', 'Pri zvonici', 'Priama cesta', 'Pribylinská', + 'Pribinova', 'Pribinova', 'Pribinova', 'Pribišova', 'Prídanky', + 'Prídavková', 'Priečna', 'Priehradná', 'Priekopnícka', 'Priekopy', + 'Priemyselná', 'Priemyselná', 'Prievozská', 'Prievozská', 'Prievozská', + 'Príjazdná', 'Príkopova', 'Primaciálne námestie', 'Prímoravská', + 'Prípojná', 'Prístav', 'Prístavná', 'Prokofievova', 'Prokopa Veľkého', + 'Prokopova', 'Prúdová', 'Prvá', 'Prvosienková', 'Pšeničná', + 'Púchovská', 'Púpavová', 'Pustá', 'Puškinova', 'Pútnická', + 'Pyrenejská', 'Rácova', 'Račianska', 'Račianska', 'Račianska', + 'Račianska', 'Račianska', 'Račianska', 'Račianske mýto', 'Radarová', + 'Rádiová', 'Radlinského', 'Radničná', 'Radničné námestie', 'Radvanská', + 'Rajčianska', 'Rajecká', 'Rajská', 'Rajtákova', 'Raketová', 'Rákosová', + 'Rascová', 'Rascová', 'Rastislavova', 'Rastlinná', 'Rašelinová', + 'Ráztočná', 'Rázusovo nábrežie', 'Ražná', 'Rebarborová', 'Regrútska', + 'Remeselnícka', 'Repašského', 'Repíková', 'Repná', 'Rešetkova', + 'Revolučná', 'Révová', 'Revúcka', 'Rezedová', 'Riazanská', 'Riazanská', + 'Ribayová', 'Ríbezľová', 'Riečna', 'Rigeleho', 'Rímska', 'Rízlingová', + 'Riznerova', 'Robotnícka', 'Roľnícka', 'Romanova', 'Röntgenova', + 'Rosná', 'Rostovská', 'Rošického', 'Rovná', 'Rovniankova', 'Rovníková', + 'Royova', 'Rozálska', 'Rozmarínová', 'Rozvodná', 'Rožňavská', + 'Rožňavská', 'Rožňavská', 'Rubínová', 'Rubinsteinova', + 'Rudnayovo námestie', 'Rudnícka', 'Rulandská', 'Rumančeková', + 'Rumunská', 'Rusovce', 'Rusovská cesta', 'Rustaveliho', 'Ružičková', + 'Ružinovská', 'Ružinovská', 'Ružinovská', 'Ružomberská', + 'Ružová dolina', 'Ružová dolina', 'Rybárska brána', 'Rybné námestie', + 'Rybničná', 'Rybničná', 'Rybničná', 'Rýdziková', 'Rytierska', + 'Sabinovská', 'Sabinovská', 'Sad Janka Kráľa', 'Sadmelijská', 'Sadová', + 'Samova', 'Saratovská', 'Sartorisova', 'Sasanková', 'Sasinkova', + 'Savignonská', 'Seberíniho', 'Sečovská', 'Sedlárska', 'Sedmokrásková', + 'Segnáre', 'Segnerova', 'Sekulská', 'Sekurisova', 'Sekýľska', + 'Semenárska', 'Semianova', 'Semilonská', 'Senická', 'Senná', + 'Septimiova', 'Schengenská', 'Schillerova', 'Schneidera -Trnavské', + 'Schody pri starej vo', 'Sibírska', 'Siedma', 'Sienkiewiczova', + 'Silvánska', 'Sinokvetná', 'Skalická cesta', 'Skalná', 'Skerličova', + 'Sklabinská', 'Sklenárova', 'Sklenárska', 'Skoroceľová', 'Skuteckého', + 'Skýcovská', 'Sládkovičova', 'Sladová', 'Slatinská', 'Slávičie údolie', + 'Slavín', 'Slepá', 'Sliačska', 'Sliezska', 'Slivková', 'Sĺňavská', + 'Slnečná', 'Slnečnicová', 'Slovanské nábrežie', 'Slovienska', + 'Slovinec', 'Slovinská', 'Slovnaftská', 'Slovnaftská', 'Slowackého', + 'Smetanova', 'Smikova', 'Smolenická', 'Smolnícka', 'Smrečianska', + 'Smrečianska', 'Snežienková', 'Soferove schody', 'Socháňova', + 'Sochorova', 'Sokolíkova', 'Sokolská', 'Solivarská', 'Sološnická', + 'Somolického', 'Somolického', 'Sosnová', 'Sovia', 'Spádová', + 'Spätná cesta', 'Spišská', 'Spojná', 'Spoločenská', 'Sputniková', + 'Sreznevského', 'Srnčia', 'Stachanovská', 'Stálicová', 'Stanekova', + 'Staničná', 'Stará Černicová', 'Stará Ivánska cesta', 'Stará Klenová', + 'Stará Prievozská', 'Stará Stupavská', 'Stará Vajnorská', + 'Stará vinárska', 'Staré Grunty', 'Staré ihrisko', 'Staré záhrady', + 'Starhradská', 'Starohájska', 'Staromestská', 'Staromlynská', + 'Starorímska', 'Staroturský chodník', 'Stavbárska', 'Staviteľská', + 'Stepná cesta', 'Stodolova', 'Stoklasová', 'Stolárska', 'Strakova', + 'Stratená', 'Strážna', 'Strážnická', 'Strážny dom', 'Strečnianska', + 'Stredná', 'Strelecká', 'Strelkova', 'Strmá cesta', 'Strmé sady', + 'Strmý bok', 'Strmý vŕšok', 'Strojnícka', 'Stromová', 'Stropkovská', + 'Struková', 'Studená', 'Studenohorská', 'Stuhová', 'Stupavská', + 'Súbežná', 'Sudová', 'Súhvezdná', 'Suchá', 'Suché mýto', 'Suchohradská', + 'Súkennícka', 'Súľovská', 'Sumbalova', 'Súmračná', 'Súťažná', + 'Svätého Vincenta', 'Svätoplukova', 'Svätoplukova', 'Svätovojtešská', + 'Svébska', 'Svetlá', 'Svíbová', 'Svidnícka', 'Svoradova', 'Svrčia', + 'Syslia', 'Šafárikovo námestie', 'Šafárikovo námestie', 'Šafránová', + 'Šagátova', 'Šachorová', 'Šalátová', 'Šaldova', 'Šalviová', + 'Šamorínska', 'Šancová', 'Šancová', 'Šancová', 'Šancová', 'Šándorova', + 'Šarišská', 'Šášovská', 'Šaštínska', 'Ševčenkova', 'Šiesta', 'Šikmá', + 'Šinkovské', 'Šintavská', 'Šípková', 'Šípová', 'Šíravská', 'Široká', + 'Škarniclova', 'Školská', 'Škovránčia', 'Škultétyho', 'Šoltésovej', + 'Šošovicová', 'Špieszova', 'Špitálska', 'Športová', + 'Šrobárovo námestie', 'Šťastná', 'Štedrá', 'Štefana Králika', + 'Štefana Králika', 'Štefana Majera', 'Štefánikova', 'Štefánikova', + 'Štefánikova', 'Štefanovičova', 'Štefunkova', 'Štepná', 'Štetinova', + 'Štiavnická', 'Štítová', 'Štrbská', 'Štúrova', 'Štvrtá', 'Štyndlova', + 'Šulekova', 'Šulekova', 'Šulekova', 'Šumavská', 'Šuňavcova', 'Šúrska', + 'Šustekova', 'Šuty', 'Švabinského', 'Švantnerova', 'Tabaková', + 'Tablicova', 'Táborská', 'Tajovského', 'Talichova', 'Tallerova', + 'Tatranská', 'Tavaríkova osada', 'Tbiliská', 'Tehelná', 'Tehelňa', + 'Tehliarska', 'Technická', 'Tekovská', 'Tekvicová', 'Telocvičná', + 'Tematínska', 'Teplická', 'Terchovská', 'Teslova', 'Tešedíkova', + 'Tetmayerova', 'Thurzova', 'Tibenského', 'Tibériová', 'Tichá', + 'Tilgnerova', 'Timravina', 'Tobrucká', 'Tokajícka', 'Tolstého', + 'Tománkova', 'Tomanova', 'Tomášikova', 'Tomášikova', 'Tomášikova', + 'Tomášikova', 'Tomášikova', 'Toplianska', 'Topoľčianska', 'Topoľová', + 'Toryská', 'Továrenská', 'Trajánova', 'Tramínová', 'Tranovského', + 'Trávna', 'Trebišovská', 'Trebišovská', 'Trebišovská', 'Trenčianska', + 'Treskoňova', 'Tretia', 'Trhová', 'Trinásta', 'Trnavská cesta', + 'Trnavská cesta', 'Trnavská cesta', 'Trnavská cesta', 'Trnavská cesta', + 'Trnavské mýto', 'Trnková', 'Tŕňová', 'Trojdomy', 'Trojičné námestie', + 'Trstínska', 'Tučkova', 'Tuhovská', 'Tulipánová', 'Tupého', + 'Tupolevova', 'Turbínova', 'Turčianska', 'Turistická', 'Turnianska', + 'Tvarožkova', 'Tylova', 'Tymiánová', 'Tyršovo nábrežie', 'Učiteľská', + 'Údernícka', 'Údolná', 'Uhliská', 'Uhorková', 'Uhrova', 'Uhrovecká', + 'Ukrajinská', 'Ulica 1. mája', 'Ulica 29. augusta', + 'Ulica 29. augusta', 'Ulica 29. augusta', 'Ulica 29. augusta', + 'Ulica 8. mája', 'Ulica Alviano', 'Ulica Imricha Karvaš', + 'Ulica J. Valašťana D', 'Ulica Janka Alexyho', 'Ulica Jozefa Krónera', + 'Ulica Juraja Hronca', 'Ulica Karola Adlera', 'Ulica kpt. Rašu', + 'Ulica Leopoldov maje', 'Ulica Ľuda Zúbka', 'Ulica Nad Válkom', + 'Ulica padlých hrdino', 'Ulica Pri gaštanovej', 'Ulica Pri pastierni', + 'Ulica Pri Vápeníckom', 'Ulica Pri vodnej nád', 'Ulica svornosti', + 'Ulica Viktora Tegelh', 'Úprkova', 'Úradnícka', 'Uránová', 'Urbánkova', + 'Urbárska', 'Ursínyho', 'Uršulínska', 'Ušiakova', 'Úvozná', 'Uzbecká', + 'Úzka', 'Úžiny', 'V záhradách', 'Vajanského nábrežie', 'Vajnorská', + 'Vajnorská', 'Vajnorská', 'Vajnorská', 'Vajnorská', 'Vajnorská', + 'Vajnorská', 'Vajnorská', 'Vajnorská', 'Valachovej', 'Valašská', + 'Valchárska', 'Vančurova', 'Vansovej', 'Vápencová', 'Vápenka', + 'Vápenná', 'Varínska', 'Varšavská', 'Varšavská', 'Vavilovova', + 'Vavrinecká', 'Vavrínova', 'Vazovova', 'Vážska', 'Včelárska', + 'Velehradská', 'Veľké Štepnice', 'Veltlínska', 'Vendelínska', + 'Ventúrska', 'Veterná', 'Veternicová', 'Vetvárska', 'Vetvová', + 'Vidlicová', 'Viedenská cesta', 'Viedenská cesta', 'Viedenská cesta', + 'Vietnamská', 'Vígľašská', 'Vihorlatská', 'Viktorínova', 'Vilová', + 'Viničná', 'Vínna', 'Vinohradnícka', 'Višňová', 'Víťazná', 'Vlárska', + 'Vlastenecké námestie', 'Vlčie hrdlo', 'Vlčkova', 'Vlčkova', 'Vlčkova', + 'Vodné elektrárne', 'Vodný vrch', 'Vosková', 'Votrubova', 'Vrábeľská', + 'Vrakunská', 'Vrakunská cesta', 'Vrakunská cesta', 'Vrančovičova', + 'Vranovská', 'Vrbánska', 'Vrbenského', 'Vŕbová', 'Vresová', + 'Vretenová', 'Vrchná', 'Vrútocká', 'Vtáčikova', 'Vtáčnik', 'Vyhliadka', + 'Vyhnianska cesta', 'Výhonská', 'Východná', 'Vysoká', 'Vysokohorská', + 'Vyšehradská', 'Vyšná', 'Výtvarná', 'Vývojová', 'Wattova', 'Wilsonova', + 'Wolkrova', 'Za bránou', 'Za farou', 'Za Kasárňou', 'Za mlynom', + 'Za sokolovňou', 'Za Stanicou', 'Za tehelňou', 'Záborského', + 'Zadunajská cesta', 'Záhorácka', 'Záhorská', 'Záhradkárska', 'Záhradná', + 'Záhradnícka', 'Záhradnícka', 'Záhradnícka', 'Záhradnícka', 'Záhrady', + 'Záhrebská', 'Záhrebská', 'Záhumenná', 'Záhumenská', 'Zákutie', + 'Zálužická', 'Zámocká', 'Zámocké schody', 'Zámočnícka', 'Západná', + 'Západný rad', 'Záporožská', 'Záruby', 'Zátišie', 'Zátureckého', + 'Zavadilová', 'Závadská', 'Záveterná', 'Závodná', 'Závodníkova', + 'Zbrody', 'Zdravotnícka', 'Zelená', 'Zeleninová', 'Zelenohorská', + 'Zelinárska', 'Zhorínska', 'Zidiny', 'Zimná', 'Zlatá', 'Zlaté piesky', + 'Zlaté schody', 'Zlatohorská', 'Znievska', 'Zohorská', 'Zochova', + 'Zrinského', 'Zvolenská', 'Zvončeková', 'Žabí majer', 'Žabotova', + 'Žarnovická', 'Žatevná', 'Žehrianska', 'Železná', 'Železničiarska', + 'Železničná', 'Želiarska', 'Žellova', 'Žiacka', 'Žiarska', 'Židovská', + 'Žihľavová', 'Žilinská', 'Žilinská', 'Žitavská', 'Žitná', 'Živnostenská', + 'Žižkova', 'Žulová', 'Župné námestie', 'Borágova', 'Parenicová', + 'Loparová', 'Jegnešská', 'Jonatanová', 'Monardová', 'Perličková', ) + + states = ( + 'Bratislavský kraj', 'Trnavský kraj', 'Trenčiansky kraj', + 'Nitriansky kraj', 'Žilinský kraj', 'Banskobystrický kraj', + 'Prešovský kraj', 'Košický kraj', ) + + countries = ( + 'Afganistan', 'Afghanistanská islamská republika', 'Ålandy', + 'Albánsko', 'Albánska republika', 'Alžírsko', + 'Alžírska demokratická ľudová republika', 'Americká Samoa', 'Andorra', + 'Andorrské kniežatstvo', 'Angola', 'Angolská republika', 'Anguilla', + 'Antarktída', 'Antigua a Barbuda', 'Argentína', + 'Argentínska republika', 'Arménsko', 'Arménska republika', 'Aruba', + 'Austrália', 'Rakúsko', 'Rakúska republika', 'Azerbajdžan', + 'Azerbajdžanská republika', 'Bahamy', 'Bahamské spoločenstvo', + 'Bahrajn', 'Bahrajnské kráľovstvo', 'Bangladéš', + 'Bangladéšska ľudová republika', 'Barbados', 'Bielorusko', + 'Bieloruská republika', 'Belgicko', 'Belgické kráľovstvo', 'Belize', + 'Benin', 'Beninská republika', 'Bermudy', 'Bhután', + 'Bhutánske kráľovstvo', 'Bolívijská republika', 'Bolívijská republika', + 'Bolívia', 'Bosna a Hercegovina', 'Republika Bosny a Hercegoviny', + 'Botswana', 'Botswanská republika', 'Bouvetov ostrov', 'Brazília', + 'Brazílska federatívna republika', 'Britské indickooceánske územie', + 'Brunejsko-darussalamský štát', 'Bulharsko', 'Bulharská republika', + 'Burkina Faso', 'Burundi', 'Burundská republika', 'Kambodža', + 'Kambodžské kráľovstvo', 'Kamerun', 'Kamerunská republika', 'Kanada', + 'Kapverdy', 'Kapverdská republika', 'Kajmanie ostrovy', + 'Stredoafrická republika', 'Čad', 'Čadská republika', 'Čile', + 'Čilská republika', 'Čína', 'Čínska ľudová republika', + 'Vianočný ostrov', 'Kokosové ostrovy', 'Kolumbia', + 'Kolumbijská republika', 'Komory', 'Komorský zväz', 'Kongo', + 'Konžská republika', 'Konžská demokratická republika', + 'Cookove ostrovy', 'Kostarika', 'Kostarická republika', + 'Pobrežie Slonoviny', 'Republika Pobrežia Slonoviny', 'Chorvátsko', + 'Chorvátska republika', 'Kuba', 'Kubánska republika', 'Cyprus', + 'Cyperská republika', 'Česká republika', 'Dánsko', 'Dánske kráľovstvo', + 'Džibutsko', 'Džibutská republika', 'Dominika', + 'Dominické spoločenstvo', 'Dominikánska republika', 'Ekvádor', + 'Ekvádorská republika', 'Egypt', 'Egyptská arabská republika', + 'Salvádor', 'Salvádorská republika', 'Rovníková Guinea', + 'Republika Rovníkovej Guiney', 'Eritrea', 'Estónsko', + 'Estónska republika', 'Etiópia', + 'Etiópska federatívna demokratická republika', 'Falklandy (Malvíny)', + 'Faerské ostrovy', 'Fidži', 'Fínsko', 'Fínska republika', 'Francúzsko', + 'Francúzska republika', 'Francúzska Guyana', 'Francúzska Polynézia', + 'Francúzske južné a antarktické územia', 'Gabon', 'Gabonská republika', + 'Gambia', 'Gambijská republika', 'Gruzínsko', 'Nemecko', + 'Nemecká spolková republika', 'Ghana', 'Ghanská republika', + 'Gibraltár', 'Grécko', 'Grécka republika', 'Grónsko', 'Grenada', + 'Guadeloupe', 'Guam', 'Guatemala', 'Guatemalská republika', 'Guernsey', + 'Guinea', 'Guinejská republika', 'Guinea-Bissau', + 'Guinejsko-bissauská republika', 'Guyana', + 'Guyanská kooperatívna republika', 'Haiti', 'Haitská republika', + 'Heardov ostrov', 'Svätá stolica (Vatikánsky mestský štát)', + 'Honduras', 'Honduraská republika', 'Hongkong', + 'Osobitná administratívna oblasť Číny Hongkong', 'Maďarsko', + 'Maďarská republika', 'Island', 'Islandská republika', 'India', + 'Indická republika', 'Indonézia', 'Indonézska republika', + 'Iránska islamská republika', 'Iránska islamská republika', 'Irak', + 'Iracká republika', 'Írsko', 'Man', 'Izrael', 'Izraelský štát', + 'Taliansko', 'Talianska republika', 'Jamajka', 'Japonsko', 'Jersey', + 'Jordánsko', 'Jordánske hášimovské kráľovstvo', 'Kazachstan', + 'Kazašská republika', 'Keňa', 'Kenská republika', 'Kiribati', + 'Kiribatská republika', 'Kórejská ľudovodemokratická republika', + 'Kórejská ľudovodemokratická republika', 'Kórejská republika', + 'Kuvajt', 'Kuvajtský štát', 'Kirgizsko', 'Kirgizská republika', + 'Laoská ľudovodemokratická republika', 'Lotyšsko', + 'Lotyšská republika', 'Libanon', 'Libanonská republika', 'Lesotho', + 'Lesothské kráľovstvo', 'Libéria', 'Libérijská republika', 'Líbya', + 'Lichtenštajnsko', 'Lichtenštajnské kniežatstvo', 'Litva', + 'Litovská republika', 'Luxembursko', 'Luxemburské veľkovojvodstvo', + 'Macao', 'Osobitná administratívna oblasť Číny Macao', + 'Macedónska republika', 'Bývalá juhoslovanská republika Macedónsko', + 'Madagaskar', 'Madagaskarská republika', 'Malawi', + 'Malawijská republika', 'Malajzia', 'Maldivy', 'Maldivská republika', + 'Mali', 'Malijská republika', 'Malta', 'Maltská republika', + 'Marshallove ostrovy', 'Republika Marshallových ostrovov', 'Martinik', + 'Mauritánia', 'Mauritánska islamská republika', 'Maurícius', + 'Maurícijská republika', 'Mayotte', 'Mexiko', 'Spojené štáty mexické', + 'Mikronézske federatívne štáty', 'Mikronézske federatívne štáty', + 'Moldavská republika', 'Moldavská republika', 'Moldavsko', 'Monako', + 'Monacké kniežatstvo', 'Mongolsko', 'Čierna Hora', 'Montserrat', + 'Maroko', 'Marocké kráľovstvo', 'Mozambik', 'Mozambická republika', + 'Mjanmarsko', 'Namíbia', 'Namíbijská republika', 'Nauru', + 'Nauruská republika', 'Nepál', + 'Nepálska federatívna demokratická republika', 'Holandsko', + 'Holandské kráľovstvo', 'Nová Kaledónia', 'Nový Zéland', 'Nikaragua', + 'Nikaragujská republika', 'Niger', 'Nigerská republika', 'Nigéria', + 'Nigérijská federatívna republika', 'Niue', 'Norfolk', + 'Severné Mariány', 'Spoločenstvo Severných Marián', 'Nórsko', + 'Nórske kráľovstvo', 'Omán', 'Ománsky sultanát', 'Pakistan', + 'Pakistanská islamská republika', 'Palau', 'Palauská republika', + 'palestínske územie, Okupované', 'Okupované palestínske územie', + 'Panama', 'Panamská republika', 'Papua - Nová Guinea', 'Paraguaj', + 'Paraguajská republika', 'Peru', 'Peruánska republika', 'Filipíny', + 'Filipínska republika', 'Pitcairnove ostrovy', 'Poľsko', + 'Poľská republika', 'Portugalsko', 'Portugalská republika', + 'Portoriko', 'Katar', 'Katarský štát', 'Réunion', 'Rumunsko', + 'Ruská federácia', 'Rwanda', 'Rwandská republika', 'Svätý Bartolomej', + 'Svätá Helena, Ascension a Tristan da Cunha', 'Svätý Krištof a Nevis', + 'Svätá Lucia', 'Saint Martin', 'Saint Pierre a Miquelon', + 'Svätý Vincent a Grenadíny', 'Samoa', 'Samojský nezávislý štát', + 'San Maríno', 'Sanmarínska republika', 'Svätý Tomáš a Princov ostrov', + 'Demokratická republika Svätého Tomáša a Princovho ostrova', + 'Saudská Arábia', 'Saudskoarabské kráľovstvo', 'Senegal', + 'Senegalská republika', 'Srbsko', 'Srbská republika', 'Seychely', + 'Seychelská republika', 'Sierra Leone', 'Sierraleonská republika', + 'Singapur', 'Singapurská republika', 'Slovensko', + 'Slovenská republika', 'Slovinsko', 'Slovinská republika', + 'Šalamúnove ostrovy', 'Somálsko', 'Somálska republika', 'Južná Afrika', + 'Juhoafrická republika', 'Južná Georgia a Južné Sandwichove ostrovy', + 'Španielsko', 'Španielske kráľovstvo', 'Srí Lanka', + 'Srílanská demokratická socialistická republika', 'Sudán', + 'Sudánska republika', 'Surinam', 'Surinamská republika', + 'Svalbard a Jan Mayen', 'Svazijsko', 'Svazijské kráľovstvo', 'Švédsko', + 'Švédske kráľovstvo', 'Švajčiarsko', 'Švajčiarska konfederácia', + 'Sýrska arabská republika', 'Taiwan, provincia Číny', 'Taiwan', + 'Tadžikistan', 'Tadžická republika', 'Tanzánijská zjednotená republika', + 'Tanzánijská zjednotená republika', 'Thajsko', 'Thajské kráľovstvo', + 'Východný Timor', 'Východotimorská demokratická republika', 'Togo', + 'Togská republika', 'Tokelau', 'Tonga', 'Tongské kráľovstvo', + 'Trinidad a Tobago', 'Republika Trinidadu a Tobaga', 'Tunisko', + 'Tuniská republika', 'Turecko', 'Turecká republika', 'Turkménsko', + 'Ostrovy Turks a Caicos', 'Tuvalu', 'Uganda', 'Ugandská republika', + 'Ukrajina', 'Spojené arabské emiráty', 'Spojené kráľovstvo', + 'Spojené kráľovstvo Veľkej Británie a Severného Írska', + 'Spojené štáty', 'Spojené štáty americké', + 'Menšie odľahlé ostrovy Spojených štátov', 'Uruguaj', + 'Uruguajská východná republika', 'Uzbekistan', 'Uzbecká republika', + 'Vanuatu', 'Vanuatská republika', 'Venezuelská bolívarovská republika', + 'Venezuela', 'Vietnam', 'Vietnamská socialistická republika', + 'Panenské ostrovy, Britské', 'Britské Panenské ostrovy', + 'Panenské ostrovy, Americké', 'Panenské ostrovy Spojených štátov', + 'Wallis a Futuna', 'Západná Sahara', 'Jemen', 'Jemenská republika', + 'Zambia', 'Zambijská republika', 'Zimbabwe', 'Zimbabwianska republika', + 'Britské antarktické územie', 'Socialistická republika Barmský zväz', + 'Bieloruská sovietska socialistická republika', + 'ostrovy Canton a Enderbury', + 'Československo, Československá socialistická republika', 'Dahome', + 'Zem kráľovnej Maud', 'Východný Timor', 'Metropolitné Francúzsko', + 'Francúzske pobrežie Afarov a Isasov', + 'Francúzske južné a antarktické územia', + 'Nemecká demokratická republika', 'Nemecká spolková republika', + 'Gilbertove a lagúnové ostrovy', 'Johnston', 'Midwajské ostrovy', + 'Holandské Antily', 'neutrálne pôdy', 'Nové Hebridy', + 'Poručnícke územie tichomorských ostrovov', 'Panamská republika', + 'Panamské prieplavové pásmo', 'Rumunská socialistická republika', + 'Svätý Krištof', 'Srbsko a Čierna Hora', 'Sikkim', 'Rodézia', + 'Španielska Sahara', 'Tichomorské ostrovy pod správou USA', + 'ZSSR, Zväz sovietskych socialistických republík', + 'Republika Horná Volta', 'Vatikánsky mestský štát (Svätá stolica)', + 'Vietnamská demokratická republika', 'Wake', + 'Jemenská ľudovodemokratická republika', 'Jemenská arabská republika', + 'Socialistická federatívna republika Juhoslávia', 'Zairská republika', ) + + def street_suffix_short(self): + return self.random_element(self.street_suffixes_short) + + def street_suffix_long(self): + return self.random_element(self.street_suffixes_long) + + def city_name(self): + return self.random_element(self.cities) + + def street_name(self): + return self.random_element(self.streets) + + def state(self): + return self.random_element(self.states) diff --git a/src/faker/providers/sl_SI/address.py b/src/libs/faker/providers/address/sl_SI/__init__.py similarity index 72% rename from src/faker/providers/sl_SI/address.py rename to src/libs/faker/providers/address/sl_SI/__init__.py index 47d04df..4c033b4 100644 --- a/src/faker/providers/sl_SI/address.py +++ b/src/libs/faker/providers/address/sl_SI/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..address import Provider as AddressProvider +from .. import Provider as AddressProvider class Provider(AddressProvider): @@ -34,381 +34,381 @@ class Provider(AddressProvider): ) streets = ( - "Abramova ulica", "Adamičeva ulica", "Adamič-Lundrovo nabrežje", - "Ajdovščina", "Aleševa ulica", "Alešovčeva ulica", - "Aljaževa ulica", "Ambrožev trg", "Ameriška ulica", - "Andrićeva ulica", "Anžurjeva ulica", "Apihova ulica", - "Argentinska ulica", "Arharjeva cesta", "Arkova ulica", - "Artačeva ulica", "Aškerčeva cesta", "Avčinova ulica", - "Avsečeva ulica", "Avstrijska ulica", "Avšičeva cesta", - "Ažmanova ulica", "Babičeva ulica", "Badjurova ulica", - "Balinarska pot", "Baragova ulica", "Barjanska cesta", - "Bavdkova ulica", "Baznikova ulica", "Bazoviška ulica", - "Beethovnova ulica", "Belačeva ulica", "Beljaška ulica", - "Berčičeva ulica", "Berčonova pot", "Berdajsova ulica", - "Bernekerjeva ulica", "Bernikova ulica", "Betettova cesta", - "Bezenškova ulica", "Bežigrad", "Bičevje", "Bilečanska ulica", - "Bitenčeva ulica", "Bizjakova ulica", "Bizjanova ulica", - "Bizovški štradon", "Blasnikova ulica", "Blasov breg", - "Bleiweisova cesta", "Bobenčkova ulica", "Bobrova ulica", - "Bognarjeva pot", "Bohinjčeva ulica", "Bohoričeva ulica", - "Boletova ulica", "Bolgarska ulica", "Borovniška ulica", - "Borštnikov trg", "Borutova ulica", "Božičeva ulica", - "Brankova ulica", "Bratinova ulica", "Bratislavska cesta", - "Bratov Jakopičev ulica", "Bratov Kunovarjev ulica", - "Bravničarjeva ulica", "Brdnikova ulica", "Breg", "Bregarjeva ulica", - "Breznikova ulica", "Brglezov štradon", "Brilejeva ulica", - "Brodarjev trg", "Brodska cesta", "Burnikova ulica", "Cankarjev vrh", - "Cankarjevo nabrežje", "Carja Dušana ulica", "Celarčeva ulica", - "Celjska ulica", "Celovška cesta", "Cerkniška ulica", - "Cerutova ulica", "Cesta Andreja Bitenca", "Cesta Ceneta Štuparja", - "Cesta Dolomitskega odreda", "Cesta II. grupe odredov", - "Cesta Ljubljanske brigade", "Cesta na Bellevue", "Cesta na Bokalce", - "Cesta na Brinovec", "Cesta na Brod", "Cesta na Ježah", - "Cesta na Kope", "Cesta na Laze", "Cesta na Loko", "Cesta na Mesarico", - "Cesta na Ozare", "Cesta na Poljane", "Cesta na Prevoje", - "Cesta na Urh", "Cesta na Vrhovce", "Cesta slov. kmečkih uporov", - "Cesta Urške Zatlerjeve", "Cesta v Dvor", "Cesta v Gameljne", - "Cesta v Hrastje", "Cesta v hrib", "Cesta v Kleče", "Cesta v Kostanj", - "Cesta v Legarico", "Cesta v Mestni log", "Cesta v Pečale", - "Cesta v Prod", "Cesta v Rožno dolino", "Cesta v Šmartno", - "Cesta v Zeleni log", "Cesta v Zgornji log", "Cesta vstaje", - "Cesta 24. junija", "Cesta 25 talcev", "Cesta 27. aprila", - "Chengdujska cesta", "Chopinov prehod", "Cigaletova ulica", - "Cilenškova ulica", "Cimermanova ulica", "Cimpermanova ulica", - "Cizejeva ulica", "Clevelandska ulica", "Colnarjeva ulica", - "Cvetlična pot", "Čampova ulica", "Čanžekova ulica", - "Čargova ulica", "Čebelarska ulica", "Čehova ulica", - "Čepelnikova ulica", "Čepovanska ulica", "Čerinova ulica", - "Černigojeva ulica", "Černivčeva ulica", "Červanova ulica", - "Čevljarska ulica", "Čižmanova ulica", "Čopova ulica", "Črna pot", - "Črnuška cesta", "Črtomirova ulica", "Čučkova ulica", - "Dajnkova ulica", "Dalmatinova ulica", "Danile Kumarjeve ulica", - "Dečkova ulica", "Dečmanova ulica", "Delakova ulica", - "Demšarjeva cesta", "Derčeva ulica", "Dergančeva ulica", - "Dermotova ulica", "Detelova ulica", "Devinska ulica", "Devova ulica", - "Divjakova ulica", "Do proge", "Dobrajčeva ulica", "Dobrdobska ulica", - "Dolenjska cesta", "Dolgi breg", "Dolgi most", "Dolharjeva ulica", - "Dolinarjeva ulica", "Dolinškova ulica", "Dolničarjeva ulica", - "Dolomitska ulica", "Drabosnjakova ulica", "Draga", "Draveljska ulica", - "Dražgoška ulica", "Drenikov vrh", "Drenikova ulica", - "Dunajska cesta", "Dvojna ulica", "Dvorakova ulica", "Dvorni trg", - "Eipprova ulica", "Ellerjeva ulica", "Emonska cesta", - "Erbežnikova ulica", "Erjavčeva cesta", "Fabianijeva ulica", - "Fani Grumove ulica", "Ferberjeva ulica", "Filipičeva ulica", - "Flajšmanova ulica", "Flandrova ulica", "Forsterjeva ulica", - "Franketova ulica", "Frankopanska ulica", "Frenkova pot", - "Friškovec", "Funtkova ulica", "Fužinska cesta", "Gabrov trg", - "Gača", "Galičeva ulica", "Galjevica", "Gallusovo nabrežje", - "Gasilska cesta", "Gasparijeva ulica", "Gašperšičeva ulica", - "Gerbičeva ulica", "Gestrinova ulica", "Glavarjeva ulica", - "Gledališka stolba", "Glinška ulica", "Glinškova ploščad", - "Glonarjeva ulica", "Gmajnice", "Gobarska pot", "Godeževa ulica", - "Gola Loka", "Golarjeva ulica", "Goljarjeva pot", "Golouhova ulica", - "Goriška ulica", "Gorjančeva ulica", "Gorjupova ulica", - "Gornji Rudnik I", "Gornji Rudnik II", "Gornji Rudnik III", - "Gornji trg", "Goropečnikova ulica", "Gortanova ulica", - "Gospodinjska ulica", "Gosposka ulica", "Gosposvetska cesta", - "Govekarjeva ulica", "Gozdna pot", "Grablovičeva ulica", - "Gradišče", "Gradnikova ulica", "Grafenauerjeva ulica", - "Grajski drevored", "Grajzerjeva ulica", "Gramozna pot", - "Grassellijeva ulica", "Gregorčičeva ulica", "Gregorinova ulica", - "Grintovška ulica", "Grobeljca", "Grobeljska pot", "Groharjeva cesta", - "Groznikova ulica", "Grška ulica", "Grško", "Gruberjevo nabrežje", - "Grudnovo nabrežje", "Gubčeva ulica", "Gunceljska cesta", - "Gustinčarjeva ulica", "Gustinčičeva ulica", "Hacetova ulica", - "Hafnerjeva ulica", "Hajdrihova ulica", "Hauptmanca", - "Hladilniška pot", "Hladnikova cesta", "Hlebčeva ulica", - "Hotimirova ulica", "Hradeckega cesta", "Hranilniška ulica", - "Hribarjevo nabrežje", "Hribernikova ulica", "Hribovska pot", - "Hrvaška ulica", "Hrvatski trg", "Hubadova ulica", "Hudourniška pot", - "Idrijska ulica", "Igriška ulica", "Ilešičeva ulica", - "Ilovški štradon", "Industrijska cesta", "Ingličeva ulica", - "Italijanska ulica", "Izletniška ulica", "Ižanska cesta", - "Jakčeva ulica", "Jakhljeva ulica", "Jakopičev drevored", - "Jakopičevo sprehajališče", "Jakšičeva ulica", "Jalnova ulica", - "Jamova cesta", "Janežičeva cesta", "Janova ulica", "Janševa ulica", - "Jarčeva ulica", "Jarnikova ulica", "Jarše", "Jarška cesta", - "Javorškova ulica", "Jazbečeva pot", "Jelinčičeva ulica", - "Jenkova ulica", "Jensenova ulica", "Jerajeva ulica", - "Jeranova ulica", "Jesenkova ulica", "Jesihov štradon", - "Jezerska ulica", "Ježa", "Ježica", "Joškov štradon", - "Jurčičev trg", "Jurčkova cesta", "Juričeva ulica", - "Juvanova ulica", "K reaktorju", "Kadilnikova ulica", - "Kajuhova ulica", "Kalingerjeva ulica", "Kalinova ulica", - "Kaminova ulica", "Kamniška ulica", "Kamnogoriška cesta", - "Kančeva ulica", "Kanonijeva cesta", "Kantetova ulica", - "Kapusova ulica", "Kardeljeva ploščad", "Karingerjeva ulica", - "Karunova ulica", "Kastelčeva ulica", "Kašeljska cesta", - "Kavadarska cesta", "Kavčičeva ulica", "Kavškova ulica", - "Kekčeva ulica", "Kermaunerjeva ulica", "Kernova cesta", - "Kerševanova ulica", "Keržičeva ulica", "Kettejeva ulica", - "Kladezna ulica", "Klančarjeva ulica", "Kleče", - "Klemenova ulica", "Kleparska steza", "Ključavničarska ulica", - "Klunova ulica", "Kmečka pot", "Knafljev prehod", - "Knezov štradon", "Knezova ulica", "Knobleharjeva ulica", - "Koblarjeva ulica", "Kocbekova ulica", "Kocenova ulica", - "Kocjanova ulica", "Kočenska ulica", "Kodrova ulica", - "Kogojeva ulica", "Kogovškova ulica", "Kokaljeva ulica", - "Kolarjeva ulica", "Kolesarska pot", "Koleševa ulica", - "Kolinska ulica", "Kolmanova ulica", "Kolodvorska ulica", - "Komanova ulica", "Komenskega ulica", "Kongresni trg", - "Kopališka ulica", "Kopitarjeva ulica", "Kopna pot", "Koprska ulica", - "Koreninova ulica", "Koroška ulica", "Korotanska ulica", - "Kosančeva ulica", "Koseskega ulica", "Koseška cesta", - "Kosmačeva ulica", "Kosova ulica", "Kosovelova ulica", - "Koširjeva ulica", "Kotnikova ulica", "Kovačeva ulica", - "Kovaška ulica", "Kovinarska ulica", "Kozakova ulica", - "Kozinova ulica", "Kozlarjeva pot", "Koželjeva ulica", - "Krakovski nasip", "Kraljeva ulica", "Kranerjeva ulica", - "Kraška ulica", "Kratka pot", "Kratka steza", "Kregarjeva ulica", - "Kreljeva ulica", "Kremžarjeva ulica", "Krimska ulica", - "Krištofova ulica", "Kriva pot", "Krivec", "Križevniška soteska", - "Križna ulica", "Krmčeva ulica", "Krmeljeva ulica", - "Kropova ulica", "Krošljeva ulica", "Krovska ulica", "Krožna pot", - "Kržičeva ulica", "Kudrova ulica", "Kuhljeva cesta", - "Kumerdejeva ulica", "Kumerjeve ulica", "Kumrovška ulica", - "Kurilniška ulica", "Kurirska ulica", "Kusoldova ulica", - "Kuštrinova ulica", "Kuzeletova ulica", "Kuzmičeva ulica", - "Lahova pot", "Lajovčeva ulica", "Laknerjeva ulica", "Lakotence", - "Lampetova ulica", "Lamutova ulica", "Langusova ulica", "Latinski trg", - "Lavrinova ulica", "Layerjeva ulica", "Lazarjeva ulica", - "Legatova ulica", "Lemeževa ulica", "Lepi pot", "Lepodvorska ulica", - "Leskovičeva ulica", "Letališka cesta", "Levarjeva ulica", - "Levičnikova ulica", "Levstikov trg", "Levstikova ulica", - "Linhartov podhod", "Linhartova cesta", "Lipahova ulica", - "Litijska cesta", "Litostrojska cesta", "Livada", "Livarska ulica", - "Ločnikarjeva ulica", "Lončarska steza", "Lorenzova cesta", - "Lovrenčičeva ulica", "Lovska ulica", "Lovšetova ulica", - "Lubejeva ulica", "Luize Pesjakove ulica", "Lunačkova ulica", - "Mačja steza", "Mačkov kot", "Mačkova ulica", "Madžarska ulica", - "Magistrova ulica", "Maistrova ulica", "Majaronova ulica", - "Majde Vrhovnikove ulica", "Majorja Lavriča ulica", "Makucova ulica", - "Mala ulica", "Mala vas", "Malejeva ulica", "Malenškova ulica", - "Malgajeva ulica", "Mali štradon", "Mali trg", "Malnarjeva ulica", - "Marčenkova ulica", "Marentičeva ulica", "Mareška pot", - "Marice Kovačeve ulica", "Marincljeva ulica", "Marinovševa cesta", - "Maroltova ulica", "Martina Krpana ulica", "Martinčeva ulica", - "Martinova ulica", "Marušičeva ulica", "Masarykova cesta", - "Matjanova pot", "Matjaževa ulica", "Maurerjeva ulica", - "Mazovčeva pot", "Med hmeljniki", "Medarska ulica", "Medenska cesta", - "Medveščkova ulica", "Mekinčeva ulica", "Melikova ulica", - "Mencingerjeva ulica", "Merčnikova ulica", "Merosodna ulica", - "Mesesnelova ulica", "Mestni trg", "Meškova ulica", "Metelkova ulica", - "Miheličeva cesta", "Mihov štradon", "Miklavčeva ulica", - "Miklošičeva cesta", "Mikuževa ulica", "Milčetova pot", - "Mire Lenardičeve ulica", "Mirje", "Mirna pot", "Mislejeva ulica", - "Mizarska pot", "Mladinska ulica", "Mlake", "Mlinska pot", - "Močnikova ulica", "Mokrška ulica", "Molekova ulica", - "Moškričeva ulica", "Mrharjeva ulica", "Mrzelova ulica", - "Murkova ulica", "Murnikova ulica", "Murnova ulica", "Muzejska ulica", - "Na cvetači", "Na delih", "Na dolih", "Na gaju", "Na gmajni", - "Na Herši", "Na jami", "Na klančku", "Na Korošci", "Na Palcah", - "Na požaru", "Na produ", "Na Rojah", "Na Stolbi", "Na Straški vrh", - "Na Trati", "Na Žalah", "Nade Ovčakove ulica", "Nadgoriška cesta", - "Nahlikova ulica", "Nahtigalova ulica", "Nanoška ulica", - "Nazorjeva ulica", "Nebotičnikov prehod", "Nedohova ulica", - "Njegoševa cesta", "Nova ulica", "Novakova pot", "Novakova ulica", - "Novi trg", "Novinarska ulica", "Novo naselje", "Novo Polje, cesta I", - "Novo Polje, cesta III", "Novo Polje, cesta IV", - "Novo Polje, cesta V", "Novo Polje, cesta VI", "Novo Polje, cesta VII", - "Novo Polje, cesta X", "Novo Polje, cesta XI", "Novo Polje, cesta XII", - "Novo Polje, cesta XIV", "Novo Polje, cesta XIX", - "Novo Polje, cesta XVI", "Novo Polje, cesta XVII", - "Novo Polje, cesta XXI", "Novo Polje, cesta XXIII", "Novosadska ulica", - "Ob daljnovodu", "Ob dolenjski železnici", "Ob Farjevcu", - "Ob Ljubljanici", "Ob Mejašu", "Ob potoku", "Ob pristanu", "Ob Savi", - "Ob studencu", "Ob zdravstvenem domu", "Ob zeleni jami", "Ob zelenici", - "Ob žici", "Obirska ulica", "Obrežna steza", "Obrije", - "Ocvirkova ulica", "Ogrinčeva ulica", "Okiškega ulica", - "Omahnova ulica", "Omejčeva ulica", "Omersova ulica", - "Oražnova ulica", "Orlova ulica", "Osenjakova ulica", - "Osojna pot", "Osojna steza", "Osterčeva ulica", "Ovčakova ulica", - "Pahorjeva ulica", "Palmejeva ulica", "Papirniška pot", - "Park Ajdovščina", "Park Arturo Toscanini", - "Parmova ulica", "Parmska cesta", "Partizanska ulica", - "Pavlovčeva ulica", "Pavšičeva ulica", "Pečarjeva ulica", - "Pečnik", "Pečnikova ulica", "Pegamova ulica", "Perčeva ulica", - "Periška cesta", "Perkova ulica", "Peršinova cesta", - "Pesarska cesta", "Pestotnikova ulica", "Peščena pot", - "Petkova ulica", "Petkovškovo nabrežje", "Petrčeva ulica", - "Pilonova ulica", "Pionirska pot", "Pipanova pot", "Pirnatova ulica", - "Planinska cesta", "Planinškova ulica", "Plečnikov podhod", - "Plemljeva ulica", "Plešičeva ulica", "Pleteršnikova ulica", - "Pločanska ulica", "Pod akacijami", "Pod bregom", "Pod bresti", - "Pod bukvami", "Pod Debnim vrhom", "Pod gabri", "Pod gozdom", - "Pod hrasti", "Pod hribom", "Pod hruško", "Pod jelšami", - "Pod jezom", "Pod ježami", "Pod Kamno gorico", "Pod klancem", - "Pod lipami", "Pod topoli", "Pod Trančo", "Pod turnom", "Pod vrbami", - "Podgornikova ulica", "Podgorska cesta", "Podgrajska cesta", - "Podjunska ulica", "Podlimbarskega ulica", "Podmilščakova ulica", - "Podrožniška pot", "Podsmreška cesta", "Podutiška cesta", - "Pogačarjev trg", "Pohlinova ulica", "Poklukarjeva ulica", - "Polakova ulica", "Polanškova ulica", "Poljanska cesta", - "Polje", "Polje, cesta I", "Polje, cesta II", "Polje, cesta III", - "Polje, cesta VI", "Polje, cesta VIII", "Polje, cesta X", - "Polje, cesta XIV", "Polje, cesta XL", "Polje, cesta XLII", - "Polje, cesta XLVI", "Polje, cesta XVI", "Polje, cesta XVIII", - "Polje, cesta XXII", "Polje, cesta XXIV", "Polje, cesta XXVI", - "Polje, cesta XXX", "Polje, cesta XXXII", "Polje, cesta XXXIV", - "Polje, cesta XXXVIII", "Poljedelska ulica", "Poljska pot", - "Porentova ulica", "Posavskega ulica", "Postojnska ulica", - "Pot do šole", "Pot Draga Jakopiča", "Pot heroja Trtnika", - "Pot k igrišču", "Pot k ribniku", "Pot k Savi", "Pot k sejmišču", - "Pot k studencu", "Pot na Breje", "Pot na Drenikov vrh", - "Pot na Golovec", "Pot na goro", "Pot na Gradišče", "Pot na Grič", - "Pot na Labar", "Pot na mah", "Pot na most", "Pot na Orle", - "Pot na Visoko", "Pot na Zduše", "Pot Rdečega križa", - "Pot v boršt", "Pot v Čeželj", "Pot v dolino", "Pot v Goričico", - "Pot v hribec", "Pot v mejah", "Pot v Mlake", "Pot v Podgorje", - "Pot v Zeleni gaj", "Pot za Brdom", "Pot za razori", - "Potokarjeva ulica", "Potrčeva ulica", "Povšetova ulica", - "Prašnikarjeva ulica", "Praznikova ulica", "Pražakova ulica", - "Pred Savljami", "Predjamska cesta", "Predor pod Gradom", - "Preglov trg", "Prekmurska ulica", "Prelčeva ulica", "Preloge", - "Premrlova ulica", "Preradovićeva ulica", "Preserska ulica", - "Prešernov trg", "Prešernova cesta", "Pretnarjeva ulica", - "Pri borštu", "Pri brvi", "Pri malem kamnu", "Pri mostiščarjih", - "Pribinova ulica", "Prijateljeva ulica", "Primorska ulica", - "Prinčičeva ulica", "Prisojna ulica", "Prištinska ulica", "Privoz", - "Proletarska cesta", "Prule", "Prušnikova ulica", "Prvomajska ulica", - "Pšatnik", "Pšatska pot", "Ptujska ulica", "Pučnikova ulica", - "Puharjeva ulica", "Puhova ulica", "Puhtejeva ulica", - "Puterlejeva ulica", "Putrihova ulica", "Raičeva ulica", - "Rakovniška ulica", "Rakuševa ulica", "Ramovševa ulica", - "Ravbarjeva ulica", "Ravna pot", "Ravnikova ulica", - "Razgledna steza", "Reber", "Reboljeva ulica", "Rečna ulica", - "Regentova cesta", "Resljeva cesta", "Reška ulica", - "Ribičičeva ulica", "Ribji trg", "Ribniška ulica", - "Rimska cesta", "Rjava cesta", "Robbova ulica", "Robičeva ulica", - "Rodičeva ulica", "Rojčeva ulica", "Romavhova ulica", "Rosna pot", - "Rotarjeva ulica", "Rovšnikova ulica", "Rozmanova ulica", - "Rožanska ulica", "Rožičeva ulica", "Rožna dolina, cesta I", - "Rožna dolina, cesta III", "Rožna dolina, cesta IV", - "Rožna dolina, cesta V", "Rožna dolina, cesta VI", - "Rožna dolina, cesta VIII", "Rožna dolina, cesta X", - "Rožna dolina, cesta XII", "Rožna dolina, cesta XIII", - "Rožna dolina, cesta XV", "Rožna dolina, cesta XVII", - "Rožna ulica", "Rudnik I", "Rudnik II", "Rudnik III", "Runkova ulica", - "Ruska ulica", "Rutarjeva ulica", "Sadinja vas", "Sajovčeva ulica", - "Samova ulica", "Saškova ulica", "Sattnerjeva ulica", - "Savinova ulica", "Savinškova ulica", "Savlje", "Savska cesta", - "Sedejeva ulica", "Selanov trg", "Selanova ulica", - "Setnikarjeva ulica", "Seunigova ulica", "Simončičeva ulica", - "Siva pot", "Skapinova ulica", "Sketova ulica", "Skopčeva ulica", - "Skrbinškova ulica", "Slape", "Slapnikova ulica", "Slavčja ulica", - "Slomškova ulica", "Slovenčeva ulica", "Slovenska cesta", - "Smoletova ulica", "Smrekarjeva ulica", "Smrtnikova ulica", - "Snebersko nabrežje", "Snežniška ulica", "Snojeva ulica", - "Sojerjeva ulica", "Sončna pot", "Sostrska cesta", "Soška ulica", - "Soteška pot", "Soussenska ulica", "Sovretova ulica", - "Spodnji Rudnik I", "Spodnji Rudnik II", "Spodnji Rudnik III", - "Spodnji Rudnik V", "Spomeniška pot", "Srebrničeva ulica", - "Srednja pot", "Stadionska ulica", "Staničeva ulica", - "Stara Ježica", "Stara slovenska ulica", "Stare Črnuče", - "Stari trg", "Stegne", "Steletova ulica", "Sternadova ulica", - "Stiška ulica", "Stolpniška ulica", "Stoženska ulica", "Stožice", - "Stražarjeva ulica", "Streliška ulica", "Stritarjeva ulica", - "Strmeckijeva ulica", "Strmi pot", "Strniševa cesta", - "Strossmayerjeva ulica", "Strugarska ulica", "Strupijevo nabrežje", - "Suhadolčanova ulica", "Sulčja ulica", "Svetčeva ulica", - "Šarhova ulica", "Šentjakob", "Šentviška ulica", - "Šerkova ulica", "Šestova ulica", "Šibeniška ulica", - "Šinkov štradon", "Šišenska cesta", "Šivičeva ulica", - "Škerljeva ulica", "Škofova ulica", "Škrabčeva ulica", - "Šlandrova ulica", "Šlosarjeva ulica", "Šmarna gora", - "Šmartinska cesta", "Šmartno", "Španova pot", "Španska ulica", - "Štajerska cesta", "Štebijeva cesta", "Štefančeva ulica", - "Štembalova ulica", "Štepanjska cesta", "Štepanjsko nabrežje", - "Štirnova ulica", "Štradon čez Prošco", "Štrekljeva ulica", - "Študentovska ulica", "Štukljeva cesta", "Štula", - "Šturmova ulica", "Šubičeva ulica", "Šumarjeva ulica", - "Švabićeva ulica", "Švarova ulica", "Švegljeva cesta", "Tabor", - "Tacenska cesta", "Tavčarjeva ulica", "Tbilisijska ulica", - "Tesarska ulica", "Teslova ulica", "Tesna ulica", "Tesovnikova ulica", - "Tiha ulica", "Tiranova ulica", "Tischlerjeva ulica", - "Tivolska cesta", "Tkalska ulica", "Tobačna ulica", "Tolminska ulica", - "Tomačevo", "Tomačevska cesta", "Tomažičeva ulica", - "Tometova ulica", "Tominškova ulica", "Tomišeljska ulica", - "Toplarniška ulica", "Topniška ulica", "Torkarjeva ulica", - "Tratnikova ulica", "Travniška ulica", "Trbeže", "Trdinova ulica", - "Trebušakova ulica", "Trg francoske revolucije", - "Trg mladih", "Trg mladinskih delov. brigad", "Trg narodnih herojev", - "Trg prekomorskih brigad", "Trg republike", "Trg 9. maja", - "Trinkova ulica", "Trnovčeva ulica", "Trnovska ulica", - "Trpinčeva ulica", "Trstenjakova ulica", "Trtnikova ulica", - "Tržaška cesta", "Tržna ulica", "Tugomerjeva ulica", - "Turnerjeva ulica", "Turnsko nabrežje", "Udvančeva ulica", - "Ulica aktivistov", "Ulica Alme Sodnik", "Ulica Andreja Kumarja", - "Ulica Angelce Ocepkove", "Ulica Angele Ljubičeve", - "Ulica borca Petra", "Ulica borcev za severno mejo", - "Ulica bratov Bezlajev", "Ulica bratov Blanč", "Ulica bratov Jančar", - "Ulica bratov Komel", "Ulica bratov Kraljič", "Ulica bratov Martinec", - "Ulica bratov Novak", "Ulica bratov Rozmanov", "Ulica bratov Škofov", - "Ulica bratov Učakar", "Ulica bratov Židan", - "Ulica Dušana Kraigherja", "Ulica Ernesta Kramerja", - "Ulica Franca Nebca", "Ulica Francke Jerasove", "Ulica Franja Novaka", - "Ulica gledališča BTC", "Ulica Goce Delčeva", - "Ulica Gubčeve brigade", "Ulica Hermana Potočnika", - "Ulica Ivana Roba", "Ulica Ivanke Kožuh", "Ulica Ivice Pirjevčeve", - "Ulica Janeza Pavla II.", "Ulica Janeza Rožiča", - "Ulica Jožeta Jame", "Ulica Jožeta Japlja", "Ulica Jožeta Mirtiča", - "Ulica Konrada Babnika", "Ulica Koroškega bataljona", - "Ulica Lizike Jančarjeve", "Ulica Lojzeta Spacala", - "Ulica Lovre Klemenčiča", "Ulica Malči Beličeve", - "Ulica Marije Drakslerjeve", "Ulica Marije Hvaličeve", - "Ulica Marje Boršnikove", "Ulica Marka Šlajmerja", - "Ulica Milana Majcna", "Ulica Milke Kerinove", "Ulica Minke Bobnar", - "Ulica Mirka Jurce", "Ulica Mirka Tomšiča", "Ulica Miroslava Turka", - "Ulica Molniške čete", "Ulica na Grad", "Ulica Nade Čamernikove", - "Ulica Olge Mohorjeve", "Ulica padlih borcev", "Ulica Pariške komune", - "Ulica Pohorskega bataljona", "Ulica Polonce Čude", - "Ulica prvoborcev", "Ulica Rezke Dragarjeve", "Ulica Rezke Klopčič", - "Ulica Rudolfa Janežiča", "Ulica Staneta Severja", - "Ulica Štefke Zbašnikove", "Ulica talcev", - "Ulica Tončke Čečeve", "Ulica v Kokovšek", - "Ulica Vide Pregarčeve", "Ulica Vladimirja Trampuža", - "Ulica Zore Ragancinove", "Ulica Žanke Erjavec", - "Ulica 15. aprila", "Ulica 15. maja", "Ulica 24. avgusta", - "Ulica 4. julija", "Ulica 7. septembra", "Ulica 9. junija", - "Uršičev štradon", "Usnjarska ulica", "V Češnjico", "V dolini", - "V Karlovce", "V Karlovce", "V Kladeh", "V Murglah", "V Sige", - "V Varde", "V Zalar", "Vagajeva ulica", "Valjavčeva ulica", - "Valvasorjeva ulica", "Vandotova ulica", "Vaška pot", - "Večna pot", "Vegova ulica", "Velebitska ulica", - "Veliki štradon", "Velikovška ulica", "Velnarjeva ulica", - "Verovškova ulica", "Veršičeva ulica", "Veselova ulica", - "Videmska ulica", "Vidergarjeva ulica", "Vidičeva ulica", - "Vidovdanska cesta", "Vilharjev podhod", "Vilharjeva cesta", - "Vinterca", "Vipavska ulica", "Vipotnikova ulica", "Viška cesta", - "Vižmarska pot", "Vodmatska ulica", "Vodmatski trg", "Vodna steza", - "Vodnikova cesta", "Vodnikovo naselje", "Vodovodna cesta", - "Vogelna ulica", "Vojkova cesta", "Volaričeva ulica", - "Vošnjakova ulica", "Vozna pot na Grad", "Vožarski pot", - "Vrazov trg", "Vrbovec", "Vrbska ulica", "Vregova ulica", - "Vrhovci, cesta I", "Vrhovci, cesta II", "Vrhovci, cesta III", - "Vrhovci, cesta IX", "Vrhovci, cesta V", "Vrhovci, cesta VI", - "Vrhovci, cesta X", "Vrhovci, cesta XI", "Vrhovci, cesta XII", - "Vrhovci, cesta XIV", "Vrhovci, cesta XIX", "Vrhovci, cesta XV", - "Vrhovci, cesta XVII", "Vrhovci, cesta XVIII", "Vrhovci, cesta XX", - "Vrhovci, cesta XXII", "Vrhovci, cesta XXVI", "Vrhovci, cesta XXVIII", - "Vrhovci, cesta XXXII", "Vrhovčeva ulica", "Vrhovnikova ulica", - "Vrtača", "Vrtna ulica", "Vrtnarska cesta", "Vulčeva ulica", - "Vzajemna ulica", "Windischerjeva ulica", "Wolfova ulica", - "Za Garažami", "Za gasilskim domom", "Za Gradom", "Za krajem", - "Za opekarno", "Za partizanskim domom", "Za progo", "Za vasjo", - "Zadnikarjeva ulica", "Zadobrovška cesta", "Zadružna ulica", - "Zajčeva pot", "Zajčevi dvori", "Zakotnikova ulica", - "Zalaznikova ulica", "Zaletelova ulica", "Zaloška cesta", - "Zarnikova ulica", "Zasavska cesta", "Zatišje", "Zavetiška ulica", - "Završje", "Zbašnikova ulica", "Zdešarjeva cesta", - "Zelena pot", "Zelenova ulica", "Zeljarska ulica", - "Zevnikova ulica", "Zidarjev štradon", "Ziherlova ulica", - "Zlatek", "Znamenjska ulica", "Zofke Kvedrove ulica", "Zoisova cesta", - "Zupanova ulica", "Zvezda", "Zvezdarska ulica", "Zvezna ulica", - "Žabarjeva ulica", "Žabjak", "Žalska ulica", "Žaucerjeva ulica", - "Žeje", "Železna cesta", "Železnikarjeva ulica", "Žerjalova ulica", - "Židankova ulica", "Židovska steza", "Židovska ulica", + "Abramova ulica", "Adamičeva ulica", "Adamič-Lundrovo nabrežje", + "Ajdovščina", "Aleševa ulica", "Alešovčeva ulica", + "Aljaževa ulica", "Ambrožev trg", "Ameriška ulica", + "Andrićeva ulica", "Anžurjeva ulica", "Apihova ulica", + "Argentinska ulica", "Arharjeva cesta", "Arkova ulica", + "Artačeva ulica", "Aškerčeva cesta", "Avčinova ulica", + "Avsečeva ulica", "Avstrijska ulica", "Avšičeva cesta", + "Ažmanova ulica", "Babičeva ulica", "Badjurova ulica", + "Balinarska pot", "Baragova ulica", "Barjanska cesta", + "Bavdkova ulica", "Baznikova ulica", "Bazoviška ulica", + "Beethovnova ulica", "Belačeva ulica", "Beljaška ulica", + "Berčičeva ulica", "Berčonova pot", "Berdajsova ulica", + "Bernekerjeva ulica", "Bernikova ulica", "Betettova cesta", + "Bezenškova ulica", "Bežigrad", "Bičevje", "Bilečanska ulica", + "Bitenčeva ulica", "Bizjakova ulica", "Bizjanova ulica", + "Bizovški štradon", "Blasnikova ulica", "Blasov breg", + "Bleiweisova cesta", "Bobenčkova ulica", "Bobrova ulica", + "Bognarjeva pot", "Bohinjčeva ulica", "Bohoričeva ulica", + "Boletova ulica", "Bolgarska ulica", "Borovniška ulica", + "Borštnikov trg", "Borutova ulica", "Božičeva ulica", + "Brankova ulica", "Bratinova ulica", "Bratislavska cesta", + "Bratov Jakopičev ulica", "Bratov Kunovarjev ulica", + "Bravničarjeva ulica", "Brdnikova ulica", "Breg", "Bregarjeva ulica", + "Breznikova ulica", "Brglezov štradon", "Brilejeva ulica", + "Brodarjev trg", "Brodska cesta", "Burnikova ulica", "Cankarjev vrh", + "Cankarjevo nabrežje", "Carja Dušana ulica", "Celarčeva ulica", + "Celjska ulica", "Celovška cesta", "Cerkniška ulica", + "Cerutova ulica", "Cesta Andreja Bitenca", "Cesta Ceneta Štuparja", + "Cesta Dolomitskega odreda", "Cesta II. grupe odredov", + "Cesta Ljubljanske brigade", "Cesta na Bellevue", "Cesta na Bokalce", + "Cesta na Brinovec", "Cesta na Brod", "Cesta na Ježah", + "Cesta na Kope", "Cesta na Laze", "Cesta na Loko", "Cesta na Mesarico", + "Cesta na Ozare", "Cesta na Poljane", "Cesta na Prevoje", + "Cesta na Urh", "Cesta na Vrhovce", "Cesta slov. kmečkih uporov", + "Cesta Urške Zatlerjeve", "Cesta v Dvor", "Cesta v Gameljne", + "Cesta v Hrastje", "Cesta v hrib", "Cesta v Kleče", "Cesta v Kostanj", + "Cesta v Legarico", "Cesta v Mestni log", "Cesta v Pečale", + "Cesta v Prod", "Cesta v Rožno dolino", "Cesta v Šmartno", + "Cesta v Zeleni log", "Cesta v Zgornji log", "Cesta vstaje", + "Cesta 24. junija", "Cesta 25 talcev", "Cesta 27. aprila", + "Chengdujska cesta", "Chopinov prehod", "Cigaletova ulica", + "Cilenškova ulica", "Cimermanova ulica", "Cimpermanova ulica", + "Cizejeva ulica", "Clevelandska ulica", "Colnarjeva ulica", + "Cvetlična pot", "Čampova ulica", "Čanžekova ulica", + "Čargova ulica", "Čebelarska ulica", "Čehova ulica", + "Čepelnikova ulica", "Čepovanska ulica", "Čerinova ulica", + "Černigojeva ulica", "Černivčeva ulica", "Červanova ulica", + "Čevljarska ulica", "Čižmanova ulica", "Čopova ulica", "Črna pot", + "Črnuška cesta", "Črtomirova ulica", "Čučkova ulica", + "Dajnkova ulica", "Dalmatinova ulica", "Danile Kumarjeve ulica", + "Dečkova ulica", "Dečmanova ulica", "Delakova ulica", + "Demšarjeva cesta", "Derčeva ulica", "Dergančeva ulica", + "Dermotova ulica", "Detelova ulica", "Devinska ulica", "Devova ulica", + "Divjakova ulica", "Do proge", "Dobrajčeva ulica", "Dobrdobska ulica", + "Dolenjska cesta", "Dolgi breg", "Dolgi most", "Dolharjeva ulica", + "Dolinarjeva ulica", "Dolinškova ulica", "Dolničarjeva ulica", + "Dolomitska ulica", "Drabosnjakova ulica", "Draga", "Draveljska ulica", + "Dražgoška ulica", "Drenikov vrh", "Drenikova ulica", + "Dunajska cesta", "Dvojna ulica", "Dvorakova ulica", "Dvorni trg", + "Eipprova ulica", "Ellerjeva ulica", "Emonska cesta", + "Erbežnikova ulica", "Erjavčeva cesta", "Fabianijeva ulica", + "Fani Grumove ulica", "Ferberjeva ulica", "Filipičeva ulica", + "Flajšmanova ulica", "Flandrova ulica", "Forsterjeva ulica", + "Franketova ulica", "Frankopanska ulica", "Frenkova pot", + "Friškovec", "Funtkova ulica", "Fužinska cesta", "Gabrov trg", + "Gača", "Galičeva ulica", "Galjevica", "Gallusovo nabrežje", + "Gasilska cesta", "Gasparijeva ulica", "Gašperšičeva ulica", + "Gerbičeva ulica", "Gestrinova ulica", "Glavarjeva ulica", + "Gledališka stolba", "Glinška ulica", "Glinškova ploščad", + "Glonarjeva ulica", "Gmajnice", "Gobarska pot", "Godeževa ulica", + "Gola Loka", "Golarjeva ulica", "Goljarjeva pot", "Golouhova ulica", + "Goriška ulica", "Gorjančeva ulica", "Gorjupova ulica", + "Gornji Rudnik I", "Gornji Rudnik II", "Gornji Rudnik III", + "Gornji trg", "Goropečnikova ulica", "Gortanova ulica", + "Gospodinjska ulica", "Gosposka ulica", "Gosposvetska cesta", + "Govekarjeva ulica", "Gozdna pot", "Grablovičeva ulica", + "Gradišče", "Gradnikova ulica", "Grafenauerjeva ulica", + "Grajski drevored", "Grajzerjeva ulica", "Gramozna pot", + "Grassellijeva ulica", "Gregorčičeva ulica", "Gregorinova ulica", + "Grintovška ulica", "Grobeljca", "Grobeljska pot", "Groharjeva cesta", + "Groznikova ulica", "Grška ulica", "Grško", "Gruberjevo nabrežje", + "Grudnovo nabrežje", "Gubčeva ulica", "Gunceljska cesta", + "Gustinčarjeva ulica", "Gustinčičeva ulica", "Hacetova ulica", + "Hafnerjeva ulica", "Hajdrihova ulica", "Hauptmanca", + "Hladilniška pot", "Hladnikova cesta", "Hlebčeva ulica", + "Hotimirova ulica", "Hradeckega cesta", "Hranilniška ulica", + "Hribarjevo nabrežje", "Hribernikova ulica", "Hribovska pot", + "Hrvaška ulica", "Hrvatski trg", "Hubadova ulica", "Hudourniška pot", + "Idrijska ulica", "Igriška ulica", "Ilešičeva ulica", + "Ilovški štradon", "Industrijska cesta", "Ingličeva ulica", + "Italijanska ulica", "Izletniška ulica", "Ižanska cesta", + "Jakčeva ulica", "Jakhljeva ulica", "Jakopičev drevored", + "Jakopičevo sprehajališče", "Jakšičeva ulica", "Jalnova ulica", + "Jamova cesta", "Janežičeva cesta", "Janova ulica", "Janševa ulica", + "Jarčeva ulica", "Jarnikova ulica", "Jarše", "Jarška cesta", + "Javorškova ulica", "Jazbečeva pot", "Jelinčičeva ulica", + "Jenkova ulica", "Jensenova ulica", "Jerajeva ulica", + "Jeranova ulica", "Jesenkova ulica", "Jesihov štradon", + "Jezerska ulica", "Ježa", "Ježica", "Joškov štradon", + "Jurčičev trg", "Jurčkova cesta", "Juričeva ulica", + "Juvanova ulica", "K reaktorju", "Kadilnikova ulica", + "Kajuhova ulica", "Kalingerjeva ulica", "Kalinova ulica", + "Kaminova ulica", "Kamniška ulica", "Kamnogoriška cesta", + "Kančeva ulica", "Kanonijeva cesta", "Kantetova ulica", + "Kapusova ulica", "Kardeljeva ploščad", "Karingerjeva ulica", + "Karunova ulica", "Kastelčeva ulica", "Kašeljska cesta", + "Kavadarska cesta", "Kavčičeva ulica", "Kavškova ulica", + "Kekčeva ulica", "Kermaunerjeva ulica", "Kernova cesta", + "Kerševanova ulica", "Keržičeva ulica", "Kettejeva ulica", + "Kladezna ulica", "Klančarjeva ulica", "Kleče", + "Klemenova ulica", "Kleparska steza", "Ključavničarska ulica", + "Klunova ulica", "Kmečka pot", "Knafljev prehod", + "Knezov štradon", "Knezova ulica", "Knobleharjeva ulica", + "Koblarjeva ulica", "Kocbekova ulica", "Kocenova ulica", + "Kocjanova ulica", "Kočenska ulica", "Kodrova ulica", + "Kogojeva ulica", "Kogovškova ulica", "Kokaljeva ulica", + "Kolarjeva ulica", "Kolesarska pot", "Koleševa ulica", + "Kolinska ulica", "Kolmanova ulica", "Kolodvorska ulica", + "Komanova ulica", "Komenskega ulica", "Kongresni trg", + "Kopališka ulica", "Kopitarjeva ulica", "Kopna pot", "Koprska ulica", + "Koreninova ulica", "Koroška ulica", "Korotanska ulica", + "Kosančeva ulica", "Koseskega ulica", "Koseška cesta", + "Kosmačeva ulica", "Kosova ulica", "Kosovelova ulica", + "Koširjeva ulica", "Kotnikova ulica", "Kovačeva ulica", + "Kovaška ulica", "Kovinarska ulica", "Kozakova ulica", + "Kozinova ulica", "Kozlarjeva pot", "Koželjeva ulica", + "Krakovski nasip", "Kraljeva ulica", "Kranerjeva ulica", + "Kraška ulica", "Kratka pot", "Kratka steza", "Kregarjeva ulica", + "Kreljeva ulica", "Kremžarjeva ulica", "Krimska ulica", + "Krištofova ulica", "Kriva pot", "Krivec", "Križevniška soteska", + "Križna ulica", "Krmčeva ulica", "Krmeljeva ulica", + "Kropova ulica", "Krošljeva ulica", "Krovska ulica", "Krožna pot", + "Kržičeva ulica", "Kudrova ulica", "Kuhljeva cesta", + "Kumerdejeva ulica", "Kumerjeve ulica", "Kumrovška ulica", + "Kurilniška ulica", "Kurirska ulica", "Kusoldova ulica", + "Kuštrinova ulica", "Kuzeletova ulica", "Kuzmičeva ulica", + "Lahova pot", "Lajovčeva ulica", "Laknerjeva ulica", "Lakotence", + "Lampetova ulica", "Lamutova ulica", "Langusova ulica", "Latinski trg", + "Lavrinova ulica", "Layerjeva ulica", "Lazarjeva ulica", + "Legatova ulica", "Lemeževa ulica", "Lepi pot", "Lepodvorska ulica", + "Leskovičeva ulica", "Letališka cesta", "Levarjeva ulica", + "Levičnikova ulica", "Levstikov trg", "Levstikova ulica", + "Linhartov podhod", "Linhartova cesta", "Lipahova ulica", + "Litijska cesta", "Litostrojska cesta", "Livada", "Livarska ulica", + "Ločnikarjeva ulica", "Lončarska steza", "Lorenzova cesta", + "Lovrenčičeva ulica", "Lovska ulica", "Lovšetova ulica", + "Lubejeva ulica", "Luize Pesjakove ulica", "Lunačkova ulica", + "Mačja steza", "Mačkov kot", "Mačkova ulica", "Madžarska ulica", + "Magistrova ulica", "Maistrova ulica", "Majaronova ulica", + "Majde Vrhovnikove ulica", "Majorja Lavriča ulica", "Makucova ulica", + "Mala ulica", "Mala vas", "Malejeva ulica", "Malenškova ulica", + "Malgajeva ulica", "Mali štradon", "Mali trg", "Malnarjeva ulica", + "Marčenkova ulica", "Marentičeva ulica", "Mareška pot", + "Marice Kovačeve ulica", "Marincljeva ulica", "Marinovševa cesta", + "Maroltova ulica", "Martina Krpana ulica", "Martinčeva ulica", + "Martinova ulica", "Marušičeva ulica", "Masarykova cesta", + "Matjanova pot", "Matjaževa ulica", "Maurerjeva ulica", + "Mazovčeva pot", "Med hmeljniki", "Medarska ulica", "Medenska cesta", + "Medveščkova ulica", "Mekinčeva ulica", "Melikova ulica", + "Mencingerjeva ulica", "Merčnikova ulica", "Merosodna ulica", + "Mesesnelova ulica", "Mestni trg", "Meškova ulica", "Metelkova ulica", + "Miheličeva cesta", "Mihov štradon", "Miklavčeva ulica", + "Miklošičeva cesta", "Mikuževa ulica", "Milčetova pot", + "Mire Lenardičeve ulica", "Mirje", "Mirna pot", "Mislejeva ulica", + "Mizarska pot", "Mladinska ulica", "Mlake", "Mlinska pot", + "Močnikova ulica", "Mokrška ulica", "Molekova ulica", + "Moškričeva ulica", "Mrharjeva ulica", "Mrzelova ulica", + "Murkova ulica", "Murnikova ulica", "Murnova ulica", "Muzejska ulica", + "Na cvetači", "Na delih", "Na dolih", "Na gaju", "Na gmajni", + "Na Herši", "Na jami", "Na klančku", "Na Korošci", "Na Palcah", + "Na požaru", "Na produ", "Na Rojah", "Na Stolbi", "Na Straški vrh", + "Na Trati", "Na Žalah", "Nade Ovčakove ulica", "Nadgoriška cesta", + "Nahlikova ulica", "Nahtigalova ulica", "Nanoška ulica", + "Nazorjeva ulica", "Nebotičnikov prehod", "Nedohova ulica", + "Njegoševa cesta", "Nova ulica", "Novakova pot", "Novakova ulica", + "Novi trg", "Novinarska ulica", "Novo naselje", "Novo Polje, cesta I", + "Novo Polje, cesta III", "Novo Polje, cesta IV", + "Novo Polje, cesta V", "Novo Polje, cesta VI", "Novo Polje, cesta VII", + "Novo Polje, cesta X", "Novo Polje, cesta XI", "Novo Polje, cesta XII", + "Novo Polje, cesta XIV", "Novo Polje, cesta XIX", + "Novo Polje, cesta XVI", "Novo Polje, cesta XVII", + "Novo Polje, cesta XXI", "Novo Polje, cesta XXIII", "Novosadska ulica", + "Ob daljnovodu", "Ob dolenjski železnici", "Ob Farjevcu", + "Ob Ljubljanici", "Ob Mejašu", "Ob potoku", "Ob pristanu", "Ob Savi", + "Ob studencu", "Ob zdravstvenem domu", "Ob zeleni jami", "Ob zelenici", + "Ob žici", "Obirska ulica", "Obrežna steza", "Obrije", + "Ocvirkova ulica", "Ogrinčeva ulica", "Okiškega ulica", + "Omahnova ulica", "Omejčeva ulica", "Omersova ulica", + "Oražnova ulica", "Orlova ulica", "Osenjakova ulica", + "Osojna pot", "Osojna steza", "Osterčeva ulica", "Ovčakova ulica", + "Pahorjeva ulica", "Palmejeva ulica", "Papirniška pot", + "Park Ajdovščina", "Park Arturo Toscanini", + "Parmova ulica", "Parmska cesta", "Partizanska ulica", + "Pavlovčeva ulica", "Pavšičeva ulica", "Pečarjeva ulica", + "Pečnik", "Pečnikova ulica", "Pegamova ulica", "Perčeva ulica", + "Periška cesta", "Perkova ulica", "Peršinova cesta", + "Pesarska cesta", "Pestotnikova ulica", "Peščena pot", + "Petkova ulica", "Petkovškovo nabrežje", "Petrčeva ulica", + "Pilonova ulica", "Pionirska pot", "Pipanova pot", "Pirnatova ulica", + "Planinska cesta", "Planinškova ulica", "Plečnikov podhod", + "Plemljeva ulica", "Plešičeva ulica", "Pleteršnikova ulica", + "Pločanska ulica", "Pod akacijami", "Pod bregom", "Pod bresti", + "Pod bukvami", "Pod Debnim vrhom", "Pod gabri", "Pod gozdom", + "Pod hrasti", "Pod hribom", "Pod hruško", "Pod jelšami", + "Pod jezom", "Pod ježami", "Pod Kamno gorico", "Pod klancem", + "Pod lipami", "Pod topoli", "Pod Trančo", "Pod turnom", "Pod vrbami", + "Podgornikova ulica", "Podgorska cesta", "Podgrajska cesta", + "Podjunska ulica", "Podlimbarskega ulica", "Podmilščakova ulica", + "Podrožniška pot", "Podsmreška cesta", "Podutiška cesta", + "Pogačarjev trg", "Pohlinova ulica", "Poklukarjeva ulica", + "Polakova ulica", "Polanškova ulica", "Poljanska cesta", + "Polje", "Polje, cesta I", "Polje, cesta II", "Polje, cesta III", + "Polje, cesta VI", "Polje, cesta VIII", "Polje, cesta X", + "Polje, cesta XIV", "Polje, cesta XL", "Polje, cesta XLII", + "Polje, cesta XLVI", "Polje, cesta XVI", "Polje, cesta XVIII", + "Polje, cesta XXII", "Polje, cesta XXIV", "Polje, cesta XXVI", + "Polje, cesta XXX", "Polje, cesta XXXII", "Polje, cesta XXXIV", + "Polje, cesta XXXVIII", "Poljedelska ulica", "Poljska pot", + "Porentova ulica", "Posavskega ulica", "Postojnska ulica", + "Pot do šole", "Pot Draga Jakopiča", "Pot heroja Trtnika", + "Pot k igrišču", "Pot k ribniku", "Pot k Savi", "Pot k sejmišču", + "Pot k studencu", "Pot na Breje", "Pot na Drenikov vrh", + "Pot na Golovec", "Pot na goro", "Pot na Gradišče", "Pot na Grič", + "Pot na Labar", "Pot na mah", "Pot na most", "Pot na Orle", + "Pot na Visoko", "Pot na Zduše", "Pot Rdečega križa", + "Pot v boršt", "Pot v Čeželj", "Pot v dolino", "Pot v Goričico", + "Pot v hribec", "Pot v mejah", "Pot v Mlake", "Pot v Podgorje", + "Pot v Zeleni gaj", "Pot za Brdom", "Pot za razori", + "Potokarjeva ulica", "Potrčeva ulica", "Povšetova ulica", + "Prašnikarjeva ulica", "Praznikova ulica", "Pražakova ulica", + "Pred Savljami", "Predjamska cesta", "Predor pod Gradom", + "Preglov trg", "Prekmurska ulica", "Prelčeva ulica", "Preloge", + "Premrlova ulica", "Preradovićeva ulica", "Preserska ulica", + "Prešernov trg", "Prešernova cesta", "Pretnarjeva ulica", + "Pri borštu", "Pri brvi", "Pri malem kamnu", "Pri mostiščarjih", + "Pribinova ulica", "Prijateljeva ulica", "Primorska ulica", + "Prinčičeva ulica", "Prisojna ulica", "Prištinska ulica", "Privoz", + "Proletarska cesta", "Prule", "Prušnikova ulica", "Prvomajska ulica", + "Pšatnik", "Pšatska pot", "Ptujska ulica", "Pučnikova ulica", + "Puharjeva ulica", "Puhova ulica", "Puhtejeva ulica", + "Puterlejeva ulica", "Putrihova ulica", "Raičeva ulica", + "Rakovniška ulica", "Rakuševa ulica", "Ramovševa ulica", + "Ravbarjeva ulica", "Ravna pot", "Ravnikova ulica", + "Razgledna steza", "Reber", "Reboljeva ulica", "Rečna ulica", + "Regentova cesta", "Resljeva cesta", "Reška ulica", + "Ribičičeva ulica", "Ribji trg", "Ribniška ulica", + "Rimska cesta", "Rjava cesta", "Robbova ulica", "Robičeva ulica", + "Rodičeva ulica", "Rojčeva ulica", "Romavhova ulica", "Rosna pot", + "Rotarjeva ulica", "Rovšnikova ulica", "Rozmanova ulica", + "Rožanska ulica", "Rožičeva ulica", "Rožna dolina, cesta I", + "Rožna dolina, cesta III", "Rožna dolina, cesta IV", + "Rožna dolina, cesta V", "Rožna dolina, cesta VI", + "Rožna dolina, cesta VIII", "Rožna dolina, cesta X", + "Rožna dolina, cesta XII", "Rožna dolina, cesta XIII", + "Rožna dolina, cesta XV", "Rožna dolina, cesta XVII", + "Rožna ulica", "Rudnik I", "Rudnik II", "Rudnik III", "Runkova ulica", + "Ruska ulica", "Rutarjeva ulica", "Sadinja vas", "Sajovčeva ulica", + "Samova ulica", "Saškova ulica", "Sattnerjeva ulica", + "Savinova ulica", "Savinškova ulica", "Savlje", "Savska cesta", + "Sedejeva ulica", "Selanov trg", "Selanova ulica", + "Setnikarjeva ulica", "Seunigova ulica", "Simončičeva ulica", + "Siva pot", "Skapinova ulica", "Sketova ulica", "Skopčeva ulica", + "Skrbinškova ulica", "Slape", "Slapnikova ulica", "Slavčja ulica", + "Slomškova ulica", "Slovenčeva ulica", "Slovenska cesta", + "Smoletova ulica", "Smrekarjeva ulica", "Smrtnikova ulica", + "Snebersko nabrežje", "Snežniška ulica", "Snojeva ulica", + "Sojerjeva ulica", "Sončna pot", "Sostrska cesta", "Soška ulica", + "Soteška pot", "Soussenska ulica", "Sovretova ulica", + "Spodnji Rudnik I", "Spodnji Rudnik II", "Spodnji Rudnik III", + "Spodnji Rudnik V", "Spomeniška pot", "Srebrničeva ulica", + "Srednja pot", "Stadionska ulica", "Staničeva ulica", + "Stara Ježica", "Stara slovenska ulica", "Stare Črnuče", + "Stari trg", "Stegne", "Steletova ulica", "Sternadova ulica", + "Stiška ulica", "Stolpniška ulica", "Stoženska ulica", "Stožice", + "Stražarjeva ulica", "Streliška ulica", "Stritarjeva ulica", + "Strmeckijeva ulica", "Strmi pot", "Strniševa cesta", + "Strossmayerjeva ulica", "Strugarska ulica", "Strupijevo nabrežje", + "Suhadolčanova ulica", "Sulčja ulica", "Svetčeva ulica", + "Šarhova ulica", "Šentjakob", "Šentviška ulica", + "Šerkova ulica", "Šestova ulica", "Šibeniška ulica", + "Šinkov štradon", "Šišenska cesta", "Šivičeva ulica", + "Škerljeva ulica", "Škofova ulica", "Škrabčeva ulica", + "Šlandrova ulica", "Šlosarjeva ulica", "Šmarna gora", + "Šmartinska cesta", "Šmartno", "Španova pot", "Španska ulica", + "Štajerska cesta", "Štebijeva cesta", "Štefančeva ulica", + "Štembalova ulica", "Štepanjska cesta", "Štepanjsko nabrežje", + "Štirnova ulica", "Štradon čez Prošco", "Štrekljeva ulica", + "Študentovska ulica", "Štukljeva cesta", "Štula", + "Šturmova ulica", "Šubičeva ulica", "Šumarjeva ulica", + "Švabićeva ulica", "Švarova ulica", "Švegljeva cesta", "Tabor", + "Tacenska cesta", "Tavčarjeva ulica", "Tbilisijska ulica", + "Tesarska ulica", "Teslova ulica", "Tesna ulica", "Tesovnikova ulica", + "Tiha ulica", "Tiranova ulica", "Tischlerjeva ulica", + "Tivolska cesta", "Tkalska ulica", "Tobačna ulica", "Tolminska ulica", + "Tomačevo", "Tomačevska cesta", "Tomažičeva ulica", + "Tometova ulica", "Tominškova ulica", "Tomišeljska ulica", + "Toplarniška ulica", "Topniška ulica", "Torkarjeva ulica", + "Tratnikova ulica", "Travniška ulica", "Trbeže", "Trdinova ulica", + "Trebušakova ulica", "Trg francoske revolucije", + "Trg mladih", "Trg mladinskih delov. brigad", "Trg narodnih herojev", + "Trg prekomorskih brigad", "Trg republike", "Trg 9. maja", + "Trinkova ulica", "Trnovčeva ulica", "Trnovska ulica", + "Trpinčeva ulica", "Trstenjakova ulica", "Trtnikova ulica", + "Tržaška cesta", "Tržna ulica", "Tugomerjeva ulica", + "Turnerjeva ulica", "Turnsko nabrežje", "Udvančeva ulica", + "Ulica aktivistov", "Ulica Alme Sodnik", "Ulica Andreja Kumarja", + "Ulica Angelce Ocepkove", "Ulica Angele Ljubičeve", + "Ulica borca Petra", "Ulica borcev za severno mejo", + "Ulica bratov Bezlajev", "Ulica bratov Blanč", "Ulica bratov Jančar", + "Ulica bratov Komel", "Ulica bratov Kraljič", "Ulica bratov Martinec", + "Ulica bratov Novak", "Ulica bratov Rozmanov", "Ulica bratov Škofov", + "Ulica bratov Učakar", "Ulica bratov Židan", + "Ulica Dušana Kraigherja", "Ulica Ernesta Kramerja", + "Ulica Franca Nebca", "Ulica Francke Jerasove", "Ulica Franja Novaka", + "Ulica gledališča BTC", "Ulica Goce Delčeva", + "Ulica Gubčeve brigade", "Ulica Hermana Potočnika", + "Ulica Ivana Roba", "Ulica Ivanke Kožuh", "Ulica Ivice Pirjevčeve", + "Ulica Janeza Pavla II.", "Ulica Janeza Rožiča", + "Ulica Jožeta Jame", "Ulica Jožeta Japlja", "Ulica Jožeta Mirtiča", + "Ulica Konrada Babnika", "Ulica Koroškega bataljona", + "Ulica Lizike Jančarjeve", "Ulica Lojzeta Spacala", + "Ulica Lovre Klemenčiča", "Ulica Malči Beličeve", + "Ulica Marije Drakslerjeve", "Ulica Marije Hvaličeve", + "Ulica Marje Boršnikove", "Ulica Marka Šlajmerja", + "Ulica Milana Majcna", "Ulica Milke Kerinove", "Ulica Minke Bobnar", + "Ulica Mirka Jurce", "Ulica Mirka Tomšiča", "Ulica Miroslava Turka", + "Ulica Molniške čete", "Ulica na Grad", "Ulica Nade Čamernikove", + "Ulica Olge Mohorjeve", "Ulica padlih borcev", "Ulica Pariške komune", + "Ulica Pohorskega bataljona", "Ulica Polonce Čude", + "Ulica prvoborcev", "Ulica Rezke Dragarjeve", "Ulica Rezke Klopčič", + "Ulica Rudolfa Janežiča", "Ulica Staneta Severja", + "Ulica Štefke Zbašnikove", "Ulica talcev", + "Ulica Tončke Čečeve", "Ulica v Kokovšek", + "Ulica Vide Pregarčeve", "Ulica Vladimirja Trampuža", + "Ulica Zore Ragancinove", "Ulica Žanke Erjavec", + "Ulica 15. aprila", "Ulica 15. maja", "Ulica 24. avgusta", + "Ulica 4. julija", "Ulica 7. septembra", "Ulica 9. junija", + "Uršičev štradon", "Usnjarska ulica", "V Češnjico", "V dolini", + "V Karlovce", "V Karlovce", "V Kladeh", "V Murglah", "V Sige", + "V Varde", "V Zalar", "Vagajeva ulica", "Valjavčeva ulica", + "Valvasorjeva ulica", "Vandotova ulica", "Vaška pot", + "Večna pot", "Vegova ulica", "Velebitska ulica", + "Veliki štradon", "Velikovška ulica", "Velnarjeva ulica", + "Verovškova ulica", "Veršičeva ulica", "Veselova ulica", + "Videmska ulica", "Vidergarjeva ulica", "Vidičeva ulica", + "Vidovdanska cesta", "Vilharjev podhod", "Vilharjeva cesta", + "Vinterca", "Vipavska ulica", "Vipotnikova ulica", "Viška cesta", + "Vižmarska pot", "Vodmatska ulica", "Vodmatski trg", "Vodna steza", + "Vodnikova cesta", "Vodnikovo naselje", "Vodovodna cesta", + "Vogelna ulica", "Vojkova cesta", "Volaričeva ulica", + "Vošnjakova ulica", "Vozna pot na Grad", "Vožarski pot", + "Vrazov trg", "Vrbovec", "Vrbska ulica", "Vregova ulica", + "Vrhovci, cesta I", "Vrhovci, cesta II", "Vrhovci, cesta III", + "Vrhovci, cesta IX", "Vrhovci, cesta V", "Vrhovci, cesta VI", + "Vrhovci, cesta X", "Vrhovci, cesta XI", "Vrhovci, cesta XII", + "Vrhovci, cesta XIV", "Vrhovci, cesta XIX", "Vrhovci, cesta XV", + "Vrhovci, cesta XVII", "Vrhovci, cesta XVIII", "Vrhovci, cesta XX", + "Vrhovci, cesta XXII", "Vrhovci, cesta XXVI", "Vrhovci, cesta XXVIII", + "Vrhovci, cesta XXXII", "Vrhovčeva ulica", "Vrhovnikova ulica", + "Vrtača", "Vrtna ulica", "Vrtnarska cesta", "Vulčeva ulica", + "Vzajemna ulica", "Windischerjeva ulica", "Wolfova ulica", + "Za Garažami", "Za gasilskim domom", "Za Gradom", "Za krajem", + "Za opekarno", "Za partizanskim domom", "Za progo", "Za vasjo", + "Zadnikarjeva ulica", "Zadobrovška cesta", "Zadružna ulica", + "Zajčeva pot", "Zajčevi dvori", "Zakotnikova ulica", + "Zalaznikova ulica", "Zaletelova ulica", "Zaloška cesta", + "Zarnikova ulica", "Zasavska cesta", "Zatišje", "Zavetiška ulica", + "Završje", "Zbašnikova ulica", "Zdešarjeva cesta", + "Zelena pot", "Zelenova ulica", "Zeljarska ulica", + "Zevnikova ulica", "Zidarjev štradon", "Ziherlova ulica", + "Zlatek", "Znamenjska ulica", "Zofke Kvedrove ulica", "Zoisova cesta", + "Zupanova ulica", "Zvezda", "Zvezdarska ulica", "Zvezna ulica", + "Žabarjeva ulica", "Žabjak", "Žalska ulica", "Žaucerjeva ulica", + "Žeje", "Železna cesta", "Železnikarjeva ulica", "Žerjalova ulica", + "Židankova ulica", "Židovska steza", "Židovska ulica", "Živaličeva ulica", "Živinozdravska ulica", "Žolgerjeva ulica", ) @@ -420,95 +420,92 @@ class Provider(AddressProvider): ) countries = ( - "Afganistan", "Islamska republika Afganistan", "Albanija", - "Alžirija", "Ljudska demokratična republika Alžirija", "Andora", - "Angola", "Republika Angola", "Antigva in Barbuda", "Argentina", - "Armenija", "Republika Armenija", "Avstralija", "Avstrija", - "Azerbajdžan", "Azerbajdžanska republika", "Bahami", "Zveza Bahami", - "Država Bahrajn", "Bangladeš", "Ljudska republika Bangladeš", - "Belgija", "Kraljevina Belgija", "Belize", "Belorusija", - "Benin", "Republika Benin", "Bocvana", "Republika Bocvana", - "Republika Bolgarija", "Bolivija", "Republika Bolivija", - "Brazilija", "Federativna republika Brazilija", "Brunej", - "Burkina Faso", "Burundi", "Republika Burundi", "Butan", - "Ciper", "Republika Ciper", "Čad", "Republika Čad", "Češka", - "Čile", "Republika Čile", "Črna gora", "Republika Črna gora", - "Kraljevina Danska", "Dominika", "Zveza Dominika", - "Džibuti", "Republika Džibuti", "Egipt", "Arabska republika Egipt", - "Republika Ekvador", "Ekvatorialna Gvineja", "Eritreja", - "Estonija", "Republika Estonija", "Etiopija", "Fidži", - "Filipini", "Republika Filipini", "Finska", "Republika Finska", - "Francoska republika", "Gabon", "Gabonska republika", "Gambija", - "Gana", "Republika Gana", "Grčija", "Helenska republika", "Grenada", - "Gvajana", "Republika Gvajana", "Gvatemala", "Republika Gvatemala", - "Republika Gvineja", "Gvineja Bissau", "Republika Gvineja Bissau", - "Republika Haiti", "Honduras", "Republika Honduras", "Hrvaška", - "Indija", "Republika Indija", "Indonezija", "Republika Indonezija", - "Republika Irak", "Iran", "Islamska republika Iran", "Irska", - "Republika Islandija", "Italija", "Italijanska republika", "Izrael", - "Jamajka", "Japonska", "Jemen", "Republika Jemen", "Jordanija", - "Južna Afrika", "Republika Južna Afrika", "Južna Koreja", - "Kambodža", "Kraljevina Kambodža", "Kamerun", "Republika Kamerun", - "Katar", "Država Katar", "Kazahstan", "Republika Kazahstan", "Kenija", - "Kirgizistan", "Kirgiška republika", "Kiribati", "Kitajska", - "Kolumbija", "Republika Kolumbija", "Komori", - "Kongo", "Republika Kongo", "Demokratična republika Kongo", - "Republika Kostarika", "Kuba", "Republika Kuba", "Kuvajt", - "Laos", "Laoška ljudska demokratična republika", "Latvija", - "Lesoto", "Kraljevina Lesoto", "Libanon", "Libanonska republika", - "Republika Liberija", "Libija", "Libijska arabska džamahirija", - "Lihtenštajn", "Kneževina Lihtenštajn", "Litva", "Republika Litva", - "Veliko vojvodstvo Luksemburg", "Madagaskar", "Republika Madagaskar", - "Republika Madžarska", "Makedonija", "Republika Makedonija", "Malavi", - "Maldivi", "Republika Maldivi", "Malezija", "Mali", "Republika Mali", - "Republika Malta", "Maroko", "Kraljevina Maroko", "Marshallovi otoki", - "Mauritius", "Republika Mauritius", "Mavretanija", - "Mehika", "Združene mehiške države", "Mikronezija", - "Mjanmar", "Zveza Mjanmar", "Moldavija", "Moldavija, Republika", - "Kneževina Monako", "Mongolija", "Mozambik", "Republika Mozambik", - "Republika Namibija", "Nauru", "Republika Nauru", "Nemčija", - "Nepal", "Kraljevina Nepal", "Niger", "Republika Niger", "Nigerija", - "Nikaragva", "Republika Nikaragva", "Nizozemska", - "Norveška", "Kraljevina Norveška", "Nova Zelandija", "Oman", - "Pakistan", "Islamska republika Pakistan", "Palau", "Republika Palau", - "Republika Panama", "Papua Nova Gvineja", "Paragvaj", - "Peru", "Republika Peru", "Poljska", "Republika Poljska", - "Portugalska republika", "Romunija", "Ruanda", "Republika Ruanda", - "Ruska federacija", "Saint Kitts in Nevis", "Saint Lucia", - "Salomonovi otoki", "Salvador", "Republika Salvador", "San Marino", - "Sao Tome in Principe", "Demokratična republika Sao Tome in Principe", - "Kraljevina Saudova Arabija", "Sejšeli", "Republika Sejšeli", - "Republika Senegal", "Severna Koreja", - "Sierra Leone", "Republika Sierra Leone", "Singapur", - "Sirija", "Sirska arabska republika", "Slonokoščena obala", - "Slovaška", "Slovaška republika", "Slovenija", "Republika Slovenija", - "Somalska demokratična republika", "Srbija", "Republika Srbija", - "Sudan", "Republika Sudan", "Surinam", "Republika Surinam", "Svazi", - "Španija", "Kraljevina Španija", "Šrilanka", - "Švedska", "Kraljevina Švedska", "Švica", - "Tadžikistan", "Republika Tadžikistan", "Tajska", - "Tajvan", "Tajvan, Provinca Kitajske", "Tanzanija", - "Togo", "Togoška republika", "Tonga", "Kraljevina Tonga", - "Republika Trinidad in Tobago", "Tunizija", "Republika Tunizija", - "Republika Turčija", "Turkmenistan", "Tuvalu", "Uganda", - "Ukrajina", "Urugvaj", "Vzhodna republika Urugvaj", "Uzbekistan", - "Vanuatu", "Republika Vanuatu", "Vatikan", - "Velika Britanija", "Združeno kraljestvo", - "Venezuela", "Republika Venezuela", "Vietnam", - "Vzhodni Timor", "Demokratična republika Vzhodni Timor", - "Samoa", "Neodvisna država Zahodna Samoa", "Zambija", - "Združene države Amerike", "Združene države", - "Združeni arabski emirati", "Zelenortski otoki", + "Afganistan", "Islamska republika Afganistan", "Albanija", + "Alžirija", "Ljudska demokratična republika Alžirija", "Andora", + "Angola", "Republika Angola", "Antigva in Barbuda", "Argentina", + "Armenija", "Republika Armenija", "Avstralija", "Avstrija", + "Azerbajdžan", "Azerbajdžanska republika", "Bahami", "Zveza Bahami", + "Država Bahrajn", "Bangladeš", "Ljudska republika Bangladeš", + "Belgija", "Kraljevina Belgija", "Belize", "Belorusija", + "Benin", "Republika Benin", "Bocvana", "Republika Bocvana", + "Republika Bolgarija", "Bolivija", "Republika Bolivija", + "Brazilija", "Federativna republika Brazilija", "Brunej", + "Burkina Faso", "Burundi", "Republika Burundi", "Butan", + "Ciper", "Republika Ciper", "Čad", "Republika Čad", "Češka", + "Čile", "Republika Čile", "Črna gora", "Republika Črna gora", + "Kraljevina Danska", "Dominika", "Zveza Dominika", + "Džibuti", "Republika Džibuti", "Egipt", "Arabska republika Egipt", + "Republika Ekvador", "Ekvatorialna Gvineja", "Eritreja", + "Estonija", "Republika Estonija", "Etiopija", "Fidži", + "Filipini", "Republika Filipini", "Finska", "Republika Finska", + "Francoska republika", "Gabon", "Gabonska republika", "Gambija", + "Gana", "Republika Gana", "Grčija", "Helenska republika", "Grenada", + "Gvajana", "Republika Gvajana", "Gvatemala", "Republika Gvatemala", + "Republika Gvineja", "Gvineja Bissau", "Republika Gvineja Bissau", + "Republika Haiti", "Honduras", "Republika Honduras", "Hrvaška", + "Indija", "Republika Indija", "Indonezija", "Republika Indonezija", + "Republika Irak", "Iran", "Islamska republika Iran", "Irska", + "Republika Islandija", "Italija", "Italijanska republika", "Izrael", + "Jamajka", "Japonska", "Jemen", "Republika Jemen", "Jordanija", + "Južna Afrika", "Republika Južna Afrika", "Južna Koreja", + "Kambodža", "Kraljevina Kambodža", "Kamerun", "Republika Kamerun", + "Katar", "Država Katar", "Kazahstan", "Republika Kazahstan", "Kenija", + "Kirgizistan", "Kirgiška republika", "Kiribati", "Kitajska", + "Kolumbija", "Republika Kolumbija", "Komori", + "Kongo", "Republika Kongo", "Demokratična republika Kongo", + "Republika Kostarika", "Kuba", "Republika Kuba", "Kuvajt", + "Laos", "Laoška ljudska demokratična republika", "Latvija", + "Lesoto", "Kraljevina Lesoto", "Libanon", "Libanonska republika", + "Republika Liberija", "Libija", "Libijska arabska džamahirija", + "Lihtenštajn", "Kneževina Lihtenštajn", "Litva", "Republika Litva", + "Veliko vojvodstvo Luksemburg", "Madagaskar", "Republika Madagaskar", + "Republika Madžarska", "Makedonija", "Republika Makedonija", "Malavi", + "Maldivi", "Republika Maldivi", "Malezija", "Mali", "Republika Mali", + "Republika Malta", "Maroko", "Kraljevina Maroko", "Marshallovi otoki", + "Mauritius", "Republika Mauritius", "Mavretanija", + "Mehika", "Združene mehiške države", "Mikronezija", + "Mjanmar", "Zveza Mjanmar", "Moldavija", "Moldavija, Republika", + "Kneževina Monako", "Mongolija", "Mozambik", "Republika Mozambik", + "Republika Namibija", "Nauru", "Republika Nauru", "Nemčija", + "Nepal", "Kraljevina Nepal", "Niger", "Republika Niger", "Nigerija", + "Nikaragva", "Republika Nikaragva", "Nizozemska", + "Norveška", "Kraljevina Norveška", "Nova Zelandija", "Oman", + "Pakistan", "Islamska republika Pakistan", "Palau", "Republika Palau", + "Republika Panama", "Papua Nova Gvineja", "Paragvaj", + "Peru", "Republika Peru", "Poljska", "Republika Poljska", + "Portugalska republika", "Romunija", "Ruanda", "Republika Ruanda", + "Ruska federacija", "Saint Kitts in Nevis", "Saint Lucia", + "Salomonovi otoki", "Salvador", "Republika Salvador", "San Marino", + "Sao Tome in Principe", "Demokratična republika Sao Tome in Principe", + "Kraljevina Saudova Arabija", "Sejšeli", "Republika Sejšeli", + "Republika Senegal", "Severna Koreja", + "Sierra Leone", "Republika Sierra Leone", "Singapur", + "Sirija", "Sirska arabska republika", "Slonokoščena obala", + "Slovaška", "Slovaška republika", "Slovenija", "Republika Slovenija", + "Somalska demokratična republika", "Srbija", "Republika Srbija", + "Sudan", "Republika Sudan", "Surinam", "Republika Surinam", "Svazi", + "Španija", "Kraljevina Španija", "Šrilanka", + "Švedska", "Kraljevina Švedska", "Švica", + "Tadžikistan", "Republika Tadžikistan", "Tajska", + "Tajvan", "Tajvan, Provinca Kitajske", "Tanzanija", + "Togo", "Togoška republika", "Tonga", "Kraljevina Tonga", + "Republika Trinidad in Tobago", "Tunizija", "Republika Tunizija", + "Republika Turčija", "Turkmenistan", "Tuvalu", "Uganda", + "Ukrajina", "Urugvaj", "Vzhodna republika Urugvaj", "Uzbekistan", + "Vanuatu", "Republika Vanuatu", "Vatikan", + "Velika Britanija", "Združeno kraljestvo", + "Venezuela", "Republika Venezuela", "Vietnam", + "Vzhodni Timor", "Demokratična republika Vzhodni Timor", + "Samoa", "Neodvisna država Zahodna Samoa", "Zambija", + "Združene države Amerike", "Združene države", + "Združeni arabski emirati", "Zelenortski otoki", ) - @classmethod - def city_name(cls): - return cls.random_element(cls.cities) + def city_name(self): + return self.random_element(self.cities) - @classmethod - def street_name(cls): - return cls.random_element(cls.streets) + def street_name(self): + return self.random_element(self.streets) - @classmethod - def state(cls): - return cls.random_element(cls.states) + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/sv_SE/__init__.py b/src/libs/faker/providers/address/sv_SE/__init__.py new file mode 100644 index 0000000..790d937 --- /dev/null +++ b/src/libs/faker/providers/address/sv_SE/__init__.py @@ -0,0 +1,110 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + + building_number_formats = ('###', '##', '#') + + street_name_formats = ('{{street_prefix}}{{street_suffix}}', ) + + street_address_formats = ('{{street_name}} {{building_number}}',) + + street_prefixes = ( + 'Björk', 'Järnvägs', 'Ring', 'Skol', 'Skogs', 'Ny', 'Gran', 'Idrotts', + 'Stor', 'Kyrk', 'Industri', 'Park', 'Strand', 'Skol', 'Trädgårds', + 'Industri', 'Ängs', 'Kyrko', 'Park', 'Villa', 'Ek', 'Kvarn', 'Stations', + 'Back', 'Furu', 'Gen', 'Fabriks', 'Åker', 'Bäck', 'Asp' + ) + + street_suffixes = ('gatan', 'gatan', 'vägen', 'vägen', + 'stigen', 'gränd', 'torget') + + address_formats = ("{{street_address}}\n{{postcode}} {{city}}", ) + + postcode_formats = ('#####', ) + + city_formats = ('{{city_name}}', ) + + cities = ( + 'Stockholm', 'Göteborg', 'Malmö', 'Uppsala', 'Västerås', 'Örebro', + 'Linköping', 'Helsingborg', 'Jönköping', 'Norrköping', 'Lund', 'Umeå', + 'Gävle', 'Borås', 'Mölndal', 'Södertälje', 'Eskilstuna', 'Karlstad', + 'Halmstad', 'Växjö', 'Sundsvall', 'Luleå', 'Trollhättan', 'Östersund', + 'Borlänge', 'Falun', 'Kalmar', 'Skövde', 'Kristianstad', 'Karlskrona', + 'Skellefteå', 'Uddevalla', 'Lidingö', 'Motala', 'Landskrona', + 'Örnsköldsvik', 'Nyköping', 'Karlskoga', 'Varberg', 'Trelleborg', + 'Lidköping', 'Alingsås', 'Piteå', 'Sandviken', 'Ängelholm' + ) + + countries = ( + 'Afghanistan', 'Albanien', 'Algeriet', 'Amerikanska Samoa', 'Andorra', + 'Angola', 'Anguilla', 'Antarktis', 'Antigua och Barbuda', 'Argentina', + 'Armenien', 'Aruba', 'Ascension', 'Australien', 'Azerbajdzjan', + 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belgien', 'Belize', + 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnien och Hercegovina', + 'Botswana', 'Brasilien', 'Brittiska Jungfruöarna', 'Brunei', + 'Bulgarien', 'Burkina Faso', 'Burma', 'Burundi', 'Caymanöarna', + 'Centralafrikanska republiken', 'Chile', 'Colombia', 'Cooköarna', + 'Costa Rica', 'Cypern', 'Danmark', 'Diego Garcia', 'Djibouti', + 'Dominica', 'Dominikanska republiken', 'Ecuador', 'Egypten', + 'Ekvatorialguinea', 'Elfenbenskusten', 'El Salvador', 'Eritrea', + 'Estland', 'Etiopien', 'England', 'Falklandsöarna', 'Fiji', + 'Filippinerna', 'Finland', 'Frankrike', 'Franska Guyana', + 'Franska Polynesien', 'Färöarna', 'Förenade Arabemiraten', 'Gabon', + 'Gambia', 'Georgien', 'Ghana', 'Gibraltar', 'Grekland', 'Grenada', + 'Grönland', 'Guadeloupe', 'Guatemala', 'Guinea', 'Guinea-Bissau', + 'Guyana', 'Haiti', 'Honduras', 'Hongkong', 'Indien', 'Indonesien', + 'Irak', 'Iran', 'Irland', 'Island', 'Israel', 'Italien', 'Jamaica', + 'Japan', 'Jemen', 'Jordanien', 'Kambodja', 'Kamerun', 'Kanada', + 'Kap Verde', 'Kazakstan', 'Kenya', 'Kina', 'Kirgizistan', 'Kiribati', + 'Komorerna', 'Kongo-Brazzaville', 'Kongo-Kinshasa', 'Kosovo', + 'Kroatien', 'Kuba', 'Kuwait', 'Laos', 'Lesotho', 'Lettland', 'Libanon', + 'Liberia', 'Libyen', 'Liechtenstein', 'Litauen', 'Luxemburg', 'Macao', + 'Madagaskar', 'Makedonien', 'Malawi', 'Malaysia', 'Maldiverna', 'Mali', + 'Malta', 'Marianerna', 'Marocko', 'Marshallöarna', 'Martinique', + 'Mauretanien', 'Mauritius', 'Mayotte', 'Mexiko', 'Midwayöarna', + 'Mikronesiens federerade stater', 'Moçambique', 'Moldavien', 'Monaco', + 'Mongoliet', 'Montenegro', 'Montserrat', 'Namibia', 'Nauru', + 'Nederländerna', 'Nederländska Antillerna', 'Nepal', + 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Nordkorea', 'Nordmarianerna', + 'Norfolkön', 'Norge', 'Nya Kaledonien', 'Nya Zeeland', 'Oman', + 'Pakistan', 'Palau', 'Palestina', 'Panama', 'Papua Nya Guinea', + 'Paraguay', 'Peru', 'Pitcairnöarna', 'Polen', 'Portugal', 'Qatar', + 'Réunion', 'Rumänien', 'Rwanda', 'Ryssland', 'Saint Kitts och Nevis', + 'Saint Lucia', 'Saint-Pierre och Miquelon', + 'Saint Vincent och Grenadinerna', 'Salomonöarna', 'Samoa', + 'Sankta Helena', 'San Marino', 'São Tomé och Príncipe', + 'Saudiarabien', 'Schweiz', 'Senegal', 'Serbien', 'Seychellerna', + 'SierraLeone', 'Singapore', 'Sint Maarten', 'Slovakien', 'Slovenien', + 'Somalia', 'Spanien', 'Sri Lanka', 'Storbritannien', 'Sudan', + 'Surinam', 'Sverige', 'Swaziland', 'Sydafrika', 'Sydkorea', 'Sydsudan', + 'Syrien', 'Tadzjikistan', 'Taiwan', 'Tanzania', 'Tchad', 'Thailand', + 'Tjeckien', 'Togo', 'Tokelauöarna', 'Tonga', 'Trinidad och Tobago', + 'Tunisien', 'Turkiet', 'Turkmenistan', 'Turks-och Caicosöarna', + 'Tuvalu', 'Tyskland', 'Uganda', 'Ukraina', 'Ungern', 'Uruguay', 'USA', + 'Uzbekistan', 'Vanuatu', 'Vatikanstaten', 'Venezuela', 'Vietnam', + 'Vitryssland', 'Wake', 'Wallis-och Futunaöarna', 'Zambia', 'Zimbabwe', + 'Österrike', 'Östtimor' + ) + + states = ( + 'Stockholms län', 'Uppsala län', 'Södermanlands län' + 'Östergötlands län', 'Jönköpings län', 'Kronobergs län', 'Kalmar län', + 'Gotlands län', 'Blekinge län', 'Skåne län', 'Hallands län', + 'Västra Götalands län', 'Värmlands län', 'Örebro län', + 'Västmanlands län', 'Dalarnas län', 'Gävleborgs län', + 'Västernorrlands län', 'Jämtlands län', 'Västerbottens län', + 'Norrbottens län' + ) + + def street_prefix(self): + return self.random_element(self.street_prefixes) + + def city_name(self): + return self.random_element(self.cities) + + def state(self): + return self.random_element(self.states) diff --git a/src/libs/faker/providers/address/uk_UA/__init__.py b/src/libs/faker/providers/address/uk_UA/__init__.py new file mode 100644 index 0000000..6cc02ee --- /dev/null +++ b/src/libs/faker/providers/address/uk_UA/__init__.py @@ -0,0 +1,69 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + address_formats = ['{{street_address}}, {{city}}, {{postcode}}'] + building_number_formats = ['#', '##', '###'] + city_formats = ['{{city_prefix}} {{first_name}}'] + street_address_formats = ['{{street_name}}, {{building_number}}'] + street_name_formats = ['{{street_prefix}} {{last_name}}', + '{{last_name}} {{street_suffix}}'] + + city_prefixes = ['місто', 'село', 'селище', 'хутір'] + countries = [ + 'Австралія', 'Австрія', 'Азербайджан', 'Албанія', 'Алжир', 'Ангола', + 'Андорра', 'Антигуа і Барбуда', 'Аргентина', 'Афганістан', + 'Багамські Острови', 'Бангладеш', 'Барбадос', 'Бахрейн', 'Беліз', + 'Бельгія', 'Бенін', 'Білорусь', 'Болгарія', 'Болівія', + 'Боснія і Герцеговина', 'Ботсвана', 'Бразилія', 'Бруней', + 'Буркіна-Фасо', 'Бурунді', 'Бутан', 'Вануату', 'Ватикан', + 'Велика Британія', 'Венесуела', 'В\'єтнам', 'Вірменія', 'Габон', + 'Гаїті', 'Гаяна', 'Гамбія', 'Гана', 'Гватемала', 'Гвінея', + 'Гвінея-Бісау', 'Гондурас', 'Гренада', 'Греція', 'Грузія', 'Данія', + 'Джибуті', 'Домініка', 'Домініканська Республіка', 'Еквадор', + 'Екваторіальна Гвінея', 'Еритрея', 'Естонія', 'Ефіопія', 'Єгипет', + 'Ємен', 'Замбія', 'Західна Сахара', 'Зімбабве', 'Ізраїль', 'Індія', + 'Індонезія', 'Ірак', 'Іран', 'Ірландія', 'Ісландія', 'Іспанія', + 'Італія', 'Йорданія', 'Кабо-Верде', 'Казахстан', 'Камбоджа', 'Камерун', + 'Канада', 'Катар', 'Кенія', 'Киргизстан', 'КНР', 'Кіпр', 'Кірибаті', + 'Колумбія', 'Коморські Острови', 'Конго', 'ДР Конго', 'Південна Корея', + 'Північна Корея', 'Косово', 'Коста-Рика', 'Кот-д\'Івуар', 'Куба', + 'Кувейт', 'Лаос', 'Латвія', 'Лесото', 'Литва', 'Ліберія', 'Ліван', + 'Лівія', 'Ліхтенштейн', 'Люксембург', 'Маврикій', 'Мавританія', + 'Мадагаскар', 'Республіка Македонія', 'Малаві', 'Малайзія', 'Малі', + 'Мальдіви', 'Мальта', 'Марокко', 'Маршаллові Острови', 'Мексика', + 'Федеративні Штати Мікронезії', 'Мозамбік', 'Молдова', 'Монако', + 'Монголія', 'М\'янма', 'Намібія', 'Науру', 'Непал', 'Нігер', 'Нігерія', + 'Нідерланди', 'Нікарагуа', 'Німеччина', 'Нова Зеландія', 'Норвегія', + 'ОАЕ', 'Оман', 'Пакистан', 'Палау', 'Палестинська держава', 'Панама', + 'Папуа Нова Гвінея', 'ПАР', 'Парагвай', 'Перу', 'Південний Судан', + 'Польща', 'Португалія', 'Росія', 'Руанда', 'Румунія', 'Сальвадор', + 'Самоа', 'Сан-Марино', 'Сан-Томе і Принсіпі', 'Саудівська Аравія', + 'Свазіленд', 'Сейшельські Острови', 'Сенегал', + 'Сент-Вінсент і Гренадини', 'Сент-Кіттс і Невіс', 'Сент-Люсія', + 'Сербія', 'Сінгапур', 'Сирія', 'Словаччина', 'Словенія', + 'Соломонові Острови', 'Сомалі', 'Судан', 'Суринам', 'Східний Тимор', + 'США', 'Сьєрра-Леоне', 'Таджикистан', 'Таїланд', 'Тайвань', 'Танзанія', + 'Того', 'Тонга', 'Тринідад і Тобаго', 'Тувалу', 'Туніс', 'Туреччина', + 'Туркменістан', 'Уганда', 'Угорщина', 'Узбекистан', 'Україна', + 'Уругвай', 'Фіджі', 'Філіппіни', 'Фінляндія', 'Франція', 'Хорватія', + 'Центральноафриканська Республіка', 'Чад', 'Чехія', 'Чилі', + 'Чорногорія', 'Швейцарія', 'Швеція', 'Шрі-Ланка', 'Ямайка', 'Японія' + ] + street_prefixes = [ + 'вулиця', 'проспект', 'майдан', 'набережна', 'бульвар', 'провулок' + ] + street_suffixes = ['узвіз'] + + def city_prefix(self): + return self.random_element(self.city_prefixes) + + def postcode(self): + """The code consists of five digits (01000-99999)""" + return '{}{}'.format(self.generator.random.randint(0, 10), self.generator.random.randint(1000, 10000)) + + def street_prefix(self): + return self.random_element(self.street_prefixes) diff --git a/src/libs/faker/providers/address/zh_CN/__init__.py b/src/libs/faker/providers/address/zh_CN/__init__.py new file mode 100644 index 0000000..7286cf3 --- /dev/null +++ b/src/libs/faker/providers/address/zh_CN/__init__.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_suffixes = ("市", "县") + city_formats = ("{{city_name}}{{city_suffix}}", "{{first_name}}{{city_suffix}}") + + district_formats = ("{{district}}区",) + + building_number_formats = ("?座",) + postcode_formats = ("%#####",) + + street_suffixes = ("街", "路",) + street_name_formats = ("{{city_name}}{{street_suffix}}", "{{last_name}}{{street_suffix}}") + street_address_formats = ("{{street_name}}{{building_number}}",) + + address_formats = ("{{province}}{{city}}{{district}}{{street_address}} {{postcode}}",) + + provinces = ( + "内蒙古自治区", "山西省", "河北省", "吉林省", "江苏省", "辽宁省", "黑龍江省", + "安徽省", "山东省", "浙江省", "江西省", "福建省", "湖南省", "湖北省", + "河南省", "广东省", "广西壮族自治区", "贵州省", "海南省", "四川省", "云南省", + "陕西省", "甘肃省", "宁夏回族自治区", "青海省", "新疆维吾尔自治区", "西藏自治区", + ) + districts = ( + "西夏", "永川", "秀英", "高港", "清城", "兴山", "锡山", "清河", + "龙潭", "华龙", "海陵", "滨城", "东丽", "高坪", "沙湾", "平山", + "城北", "海港", "沙市", "双滦", "长寿", "山亭", "南湖", "浔阳", + "南长", "友好", "安次", "翔安", "沈河", "魏都", "西峰", "萧山", + "金平", "沈北新", "孝南", "上街", "城东", "牧野", "大东", + "白云", "花溪", "吉区", "新城", "怀柔", "六枝特", "涪城", + "清浦", "南溪", "淄川", "高明", "东城", "崇文", "朝阳", "大兴", + "房山", "门头沟", "黄浦", "徐汇", "静安", "普陀", "闵行", "和平", + "蓟州", "永川", "长寿", "璧山", "合川", "梁平", "丰都", "江北", + ) + cities = ( + "北京", "上海", "天津", "重庆", "哈尔滨", "长春", "沈阳", "呼和浩特", + "石家庄", "乌鲁木齐", "兰州", "西宁", "西安", "银川", "郑州", "济南", "太原", + "合肥", "武汉", "长沙", "南京", "成都", "贵阳", "昆明", "南宁", "拉萨", + "杭州", "南昌", "广州", "福州", "台北", "海口", "香港", "澳门", "通辽", + "兴安盟", "太原", "辛集", "邯郸", "沈阳", "辽阳", "兴城", "北镇", "阜新", + "哈尔滨", "齐齐哈尔", "淮安", "张家港", "海门", "六安", "巢湖", "马鞍山", + "永安", "宁德", "嘉禾", "荆门", "潜江", "大冶", "宜都", "佛山", "深圳", + "潮州", "惠州", "汕尾", "东莞", "梧州", "柳州", "合山", "六盘水", "关岭", ) + countries = ( + "阿富汗", "阿拉斯加", "阿尔巴尼亚", "阿尔及利亚", "安道尔", "安哥拉", "安圭拉岛英", "安提瓜和巴布达", + "阿根廷", "亚美尼亚", "阿鲁巴岛", "阿森松", "澳大利亚", "奥地利", "阿塞拜疆", "巴林", "孟加拉国", + "巴巴多斯", "白俄罗斯", "比利时", "伯利兹", "贝宁", "百慕大群岛", "不丹", "玻利维亚", "波斯尼亚和黑塞哥维那", + "博茨瓦纳", "巴西", "保加利亚", "布基纳法索", "布隆迪", "喀麦隆", "加拿大", "加那利群岛", "佛得角", + "开曼群岛", "中非", "乍得", "智利", "圣诞岛", "科科斯岛", "哥伦比亚", "巴哈马国", "多米尼克国", "科摩罗", + "刚果", "科克群岛", "哥斯达黎加", "克罗地亚", "古巴", "塞浦路斯", "捷克", "丹麦", "迪戈加西亚岛", "吉布提", + "多米尼加共和国", "厄瓜多尔", "埃及", "萨尔瓦多", "赤道几内亚", "厄立特里亚", "爱沙尼亚", "埃塞俄比亚", "福克兰群岛", + "法罗群岛", "斐济", "芬兰", "法国", "法属圭亚那", "法属波里尼西亚", "加蓬", "冈比亚", "格鲁吉亚", "德国", "加纳", + "直布罗陀", "希腊", "格陵兰岛", "格林纳达", "瓜德罗普岛", "关岛", "危地马拉", "几内亚", "几内亚比绍", "圭亚那", + "海地", "夏威夷", "洪都拉斯", "匈牙利", "冰岛", "印度", "印度尼西亚", "伊郎", "伊拉克", "爱尔兰", "以色列", + "意大利", "科特迪瓦", "牙买加", "日本", "约旦", "柬埔塞", "哈萨克斯坦", "肯尼亚", "基里巴斯", "朝鲜", "韩国", + "科威特", "吉尔吉斯斯坦", "老挝", "拉脱维亚", "黎巴嫩", "莱索托", "利比里亚", "利比亚", "列支敦士登", "立陶宛", + "卢森堡", "马其顿", "马达加斯加", "马拉维", "马来西亚", "马尔代夫", "马里", "马耳他", "马里亚纳群岛", "马绍尔群岛", + "马提尼克", "毛里塔尼亚", "毛里求斯", "马约特岛", "墨西哥", "密克罗尼西亚", "中途岛", "摩尔多瓦", "摩纳哥", "蒙古", + "蒙特塞拉特岛", "摩洛哥", "莫桑比克", "缅甸", "纳米比亚", "瑙鲁", "尼泊尔", "荷兰", "荷属安的列斯群岛", "新喀里多尼亚群岛", + "新西兰", "尼加拉瓜", "尼日尔", "尼日利亚", "纽埃岛", "诺福克岛", "挪威", "阿曼", "帕劳", "巴拿马", "巴布亚新几内亚", + "巴拉圭", "秘鲁", "菲律宾", "波兰", "葡萄牙", "巴基斯坦", "波多黎各", "卡塔尔", "留尼汪岛", "罗马尼亚", "俄罗斯", + "卢旺达", "东萨摩亚", "西萨摩亚", "圣马力诺", "圣皮埃尔岛及密克隆岛", "圣多美和普林西比", "沙特阿拉伯", "塞内加尔", + "塞舌尔", "新加坡", "斯洛伐克", "斯洛文尼亚", "所罗门群岛", "索马里", "南非", "西班牙", "斯里兰卡", "圣克里斯托弗和尼维斯", + "圣赫勒拿", "圣卢西亚", "圣文森特岛", "苏丹", "苏里南", "斯威士兰", "瑞典", "瑞士", "叙利亚", "塔吉克斯坦", "坦桑尼亚", + "泰国", "阿拉伯联合酋长国", "多哥", "托克劳群岛", "汤加", "特立尼达和多巴哥", "突尼斯", "土耳其", "土库曼斯坦", + "特克斯和凯科斯群岛", "图瓦卢", "美国", "乌干达", "乌克兰", "英国", "乌拉圭", "乌兹别克斯坦", "瓦努阿图", + "梵蒂冈", "委内瑞拉", "越南", "维尔京群岛", "维尔京群岛和圣罗克伊", "威克岛", "瓦里斯和富士那群岛", "西撒哈拉", + "也门", "南斯拉夫", "扎伊尔", "赞比亚", "桑给巴尔", "津巴布韦", "中华人民共和国", "中国", + ) + + def building_number(self): + return self.lexify(self.random_element(self.building_number_formats)) + + def city_name(self): + return self.random_element(self.cities) + + def province(self): + return self.random_element(self.provinces) + + def district(self): + return self.random_element(self.districts) diff --git a/src/libs/faker/providers/address/zh_TW/__init__.py b/src/libs/faker/providers/address/zh_TW/__init__.py new file mode 100644 index 0000000..af12e22 --- /dev/null +++ b/src/libs/faker/providers/address/zh_TW/__init__.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as AddressProvider + + +class Provider(AddressProvider): + city_formats = ("{{city_name}}", ) + building_number_formats = ("%號", "%#號", "%##號", ) + postcode_formats = ("%####", "%##", ) + section_formats = ( "", "", "", "", "%段", ) + street_address_formats = ( "{{street_name}}{{street_name_suffix}}{{section_number}}{{building_number}}", ) + city_formats = ( "{{city_name}}{{city_name_suffix}}", ) + address_formats = ("{{postcode}} {{city}}{{street_address}}{{secondary_address}}", ) + secondary_address_formats = ('#樓', '之#') + + street_names = ("中正", "中山", "民生", "中華", "和平", + "中興", "仁愛", "復興", "民族", "民權", + "忠孝", "信義", "成功", "新興", "新生", + "動物園", "淡水", "新生", "文化", "大同", + "三民", "新生", "光復", "自強", "光明", + "公園", "文山", "松山", "新店", "建國", + "西門", "古亭", "迴龍", "中山", "新莊", + "蘆洲", "永安", "四維", "大橋頭", "府中", + "福德", "大同", "文昌", "土城", "博愛", + "象山", "光華", "太平", "水源", "莒光", + "廣慈", "大仁", "中央", "大智", "林森", + "長春", "南", "劍南", "大坪", "國凱" + "八德", "天母", "東興", "勝利", "頂福州", + "東湖", "大勇", "民有", "自由", "長安", + "明德", "大安", "龍山寺", "德", "忠義", + "中和", "自由", "新埔", "永和", "延平", + "正義", "五福", "華興", "育英", "平和", + "福安", "小碧潭", "永寧", "育英", "興", + "自立", "民享", "昆陽", "民治", "關渡", + "學府", "奇岩", "紅樹林", "和街", "民富", + "關渡", "北投", "石牌", "芝山", "景美", + "士林", "劍潭", "雙連", "新北投", "萬隆") + + street_suffixes = ( "路", "街", "巷" ) + + cities = ("基隆", "台北", "新北", "桃園", "新竹", + "新竹", "苗栗", "台中", "彰化", "南投", + "雲林", "嘉義", "桃園", "台南", "高雄", + "屏東", "台東", "花蓮", "宜蘭", "澎湖", + "金門", "連江", "太保", "朴子", "馬公", + "頭份", "臺東", "斗六", "員林", "竹北", + "平鎮", "臺中", "八德", "板橋", "大里", + "鳳山", "豐原", "蘆洲", "蘆竹", "三重", + "樹林", "太平", "新營", "新營", "汐止", + "楊梅", "永和", "永康", "中和", "中壢", + "阿里山", "白沙", "褒忠", "北斗", "北竿", + "北港", "卑南", "草屯", "梅山", "牡丹", + "橫山", "光復", "關山", "古坑", "竹田") + + city_suffixes = ( "市", "縣" ) + + # from + countries = ("阿爾巴尼亞", "剛果共和國", "阿爾及利亞", "丹麥", + "安哥拉", "多明尼加", "安圭拉", "多米尼克", + "阿根廷", "厄瓜多爾", "亞美尼亞", "埃及", + "阿路巴", "薩爾瓦多", "澳大利亞", "厄利垂亞", + "奧地利", "愛沙尼亞", "亞塞拜然", "衣索匹亞", + "巴哈馬", "斐濟", "巴林", "芬蘭", "孟加拉", "法屬玻里尼西亞", + "法國", "巴貝多", "加彭", "白俄羅斯", "喬治亞", + "比利時", "德國", "貝里斯", "迦納", "貝南", "直布羅陀", + "百慕達", "英國", "不丹", "希臘", "玻利維亞", "格瑞那達", + "波希尼亞及赫塞哥維那", "瓜地馬拉", "波札那", "幾內亞", + "巴西", "蓋亞那", "汶萊", "海地", "保加利亞", "宏都拉斯", + "布吉納法索", "香港", "蒲隆地", "匈牙利", "柬埔寨", "冰島", + "喀麥隆", "印度", "加拿大", "印尼", "維德角島", "依朗", + "開曼群島", "伊拉克", "中非共和國", "愛爾蘭", "查德", "以色列", + "智利", "義大利", "中國大陸", "牙買加", "哥倫比亞", "日本", + "剛果", "約旦", "科克群島", "肯亞", "哥斯大黎加", "韓國", + "象牙海岸", "科威特", "克羅埃西亞", "寮國", "塞浦路斯", "拉脫維亞", + "捷克", "賴索托", "盧森堡", "聖露西亞", "澳門", "聖文森及格瑞那丁", + "馬其頓", "聖多美及普林西比", "馬達加斯加", "沙烏地阿拉伯", + "馬拉威", "塞內加爾", "馬來西亞", "塞席爾", "馬爾地夫", "獅子山", + "馬利", "新加坡", "馬爾他", "斯洛伐克", "模里西斯", "斯洛維尼亞", + "茅利塔尼亞", "索羅門群島", "墨西哥", "索馬利亞", + "摩爾多瓦", "南非", "蒙古", "西班牙", "摩洛哥", "斯里蘭卡", + "緬甸", "蘇丹", "納米比亞", "蘇利南", "諾魯", "史瓦濟蘭", + "尼泊爾", "瑞典", "荷蘭", "瑞士", "新喀里多尼亞", "敘利亞", + "紐西蘭", "坦尚尼亞", "尼日", "泰國", "奈及利亞", "多哥", + "挪威", "千里達及托貝哥", "阿曼", "突尼西亞", "巴基斯坦", "土耳其", + "巴拿馬", "烏干達", "巴布亞紐幾內亞", "烏克蘭", + "巴拉圭", "阿拉伯聯合大公國", "秘魯", "美國", "菲律賓", "烏拉圭", + "波蘭", "委內瑞拉", "葡萄牙", "越南", "卡達", "西薩摩亞", + "羅馬尼亞", "葉門", "俄羅斯", "尚比亞", "盧安達", "辛巴威", + "聖克里斯多福及尼維斯") + + def secondary_address(self): + return self.numerify(self.random_element(self.secondary_address_formats)) + + def building_number(self): + return self.numerify(self.random_element(self.building_number_formats)) + + def street_name(self): + return self.random_element(self.street_names) + + def street_name_suffix(self): + return self.random_element(self.street_suffixes) + + def city_name(self): + return self.random_element(self.cities) + + def city_name_suffix(self): + return self.random_element(self.city_suffixes) + + def section_number(self): + return self.numerify(self.random_element(self.section_formats)) diff --git a/src/libs/faker/providers/automotive/__init__.py b/src/libs/faker/providers/automotive/__init__.py new file mode 100644 index 0000000..2287d90 --- /dev/null +++ b/src/libs/faker/providers/automotive/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 + +localized = True + +from .. import BaseProvider +from string import ascii_uppercase +import re + +class Provider(BaseProvider): + license_formats = () + + def license_plate(self): + temp = re.sub(r'\?', + lambda x: self.random_element(ascii_uppercase), + self.random_element(self.license_formats)) + return self.numerify(temp) diff --git a/src/libs/faker/providers/automotive/ar_JO/__init__.py b/src/libs/faker/providers/automotive/ar_JO/__init__.py new file mode 100644 index 0000000..362e084 --- /dev/null +++ b/src/libs/faker/providers/automotive/ar_JO/__init__.py @@ -0,0 +1,42 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + # Source: https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Jordan + license_formats = ( + '{{initials}}-####', + '{{initials}}-#####', + ) + + def initials(self): + return self.random_element([ + '1', # Ministers + '2', '3', # Parliament + '5', # General Government + + '6', # Aqaba free zone + '7', '8', # Diplomatic + '9', # Temporary + '10', '23', # Passenger cars + '38', '39', # Crew cabs + '41', '42', # Light goods vehicles + '44', # Tractors + '46', # Motorcycles and scooters + '50', # Taxi + '56', # Small buses + '58', # Coaches + '60', # HGVs + '70', # Rental Cars + '71', # Trailer + '90', # Army + '95', # Ambulance + '96', # Gendarmerie + '99', # Police + ]) + + def license_plate(self): + pattern = self.random_element(self.license_formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/libs/faker/providers/automotive/ar_PS/__init__.py b/src/libs/faker/providers/automotive/ar_PS/__init__.py new file mode 100644 index 0000000..4c43cad --- /dev/null +++ b/src/libs/faker/providers/automotive/ar_PS/__init__.py @@ -0,0 +1,62 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + # Source: https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_the_Palestinian_National_Authority + license_formats = ( + # Private vehicles + '{{district}}-####-3#', + '{{district}}-####-4#', + '{{district}}-####-7#', + '{{district}}-####-9#', + # Public transport + '{{district}}-####-30', + # Authority vehicles + '####', + # New police vehicles + '####-99', + + # Gaza strip after 2012 + + # Private + '1-####-0#', + '3-####-0#', + # Commercial + '1-####-1#', + '3-####-1#', + # Public + '1-####-2#', + '3-####-2#', + # Municipal + '1-####-4#', + '3-####-4#', + # Governmental, and Governmental personal vehicles + '1-####-5#', + '3-####-5#', + ) + + def district(self): + return self.random_element([ + # Gaza Strip + '1', + '3', + + # Northern West Bank (Nablus, Tulkarm, Qalqilya, Jenin) + '4', + '7', + + # Central West Bank (Ramallah, Jerusalem, Jericho) + '5', + '6', + + # Southern West Bank (Bethlehem, Hebron) + '8', + '9', + ]) + + def license_plate(self): + pattern = self.random_element(self.license_formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/libs/faker/providers/automotive/ar_SA/__init__.py b/src/libs/faker/providers/automotive/ar_SA/__init__.py new file mode 100644 index 0000000..0b43cac --- /dev/null +++ b/src/libs/faker/providers/automotive/ar_SA/__init__.py @@ -0,0 +1,81 @@ +# coding=utf-8 + +from __future__ import unicode_literals + +import re + +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + # Source: https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Saudi_Arabia + LICENSE_FORMAT_EN = '#### ???' + LICENSE_FORMAT_AR = '? ? ? ####' + + PLATE_CHARS_EN = 'ABDEGHJKLNRSTUVXZ' + PLATE_CHARS_AR = 'أبدعقهحكلنرسطوىصم' + + PLATE_MAP = { + 'A': 'ا', + 'B': 'ب', + 'D': 'د', + 'E': 'ع', + 'G': 'ق', + 'H': 'ه', + 'J': 'ح', + 'K': 'ك', + 'L': 'ل', + 'N': 'ن', + 'R': 'ر', + 'S': 'س', + 'T': 'ط', + 'U': 'و', + 'V': 'ى', + 'X': 'ص', + 'Z': 'م', + + '0': '٠', + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + } + + def license_plate_en(self): + return self.bothify( + self.LICENSE_FORMAT_EN, letters=self.PLATE_CHARS_EN + ) + + def license_plate_ar(self): + english_plate = self.license_plate_en() + return self._translate_license_plate(english_plate) + + def _translate_license_plate(self, license_plate): + nums = list(reversed(license_plate[0:4])) + chars = list(license_plate[5:8]) + + numerated = re.sub( + r'\#', + lambda x: self.PLATE_MAP[nums.pop()], + self.LICENSE_FORMAT_AR + ) + ar_plate = re.sub( + r'\?', + lambda x: self.PLATE_MAP[chars.pop()], + numerated + ) + + return ar_plate + + def license_plate(self): + en_palate = self.license_plate_en() + ar_palate = self._translate_license_plate(en_palate) + + return en_palate, ar_palate + + diff --git a/src/libs/faker/providers/automotive/en_CA/__init__.py b/src/libs/faker/providers/automotive/en_CA/__init__.py new file mode 100644 index 0000000..473a7a4 --- /dev/null +++ b/src/libs/faker/providers/automotive/en_CA/__init__.py @@ -0,0 +1,42 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + # from https://www.revolvy.com/main/index.php?s=Canadian%20licence%20plate%20designs%20and%20serial%20formats + license_formats = ( + # Alberta + '???-####', + # BC + '??# ##?', + '?? ####', + # Manitoba + '??? ###', + # New Brunswick + '??? ###', + # Newfoundland and Labrador + '??? ###', + # NWT + '######', + # Nova Scotia + '??? ###', + # Nunavut + '### ###', + # Ontario + '### ???', + '???? ###', + '??# ###', + '### #??', + '?? ####', + 'GV??-###', + # PEI + '## ##??', + # Quebec + '?## ???', + # Saskatchewan + '### ???', + # Yukon + '???##' + ) \ No newline at end of file diff --git a/src/libs/faker/providers/automotive/en_GB/__init__.py b/src/libs/faker/providers/automotive/en_GB/__init__.py new file mode 100644 index 0000000..b84c196 --- /dev/null +++ b/src/libs/faker/providers/automotive/en_GB/__init__.py @@ -0,0 +1,12 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + # from https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_the_United_Kingdom + license_formats = ( + '??## ???', + '??##???' + ) \ No newline at end of file diff --git a/src/libs/faker/providers/automotive/en_US/__init__.py b/src/libs/faker/providers/automotive/en_US/__init__.py new file mode 100644 index 0000000..8d2c9ea --- /dev/null +++ b/src/libs/faker/providers/automotive/en_US/__init__.py @@ -0,0 +1,164 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + +class Provider(AutomotiveProvider): + # from https://en.wikipedia.org/wiki/United_States_license_plate_designs_and_serial_formats#Current_standard-issue_passenger_plate_designs_and_serial_formats + license_formats = ( + # Alabama + '#??####', + '##??###', + # Alaska + '### ???', + # American Samoa + '####', + # Arizona + '???####', + # Arkansas + '### ???', + '###???', + # California + '#???###', + # Colarado + '###-???', + '???-###', + # Conneticut + '###-???', + # Delaware + '######', + # DC + '??-####', + # Florda + '??? ?##', + '### ???', + '?## #??', + '### #??', + # Georgia + '???####', + # Guam + '?? ####', + # Hawaii + '??? ###', + 'H?? ###', + 'Z?? ###', + 'K?? ###', + 'L?? ###', + 'M?? ###', + # Idaho + '? ######', + '#? #####', + '#? ?####', + '#? ??###', + '#? #?#???', + '#? ####?', + '##? ####', + # Illinois + '?? #####', + '??# ####', + # Indiana + '###?', + '###??', + '###???', + # Iowa + '??? ###', + # Kansas + '### ???', + # Kentucky + '### ???', + # Louisiana + '### ???', + # Maine + '#### ??', + # Maryland + '#??####', + # Massachusetts + '#??? ##', + '#?? ###', + '### ??#', + '##? ?##', + # Michigan + '### ???', + '#?? ?##', + # Minnesota + '###-???', + # Mississippi + '??? ###', + # Missouri + '??# ?#?', + # Montana + '#-#####?', + '##-####?', + # Nebraska + '??? ###', + '#-?####', + '##-?###', + '##-??##', + # Nevada + '##?•###', + # New Hampshire + '### ####', + # New Jersey + '?##-???', + # New Mexico + '###-???', + '???-###', + # New York + '???-####', + # North Carolina + '###-????', + # North Dakota + '### ???', + # Nothern Mariana Islands + '??? ###', + # Ohio + '??? ####', + # Oklahoma + '???-###', + # Oregon + '### ???', + # Pennsylvania + '???-####', + # Peurto Rico + '???-###', + # Rhode Island + '###-###', + # South Carolina + '### #??', + # South Dakota + '#?? ###', + '#?? ?##', + '##? ###', + '##? ?##', + '##? ??#', + # Tennessee + '?##-##?', + # Texas + '???-####', + # Utah + '?## #??', + '?## #??', + # Vermont + '??? ###', + '##??#', + '#??##', + '###?#', + '#?###', + # US Virgin Islands + '??? ###', + # Virginia + '???-####', + # Washington + '???####', + '###-???' + # West Virginia + '#?? ###', + '??? ###', + # Wisconsin + '???-####', + '###-???' + # Wyoming + '#-#####', + '#-####?', + '##-#####' + ) \ No newline at end of file diff --git a/src/libs/faker/providers/automotive/hu_HU/__init__.py b/src/libs/faker/providers/automotive/hu_HU/__init__.py new file mode 100644 index 0000000..7bbc3fd --- /dev/null +++ b/src/libs/faker/providers/automotive/hu_HU/__init__.py @@ -0,0 +1,11 @@ +# coding=utf-8 + + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + +class Provider(AutomotiveProvider): + # from https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Hungary + license_formats = ( + '???-###', + ) diff --git a/src/libs/faker/providers/automotive/id_ID/__init__.py b/src/libs/faker/providers/automotive/id_ID/__init__.py new file mode 100644 index 0000000..888a4d8 --- /dev/null +++ b/src/libs/faker/providers/automotive/id_ID/__init__.py @@ -0,0 +1,17 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as AutomotiveProvider + +class Provider(AutomotiveProvider): + # Currently this is my own work + license_formats = ( + '? ### ??', + '? ### ???', + '?? ### ??', + '?? ### ???', + '? #### ??', + '? #### ???', + '?? #### ??', + '?? #### ???', + ) diff --git a/src/libs/faker/providers/automotive/pt_BR/__init__.py b/src/libs/faker/providers/automotive/pt_BR/__init__.py new file mode 100644 index 0000000..cc99192 --- /dev/null +++ b/src/libs/faker/providers/automotive/pt_BR/__init__.py @@ -0,0 +1,11 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + + license_formats = ( + '???-####', + ) diff --git a/src/libs/faker/providers/barcode/__init__.py b/src/libs/faker/providers/barcode/__init__.py new file mode 100644 index 0000000..f0914df --- /dev/null +++ b/src/libs/faker/providers/barcode/__init__.py @@ -0,0 +1,30 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import BaseProvider + + +class Provider(BaseProvider): + + def ean(self, length=13): + code = [self.random_digit() for i in range(length - 1)] + + if length not in (8, 13): + raise AssertionError("length can only be 8 or 13") + + if length == 8: + weights = [3, 1, 3, 1, 3, 1, 3] + elif length == 13: + weights = [1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3] + + weighted_sum = sum([x * y for x, y in zip(code, weights)]) + check_digit = (10 - weighted_sum % 10) % 10 + code.append(check_digit) + + return ''.join(str(x) for x in code) + + def ean8(self): + return self.ean(8) + + def ean13(self): + return self.ean(13) diff --git a/src/libs/faker/providers/barcode/en_US/__init__.py b/src/libs/faker/providers/barcode/en_US/__init__.py new file mode 100644 index 0000000..1793279 --- /dev/null +++ b/src/libs/faker/providers/barcode/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as BarCodeProvider + + +class Provider(BarCodeProvider): + pass diff --git a/src/libs/faker/providers/color/__init__.py b/src/libs/faker/providers/color/__init__.py new file mode 100644 index 0000000..ad314a6 --- /dev/null +++ b/src/libs/faker/providers/color/__init__.py @@ -0,0 +1,177 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import BaseProvider + +localized = True + + +class Provider(BaseProvider): + all_colors = OrderedDict(( + ("AliceBlue", "#F0F8FF"), + ("AntiqueWhite", "#FAEBD7"), + ("Aqua", "#00FFFF"), + ("Aquamarine", "#7FFFD4"), + ("Azure", "#F0FFFF"), + ("Beige", "#F5F5DC"), + ("Bisque", "#FFE4C4"), + ("Black", "#000000"), + ("BlanchedAlmond", "#FFEBCD"), + ("Blue", "#0000FF"), + ("BlueViolet", "#8A2BE2"), + ("Brown", "#A52A2A"), + ("BurlyWood", "#DEB887"), + ("CadetBlue", "#5F9EA0"), + ("Chartreuse", "#7FFF00"), + ("Chocolate", "#D2691E"), + ("Coral", "#FF7F50"), + ("CornflowerBlue", "#6495ED"), + ("Cornsilk", "#FFF8DC"), + ("Crimson", "#DC143C"), + ("Cyan", "#00FFFF"), + ("DarkBlue", "#00008B"), + ("DarkCyan", "#008B8B"), + ("DarkGoldenRod", "#B8860B"), + ("DarkGray", "#A9A9A9"), + ("DarkGreen", "#006400"), + ("DarkKhaki", "#BDB76B"), + ("DarkMagenta", "#8B008B"), + ("DarkOliveGreen", "#556B2F"), + ("DarkOrange", "#FF8C00"), + ("DarkOrchid", "#9932CC"), + ("DarkRed", "#8B0000"), + ("DarkSalmon", "#E9967A"), + ("DarkSeaGreen", "#8FBC8F"), + ("DarkSlateBlue", "#483D8B"), + ("DarkSlateGray", "#2F4F4F"), + ("DarkTurquoise", "#00CED1"), + ("DarkViolet", "#9400D3"), + ("DeepPink", "#FF1493"), + ("DeepSkyBlue", "#00BFFF"), + ("DimGray", "#696969"), + ("DodgerBlue", "#1E90FF"), + ("FireBrick", "#B22222"), + ("FloralWhite", "#FFFAF0"), + ("ForestGreen", "#228B22"), + ("Fuchsia", "#FF00FF"), + ("Gainsboro", "#DCDCDC"), + ("GhostWhite", "#F8F8FF"), + ("Gold", "#FFD700"), + ("GoldenRod", "#DAA520"), + ("Gray", "#808080"), + ("Green", "#008000"), + ("GreenYellow", "#ADFF2F"), + ("HoneyDew", "#F0FFF0"), + ("HotPink", "#FF69B4"), + ("IndianRed", "#CD5C5C"), + ("Indigo", "#4B0082"), + ("Ivory", "#FFFFF0"), + ("Khaki", "#F0E68C"), + ("Lavender", "#E6E6FA"), + ("LavenderBlush", "#FFF0F5"), + ("LawnGreen", "#7CFC00"), + ("LemonChiffon", "#FFFACD"), + ("LightBlue", "#ADD8E6"), + ("LightCoral", "#F08080"), + ("LightCyan", "#E0FFFF"), + ("LightGoldenRodYellow", "#FAFAD2"), + ("LightGray", "#D3D3D3"), + ("LightGreen", "#90EE90"), + ("LightPink", "#FFB6C1"), + ("LightSalmon", "#FFA07A"), + ("LightSeaGreen", "#20B2AA"), + ("LightSkyBlue", "#87CEFA"), + ("LightSlateGray", "#778899"), + ("LightSteelBlue", "#B0C4DE"), + ("LightYellow", "#FFFFE0"), + ("Lime", "#00FF00"), + ("LimeGreen", "#32CD32"), + ("Linen", "#FAF0E6"), + ("Magenta", "#FF00FF"), + ("Maroon", "#800000"), + ("MediumAquaMarine", "#66CDAA"), + ("MediumBlue", "#0000CD"), + ("MediumOrchid", "#BA55D3"), + ("MediumPurple", "#9370DB"), + ("MediumSeaGreen", "#3CB371"), + ("MediumSlateBlue", "#7B68EE"), + ("MediumSpringGreen", "#00FA9A"), + ("MediumTurquoise", "#48D1CC"), + ("MediumVioletRed", "#C71585"), + ("MidnightBlue", "#191970"), + ("MintCream", "#F5FFFA"), + ("MistyRose", "#FFE4E1"), + ("Moccasin", "#FFE4B5"), + ("NavajoWhite", "#FFDEAD"), + ("Navy", "#000080"), + ("OldLace", "#FDF5E6"), + ("Olive", "#808000"), + ("OliveDrab", "#6B8E23"), + ("Orange", "#FFA500"), + ("OrangeRed", "#FF4500"), + ("Orchid", "#DA70D6"), + ("PaleGoldenRod", "#EEE8AA"), + ("PaleGreen", "#98FB98"), + ("PaleTurquoise", "#AFEEEE"), + ("PaleVioletRed", "#DB7093"), + ("PapayaWhip", "#FFEFD5"), + ("PeachPuff", "#FFDAB9"), + ("Peru", "#CD853F"), + ("Pink", "#FFC0CB"), + ("Plum", "#DDA0DD"), + ("PowderBlue", "#B0E0E6"), + ("Purple", "#800080"), + ("Red", "#FF0000"), + ("RosyBrown", "#BC8F8F"), + ("RoyalBlue", "#4169E1"), + ("SaddleBrown", "#8B4513"), + ("Salmon", "#FA8072"), + ("SandyBrown", "#F4A460"), + ("SeaGreen", "#2E8B57"), + ("SeaShell", "#FFF5EE"), + ("Sienna", "#A0522D"), + ("Silver", "#C0C0C0"), + ("SkyBlue", "#87CEEB"), + ("SlateBlue", "#6A5ACD"), + ("SlateGray", "#708090"), + ("Snow", "#FFFAFA"), + ("SpringGreen", "#00FF7F"), + ("SteelBlue", "#4682B4"), + ("Tan", "#D2B48C"), + ("Teal", "#008080"), + ("Thistle", "#D8BFD8"), + ("Tomato", "#FF6347"), + ("Turquoise", "#40E0D0"), + ("Violet", "#EE82EE"), + ("Wheat", "#F5DEB3"), + ("White", "#FFFFFF"), + ("WhiteSmoke", "#F5F5F5"), + ("Yellow", "#FFFF00"), + ("YellowGreen", "#9ACD3"), + )) + + safe_colors = ( + 'black', 'maroon', 'green', 'navy', 'olive', + 'purple', 'teal', 'lime', 'blue', 'silver', + 'gray', 'yellow', 'fuchsia', 'aqua', 'white', + ) + + def color_name(self): + return self.random_element(self.all_colors.keys()) + + def safe_color_name(self): + return self.random_element(self.safe_colors) + + def hex_color(self): + return "#{0}".format(("%x" % self.random_int(1, 16777215)).ljust(6, '0')) + + def safe_hex_color(self): + color = ("%x" % self.random_int(0, 255)).ljust(3, '0') + return "#{0}{0}{1}{1}{2}{2}".format(*color) + + def rgb_color(self): + return ','.join(map(str, (self.random_int(0, 255) for _ in range(3)))) + + def rgb_css_color(self): + return 'rgb(%s)' % ','.join(map(str, (self.random_int(0, 255) for _ in range(3)))) diff --git a/src/libs/faker/providers/color/ar_PS/__init__.py b/src/libs/faker/providers/color/ar_PS/__init__.py new file mode 100644 index 0000000..717fa31 --- /dev/null +++ b/src/libs/faker/providers/color/ar_PS/__init__.py @@ -0,0 +1,157 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as ColorProvider + + +class Provider(ColorProvider): + all_colors = OrderedDict(( + ("أزرق أليس", "#F0F8FF"), + ("أبيض عتيق", "#FAEBD7"), + ("مائي", "#00FFFF"), + ("زبرجدي", "#7FFFD4"), + ("لازوردي", "#F0FFFF"), + ("صوفي", "#F5F5DC"), + ("حسائي", "#FFE4C4"), + ("أسود", "#000000"), + ("لوزي", "#FFEBCD"), + ("أزرق", "#0000FF"), + ("بنفسجي مزرق", "#8A2BE2"), + ("بني", "#A52A2A"), + ("خشبية", "#DEB887"), + ("أزرق كاديتي", "#5F9EA0"), + ("كرتوزي", "#7FFF00"), + ("شوكولاتيّ", "#D2691E"), + ("مرجاني", "#FF7F50"), + ("قنطريوني", "#6495ED"), + ("حرير الذرة", "#FFF8DC"), + ("قرمزي", "#DC143C"), + ("سيان", "#00FFFF"), + ("أزرق داكن", "#00008B"), + ("سيان داكن", "#008B8B"), + ("عصا الدهب الغامق", "#B8860B"), + ("رمادي داكن", "#A9A9A9"), + ("أخضر داكن", "#006400"), + ("خاكي داكن", "#BDB76B"), + ("ماجنتا داكن", "#8B008B"), + ("أخضر زيتوني داكن", "#556B2F"), + ("برتقالي داكن", "#FF8C00"), + ("أوركيدي داكن", "#9932CC"), + ("أحمر داكن", "#8B0000"), + ("سلموني داكن", "#E9967A"), + ("أخضر بحري داكن", "#8FBC8F"), + ("أزرق أردوازي داكن", "#483D8B"), + ("رمادي لازوردي داكن", "#2F4F4F"), + ("تركوازي داكن", "#00CED1"), + ("بنفسج داكن", "#9400D3"), + ("زهري غامق", "#FF1493"), + ("أزرق سماوي غامق", "#00BFFF"), + ("رمادي خافت", "#696969"), + ("أزرق فريق دودجر", "#1E90FF"), + ("الطوب شمت", "#B22222"), + ("أبيض وردي", "#FFFAF0"), + ("أخضر الغابت", "#228B22"), + ("فوشي", "#FF00FF"), + ("رمادي باهت", "#DCDCDC"), + ("أبيض شبحي", "#F8F8FF"), + ("ذهبي", "#FFD700"), + ("ذهبي", "#DAA520"), + ("رمادي", "#808080"), + ("أخضر", "#008000"), + ("أصفر مخضر", "#ADFF2F"), + ("عسلي", "#F0FFF0"), + ("وردي فاقع", "#FF69B4"), + ("قسطلي", "#CD5C5C"), + ("نيلي", "#4B0082"), + ("سكري", "#FFFFF0"), + ("خاكي", "#F0E68C"), + ("لاڤندر", "#E6E6FA"), + ("أحمر اللافندر", "#FFF0F5"), + ("أخضر عشبي", "#7CFC00"), + ("ليمون شيفوني", "#FFFACD"), + ("أزرق فاتح", "#ADD8E6"), + ("مرجاني فاتح", "#F08080"), + ("أزرق طفولي", "#E0FFFF"), + ("أصفر ذهبي فاتح ", "#FAFAD2"), + ("رمادي فاتح", "#D3D3D3"), + ("أخضر فاتح", "#90EE90"), + ("وردي فاتح", "#FFB6C1"), + ("سلموني فاتح", "#FFA07A"), + ("أخضر بحري فاتح", "#20B2AA"), + ("سماوي فاتح", "#87CEFA"), + ("أزرق أردوازي فاتح", "#778899"), + ("أزرق معدني فاتح", "#B0C4DE"), + ("أصفر فاتح", "#FFFFE0"), + ("ليمي", "#00FF00"), + ("أخضر ليموني", "#32CD32"), + ("كتاني", "#FAF0E6"), + ("فوشيا", "#FF00FF"), + ("كستنائي", "#800000"), + ("زبرجدي متوسط", "#66CDAA"), + ("أزرق متوسط", "#0000CD"), + ("أوركيدي متوسط", "#BA55D3"), + ("فوشي متوسط", "#9370DB"), + ("أخضر بحري متوسط", "#3CB371"), + ("أزرق أردوازي متوسط", "#7B68EE"), + ("أخضر ربيعي متوسط", "#00FA9A"), + ("ترموازي متوسط", "#48D1CC"), + ("أحمر بنفسجي", "#C71585"), + ("الأزرق متوسط", "#191970"), + ("نعناعي كريمي", "#F5FFFA"), + ("الوردي الضبابي", "#FFE4E1"), + ("موكاسيني", "#FFE4B5"), + ("أبيض نافاجو", "#FFDEAD"), + ("كحلي", "#000080"), + ("رباطي قديم", "#FDF5E6"), + ("زيتوني", "#808000"), + ("زيتوني رمادي", "#6B8E23"), + ("برتقالي", "#FFA500"), + ("أحمر برتقالي", "#FF4500"), + ("أوركيدي", "#DA70D6"), + ("ذهبي باهت", "#EEE8AA"), + ("أخضر باهت", "#98FB98"), + ("تركوازي باهت", "#AFEEEE"), + ("أحمر بنفسجي باهت", "#DB7093"), + ("بابايا", "#FFEFD5"), + ("حنطي", "#FFDAB9"), + ("بيرو", "#CD853F"), + ("زهري", "#FFC0CB"), + ("برقوقي", "#DDA0DD"), + ("أزرق مسحوقي", "#B0E0E6"), + ("أرجواني", "#800080"), + ("أحمر", "#FF0000"), + ("بني وردي", "#BC8F8F"), + ("أزرق ملكي", "#4169E1"), + ("بني السرج", "#8B4513"), + ("سالموني", "#FA8072"), + ("بني رملي", "#F4A460"), + ("أخضر بحري", "#2E8B57"), + ("صدفي", "#FFF5EE"), + ("سيينا", "#A0522D"), + ("فضي", "#C0C0C0"), + ("أزرق سماي", "#87CEEB"), + ("أزرق أردوازي", "#6A5ACD"), + ("رمادي معدني", "#708090"), + ("ثلجي", "#FFFAFA"), + ("أخضر ربيعي", "#00FF7F"), + ("أزرق معدني", "#4682B4"), + ("نطي", "#D2B48C"), + ("حذفي", "#008080"), + ("أرجواني", "#D8BFD8"), + ("طماطمي", "#FF6347"), + ("تركواز", "#40E0D0"), + ("بنفسجي", "#EE82EE"), + ("قمحي", "#F5DEB3"), + ("أبيض", "#FFFFFF"), + ("دخاني قمحي", "#F5F5F5"), + ("أصفر", "#FFFF00"), + ("أصفر مخضر", "#9ACD3"), + )) + + safe_colors = ( + 'أسود', 'كستنائي', 'أخضر', 'كحلي', 'زيتوني', + 'أرجواني', 'حذفي', 'ليمي', 'أزرق', 'فضي', + 'رمادي', 'أصفر', 'فوشي', 'مائي', 'أبيض', + ) + diff --git a/src/libs/faker/providers/color/en_US/__init__.py b/src/libs/faker/providers/color/en_US/__init__.py new file mode 100644 index 0000000..8edf337 --- /dev/null +++ b/src/libs/faker/providers/color/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as ColorProvider + + +class Provider(ColorProvider): + pass diff --git a/src/libs/faker/providers/color/fr_FR/__init__.py b/src/libs/faker/providers/color/fr_FR/__init__.py new file mode 100644 index 0000000..33b9c97 --- /dev/null +++ b/src/libs/faker/providers/color/fr_FR/__init__.py @@ -0,0 +1,156 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as ColorProvider + +localized = True + + +class Provider(ColorProvider): + all_colors = OrderedDict(( + ("Noir", "#000000"), + ("Gris mat", "#696969"), + ("Gris", "#808080"), + ("Gris foncé (Acier)", "#A9A9A9"), + ("Gris argent", "#C0C0C0"), + ("Gris clair", "#D3D3D3"), + ("Gris gainsboro (Etain)", "#DCDCDC"), + ("Blanc fumée", "#F5F5F5"), + ("Blanc spectral", "#F8F8FF"), + ("Blanc", "#FFFFFF"), + ("Ivoire", "#FFFFF0"), + ("Blanc floral", "#FFFAF0"), + ("Blanc coquillage", "#FFF5EE"), + ("Blanc lavande", "#FFF0F5"), + ("Blanc dentelle", "#FDF5E6"), + ("Blanc Lin", "#FAF0E6"), + ("Rose brumeux", "#FFE4E1"), + ("Rose", "#FFC0CB"), + ("Rose clair", "#FFB6C1"), + ("Rose Passion", "#FF69B4"), + ("Rose profond", "#FF1493"), + ("Violet pâle", "#DB7093"), + ("Fushia (Magenta)", "#FF00FF"), + ("Violet moyen", "#C71585"), + ("Violet chardon", "#D8BFD8"), + ("Prune", "#DDA0DD"), + ("Violet", "#EE82EE"), + ("Violet orchidée", "#DA70D6"), + ("Violet orchidée moyen", "#BA55D3"), + ("Violet orchidée foncé", "#9932CC"), + (u"Violet foncé", "#9400D3"), + ("Bleu violet", "#8A2BE2"), + ("Indigo", "#4B0082"), + ("Bleu ardoise moyen", "#7B68EE"), + ("Bleu ardoise", "#6A5ACD"), + ("Bleu ardoise foncé", "#483D8B"), + ("Pourpre moyen", "#9370DB"), + ("Magenta foncé", "#8B008B"), + ("Pourpre", "#800080"), + ("Brun rosé", "#BC8F8F"), + ("Corail clair", "#F08080"), + ("Corail", "#FF7F50"), + ("Tomate", "#FF6347"), + ("Orangé", "#FF4500"), + ("Rouge", "#FF0000"), + ("Rouge cramoisi", "#DC143C"), + ("Saumon clair", "#FFA07A"), + ("Saumon Foncé", "#E9967A"), + ("Saumon", "#FA8072"), + ("Rouge Indien", "#CD5C5C"), + ("Rouge brique", "#B22222"), + ("Brun", "#A52A2A"), + ("Rouge foncé", "#8B0000"), + ("Bordeaux", "#800000"), + ("Beige", "#F5F5DC"), + ("Beige antique", "#FAEBD7"), + ("Beige papaye", "#FFEFD5"), + ("Amande", "#FFEBCD"), + ("Bisque", "#ffe4c4"), + ("Beige pêche", "#FFDAB9"), + ("Beige mocassin", "#FFE4B5"), + ("Jaune blanc navaro", "#FFDEAD"), + ("Jaune blé", "#F5DEB3"), + ("Brun bois rustique", "#DEB887"), + ("Brun roux", "#D2B48C"), + ("Brun sable", "#F4A460"), + ("Orange", "#FFA500"), + ("Orange foncé", "#FF8C00"), + ("Chocolat", "#D2691E"), + ("Brun pérou", "#CD853F"), + ("Terre de Sienne", "#A0522D"), + ("Brun cuir", "#8B4513"), + ("Jaune clair", "#FFFFE0"), + ("Jaune maïs doux", "#FFF8DC"), + ("Jaune doré clair", "#FAFAD2"), + ("Beige citron soie", "#FFFACD"), + ("Jaune doré pâle", "#EEE8AA"), + ("Brun kaki", "#F0E68C"), + ("Jaune", "#FFFF00"), + ("Or", "#FFD700"), + ("Jaune doré", "#DAA520"), + ("Jaune doré foncé", "#B8860B"), + ("Brun kaki foncé", "#BDB76B"), + ("Jaune vert", "#9ACD32"), + ("Kaki", "#6B8E23"), + ("Olive", "#808000"), + ("Vert olive foncé", "#556B2F"), + ("Vert jaune", "#ADFF2F"), + ("Chartreuse", "#7FFF00"), + ("Vert prairie", "#7CFC00"), + ("Citron vert", "#00FF00"), + ("Citron vert foncé", "#32CD32"), + ("Blanc menthe", "#F5FFFA"), + ("Miellat", "#F0FFF0"), + ("Vert pâle", "#98FB98"), + ("Vert clair", "#90EE90"), + ("Vert printemps", "#00FF7F"), + ("Vert printemps moyen", "#00FA9A"), + ("Vert forêt", "#228B22"), + ("Vert", "#008000"), + ("Vert foncé", "#006400"), + ("Vert océan foncé", "#8FBC8F"), + ("Vert océan moyen", "#3CB371"), + ("Vert océan", "#2E8B57"), + ("Gris ardoise clair", "#778899"), + ("Gris ardoise", "#708090"), + ("Gris ardoise foncé", "#2F4F4F"), + ("Bleu alice", "#F0F8FF"), + ("Bleu azur", "#F0FFFF"), + ("Cyan clair", "#E0FFFF"), + ("Azurin", "#AFEEEE"), + ("Aigue-marine", "#7FFFD4"), + ("Aigue-marine moyen", "#66CDAA"), + ("Cyan", "#00FFFF"), + ("Turquoise", "#40E0D0"), + ("Turquoise moyen", "#48D1CC"), + ("Turquoise foncé", "#00CED1"), + ("Vert marin clair", "#20B2AA"), + ("Cyan foncé", "#008B8B"), + ("Vert sarcelle", "#008080"), + ("Bleu pétrole", "#5F9EA0"), + ("Bleu poudre", "#B0E0E6"), + ("Bleu clair", "#ADD8E6"), + ("Bleu azur clair", "#87CEFA"), + ("Bleu azur", "#87CEEB"), + ("Bleu azur profond", "#00BFFF"), + ("Bleu toile", "#1E90FF"), + ("Bleu lavande", "#E6E6FA"), + ("Bleu acier clair", "#B0C4DE"), + ("Bleuet", "#6495ED"), + ("Bleu acier", "#4682B4"), + ("Bleu royal", "#4169E1"), + ("Bleu", "#0000FF"), + ("Bleu moyen", "#0000CD"), + ("Bleu foncé", "#00008B"), + ("Bleu marin", "#000080"), + ("Bleu de minuit", "#191970"), + )) + + safe_colors = ( + 'noir', 'bordeaux', 'vert', 'rouge', + 'violet', 'sarcelle', 'bleu', 'argent', + 'gris', 'jaune', 'fuchsia', 'cyan', 'blanc' + ) + diff --git a/src/libs/faker/providers/color/hr_HR/__init__.py b/src/libs/faker/providers/color/hr_HR/__init__.py new file mode 100644 index 0000000..cf06376 --- /dev/null +++ b/src/libs/faker/providers/color/hr_HR/__init__.py @@ -0,0 +1,160 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from collections import OrderedDict + +from .. import Provider as ColorProvider + +localized = True + + +class Provider(ColorProvider): + all_colors = OrderedDict(( + ('Akvamarin', '#7FFFD4'), + ('Antikna bijela', '#FAEBD7'), + ('Azurna', '#F0FFFF'), + ('Bež', '#F5F5DC'), + ('Bijela', '#FFFFFF'), + ('Bijelo bilje', '#FFFAF0'), + ('Bjelokost', '#FFFFF0'), + ('Blijeda kudelja', '#EEE8AA'), + ('Blijedi badem', '#FFEBCD'), + ('Blijedoljubičasta', '#DB7093'), + ('Blijedotirkizna', '#AFEEEE'), + ('Blijedozelena', '#98FB98'), + ('Breskva', '#FFDAB9'), + ('Brončana', '#D2B48C'), + ('Čeličnoplava', '#4682B4'), + ('Čičak', '#D8BFD8'), + ('Cijan', '#00FFFF'), + ('Čipka', '#FDF5E6'), + ('Čokoladna', '#D2691E'), + ('Crna', '#000000'), + ('Crvena', '#FF0000'), + ('Dim', '#F5F5F5'), + ('Dodger plava', '#1E90FF'), + ('Duboko ružičasta', '#FF1493'), + ('Fuksija', '#FF00FF'), + ('Gainsboro', '#DCDCDC'), + ('Grimizna', '#DC143C'), + ('Indigo', '#4B0082'), + ('Jelenska koža', '#FFE4B5'), + ('Kadetski plava', '#5F9EA0'), + ('Kestenjasta', '#800000'), + ('Koraljna', '#FF7F50'), + ('Kraljevski plava', '#4169E1'), + ('Kudelja', '#DAA520'), + ('Lan', '#FAF0E6'), + ('Lavanda', '#E6E6FA'), + ('Limun', '#FFFACD'), + ('Lipa', '#00FF00'), + ('Ljubičasta', '#EE82EE'), + ('Magenta', '#FF00FF'), + ('Maslinasta', '#808000'), + ('Medljika', '#F0FFF0'), + ('Menta', '#F5FFFA'), + ('Modro nebo', '#00BFFF'), + ('Modrozelena', '#008080'), + ('Mornarska', '#000080'), + ('Morskozelena', '#2E8B57'), + ('Mračno siva', '#696969'), + ('Narančasta', '#FFA500'), + ('Narančastocrvena', '#FF4500'), + ('Narančastoružičasta', '#FA8072'), + ('Noćno plava', '#191970'), + ('Orhideja', '#DA70D6'), + ('Papaja', '#FFEFD5'), + ('Peru', '#CD853F'), + ('Plava', '#0000FF'), + ('Plavi prah', '#B0E0E6'), + ('Plavi škriljevac', '#6A5ACD'), + ('Plavkasta', '#F0F8FF'), + ('Plavo cvijeće', '#6495ED'), + ('Plavo nebo', '#87CEEB'), + ('Plavoljubičasta', '#8A2BE2'), + ('Porculanska', '#FFE4C4'), + ('Prljavomaslinasta', '#6B8E23'), + ('Proljetnozelena', '#00FF7F'), + ('Prozirno bijela', '#F8F8FF'), + ('Pšenica', '#F5DEB3'), + ('Purpurna', '#800080'), + ('Rajčica', '#FF6347'), + ('Rumena lavanda', '#FFF0F5'), + ('Ružičasta', '#FFC0CB'), + ('Ružičastosmeđa', '#BC8F8F'), + ('Siva', '#808080'), + ('Sivi škriljevac', '#708090'), + ('Sivožuta', '#F0E68C'), + ('Smeđa', '#A52A2A'), + ('Smeđe sedlo', '#8B4513'), + ('Smeđi pijesak', '#F4A460'), + ('Smeđkasto bijela', '#FFDEAD'), + ('Snijeg', '#FFFAFA'), + ('Srebrna', '#C0C0C0'), + ('Srednja akvamarin', '#66CDAA'), + ('Srednja crvenoljubičasta', '#C71585'), + ('Srednja morskozelena', '#3CB371'), + ('Srednja orhideja', '#BA55D3'), + ('Srednja plava', '#0000CD'), + ('Srednja proljetnozelena', '#00FA9A'), + ('Srednja purpurna', '#9370DB'), + ('Srednja tirkizna', '#48D1CC'), + ('Srednje plavi škriljevac', '#7B68EE'), + ('Svijetla čeličnoplava', '#B0C4DE'), + ('Svijetla narančastoružičasta', '#FFA07A'), + ('Svijetli cijan', '#E0FFFF'), + ('Svijetlo drvo', '#DEB887'), + ('Svijetlokoraljna', '#F08080'), + ('Svijetlomorskozelena', '#20B2AA'), + ('Svijetloplava', '#ADD8E6'), + ('Svijetloružičasta', '#FFB6C1'), + ('Svijetlosiva', '#D3D3D3'), + ('Svijetlosivi škriljevac', '#778899'), + ('Svijetlozelena', '#90EE90'), + ('Svijetložuta kudelja', '#FAFAD2'), + ('Svijetložuta', '#FFFFE0'), + ('Šamotna opeka', '#B22222'), + ('Školjka', '#FFF5EE'), + ('Šljiva', '#DDA0DD'), + ('Tamna kudelja', '#B8860B'), + ('Tamna magenta', '#8B008B'), + ('Tamna narančastoružičasta', '#E9967A'), + ('Tamna orhideja', '#9932CC'), + ('Tamna sivožuta', '#BDB76B'), + ('Tamni cijan', '#008B8B'), + ('Tamno zelena', '#006400'), + ('Tamnocrvena', '#8B0000'), + ('Tamnoljubičasta', '#9400D3'), + ('Tamnomaslinasta', '#556B2F'), + ('Tamnonarančasta', '#FF8C00'), + ('Tamnoplava', '#00008B'), + ('Tamnoplavi škriljevac', '#483D8B'), + ('Tamnosiva', '#A9A9A9'), + ('Tamnosivi škriljevac', '#2F4F4F'), + ('Tamnotirkizna', '#00CED1'), + ('Tamnozelena', '#8FBC8F'), + ('Tirkizna', '#40E0D0'), + ('Topla ružičasta', '#FF69B4'), + ('Vedro nebo', '#87CEFA'), + ('Voda', '#00FFFF'), + ('Zelena lipa', '#32CD32'), + ('Zelena šuma', '#228B22'), + ('Zelena tratina', '#7CFC00'), + ('Zelena', '#008000'), + ('Zeleni liker', '#7FFF00'), + ('Zelenožuta', '#ADFF2F'), + ('Zlatna', '#FFD700'), + ('Žućkastocrvena zemlja', '#CD5C5C'), + ('Žućkastoružičasta', '#FFE4E1'), + ('Žućkastosmeđa glina', '#A0522D'), + ('Žuta svila', '#FFF8DC'), + ('Žuta', '#FFFF00'), + ('Žutozelena', '#9ACD3'), + )) + + safe_colors = ( + 'crna', 'kestenjasta', 'zelena', 'mornarska', 'maslinasta', + 'purpurna', 'modrozelena', 'lipa', 'plava', 'srebrna', + 'siva', 'žuta', 'fuksija', 'voda', 'bijela', + ) + diff --git a/src/libs/faker/providers/color/hu_HU/__init__.py b/src/libs/faker/providers/color/hu_HU/__init__.py new file mode 100644 index 0000000..f5c378f --- /dev/null +++ b/src/libs/faker/providers/color/hu_HU/__init__.py @@ -0,0 +1,14 @@ +# coding=utf-8 +from collections import OrderedDict + +from faker.providers import BaseProvider + + +class Provider(BaseProvider): + + safe_colors = ( + 'fekete', 'bordó', 'zöld', 'királykék', 'oliva', + 'bíbor', 'kékeszöld', 'citromzöld', 'kék', 'ezüst', + 'szürke', 'sárga', 'mályva', 'akvamarin', 'fehér', + ) + diff --git a/src/libs/faker/providers/color/pt_BR/__init__.py b/src/libs/faker/providers/color/pt_BR/__init__.py new file mode 100644 index 0000000..e0368b2 --- /dev/null +++ b/src/libs/faker/providers/color/pt_BR/__init__.py @@ -0,0 +1,247 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as ColorProvider + +localized = True + + +class Provider(ColorProvider): + all_colors = OrderedDict(( + ("Açafrão", "#F4C430"), + ("Água-marinha média", "#66CDAA"), + ("Água-marinha", "#7FFFD4"), + ("Água", "#00FFFF"), + ("Alizarina", "#E32636"), + ("Amarelo brasilis", "#ECDB00"), + ("Amarelo claro", "#FFFFE0"), + ("Amarelo creme", "#ECD690"), + ("Amarelo escuro", "#F2B73F"), + ("Amarelo esverdeado", "#9ACD32"), + ("Amarelo esverdeado", "#ADFF2F"), + ("Amarelo ouro claro", "#FAFAD2"), + ("Amarelo queimado", "#EEAD2D"), + ("Amarelo", "#FFFF00"), + ("Âmbar", "#FFBF00"), + ("Ameixa", "#DDA0DD"), + ("Amêndoa", "#FFEBCD"), + ("Ametista", "#9966CC"), + ("Aspargo", "#7BA05B"), + ("Azul aço claro", "#B0C4DE"), + ("Azul aço", "#4682B4"), + ("Azul alice", "#F0F8FF"), + ("Azul ardósia claro", "#8470FF"), + ("Azul ardósia escuro", "#483D8B"), + ("Azul ardósia médio", "#7B68EE"), + ("Azul ardósia", "#6A5ACD"), + ("Azul areado", "#B8CAD4"), + ("Azul brasilis brilhante", "#09ACDB"), + ("Azul brasilis", "#00BDCE"), + ("Azul cadete", "#5F9EA0"), + ("Azul camarada", "#054F77"), + ("Azul celeste brilhante", "#007FFF"), + ("Azul celeste pernambucano", "#00A4CD"), + ("Azul celeste", "#F0FFFF"), + ("Azul céu claro", "#87CEFA"), + ("Azul céu profundo", "#00BFFF"), + ("Azul céu", "#87CEEB"), + ("Azul claro", "#ADD8E6"), + ("Azul cobalto", "#0047AB"), + ("Azul escuro", "#00008B"), + ("Azul flor de milho", "#6495ED"), + ("Azul força aérea", "#5D8AA8"), + ("Azul furtivo", "#1E90FF"), + ("Azul manteiga", "#a6aa3e"), + ("Azul marinho", "#120A8F"), + ("Azul médio", "#0000CD"), + ("Azul meia-noite", "#191970"), + ("Azul petróleo", "#084D6E"), + ("Azul pólvora", "#B0E0E6"), + ("Azul real", "#0000DD"), + ("Azul taparuere", "#248EFF"), + ("Azul turquesa brilhante", "#00DDFF"), + ("Azul turquesa", "#00CCEE"), + ("Azul violeta", "#8A2BE2"), + ("Azul", "#0000FF"), + ("Bege", "#F5F5DC"), + ("Bordô", "#800000"), + ("Borgonha", "#900020"), + ("Branco antigo", "#FAEBD7"), + ("Branco fantasma", "#F8F8FF"), + ("Branco floral", "#FFFAF0"), + ("Branco fumaça", "#F5F5F5"), + ("Branco navajo", "#FFDEAD"), + ("Branco", "#FFFFFF"), + ("Brasil", "#A7F432"), + ("Bronze", "#CD7F32"), + ("Caqui escuro", "#BDB76B"), + ("Caqui", "#F0E68C"), + ("Caramelo", "#8B5742"), + ("Cardo", "#D8BFD8"), + ("Carmesim", "#DC143C"), + ("Carmim carnáceo", "#960018"), + ("Carmim clássico", "#992244"), + ("Carmim", "#712F26"), + ("Castanho avermelhado", "#8B0000"), + ("Castanho claro", "#D2B48C"), + ("Cenoura", "#ED9121"), + ("Cereja Hollywood", "#F400A1"), + ("Cereja", "#DE3163"), + ("Chocolate", "#D2691E"), + ("Ciano claro", "#E0FFFF"), + ("Ciano escuro", "#008B8B"), + ("Ciano", "#00FFFF"), + ("Cinza ardósia claro", "#778899"), + ("Cinza ardósia escuro", "#2F4F4F"), + ("Cinza ardósia", "#708090"), + ("Cinza claro", "#D3D3D3"), + ("Cinza escuro", "#A9A9A9"), + ("Cinza fosco", "#696969"), + ("Cinza médio", "#DCDCDC"), + ("Cinza", "#808080"), + ("Cobre", "#B87333"), + ("Concha", "#FFF5EE"), + ("Coral claro", "#F08080"), + ("Coral", "#FF7F50"), + ("Couro", "#F0DC82"), + ("Creme de marisco", "#FFE4C4"), + ("Creme de menta", "#F5FFFA"), + ("Creme", "#FFFDD0"), + ("Dourado escuro", "#B8860B"), + ("Dourado pálido", "#EEE8AA"), + ("Dourado", "#DAA520"), + ("Ébano", "#555D50"), + ("Eminência", "#6C3082"), + ("Escarlate", "#FF2400"), + ("Esmeralda", "#50C878"), + ("Eucalipto", "#44D7A8"), + ("Fandango", "#B53389"), + ("Feldspato", "#FDD5B1"), + ("Ferrugem", "#B7410E"), + ("Flerte", "#A2006D"), + ("Fúcsia", "#FF00FF"), + ("Fuligem", "#3D2B1F"), + ("Glicínia", "#C9A0DC"), + ("Glitter", "#E6E8FA"), + ("Grená", "#831D1C"), + ("Heliotrópio", "#DF73FF"), + ("Herbal", "#2E8B57"), + ("Independência", "#4C516D"), + ("Índigo", "#4B0082"), + ("Iris", "#5A4FCF"), + ("Jade", "#00A86B"), + ("Jambo", "#FF4500"), + ("Jasmine", "#F8DE7E"), + ("Kiwi", "#8EE53F"), + ("Laranja claro", "#FFB84D"), + ("Laranja escuro", "#FF8C00"), + ("Laranja", "#FFA500"), + ("Lavanda avermelhada", "#FFF0F5"), + ("Lavanda", "#E6E6FA"), + ("Lilás", "#C8A2C8"), + ("Lima", "#FDE910"), + ("Limão", "#00FF00"), + ("Linho", "#FAF0E6"), + ("Madeira", "#DEB887"), + ("Magenta escuro", "#8B008B"), + ("Magenta", "#FF00FF"), + ("Malva", "#E0B0FF"), + ("Mamão batido", "#FFEFD5"), + ("Maná", "#F0FFF0"), + ("Marfim", "#FFFFF0"), + ("Marrom amarelado", "#F4A460"), + ("Marrom claro", "#A52A2A"), + ("Marrom rosado", "#BC8F8F"), + ("Marrom sela", "#8B4513"), + ("Marrom", "#964b00"), + ("Milho Claro", "#FFF8DC"), + ("Milho", "#FBEC5D"), + ("Mocassim", "#FFE4B5"), + ("Mostarda", "#FFDB58"), + ("Naval", "#000080"), + ("Neve", "#FFFAFA"), + ("Nyanza", "#E9FFDB"), + ("Ocre", "#CC7722"), + ("Oliva escura", "#556B2F"), + ("Oliva parda", "#6B8E23"), + ("Oliva", "#808000"), + ("Orquídea escura", "#9932CC"), + ("Orquídea média", "#BA55D3"), + ("Orquídea", "#DA70D6"), + ("Ouro", "#FFD700"), + ("Pardo escuro", "#CC6600"), + ("Pardo", "#CD853F"), + ("Pêssego", "#FFDAB9"), + ("Prata", "#C0C0C0"), + ("Preto", "#000000"), + ("Púrpura média", "#9370DB"), + ("Púrpura", "#800080"), + ("Quantum", "#111111"), + ("Quartzo", "#51484F"), + ("Renda antiga", "#FDF5E6"), + ("Rosa amoroso", "#CD69CD"), + ("Rosa brilhante", "#FF007F"), + ("Rosa Choque", "#FC0FC0"), + ("Rosa claro", "#FFB6C1"), + ("Rosa danação", "#DA69A1"), + ("Rosa embaçado", "#FFE4E1"), + ("Rosa forte", "#FF69B4"), + ("Rosa profundo", "#FF1493"), + ("Rosa", "#FFCBDB"), + ("Roxo brasilis", "#8A008A"), + ("Roxo", "#993399"), + ("Rútilo", "#6D351A"), + ("Salmão claro", "#FFA07A"), + ("Salmão escuro", "#E9967A"), + ("Salmão", "#FA7F72"), + ("Sépia", "#705714"), + ("Siena", "#FF8247"), + ("Tangerina", "#F28500"), + ("Terracota", "#E2725B"), + ("Tijolo refratário", "#B22222"), + ("Tomate", "#FF6347"), + ("Triássico", "#FF2401"), + ("Trigo", "#F5DEB3"), + ("Turquesa escura", "#00CED1"), + ("Turquesa média", "#48D1CC"), + ("Turquesa pálida", "#AFEEEE"), + ("Turquesa", "#40E0D0"), + ("Urucum", "#EC2300"), + ("Verde amarelado", "#9ACD32"), + ("Verde claro", "#90EE90"), + ("Verde escuro", "#006400"), + ("Verde espectro", "#00FF00"), + ("Verde floresta", "#228B22"), + ("Verde fluorescente", "#CCFF33"), + ("Verde grama", "#7CFC00"), + ("Verde lima", "#32CD32"), + ("Verde mar claro", "#20B2AA"), + ("Verde mar escuro", "#8FBC8F"), + ("Verde mar médio", "#3CB371"), + ("Verde militar", "#78866B"), + ("Verde pálido", "#98FB98"), + ("Verde Paris", "#7FFF00"), + ("Verde primavera médio", "#00FA9A"), + ("Verde primavera", "#00FF7F"), + ("Verde-azulado", "#008080"), + ("Verde", "#008000"), + ("Vermelho enegrecido", "#550000"), + ("Vermelho escuro", "#8B0000"), + ("Vermelho indiano", "#CD5C5C"), + ("Vermelho violeta médio", "#C71585"), + ("Vermelho violeta pálido", "#DB7093"), + ("Vermelho violeta", "#D02090"), + ("Vermelho", "#FF0000"), + ("Violeta claro", "#F8CBF8"), + ("Violeta escuro", "#9400D3"), + ("Violeta", "#EE82EE"), + ("Zinco", "#E2DDF0"), + )) + + safe_colors = ( + 'preto', 'marrom', 'verde', 'azul escuro', 'verde escuro', + 'roxo', 'laranja', 'verde claro', 'azul', 'rosa', 'violeta', + 'cinza', 'amarelo', 'magenta', 'ciano', 'branco', + ) diff --git a/src/libs/faker/providers/color/ru_RU/__init__.py b/src/libs/faker/providers/color/ru_RU/__init__.py new file mode 100644 index 0000000..efef06d --- /dev/null +++ b/src/libs/faker/providers/color/ru_RU/__init__.py @@ -0,0 +1,74 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as ColorProvider + +localized = True + + +class Provider(ColorProvider): + all_colors = OrderedDict(( + ("Античный Белый", "#FAEBD7"), + ("Аквамарин", "#7FFFD4"), + ("Лазурный", "#F0FFFF"), + ("Бежевый", "#F5F5DC"), + ("Черный", "#000000"), + ("Синий", "#0000FF"), + ("Сине-фиолетовый", "#8A2BE2"), + ("Коричневый", "#A52A2A"), + ("Шоколадный", "#D2691E"), + ("Коралловый", "#FF7F50"), + ("Васильковый", "#6495ED"), + ("Малиновый", "#DC143C"), + ("Темно-синий", "#00008B"), + ("Темно-голубой", "#008B8B"), + ("Темно-серый", "#A9A9A9"), + ("Темно-зеленый", "#006400"), + ("Темный хаки", "#BDB76B"), + ("Темно-оранжевый", "#FF8C00"), + ("Темно-красный", "#8B0000"), + ("Темно-бирюзовый", "#00CED1"), + ("Темно-фиолетовый", "#9400D3"), + ("Темно-розовый", "#FF1493"), + ("Тусклый серый", "#696969"), + ("Фуксия", "#FF00FF"), + ("Золотой", "#FFD700"), + ("Серый", "#808080"), + ("Зеленый", "#008000"), + ("Желто-зеленый", "#ADFF2F"), + ("Ярко-розовый", "#FF69B4"), + ("Индиго", "#4B0082"), + ("Слоновая кость", "#FFFFF0"), + ("Хаки", "#F0E68C"), + ("Розовато-лавандовый", "#FFF0F5"), + ("Светло-синий", "#ADD8E6"), + ("Светло-голубой", "#E0FFFF"), + ("Светло-серый", "#D3D3D3"), + ("Светло-зеленый", "#90EE90"), + ("Светло-розовый", "#FFB6C1"), + ("Светло-голубой", "#87CEFA"), + ("Светло-желтый", "#FFFFE0"), + ("Каштановый", "#800000"), + ("Оранжевый", "#FFA500"), + ("Оранжево-красный", "#FF4500"), + ("Бледно-зеленый", "#98FB98"), + ("Бледно-Бирюзовый", "#AFEEEE"), + ("Розовый", "#FFC0CB"), + ("Сливовый", "#DDA0DD"), + ("Пурпурный", "#800080"), + ("Красный", "#FF0000"), + ("Цвет морской волны", "#2E8B57"), + ("Серебряный", "#C0C0C0"), + ("Бирюзовый", "#40E0D0"), + ("Фиолетовый", "#EE82EE"), + ("Белый", "#FFFFFF"), + ("Желтый", "#FFFF00"), + ("Желто-зеленый", "#9ACD3"), + )) + + safe_colors = ( + 'черный', 'бордовый', 'зеленый', 'оливковый', + 'пурпурный', 'teal', 'lime', 'синий', 'серебряный', + 'серый', 'желтый', 'фуксия', 'белый' + ) diff --git a/src/libs/faker/providers/color/uk_UA/__init__.py b/src/libs/faker/providers/color/uk_UA/__init__.py new file mode 100644 index 0000000..6b72462 --- /dev/null +++ b/src/libs/faker/providers/color/uk_UA/__init__.py @@ -0,0 +1,218 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from collections import OrderedDict + +from .. import Provider as ColorProvider + + +class Provider(ColorProvider): + # Source: uk.wikipedia.org/wiki/Список_кольорів + all_colors = OrderedDict(( + ('Абрикосовий', '#FBCEB1'), + ('Аквамариновий', '#7FFFD4'), + ('Алізариновий червоний', '#E32636'), + ('Амарантовий', '#E52B50'), + ('Амарантово-рожевий', '#F19CBB'), + ('Аметистовий', '#9966CC'), + ('Андроїдний зелений', '#A4C639'), + ('Арсеновий', '#3B444B'), + ('Атомний мандаріновий', '#FF9966'), + ('Багряний', '#FF2400'), + ('Баклажановий', '#990066'), + ('Барвінковий', '#CCCCFF'), + ('Бежевий', '#F5F5DC'), + ('Берлінська лазур', '#003153'), + ('Блаватний', '#6495ED'), + ('Блакитний', '#AFEEEE'), + ('Блакитний Брандейса', '#0070FF'), + ('Блакитно-зелений', '#00DDDD'), + ('Блакитно-фіолетовий', '#8A2BE2'), + ('Блідий рожево-ліловий', '#996666'), + ('Блідо-брунатний', '#987654'), + ('Блідо-волошковий', '#ABCDEF'), + ('Блідо-карміновий', '#AF4035'), + ('Блідо-каштановий', '#DDADAF'), + ('Блідо-пурпуровий', '#F984E5'), + ('Блідо-пісочний', '#DABDAB'), + ('Блідо-рожевий', '#FADADD'), + ('Болотний', '#ACB78E'), + ('Бронзовий', '#CD7F32'), + ('Брунатний', '#964B00'), + ('Брунато-малиновий', '#800000'), + ('Будяковий', '#D8BFD8'), + ('Бузковий', '#C8A2C8'), + ('Бургундський', '#900020'), + ('Бурий', '#755A57'), + ('Бурштиновий', '#FFBF00'), + ('Білий', '#FFFFFF'), + ('Білий навахо', '#FFDEAD'), + ('Бірюзовий', '#30D5C8'), + ('Бістр', '#3D2B1F'), + ('Вода пляжа Бонді', '#0095B6'), + ('Вохра', '#CC7722'), + ('Відбірний жовтий', '#FFBA00'), + ('Візантійський', '#702963'), + ('Гарбуз', '#FF7518'), + ('Гарячо-рожевий', '#FC0FC0'), + ('Геліотроп', '#DF73FF'), + ('Глибокий фіолетовий', '#423189'), + ('Глицінія', '#C9A0DC'), + ('Грушевий', '#D1E231'), + ('Гумігут', '#E49B0F'), + ('Гірчичний', '#FFDB58'), + ('Дерева', '#79443B'), + ('Джинсовий', '#1560BD'), + ('Діамантово-рожевий', '#FF55A3'), + ('Жовтий', '#FFFF00'), + ('Жовто-зелений', '#ADFF2F'), + ('Жовто-персиковий', '#FADFAD'), + ('Захисний синій', '#1E90FF'), + ('Зелена весна', '#00FF7F'), + ('Зелена мʼята', '#98FF98'), + ('Зелена сосна', '#01796F'), + ('Зелене море', '#2E8B57'), + ('Зелений', '#00FF00'), + ('Зелений армійський', '#4B5320'), + ('Зелений мох', '#ADDFAD'), + ('Зелений папороть', '#4F7942'), + ('Зелений чай', '#D0F0C0'), + ('Зелено-сірий чай', '#CADABA'), + ('Зеленувато-блакитний', '#008080'), + ('Золотаво-березовий', '#DAA520'), + ('Золотий', '#FFD700'), + ('Золотисто-каштановий', '#6D351A'), + ('Індиго', '#4B0082'), + ('Іржавий', '#B7410E'), + ('Кардинал (колір)', '#C41E3A'), + ('Карміновий', '#960018'), + ('Каштановий', '#CD5C5C'), + ('Кобальтовий', '#0047AB'), + ('Колір жовтого шкільного автобуса', '#FFD800'), + ('Колір засмаги', '#D2B48C'), + ('Колір морської піни', '#FFF5EE'), + ('Колір морської хвилі', '#00FFFF'), + ('Кораловий', '#FF7F50'), + ('Королівський синій', '#4169E1'), + ('Кремовий', '#FFFDD0'), + ('Кукурудзяний', '#FBEC5D'), + ('Кіновар', '#FF4D00'), + ('Лавандний', '#E6E6FA'), + ('Лазуровий', '#007BA7'), + ('Лазурово-синій', '#2A52BE'), + ('Лайм', '#CCFF00'), + ('Латунний', '#B5A642'), + ('Лимонний', '#FDE910'), + ('Лимонно-кремовий', '#FFFACD'), + ('Лляний', '#EEDC82'), + ('Лляний', '#FAF0E6'), + ('Лососевий', '#FF8C69'), + ('Ліловий', '#DB7093'), + ('Малахітовий', '#0BDA51'), + ('Малиновий', '#DC143C'), + ('Мандариновий', '#FFCC00'), + ('Мисливський', '#004225'), + ('Морквяний', '#ED9121'), + ('Мідний', '#B87333'), + ('Міжнародний помаранчевий', '#FF4F00'), + ('Нефритовий', '#00A86B'), + ('Ніжно-блакитний', '#E0FFFF'), + ('Ніжно-оливковий', '#6B8E23'), + ('Ніжно-рожевий', '#FB607F'), + ('Оливковий', '#808000'), + ('Опівнічно-синій', '#003366'), + ('Орхідея', '#DA70D6'), + ('Палена сіена', '#E97451'), + ('Палений оранжевий', '#CC5500'), + ('Панг', '#C7FCEC'), + ('Паросток папаї', '#FFEFD5'), + ('Пастельно-зелений', '#77DD77'), + ('Пастельно-рожевий', '#FFD1DC'), + ('Персиковий', '#FFE5B4'), + ('Перський синій', '#6600FF'), + ('Помаранчевий', '#FFA500'), + ('Помаранчево-персиковий', '#FFCC99'), + ('Помаранчево-рожевий', '#FF9966'), + ('Пурпурний', '#FF00FF'), + ('Пурпуровий', '#660099'), + ('Пшеничний', '#F5DEB3'), + ('Пісочний колір', '#F4A460'), + ('Рожевий', '#FFC0CB'), + ('Рожевий Маунтбеттена', '#997A8D'), + ('Рожево-лавандний', '#FFF0F5'), + ('Рожево-ліловий', '#993366'), + ('Салатовий', '#7FFF00'), + ('Сангрія', '#92000A'), + ('Сапфіровий', '#082567'), + ('Світло-синій', '#007DFF'), + ('Сепія', '#704214'), + ('Сиваво-зелений', '#ACE1AF'), + ('Сигнально-помаранчевий', '#FF9900'), + ('Синя пил', '#003399'), + ('Синя сталь', '#4682B4'), + ('Сині яйця малинівки', '#00CCCC'), + ('Синій', '#0000FF'), + ('Синій (RYB)', '#0247FE'), + ('Синій (пігмент)', '#333399'), + ('Синій ВПС', '#5D8AA8'), + ('Синій Клейна', '#3A75C4'), + ('Сливовий', '#660066'), + ('Смарагдовий', '#50C878'), + ('Спаржевий', '#7BA05B'), + ('Срібний', '#C0C0C0'), + ('Старе золото', '#CFB53B'), + ('Сіра спаржа', '#465945'), + ('Сірий', '#808080'), + ('Сірий шифер', '#708090'), + ('Темний весняно-зелений', '#177245'), + ('Темний жовто-брунатний', '#918151'), + ('Темний зелений чай', '#BADBAD'), + ('Темний пастельно-зелений', '#03C03C'), + ('Темний хакі', '#BDB76B'), + ('Темний індиго', '#310062'), + ('Темно-аспідний сірий', '#2F4F4F'), + ('Темно-брунатний', '#654321'), + ('Темно-бірюзовий', '#116062'), + ('Темно-зелений', '#013220'), + ('Темно-зелений хакі', '#78866B'), + ('Темно-золотий', '#B8860B'), + ('Темно-карміновий', '#560319'), + ('Темно-каштановий', '#986960'), + ('Темно-кораловий', '#CD5B45'), + ('Темно-лазурний', '#08457E'), + ('Темно-лососевий', '#E9967A'), + ('Темно-мандариновий', '#FFA812'), + ('Темно-оливковий', '#556832'), + ('Темно-персиковий', '#FFDAB9'), + ('Темно-рожевий', '#E75480'), + ('Темно-синій', '#000080'), + ('Ультрамариновий', '#120A8F'), + ('Умбра', '#734A12'), + ('Умбра палена', '#8A3324'), + ('Фуксія', '#FF00FF'), + ('Фіолетовий', '#8B00FF'), + ('Фіолетово-баклажановий', '#991199'), + ('Фіолетово-червоний', '#C71585'), + ('Хакі', '#C3B091'), + ('Цинамоновий', '#7B3F00'), + ('Циннвальдит', '#EBC2AF'), + ('Ціан (колір)', '#00FFFF'), + ('Ціано-блакитний', '#F0F8FF'), + ('Червоний', '#FF0000'), + ('Червоно-буро-помаранчевий', '#CD5700'), + ('Червоновато-брунатний', '#CC8899'), + ('Чорний', '#000000'), + ('Шафрановий', '#F4C430'), + ('Шкіра буйвола', '#F0DC82'), + ('Шоколадний', '#D2691E'), + ('Яскраво-бурштиновий', '#FF7E00'), + ('Яскраво-бірюзовий', '#08E8DE'), + ('Яскраво-зелений', '#66FF00'), + ('Яскраво-зелений', '#40826D'), + ('Яскраво-рожевий', '#FF007F'), + ('Яскраво-фіолетовий', '#CD00CD'), + ('Ясно-брунатний', '#CD853F'), + ('Ясно-вишневий', '#DE3163'), + ('Ясно-лазуровий', '#007FFF'), + ('Ясно-лазуровий (веб)', '#F0FFFF') + )) diff --git a/src/faker/providers/en_US/company.py b/src/libs/faker/providers/company/__init__.py similarity index 73% rename from src/faker/providers/en_US/company.py rename to src/libs/faker/providers/company/__init__.py index 31746a5..539fa2b 100644 --- a/src/faker/providers/en_US/company.py +++ b/src/libs/faker/providers/company/__init__.py @@ -1,35 +1,42 @@ +# coding=utf-8 + from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import BaseProvider -class Provider(CompanyProvider): +localized = True + + +class Provider(BaseProvider): formats = ( '{{last_name}} {{company_suffix}}', '{{last_name}}-{{last_name}}', '{{last_name}}, {{last_name}} and {{last_name}}' ) + company_suffixes = ('Inc', 'and Sons', 'LLC', 'Group', 'PLC', 'Ltd') + catch_phrase_words = ( ( 'Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', - 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Facetoface', + 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Face-to-face', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', - 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', + 'Mandatory', 'Monitored', 'Multi-channeled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', - 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', + 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarized', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', - 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', + 'Synchronized', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented' ), ( '24hour', '24/7', '3rdgeneration', '4thgeneration', '5thgeneration', '6thgeneration', 'actuating', - 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', + 'analyzing', 'asymmetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', @@ -38,28 +45,28 @@ class Provider(CompanyProvider): 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leadingedge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', - 'multi-tasking', 'national', 'needs-based', 'neutral', 'nextgeneration', 'non-volatile', 'object-oriented', + 'multi-tasking', 'national', 'needs-based', 'neutral', 'next generation', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', - 'well-modulated', 'zeroadministration', 'zerodefect', 'zerotolerance' + 'well-modulated', 'zero administration', 'zero-defect', 'zero tolerance' ), ( 'ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', - 'architecture', 'archive', 'artificialintelligence', 'array', 'attitude', 'benchmark', - 'budgetarymanagement', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', - 'concept', 'conglomeration', 'contingency', 'core', 'customerloyalty', 'database', 'data-warehouse', - 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focusgroup', - 'forecast', 'frame', 'framework', 'function', 'functionalities', 'GraphicInterface', 'groupware', - 'GraphicalUserInterface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', - 'infrastructure', 'initiative', 'installation', 'instructionset', 'interface', 'internetsolution', - 'intranet', 'knowledgeuser', 'knowledgebase', 'localareanetwork', 'leverage', 'matrices', 'matrix', + 'architecture', 'archive', 'artificial intelligence', 'array', 'attitude', 'benchmark', + 'budgetary management', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', + 'concept', 'conglomeration', 'contingency', 'core', 'customer loyalty', 'database', 'data-warehouse', + 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focus group', + 'forecast', 'frame', 'framework', 'function', 'functionalities', 'Graphic Interface', 'groupware', + 'Graphical User Interface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', + 'infrastructure', 'initiative', 'installation', 'instruction set', 'interface', 'Internet solution', + 'intranet', 'knowledge user', 'knowledgebase', 'Local Area Network', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', - 'openarchitecture', 'opensystem', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', - 'pricingstructure', 'processimprovement', 'product', 'productivity', 'project', 'projection', 'protocol', - 'securedline', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', - 'success', 'superstructure', 'support', 'synergy', 'systemengine', 'task-force', 'throughput', 'time-frame', - 'toolset', 'utilisation', 'website', 'workforce' + 'open architecture', 'open system', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', + 'pricing structure', 'process improvement', 'product', 'productivity', 'project', 'projection', 'protocol', + 'secured line', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', + 'success', 'superstructure', 'support', 'synergy', 'system engine', 'task-force', 'throughput', 'time-frame', + 'toolset', 'utilization', 'website', 'workforce' ) ) @@ -69,9 +76,9 @@ class Provider(CompanyProvider): 'orchestrate', 'leverage', 'reinvent', 'aggregate', 'architect', 'enhance', 'incentivize', 'morph', 'empower', 'envisioneer', 'monetize', 'harness', 'facilitate', 'seize', 'disintermediate', 'synergize', 'strategize', 'deploy', 'brand', 'grow', 'target', 'syndicate', 'synthesize', 'deliver', 'mesh', 'incubate', - 'engage', 'maximize', 'benchmark', 'expedite', 'reintermediate', 'whiteboard', 'visualize', 'repurpose', + 'engage', 'maximize', 'benchmark', 'expedite', 're-intermediate', 'whiteboard', 'visualize', 'repurpose', 'innovate', 'scale', 'unleash', 'drive', 'extend', 'engineer', 'revolutionize', 'generate', 'exploit', - 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 'recontextualize' + 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 're-contextualize' ), ( 'clicks-and-mortar', 'value-added', 'vertical', 'proactive', 'robust', 'revolutionary', 'scalable', @@ -89,12 +96,23 @@ class Provider(CompanyProvider): 'initiatives', 'channels', 'eyeballs', 'communities', 'ROI', 'solutions', 'e-tailers', 'e-services', 'action-items', 'portals', 'niches', 'technologies', 'content', 'vortals', 'supply-chains', 'convergence', 'relationships', 'architectures', 'interfaces', 'e-markets', 'e-commerce', 'systems', 'bandwidth', - 'infomediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', - 'metrics', 'e-business', 'functionalities', 'experiences', 'webservices', 'methodologies' + 'info-mediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', + 'metrics', 'e-business', 'functionalities', 'experiences', 'web services', 'methodologies' ) ) - company_suffixes = ('Inc', 'and Sons', 'LLC', 'Group', 'PLC', 'Ltd') + def company(self): + """ + :example 'Acme Ltd' + """ + pattern = self.random_element(self.formats) + return self.generator.parse(pattern) + + def company_suffix(self): + """ + :example 'Ltd' + """ + return self.random_element(self.company_suffixes) def catch_phrase(self): """ diff --git a/src/faker/providers/bg_BG/company.py b/src/libs/faker/providers/company/bg_BG/__init__.py similarity index 50% rename from src/faker/providers/bg_BG/company.py rename to src/libs/faker/providers/company/bg_BG/__init__.py index 813ca51..0105aa2 100644 --- a/src/faker/providers/bg_BG/company.py +++ b/src/libs/faker/providers/company/bg_BG/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -11,13 +11,13 @@ class Provider(CompanyProvider): ) company_suffixes = ( - 'АД', 'AD', - 'ADSITz', 'АДСИЦ', - 'EAD', 'ЕАД', - 'EOOD', 'ЕООД', - 'ET', 'ET', - 'OOD', 'ООД', - 'KD', 'КД', - 'KDA', 'КДА', - 'SD', 'СД' + 'АД', 'AD', + 'ADSITz', 'АДСИЦ', + 'EAD', 'ЕАД', + 'EOOD', 'ЕООД', + 'ET', 'ET', + 'OOD', 'ООД', + 'KD', 'КД', + 'KDA', 'КДА', + 'SD', 'СД' ) diff --git a/src/faker/providers/cs_CZ/company.py b/src/libs/faker/providers/company/cs_CZ/__init__.py similarity index 85% rename from src/faker/providers/cs_CZ/company.py rename to src/libs/faker/providers/company/cs_CZ/__init__.py index 8c054da..0a887de 100644 --- a/src/faker/providers/cs_CZ/company.py +++ b/src/libs/faker/providers/company/cs_CZ/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): diff --git a/src/faker/providers/de_DE/company.py b/src/libs/faker/providers/company/de_DE/__init__.py similarity index 92% rename from src/faker/providers/de_DE/company.py rename to src/libs/faker/providers/company/de_DE/__init__.py index cf1cb07..af04cd9 100644 --- a/src/faker/providers/de_DE/company.py +++ b/src/libs/faker/providers/company/de_DE/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): diff --git a/src/libs/faker/providers/company/en_US/__init__.py b/src/libs/faker/providers/company/en_US/__init__.py new file mode 100644 index 0000000..de6df66 --- /dev/null +++ b/src/libs/faker/providers/company/en_US/__init__.py @@ -0,0 +1,6 @@ +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + pass diff --git a/src/faker/providers/es_MX/company.py b/src/libs/faker/providers/company/es_MX/__init__.py similarity index 81% rename from src/faker/providers/es_MX/company.py rename to src/libs/faker/providers/company/es_MX/__init__.py index 65bff00..bd63d50 100644 --- a/src/faker/providers/es_MX/company.py +++ b/src/libs/faker/providers/company/es_MX/__init__.py @@ -1,6 +1,6 @@ # -*- encoding: utf-8 -*- from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -26,8 +26,8 @@ class Provider(CompanyProvider): "base de datos", "data-warehouse", "definición", "emulación", "codificar", "encriptar", "extranet", "firmware", "flexibilidad", "focus group", "previsión", "base de trabajo", - "función", "funcionalidad", "Interfaz Gráfica", "groupware", - "Interfaz gráfico de usuario", "hardware", "Soporte", "jerarquía", + "función", "funcionalidad", "interfaz gráfica", "groupware", + "interfaz gráfico de usuario", "hardware", "soporte", "jerarquía", "conjunto", "implementación", "infraestructura", "iniciativa", "instalación", "conjunto de instrucciones", "interfaz", "intranet", "base del conocimiento", "red de area local", @@ -38,7 +38,7 @@ class Provider(CompanyProvider): "estructura de precios", "proceso de mejora", "producto", "productividad", "proyecto", "proyección", "protocolo", "línea segura", "software", "solución", - "estandardización", "estrategia", "estructura", "éxito", + "estandarización", "estrategia", "estructura", "éxito", "superestructura", "soporte", "sinergia", "mediante", "marco de tiempo", "caja de herramientas", "utilización", "website", "fuerza de trabajo"), @@ -47,32 +47,32 @@ class Provider(CompanyProvider): "5ta generación", "6ta generación", "analizada", "asimétrica", "asíncrona", "monitorizada por red", "bidireccional", "bifurcada", "generada por el cliente", - "cliente servidor", "coherente", "cohesiva", "compuesto", + "cliente-servidor", "coherente", "cohesiva", "compuesto", "sensible al contexto", "basado en el contexto", "basado en contenido", "dedicada", - "generado por la demanda", "didactica", "direccional", + "generado por la demanda", "didáctica", "direccional", "discreta", "dinámica", "potenciada", "acompasada", "ejecutiva", "explícita", "tolerante a fallos", - "innovadora", "amplio ábanico", "global", "heurística", + "innovadora", "amplio abanico", "global", "heurística", "alto nivel", "holística", "homogénea", "híbrida", "incremental", "intangible", "interactiva", "intermedia", "local", "logística", "maximizada", "metódica", - "misión crítica", "móbil", "modular", "motivadora", + "misión crítica", "móvil", "modular", "motivadora", "multimedia", "multiestado", "multitarea", "nacional", "basado en necesidades", "neutral", "nueva generación", "no-volátil", "orientado a objetos", "óptima", "optimizada", "radical", "tiempo real", "recíproca", "regional", "escalable", "secundaria", "orientada a soluciones", - "estable", "estatica", "sistemática", "sistémica", + "estable", "estática", "sistemática", "sistémica", "tangible", "terciaria", "transicional", "uniforme", "valor añadido", "vía web", "defectos cero", "tolerancia cero" ), ( - 'adaptivo', 'avanzado', 'asimilado', 'automatizado', + 'adaptativo', 'avanzado', 'asimilado', 'automatizado', 'balanceado', 'enfocado al negocio', 'centralizado', 'clonado', 'compatible', 'configurable', 'multiplataforma', 'enfocado al cliente', 'personalizable', - 'descentralizado', 'digitizado', 'distribuido', 'diverso', + 'descentralizado', 'digitalizado', 'distribuido', 'diverso', 'mejorado', 'en toda la empresa', 'ergonómico', 'exclusivo', 'expandido', 'extendido', 'cara a cara', 'enfocado', 'de primera línea', 'totalmente configurable', @@ -81,39 +81,39 @@ class Provider(CompanyProvider): 'inverso', 'administrado', 'mandatorio', 'monitoreado', 'multicanal', 'multilateral', 'multi-capas', 'en red', 'basado en objetos', 'de arquitectura abierta', - 'Open-source', 'operativo', 'optimizado', 'opcional', + 'open-source', 'operativo', 'optimizado', 'opcional', 'orgánico', 'organizado', 'perseverante', 'persistente', 'polarizado', 'preventivo', 'proactivo', 'enfocado a ganancias', 'programable', 'progresivo', 'llave pública', 'enfocado a la calidad', 'reactivo', 'realineado', - 're-contextualizado', 'reducido', 'con ingeniería inversa', + 'recontextualizado', 'reducido', 'con ingeniería inversa', 'de tamaño adecuado', 'robusto', 'seguro', 'compartible', 'sincronizado', 'orientado a equipos', 'total', - 'universal', 'actualizable', 'centrado al usuario', + 'universal', 'actualizable', 'centrado en el usuario', 'versátil', 'virtual', 'visionario', ) ) bsWords = ( ( - 'implementa', 'utiliza', 'integrata', 'optimiza', - 'evoluciona', 'transforma', 'abraza', 'habilia', - 'orquesta', 'reinventa', 'agrega', 'mejora', 'incentiviza', - 'modifica', 'empondera', 'monetiza', 'fortalece', - 'facilita', 'synergiza', 'crear marca', 'crece', + 'implementa', 'utiliza', 'integra', 'optimiza', + 'evoluciona', 'transforma', 'abraza', 'habilita', + 'orquesta', 'reinventa', 'agrega', 'mejora', 'incentiva', + 'modifica', 'empodera', 'monetiza', 'fortalece', + 'facilita', 'sinergiza', 'crea marca', 'crece', 'sintetiza', 'entrega', 'mezcla', 'incuba', 'compromete', - 'maximiza', 'inmediata', 'visualiza', 'inova', + 'maximiza', 'visualiza', 'innova', 'escala', 'libera', 'maneja', 'extiende', 'revoluciona', - 'genera', 'explota', 'transición', 'itera', 'cultiva', + 'genera', 'explota', 'transiciona', 'itera', 'cultiva', 'redefine', 'recontextualiza', ), ( - 'synergías', 'paradigmas', 'marcados', 'socios', + 'sinergias', 'paradigmas', 'marcados', 'socios', 'infraestructuras', 'plataformas', 'iniciativas', - 'chanales', 'communidades', 'ROI', 'soluciones', + 'canales', 'communidades', 'ROI', 'soluciones', 'portales', 'nichos', 'tecnologías', 'contenido', 'cadena de producción', 'convergencia', 'relaciones', - 'architecturas', 'interfaces', 'comercio electrónico', + 'arquitecturas', 'interfaces', 'comercio electrónico', 'sistemas', 'ancho de banda', 'modelos', 'entregables', 'usuarios', 'esquemas', 'redes', 'aplicaciones', 'métricas', 'funcionalidades', 'experiencias', 'servicios web', @@ -126,7 +126,7 @@ class Provider(CompanyProvider): 'uno-a-uno', '24/7', 'end-to-end', 'globales', 'B2B', 'B2C', 'granulares', 'sin fricciones', 'virtuales', 'virales', 'dinámicas', '24/365', 'magnéticas', 'listo para la web', - 'interactivas', 'dot-com', 'sexi', 'en tiempo real', + 'interactivas', 'punto-com', 'sexi', 'en tiempo real', 'eficientes', 'front-end', 'distribuidas', 'extensibles', 'llave en mano', 'de clase mundial', 'open-source', 'plataforma cruzada', 'de paquete', 'empresariales', @@ -137,7 +137,7 @@ class Provider(CompanyProvider): ), ) - company_preffixes = ('Despacho', 'Grupo', 'Corporativo', 'Club', + company_preffixes = ('Despacho', 'Grupo', 'Corporacin', 'Club', 'Industrias', 'Laboratorios', 'Proyectos') company_suffixes = ('A.C.', 'S.A.', 'S.A. de C.V.', 'S.C.', diff --git a/src/libs/faker/providers/company/fa_IR/__init__.py b/src/libs/faker/providers/company/fa_IR/__init__.py new file mode 100644 index 0000000..a0464d8 --- /dev/null +++ b/src/libs/faker/providers/company/fa_IR/__init__.py @@ -0,0 +1,1117 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + + company_names = [ + 'گروه سیمان', + 'گروه فلزات اساسي', + 'ایران گچ', + 'آلومتك', + 'ساروج بوشهر', + 'آلومينيوم ايران', + 'سيمان  ساوه', + 'ایران ذوب', + 'سيمان اردبيل و آهك آذرشهر', + 'پارس مولیبدن', + 'سيمان اروميه', + 'ذوب روی اصفهان', + 'سيمان اصفهان', + 'صنايع مس شهيد باهنر', + 'سيمان ايلام', + 'صنایع خالص سازان روی زنجان', + 'سيمان بجنورد', + 'صنعتی و سرمایه گذاری سپنتا', + 'سيمان بهبهان', + 'كالسيمين', + 'سيمان تهران', + 'گروه كارخانه هاي توليدي نورد آلومينيوم', + 'سيمان خاش', + 'ملي سرب و روي ايران', + 'سيمان خزر', + 'ملی صنایع مس ایران', + 'سيمان داراب', + 'آلومراد', + 'سيمان دورود', + 'آلومينيوم المهدي', + 'سيمان سفيدني ريز', + 'آلومينيوم پارس', + 'سيمان شاهرود', + 'کارخانجات تولیدی مواد الومینیوم', + 'سيمان شرق', + 'مجتمع ذوب و احیای روی قشم', + 'سيمان شمال', + 'مجتمع صنايع الومينيوم جنوب', + 'سيمان صوفيان', + 'مس تکنار', + 'سيمان غرب', + 'گروه کانی های فلزی', + 'سيمان فارس', + 'آلوميناي ايران', + 'سيمان قاين', + 'تهيه و توليد مواد اوليه فولاد خراسان', + 'سيمان كارون', + 'سنگ آهن مركزي ايران', + 'سيمان كرمان', + 'هرمز انرژی', + 'سيمان مازندران', + 'واحد طلای موته', + 'سيمان هرمزگان', + 'واحد پیربکران', + 'سيمان هگمتان', + 'واحد فسفات اسفردی', + 'سیمان خوزستان', + 'واحد نخلک', + 'سیمان دشتستان', + 'ويتانا', + 'سیمان زابل', + 'گروه صنایع غذایی', + 'سیمان فارس نو', + 'کشاورزی و تحقیقاتی نوین زعفران', + 'سیمان لار سبزوار', + 'گلستان', + 'سیمان لارستان', + 'آرد زر', + 'سیمان لامرد', + 'اروم آدا', + 'سیمان مجد خواف', + 'ایران گلاب مرغوب', + 'سیمان ممتازان کرمان', + 'بيسكوئيت گرجي', + 'فراورده سیمان شرق', + 'تحول چاشنی توس', + 'گچ ماشيني فارس', + 'تهیه و بسته بندی خشکبار آرات', + 'سیمان آذر آبادگان خوی', + 'توسعه کشت ذرت', + 'سیمان بوهروک یزد', + 'تولیدی آرد البرز', + 'سیمان جوین', + 'تولیدی زعفران سحرخیز', + 'سیمان قشم', + 'خوراك دام پارس', + 'سیمان کردستان', + 'دشت مرغاب', + 'گچ تهران', + 'روغن نباتي پارس', + 'گروه فولاد', + 'روغن نباتي جهان', + 'پلی ران اتصال', + 'روغن نباتی گلناز', + 'توليدی لوله هاي پلي اتيلن دوجداره بوشهر', + 'روغنکشی خرمشهر', + 'تولید لوله و پوشش سلفچگان', + 'زر ماکارون', + 'سلفچگان', + 'سالمين', + 'ذوب آهن اصفهان', + 'سپتیکو', + 'ساخته های فلزی اصفهان', + 'سحر همدان', + 'صنايع فرو آلياژ ايران', + 'سقزسازی کردستان', + 'صنايع گالوانيزه فجر سپاهان', + 'شاد گل نیشابور', + 'صنایع فولاد آلياژي يزد', + 'شهد ايران', + 'فولاد اکسین خوزستان', + 'صنایع غذایی مینو شرق', + 'فولاد آلیاژی ایران', + 'صنعتي  پارس مينو', + 'فولاد خوزستان', + 'صنعتي مينو خرم دره', + 'فولاد صنعت مهدی', + 'فراورده های سیب زمینی پریس اصفهان', + 'فولاد مباركه اصفهان', + 'فرآورده های گوشتی تهران', + 'کارخانجات نورد لوله یاران', + 'كشت و صنعت پياذر', + 'کاوه کشاورز', + 'كيوان', + 'گروه صنعتي سپاهان', + 'کشت و صنعت اشراق', + 'لوله و پروفیل سپنتا تهران', + 'کشت و صنعت قطران گل ایران', + 'لوله و ماشين سازي ايران', + 'کشت وصنعت روژین تاک', + 'مجتمع فولاد خراسان', + 'کشتارگاه صنعتی طیور سپیدان آمل', + 'میراب پروفیل', + 'گروه توليدي مهرام', + 'نورد و توليد قطعات فولادي', + 'گلوكوزان', + 'نورد و لوله صفا', + 'مارگارين', + 'نوین آلیاژسمنان', + 'مجتمع صنایع غذایی بهپودر اصفهان', + 'فولاد آذربايجان', + 'مجتمع كشت و صنعت چين چين', + 'فولاد افزا سپاهان', + 'مجتمع کارخانجات سوربن شمال', + 'گروه ملي صنعتي فولاد ايران', + 'مرغ اجداد زربال', + 'پروفيل صنعت جنوب', + 'شوكو پارس', + 'صبا فولاد خلیج فارس', + 'آرد تجارت', + 'فولاد تربت حیدریه', + 'بهپاك', + 'لوله و تجهيزات سديد', + 'پيچك', + 'نورد لوله اهواز', + 'توسعه کشت و صنعت ملی ( كشت و صنعت گرگان )', + 'نورد و پروفيل پارس', + 'فراورده هاي غذائي مشهد', + 'گروه پیمانکاری صنعتی', + 'گروه معادن', + 'احداث صنعت', + 'معدن کاران انگوران', + 'گروه ساخت قطعات خودرو', + 'باما', + 'تولید موتور های دیزل ایران', + 'تامين ماسه ريخته گري', + 'اگزوز خودرو خراسان', + 'تامین مواد اولیه فولاد صبا نور', + 'الكتريك خودرو شرق', + 'توسعه معادن روي ايران', + 'آهنگري تراكتورسازي ايران', + 'توليد فروموليبدن كرمان', + 'اورند پلاستیک', + 'تولیدی آذر سنگ سرخ', + 'ايران دوچرخ', + 'جهاد نصر سیرجان', + 'پلاسكو كار سايپا', + 'حفاری ایراندشت کاشان', + 'توليد محورخودرو', + 'ذوب وروی بافق', + 'توليدي قطعات محوري خراسان', + 'زرین معدن آسیا', + 'تولیدی صنعتی لنت پارس', + 'زغال سنگ نگين طبس', + 'چرخشگر', + 'زنجان برنز', + 'رادياتور ايران', + 'سرمایه گذاری توسعه معادن کوثر', + 'ريخته گري تراكتورسازي ايران', + 'سنگ آهن شرق', + 'رينگ سازي مشهد', + 'سنگ آهن گل گهر', + 'ریخته گری آلومینیوم ایران خودرو', + 'سنگاب آذرشهر', + 'ساخت و نصب صنعتی البرز', + 'سنگاب همدان', + 'سازه پويش', + 'سوژميران', + 'سايپا آذين', + 'سولفاتيک', + 'سایپا پرس', + 'شن سازان هراز', + 'سیبا موتور', + 'صنعت روی زنگان', + 'شمیم پژوهش', + 'صنعتي و معدني شمال شرق شاهرود', + 'صنايع ريخته گري ايران', + 'فراوري مواد معدني ايران', + 'صنایع ریخته گری پرلیت آسیا', + 'فرو سيليس ايران', + 'صنایع نوید موتور', + 'مجتمع معادن سنگ چینی نی ریز', + 'صنعتي نيرو محركه', + 'معادن بافق', + 'صنعتی صبوران پلیمر', + 'معادن سنگ اهن احیاء سپاهان', + 'فنر سازی زر گلپايگان', + 'معادن منگنز ايران', + 'فنرسازي خاور', + 'معدن کار باختر', + 'فنرسازي زر', + 'معدني دماوند', + 'كاربراتور ايران', + 'معدني و صنعتي چادرملو', + 'كارخانجات كمك فنر ايندامين سايپا', + 'معدنی و فرآوری سرمه فیروزآباد', + 'کابل خودرو سبزوار', + 'ندای رهاوی', + 'کلاچ سازی شایان صنعت', + 'زغال سنگ البرز شرقی', + 'گیربکس سایپا', + 'زغال سنگ البرز مرکزی', + 'لنت ترمز ايران', + 'زغال سنگ کرمان', + 'ماشین سازی فراگیر سپنتا', + 'فرآوري معدني اپال کاني پارس', + 'مجتمع صنعتی سپاهان باطری', + 'گروه توسعه معادن روی ایران', + 'محورسازان ايران خودرو', + 'گروه قند و شکر', + 'مهركام پارس', + 'سهامی عام شهد – قند خوی', + 'مهندسي نصير ماشين', + 'شکر شاهرود', + 'موتورسازان تراكتورسازي ايران', + 'صنعتی کشاورزی شیرین خراسان', + 'نیروسازاراک‎', + 'فرآورد ه هاي غذايي و قند پيرانشهر', + 'یسکو', + 'فراورده هاي غذايي و قند تربت جام', + 'گروه انتشار، چاپ و تكثير', + 'فرآورده هاي غذايي و قند چهارمحال', + 'افست', + 'قند اصفهان', + 'گروه خدمات فنی و مهندسی', + 'قند ثابت خراسان', + 'ملی ساختمان', + 'قند شيروان قوچان وبجنورد', + 'مهندسی فرا نیرو', + 'قند قهستان', + 'آبادراهان پارس', + 'قند لرستان', + 'احداث تاسیسات انتقال نیرو – اتانیر', + 'قند مرودشت', + 'آذرپاسیلو', + 'قند نقش جهان', + 'ارسا ساختمان', + 'قند نيشابور', + 'آفرینه طوس', + 'قند هكمتان', + 'اهرام فناوری قدرت', + 'کارخانجات قند قزوین', + 'ایریتک', + 'قند بيستون', + 'بازرسي مهندسي و صنعتي ايران', + 'قند پارس', + 'تجهیزات و خدمات صنایع آب و برق ایران – صانیر', + 'گروه رایانه و فعالیتهای وابسته به آن', + 'تکنیک', + 'ایران ارقام', + 'توسعه ساخت و نصب صنايع بتني و فلزي گسترش مانا ساز آبيک', + 'تجارت الكترونيك پارسيان', + 'جنرال مکانیک', + 'توسعه سازه پایه فن آوا', + 'حفاری شمال', + 'توسعه فناوری اطلاعات خوارزمی', + 'خدمات مهندسی ساختمان تاسیسات راه آهن', + 'تینا سامانه', + 'خدماتي تجهيزات سنگين همگام', + 'داده پردازي خوارزمي', + 'راهبران فولاد اصفهان', + 'داده پردازی ایران', + 'راهسازی و ساختمانی 115', + 'داده پردازی فن آوا', + 'ره  گستر نفت', + 'داده سامانه فن آوا', + 'صنعتی دریایی ایران – صدرا', + 'فن آوا کارت', + 'فراب', + 'کارت اعتباری ایران کیش', + 'کیسون', + 'گسترش الکترونیک مبین ایران', + 'معماران پارس صنعت', + 'خدمات انفورماتیک', + 'مهام شرق', + 'گروه وسايل اندازه گيري، پزشكي و اپتيكي', + 'مهندسان مشاور سازه', + 'مهندسی فرسار تجارت', + 'مهندسي و نصب فيرمکو پارس', + 'پویندگان راه سعادت', + 'مهندسي وتحقيقاتي فلزات غيرآهنی', + 'كنتور سازي ايران', + 'مهندسی و پشتیبانی نیروگاهی البرز توربین', + 'گروه ماشين آلات و تجهيزات', + 'موننکو ایران', + 'مارال صنعت جاوید', + 'نصب نیرو', + 'ماشین رول', + 'خدمات ماشینی کشتیرانی', + 'افرند کالا سازه', + 'گسترش صنايع وخدمات', + 'آلفا پاک ایران', + 'گروه لوازم خانگي', + 'بلبرينگ ايران', + 'لعران', + 'بهسازان غلطک فولاد اصفهان', + 'ارج', + 'پارس بوشونگ', + 'آیسان خزر', + 'پاریزان صنعت', + 'پارس خزر', + 'پمپ سمنان انرژی', + 'تولیدی و صنعتی نیک کالا', + 'تراكتور سازي ايران', + 'صنايع سرماآفرين قشم', + 'تراکتور سازی کردستان', + 'صنعتي جنرال', + 'تسهیل ماشین صنعت', + 'كارخانجات آبسال', + 'توليد تجهيزات سنگين هپكو', + 'كارخانجات لوازم خانگي پارس', + 'توليدي پمپ پارس', + 'کارخانجات پارس ماشین', + 'توليدي تجهيزات ايمني راهها', + 'گروه صنعتي بوتان', + 'تیراژه ماشین', + 'لوازم خانگی نانیوا', + 'دلتا راه ماشین', + 'توليدي كولر گازي ايران', + 'رهشاد سپاهان', + 'جام جهان نما', + 'ساخت تجهيزات سپاهان', + 'كارخانجات صنعتي آزمايش', + 'سوت ماشین', + 'گروه پلاستيك', + 'صنايع پمپ سازي ايران', + 'یزد بسپار', + 'صنايع سرما آفرين', + 'آرتا پلاست', + 'صنایع پمپ ابارا', + 'پلاستيران', + 'صنعتی هلی خودرو', + 'پلاستيکهاي مهندسي درخشان ساز', + 'طراحي مهندسي وساخت تجهيزات وابزارآلات سايپا', + 'توليدي پلاستيك شاهين', + 'فولادريزي قائم سپهر سپاهان', + 'توليدي گاز لوله', + 'کالای پمپ', + 'توليدي و صنعتي درخشان تهران', + 'ماشين سازي اراك', + 'جوی گستر نفت', + 'ماشين سازي نیرو محركه', + 'صنايع لاستيك سهند', + 'مهندسي تكنو تار', + 'كارخانجات توليدي تهران', + 'مهندسي و توليد ماشين آلات راهسازي و معدني کشاورزي هپکو اراک', + 'توليدي وصنعتي ايران وغرب', + 'مهندسي و ساختمان ماشين سازي اراک', + 'لوله سازي اهواز', + 'مهندسي و قطعات ماشين آلات راه سازي ايران', + 'گروه مبلمان و مصنوعات ديگر', + 'مهندسی فیروزا', + 'عايق پلاستيك', + 'مهندسی و ساخت بویلر مپنا', + 'تجهيزات مدارس ايران', + 'هوا ابزار تهران', + 'صنعتی جهان چیدمان-جلیس', + 'اشتهاد موتورز', + 'گروه محصولات شيميايي', + 'كارخانجات صنعتي  و توليدي اتمسفر', + 'احسان شیمی استهبان', + 'كمپر سور سازي ايران', + 'آریا رزین', + 'ليفتراك سازي سهند', + 'الکترو زر سازه', + 'فرتاک ماشین', + 'ایمن تاش سپاهان', + 'کمباین سازی ایران', + 'بردار شیب', + 'ماشين آلات صنعتي تراكتور سازي ايران', + 'بين المللي محصولات پارس', + 'صنايع توليدي اشتاد ايران', + 'بين المللي سارنگ تدارك', + 'پروفيل و يخچال ايران پويا', + 'پارس زئولايت', + 'توليدي بهمن', + 'پارسیان پارت پاسارگاد', + 'گروه محصولات كاغذي', + 'پاكسان', + 'بسته بندي پارس', + 'پاکنام', + 'صنايع كاغذ سازي كاوه', + 'پالایش قطران ذغالسنگ اصفهان', + 'صنایع چوب و کاغذ مازندران', + 'توکا رنگ فولاد سپاهان', + 'كارتن البرز', + 'تولي پرس', + 'كارتن ايران', + 'توليد سموم علف كش', + 'کارتن مشهد', + 'تولید مواد اولیه الیاف مصنوعی', + 'محصولات کاغذی لطیف', + 'تولیدی و صنعتی  فراسان', + 'كارتن پارس', + 'تولیدی و صنعتی سامد', + 'گروه منسوجات', + 'تولیدی وصنعتی خودرنگ', + 'ايران برك', + 'حباب کف توس', + 'توليدي بافت آزادي', + 'داروئي ارايشي وبهداشتي مينو', + 'وطن اصفهان', + 'دنیای آرایش', + 'ريسندگي و با فندگي كاشان', + 'دوده صنعتي پارس', + 'ريسندگي و بافندگي پاكريس', + 'رزیتان', + 'ريسندگي و بافندگي ري', + 'ریف ایران', + 'فرش پارس', + 'سامان شیمی', + 'گردباف يزد', + 'سرمايه گذاري صنايع شيميايي ايران', + 'گروه صنعتي نقش ايران', + 'شيمي بافت', + 'نساجي بابكان', + 'شيميايي پارس پامچال', + 'نساجي خوي', + 'شيميايي فرآورد قشم', + 'نساجي غرب', + 'شیمیایی بهداد', + 'نساجي قائم شهر', + 'شیمیایی بهداش', + 'نساجي مازندران', + 'شیمیایی و تولیدی رزپلیمر', + 'وطن اصفهان', + 'صنايع شيميايي رنگين', + 'يزد باف', + 'صنايع شيميايي سينا', + 'صنايع نساجي ايران', + 'صنايع شيميايي فارس', + 'گروه بانك ها، موسسات اعتباري و ساير نهادهاي مالي', + 'صنایع بهداشتی ساینا', + 'بانك اقتصاد نوين', + 'صنایع رنگ و رزین طیف سایپا', + 'بانك پارسيان', + 'صنایع شیمی ساختمان آباد گران', + 'بانك سامان', + 'فراپاکس شیراز', + 'بانك كارآفرين', + 'كربن ايران', + 'بانک انصار', + 'كف', + 'بانک ایران زمین', + 'کلر پارس', + 'بانک پاسارگاد', + 'گلتاش', + 'بانک تجارت ایران', + 'لابراتوارهای داروهای گیاهی طبیعت زنده', + 'بانک حکمت ایرانیان', + 'لعاب مشهد', + 'بانک دی', + 'لعابيران', + 'بانک سرمایه', + 'مجتمع صنایع شیمیایی پلیمر ایران', + 'بانک سینا', + 'مديريت صنعت شوينده توسعه صنايع بهشهر', + 'بانک شهر', + 'مروارید هامون', + 'بانک صادرات ایران', + 'معدني املاح ايران', + 'بانک گردشگری', + 'ملي شيمي كشاورز', + 'بانک ملت', + 'من', + 'پست بانک', + 'نيرو كلر', + 'بانک تات', + 'الياف', + 'بانک کشاورزی', + 'پارسيلون', + 'گروه واسطه گري هاي مالي', + 'توليدي  الياف پلي  پروپيلين  بنياد', + 'رايان سايپا', + 'صنايع تبديلي گلستان', + 'سپرده گذاری مرکزی اوراق بهادار و تسویه وجوه', + 'كارخانجات توليدي سوپر رنگ', + 'ليزينگ آريادانا', + 'صنايع رنگ پارس الوان', + 'ليزينگ ايران', + 'گروه مواد و محصولات دارويي', + 'ليزينگ خودرو غدير', + 'آفا شیمی', + 'ليزينگ صنعت و معدن', + 'البرز دارو', + 'ليزينگ ماشين الات سنگين ايرانيان', + 'ايران دارو', + 'لیزینگ اقتصاد نوین', + 'پارس دارو', + 'لیزینگ رازی', + 'تحقیقاتی و تولیدی سیناژن', + 'لیزینگ ماشین آلات و تجهیزات پاسارگاد', + 'تهران دارو', + 'لیزینگ ایرانیان', + 'تهران شيمي', + 'لیزینگ شهر – لیزینگ سامان آریا', + 'توليد ژلاتين کپسول ايران', + 'گروه توزیع برق', + 'توليد مواد اوليه دارو پخش', + 'توزیع برق بوشهر', + 'تولید مواد دارویی درسا دارو', + 'توسعه برق شمال افشان گستر', + 'داروسازي اسوه', + 'صنايع برق زنگان پارس', + 'داروسازي اكسير', + 'گهر انرژي سيرجان', + 'داروسازي امين', + 'برق و انرژی صبا', + 'داروسازي جابرابن حيان', + 'گروه شرکتهای بازرگانی', + 'داروسازي حكيم', + 'اتصال استیل هما', + 'داروسازي دكتر عبيدي', + 'اسپرلوس اهورا', + 'داروسازي روزدارو', + 'افزار پرداز رمیس', + 'داروسازي زهراوي', + 'الهام بیسان', + 'داروسازي فارابي', + 'ایمان تجارت روشن', + 'داروسازي كوثر', + 'بازرگاني پتروشيمي', + 'داروسازی بهوزان', + 'بازرگانی ارمغان مهر سیرت', + 'داروسازی تولید دارو – سهامی خاص', + 'بازرگانی ایران ترانسفو', + 'داروسازی دانا', + 'بازرگانی بین المللی استوان سپند', + 'داروسازی شهید قاضی تبریز', + 'بازرگانی پارس ماهان آسیا', + 'داروسازی گیلارانکو', + 'بازرگانی پتروشیمی زنجان', + 'داروئي و بهداشتي لقمان', + 'بازرگانی تبادل و تدارک کالا', + 'داملران', + 'بازرگانی صبا بیمه ایرانیان', + 'سينا دارو', + 'بازرگانی مبین تجارت غرب', + 'شيمي دارويي داروپخش', + 'بازرگانی نفت یاب', + 'صنعتي كيميدارو', + 'بازرگانی،صنعتی بهشت پارس', + 'فارما شیمی', + 'بهترین های پزشکی پارس', + 'فراورده هاي تزريقي ايران', + 'پارس بازرگان', + 'كارخانجات دارو پخش', + 'پارس گستر مینو', + 'لابراتورهای دارویی رازک', + 'پديده گستران غرب', + 'مواد اولیه دارویی تهران شیمی', + 'تجارت گستران خوارزمي', + 'داروسازی سبحان انکولوژی', + 'تجاری و بازرگانی مواد معدنی میناب', + 'سرمايه گذاري البرز', + 'تجهیز یاران', + 'شيرين دارو', + 'تهیه و تولید خاک نسوز استقلال آباده', + 'گروه دارویی سبحان', + 'توسعه صنايع غذايي بم', + 'گروه خودروسازی', + 'توسعه و تجارت بین المللی صبا', + 'ايران خودرو', + 'توسعه و تجارت ماتریس', + 'ايران خودروديزل', + 'جهان فعالیت', + 'ایران خودرو تبریز', + 'خشکبار دست چین', + 'ایران خودرو خراسان', + 'داده های رسا', + 'ایران خودرو مازندران', + 'دانیال کار', + 'بهمن دیزل', + 'درمان یار آنی', + 'پارس خودرو', + 'راسن درمان', + 'تولیدی و صنعتی عقاب افشان', + 'رویال پیشگام شرق', + 'زامياد', + 'سامان بارز', + 'سايپا', + 'سیاحان سپهر آسیا', + 'سايپاديزل', + 'صخره سنگی فرزین', + 'سایپا کاشان', + 'صنایع نئون پرس', + 'گروه بهمن', + 'فانوس دشت تجارت', + 'بنيان ديزل', + 'کیا مهستان', + 'توليدي مرتب', + 'کیمیا آرا هرم', + 'گروه محصولات لبني', + 'گسترش تجارت کالای ایرانیان', + 'پاک پی', + 'مديريت و ساخت طرحهاي نفت گستر', + 'تولید فرآورده های لبنی کاله', + 'مهر اسپند پویا', + 'شير پاستوريزه پگاه اصفهان', + 'مهندسی بازرگانی درداران سریر', + 'شير پاستوريزه پگاه خراسان', + 'نویان بسپار', + 'شير پگاه آذربايجان غربي', + 'نیکان شهد بارز', + 'صنايع شير ايلام زاگرس', + 'گروه هولدینگ', + 'فراورده هاي لبني پاکسار ساري', + 'توسعه صنايع بهشهر – هلدينگ', + 'لبنيات پاستوريزه پاك', + 'داروپخش – هلدينگ', + 'لبنيات كالبر', + 'راه آهن جمهوری اسلامی ایران', + 'لبنیات پاستوریزه پاک آرا سنندج', + 'سرمايه گذاري توسعه معادن و فلزات', + 'گروه منسوجات و فرش بافی', + 'سرمايه گذاري توكا فولاد – هلدينگ', + 'ابهر ریس', + 'سرمايه گذاري صنعت نفت – هلدينگ', + 'ايران پوپلين', + 'سرمایه گذاری گروه صنعتی ملی', + 'ايران مرينوس', + 'گروه صنعتي سديد – هلدينگ', + 'بافتینه', + 'گروه صنعتي قطعات اتومبيل ايران', + 'پشمبافي توس', + 'گروه صنعتي ناب', + 'پلي اكريل ايران', + 'گسترش نفت و گاز پارسیان', + 'تمدن فرش کاشان', + 'مدیریت پروژه های نیروگاهی ایران – مپنا', + 'تولیدی پارس دکور', + 'هلدینگ توسعه معادن و صنایع معدنی خاورمیانه', + 'تولیدی پارس نخ', + 'هلدینگ دامپروری شیروگوشت پارس', + 'تولیدی پینک', + 'سرمايه گذاري بانك ملي ايران – هلدينگ', + 'تولیدی و صنعتی پارس تکمیل', + 'صنعتي بهشهر', + 'تولیدی و صنعتی رسول اصفهان', + 'گروه بنادر ودریانوردی', + 'شبنم باف', + 'پایانه ها و مخازن پتروشیمی', + 'صنایع موکت همدان', + 'خدمات دریایی و بندری کاوه', + 'صنایع نخ خمین', + 'گروه گاز', + 'صنایع نساجی همدانیان', + 'گاز اصفهان', + 'ظریف مصور', + 'ملی گاز', + 'فرش مشهد', + 'گاز خراسان جنوبی', + 'فرش نگین مشهد', + 'گروه آشامیدنی ها', + 'کارخانجات ریسندگی نطنز', + 'آب معدنی دماوند', + 'مخمل و ابريشم كاشان', + 'آذر شهد ارومیه', + 'موکت نگین مشهد', + 'بهنوش ايران', + 'نساجي بروجرد', + 'پیمان فردان', + 'نساجی کویر سمنان', + 'تولیدی نوشابه ارم نوش', + 'صنايع نساجي ايران', + 'زمزم آذربایجان', + 'گروه حمل و نقل دریایی و حمل و نقل آب های ساحلی', + 'زمزم اصفهان', + 'حمل و نقل ترکیبی کشتیرانی جمهوری اسلامی', + 'زمزم تهران', + 'حمل و نقل خدمات دریایی آبادان', + 'زمزم رشت', + 'خدمات دریایی و کشتیرانی خط دریا بندر', + 'زمزم گرگان', + 'دريابان جنوب ايران', + 'شهداب', + 'کشتیرانی آریا', + 'فرآورده های نوشیدنی تسنیم نوش', + 'کشتیرانی جمهوری اسلامی ایران', + 'نوش مازندران', + 'کشتیرانی والفجر', + 'ساسان', + 'گروه خدمات فنی-مهندسی خودرو', + 'گروه تایر سازی', + 'امداد خودرو ایران', + 'ایران یاسا', + 'امداد خودرو سایپا', + 'بید وایر ایران', + 'بازرسی فنی و کنترل خوردگی تکین کو', + 'توليدي ايران تاير', + 'گواه', + 'توليدي لاستيکهاي صنعتي مبارکه', + 'مزدا یدک', + 'کویر تایر', + 'مهندسی و مشاور سازه گستر سایپا', + 'لاستيك دنا', + 'خدمات کمات ماشین شرق', + 'لاستیک بارز', + 'گروه فرهنگی و گردشگری', + '8', + 'لاستیک پارس', + 'تجارت توسعه گردشگري آتيه انديشان', + 'مجتمع صنايع لاستيك يزد', + 'توسعه گردشگري کاروانسراي پارس', + 'مجتمع صنعتي آرتاويل تاير', + 'گروه سرمايه گذاري ميراث فرهنگي و گردشگري ايران', + 'توليدي لاستيك البرز – كيان تاير', + 'مجتمع توريستي، رفاهي آبادگران ايران', + 'گروه شرکتهای مشاوره', + 'گروه كاني های غير فلزي', + 'irpmc', + 'آجر نسوز امين آباد', + 'بودجه irpmc', + 'آذريت', + 'همکاران سیستم اردبیل', + 'ايتالران', + 'همکاران سیستم البرز', + 'ايرانيت', + 'همکاران سیستم پناه شرق', + 'پرمیت', + 'همکاران سیستم خراسان جنوبی', + 'پشم شیشه ایران', + '7', + 'همکاران سیستم خراسان رضوی', + 'تولیدی و صنعتی آبگینه', + 'همکاران سیستم خوزستان', + 'خاك چيني ايران', + 'همکاران سیستم زنجان', + 'زرین شیشه مرکزی', + 'همکاران سیستم فارس', + 'سایپا شیشه', + 'همکاران سیستم قزوین', + 'سراميك هاي صنعتي اردكان', + 'همکاران سیستم گیلان', + 'شيشه قزوين', + 'همکاران سیستم مازندران', + 'شيشه همدان', + 'گروه ماشين آلات و دستگاههاي برقي', + 'شيشه و گاز', + 'ايران ترانسفو', + 'شیشه داروئی رازی تاکستان', + 'ایران ترانسفوی ری', + 'فارسيت اهواز', + 'پارس سوئيچ', + 'فرآورده هاي نسوز پارس', + 'تال ایران', + 'فرآورده هاي نسوزآذر', + 'تامین تابلو', + 'فراورده های نسوز ایران', + 'تجهیزات انتقال برق پارس', + 'كارخانجات توليدي شيشه دارويي رازي', + 'ترانسفور ماتور توزیع زنگان', + 'كارخانه فارسيت درود', + 'تهران پادنا', + 'ورزيران', + 'توربوژنراتور شاهرود', + 'مقره سازی ایران', + 'توس فیوز', + 'چینی سازی البرز', + 'جابون', + 'گروه ارتباطات', + 'خیام الکتریک', + 'ارتباطات فن آوا', + 'صنايع جوشكاب يزد', + 'ارتباطات کوه نور', + 'صنایع کابل سازی افق البرز', + 'ارتباطات سیار ایران – همراه اول', + 'صنعتی مهندسی پالایش نیرو', + 'مخابرات ایران', + 'فاراتل', + 'گروه شرکت های پخش', + 'كابل البرز', + 'پخش سراسری کالای کالبر', + 'كابل باختر', + 'پخش هجرت', + 'كابلهاي مخابراتي شهيد قندي', + 'توزيع داروهاي دامي داروپخش', + 'كارخانجات كابلسازي ايران', + 'مهندسي و پشتيباني پخش فرآورده هاي نفتي امين', + 'کابل تک', + 'گروه بیمه', + 'لامپ پارس شهاب', + 'بيمه پاسارگاد', + 'مازی نور', + 'بیمه آسیا', + 'مهندسی مپنا مکو', + 'بیمه البرز', + 'مهندسی و ساخت توربین مپنا توکا', + 'بیمه پارسیان', + 'مهندسی و ساخت ژنراتور مپنا – پارس', + 'بیمه دانا', + 'موتوژن', + 'بیمه دی', + 'نيرو ترانس', + 'بیمه نوین', + 'پارس نور الکتریک', + 'صندوق بیمه سرمایه گذاری فعالیت های معدنی', + 'توليدي قوه پارس', + 'گروه سرمايه گذاري ها', + 'مهندسی و ساخت پره توربين مپنا – پرتو', + 'حفیظ سامانه', + 'تامین قطعات و تجهیزات سرو نیرو شیراز', + 'تکادو', + 'صنایع مهتاب خراسان', + 'سرمايه گذاري آتيه دماوند', + 'صنعتي مهر آباد', + 'سرمايه گذاري انديشه محوران', + 'گروه كشاورزي ، دامپروري و خدمات وابسته به آن', + 'سرمايه گذاري بهمن', + 'تلیسه نمونه', + 'سرمايه گذاري پارس توشه', + 'دانه چین', + 'سرمايه گذاري توسعه آذربايجان', + 'دامپروری و مرغداری دشت خرمدره', + 'سرمايه گذاري توسعه صنعتي ايران', + 'دامداری شیر و دام بنیاد', + 'سرمايه گذاري توسعه ملي', + 'شیر و گوشت زاگرس', + 'سرمايه گذاري چشم انداز توسعه شمال', + 'کشاورزی ودامپروری بینالود', + 'سرمايه گذاري ساختمان ايران – هلدينگ', + 'کشاورزی ودامپروری دشت نوین ملایرا', + 'سرمايه گذاري سايپا', + 'کشاورزی ودامپروری یاسوج', + 'سرمايه گذاري سپه', + 'کشت و دام قیام اصفهان', + 'سرمايه گذاري صندوق بازنشستگي كشوري', + 'کشت وصنعت سبز پاسارگاد', + 'سرمايه گذاري صنعت بيمه', + 'گسترش صنايع و خدمات کشاورزي', + 'سرمايه گذاري صنعت ومعدن', + 'مجتمع دامداری بیجین', + 'سرمايه گذاري گروه صنايع بهشهر ايران', + 'مجتمع شیر و گوشت مهدشت', + 'سرمايه گذاري گروه صنعتي رنا', + 'مگسال', + 'سرمايه گذاري معيار صنعت پارس', + 'کشت وصنعت پیوند هراز', + 'سرمايه گذاري ملت', + 'گروه محصولات فلزي', + 'سرمايه گذاري ملي ايران', + 'صنعتی گام اراک', + 'سرمايه گذاري نيرو', + 'آریا بارون توس', + 'سرمايه گذاري هامون کيش', + 'پودر جوش ایران', + 'سرمایه گذاری اعتماد جم', + 'تولیدی و صنعتی الکترود یزد', + 'سرمایه گذاری اقتصاد نوین', + 'جوش و اکسیژن ایران', + 'سرمایه گذاری ایساتیس پویا', + 'دژپاد', + 'سرمایه گذاری پارس آریان', + 'سولیران', + 'سرمایه گذاری توسعه و عمران استان اردبیل-سبلان سبز', + 'صنايع مفتولي زنجان', + 'سرمایه گذاری دارویی تامین', + 'صنایع آذرآب', + 'سرمایه گذاری دانایان پارس', + 'صنایع استیل البرز', + 'سرمایه گذاری سروش یاران', + 'صنایع بسته بندی ایران', + 'سرمایه گذاری صندوق بازنشستگی کارکنان بانک ها', + 'صنایع بسته بندی مشهد', + 'گسترش سرمايه گذاري ايران خودرو', + 'صنایع فلزی کوشا', + 'گسترش سرمایه گذاری ایرانیان', + 'صنعتی آما', + 'مديريت سرمايه گذاري اميد', + 'صنعتی جام دارو', + 'نیرو سرمایه', + 'لامیران – تیغ ایران', + 'هلدینگ توسعه معادن و صنایع معدنی خاور میانه -میدکو', + 'آونگان', + 'ملی نفت ایران', + 'پارس متال', + 'مديريت سرمايه برنا', + 'پایساز', + 'سرمايه گذاري بوعلي', + 'توسعه و گسترش صنایع بسته بندی فلزی', + 'سرمايه گذاري سمند', + 'تولیدی ابزار مهدی', + 'سرمايه گذاري صنايع پتروشيمي', + 'گسترش صنایع انرژی آذرآب', + 'سرمايه گذاري كار آفرين', + 'صنایع فلزی ایران', + 'سرمايه گذاري نفت قشم', + 'صنعتی کاوه', + 'سرمایه گذاری پویا همگام', + 'صنعتی ملایر', + 'سرمایه گذاری توسعه  الوند غدیر', + 'بسته بندي البرز', + 'گروه فعاليتهاي پشتيباني و حمل و نقل', + 'گروه حمل و نقل، انبارداری و ارتباطات', + 'خدمات دريايي تايدواترخاورميانه', + 'بنیادبارانداز', + 'گروه توليدات پتروشيمي', + 'توکا ریل', + 'پترو شیمی لاله', + 'حمل و نقل آشنا راه سماء', + 'پتروشيمي آبادان', + 'حمل و نقل بین المللی خلیج فارس', + 'پتروشيمي اراك-پتروشیمی شازند', + 'حمل و نقل پتروشیمی', + 'پتروشيمي اصفهان', + 'حمل و نقل توکا', + 'پتروشيمي شيراز', + 'گروه فرآورده هاي نفتي كك و سوخت هسته اي', + 'پتروشیمی  پردیس', + 'پالايشگاه نفت تبريز', + 'پتروشیمی  زاگرس', + 'پالایش نفت آبادان', + 'پتروشیمی امیرکبیر', + 'پالایش نفت بندر عباس', + 'پتروشیمی بندر امام', + 'پالایش نفت تهران', + 'پتروشیمی بیستون', + 'پالایش نفت لاوان', + 'پتروشیمی تند گویان', + 'پالایشگاه نفت شیراز', + 'پتروشیمی جم', + 'تجهيز نيروي زنگان', + 'پتروشیمی جهرم', + 'خدمات حفاری صنایع نفت', + 'پتروشیمی خارک', + 'نفت ایرانول', + 'پتروشیمی خراسان', + 'نفت بهران', + 'پتروشیمی رجال', + 'نفت پارس', + 'پتروشیمی فن آوران', + 'نگین فخر آذربایجان', + 'پتروشیمی مارون', + 'توسعه نفت وگاز مپنا', + 'پتروشیمی مبین', + 'تولیدی مخازن گاز طبیعی آسیا ناما', + 'صنایع پتروشیمی کرمانشاه', + 'گروه كاشي و سراميك', + 'پتروشيمي اروند', + 'پارس سرام', + 'پتروشيمي برزويه', + 'تولید سرام دیر گداز', + 'پتروشيمي فجر', + 'تولیدی توس چینی', + 'مديريت توسعه صنايع پتروشيمي', + 'تولیدی گرانیت بهسرام', + 'پتروشيمي بوعلي سينا', + 'سرامیک طوس', + 'پتروشيمي بين الملل', + 'صنایع چینی زرین ایران', + 'پتروشيمي خوزستان', + 'صنایع کاشی اصفهان', + 'پتروشيمي پارس', + 'صنایع کاشی تیما', + 'اوره و ؛آمونیک پتروشیمی زنجان', + 'صنایع کاشی نائین', + 'پتروشيمي فسا', + 'صنایع کاشی و سرامیک الوند', + 'پتروشیمی داراب', + 'کارخانجات کاشی و سرامیک حافظ', + 'پتروشیمی سرمایه گذاری ایرانیان', + 'کارخانه چینی ایران', + 'پتروشیمی لردگان', + 'کاشی بیستون', + 'پتروشیمی ممسنی', + 'کاشی پارس', + 'خاک طلایی توس', + 'کاشی تکسرام', + 'شهرک صنعتی پتروشیمی زنجان', + 'کاشی فیروزه مشهد', + 'صنايع پتروشيمي دهدشت', + 'کاشی کرد', + 'صنایع پتروشیمی تخت جمشید', + 'کاشی نیلو', + 'صنایع پتروشیمی زنجان', + 'کاشی و سرامیک سعدی', + 'گروه انبوه سازي، املاك و مستغلات', + 'کاشی و سرامیک سینا', + 'آ س پ', + 'گلسار فارس', + 'آذر توسعه مسکن', + 'گروه شركتهاي چند رشته اي صنعتي', + 'بين المللي توسعه ساختمان', + 'سرمايه گذاري غدير', + 'پارس مسکن خزر', + 'سرمایه گذاری گروه توسعه ملی(سرمایه گذاری بانک ملی ایران', + 'توسعه ساختمان خوارزمي', + 'گروه ساير وسايل حمل و نقل', + 'توسعه صنعت ساختمان غدیرخوزستان', + 'سرمايه گذاري اعتباري ايران', + 'زرین بنا پارسیان', + 'گروه ساخت راديو، تلويزيون و دستگاهها و وسايل ارتباطي', + 'ساختمان اصفهان', + 'آريا الكترونيك ايران', + 'ساختماني برج ناهيد', + 'پارس الكتريك', + 'سامان گستر اصفهان', + 'شهاب', + 'سرمايه گذاري توسعه شهري توس گستر', + 'صنايع مخابراتي راه دور ايران', + 'سرمايه گذاري توسعه وساختماني برج آوران', + 'فن آوران انیاک', + 'سرمايه گذاري ساختمان نوین', + 'كارخانجات صنعتي پيام', + 'سرمايه گذاري شاهد', + 'كارخانجات مخابراتي ايران', + 'سرمايه گذاري و توسعه خوزستان', + 'مرکز ماشینهای اداری ایران', + 'سرمایه گذاری مسکن تهران', + 'گروه محصولات چوبي', + 'سرمایه گذاری مسکن شمال شرق', + 'ایزوفام', + 'شهرسازی و خانه سازی باغ میشه', + 'توليد فيبر ايران', + 'صبا آرمه', + 'صنايع چوب خزر کاسپين', + 'طرح ساختمان پارسا', + 'نئوپان 22 بهمن', + 'عمران و توسعه شاهد', + 'سخت آژند', + 'گروه شرکت های مشاوره تبلیغاتی', + 'موسسه پویندگان توسعه پارس', + # Source: https://en.wikipedia.org/wiki/List_of_companies_of_Iran + 'شرکت ملی نفت ایران', + 'معادن ایران', + 'سازمان نوسازی', + 'ایران خودرو', + 'امیدان تجارت کیش ', + 'سایپا', + 'مجتمع فولاد مبارکه', + 'بانک پارسیان', + 'بانک سامان', + 'بانک سپه', + 'صنایع پتروشیمی ایران', + 'بانک مسکن', + 'لایف برد پارسه', + 'صنایع پترو شیمی بو علی سینا', + 'فولاد خورستان', + 'ابر موتور', + 'سرمایه‌گذاری بانک ملی', + 'ایران خودرو دیزل', + 'توسعه صنعتی بوشهر', + 'بانک اقتصاد نوین', + 'شرکت زامیاد', + 'صنایع شیر ایران (پگاه)', + 'سرمایه‌گذاری غدیر', + 'ایمیدرو', + 'کارخانجات داروپخش', + 'سایپا دیزل', + 'بانک کارآفرین', + 'معدنی و صنعتی چادرملو', + 'ساخت تأسیسات دریایی ایران', + 'اتکا', + 'گسترش و نوسازی صنایع ایران', + 'تولی‌پرس', + 'هواپیمایی آسمان', + 'سازمان صنایع هوایی ایران', + 'مادیران', + 'پارس آنلاین', + 'شاتل', + 'شرکت مخابرات ایران', + 'ایرانسل', + 'راه‌آهن ایران', + 'هواپیمایی پیام', + 'متروی تهران', + 'شرکت ملی نفت‌کش ایران', + 'پالایش و پخش فراورده‌های نفتی ایران', + 'سازمان انرژی اتمی ایران', + 'صدا و سیما', + 'رجحان', + 'شرکت داده‌پردازی ایران', + 'گروه هتل‌های هما', + 'کیش اورینتال', + 'الک تیک', + ] + + def company(self): + return self.random_element(self.company_names) \ No newline at end of file diff --git a/src/libs/faker/providers/company/fi_FI/__init__.py b/src/libs/faker/providers/company/fi_FI/__init__.py new file mode 100644 index 0000000..d2e3887 --- /dev/null +++ b/src/libs/faker/providers/company/fi_FI/__init__.py @@ -0,0 +1,53 @@ +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}}' + ) + + company_suffixes = ( + 'As Oy', 'Tmi', 'Oy', 'Oyj', 'Ky', 'Osk', 'ry' + ) + + def company_business_id(self): + """ + Returns Finnish company Business Identity Code (y-tunnus). + Format is 8 digits - e.g. FI99999999,[8] last digit is a check + digit utilizing MOD 11-2. The first digit is zero for some old + organizations. This function provides current codes starting with + non-zero. + """ + def calculate_checksum(number): + """Calculate the checksum using mod 11,2 method""" + factors = [7, 9, 10, 5, 8, 4, 2] + sum = 0 + for x, y in zip(number, factors): + sum = sum + int(x) * y + if sum % 11 == 0: + return '0' + else: + return str(11 - sum % 11) + + first_digit = str(self.random_digit_not_null()) + body = first_digit + self.bothify(self.random_element(('######',))) + cs = calculate_checksum(body) + return (body + '-' + str(cs)) + + def company_vat(self): + """ + Returns Finnish VAT identification number (Arvonlisaveronumero). + This can be calculated from company business identity code by + adding prefix "FI" and removing dash before checksum. + """ + def convert_to_vat(business_id): + """ + Convert business id to VATIN + """ + return 'FI' + business_id.replace('-', '') + + return convert_to_vat(self.company_business_id()) diff --git a/src/libs/faker/providers/company/fr_CH/__init__.py b/src/libs/faker/providers/company/fr_CH/__init__.py new file mode 100644 index 0000000..6c1cafe --- /dev/null +++ b/src/libs/faker/providers/company/fr_CH/__init__.py @@ -0,0 +1,40 @@ +# coding=utf-8 +from __future__ import unicode_literals +from ..fr_FR import Provider as CompanyProvider + + +class Provider(CompanyProvider): + company_suffixes = ('SA', 'Sàrl.') + + def ide(self): + """ + Generates a IDE number (9 digits). + http://www.bfs.admin.ch/bfs/portal/fr/index/themen/00/05/blank/03/02.html + """ + def _checksum(digits): + factors = (5, 4, 3, 2, 7, 6, 5, 4) + sum = 0 + for i in range(len(digits)): + sum += digits[i] * factors[i] + return sum % 11 + + while True: + # create an array of first 8 elements initialized randomly + digits = self.generator.random.sample(range(10), 8) + # sum those 8 digits according to (part of) the "modulo 11" + sum = _checksum(digits) + # determine the last digit to make it qualify the test + control_number = 11 - sum + if (control_number != 10): + digits.append(control_number) + break + + digits = ''.join([str(digit) for digit in digits]) + # finally return our random but valid BSN + return 'CHE-' + digits[0:3] + '.'\ + + digits[3:6] + '.'\ + + digits[6:9] + uid = ide + # uid: german name for ide + idi = ide + # idi: italian name for ide diff --git a/src/faker/providers/fr_FR/company.py b/src/libs/faker/providers/company/fr_FR/__init__.py similarity index 79% rename from src/faker/providers/fr_FR/company.py rename to src/libs/faker/providers/company/fr_FR/__init__.py index 4ab0456..3a0a2f2 100644 --- a/src/faker/providers/fr_FR/company.py +++ b/src/libs/faker/providers/company/fr_FR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -35,26 +35,23 @@ class Provider(CompanyProvider): siren_format = "### ### ###" - @classmethod - def catch_phrase_noun(cls): + def catch_phrase_noun(self): """ Returns a random catch phrase noun. """ - return cls.random_element(cls.nouns) + return self.random_element(self.nouns) - @classmethod - def catch_phrase_attribute(cls): + def catch_phrase_attribute(self): """ Returns a random catch phrase attribute. """ - return cls.random_element(cls.attributes) + return self.random_element(self.attributes) - @classmethod - def catch_phrase_verb(cls): + def catch_phrase_verb(self): """ Returns a random catch phrase verb. """ - return cls.random_element(cls.verbs) + return self.random_element(self.verbs) def catch_phrase(self): """ @@ -75,14 +72,13 @@ class Provider(CompanyProvider): # An array containing string which should not appear twice in a catch phrase words_which_should_not_appear_twice = ('sécurité', 'simpl') - @classmethod - def _is_catch_phrase_valid(cls, catch_phrase): + def _is_catch_phrase_valid(self, catch_phrase): """ Validates a french catch phrase. :param catch_phrase: The catch phrase to validate. """ - for word in cls.words_which_should_not_appear_twice: + for word in self.words_which_should_not_appear_twice: # Fastest way to check if a piece of word does not appear twice. begin_pos = catch_phrase.find(word) end_pos = catch_phrase.find(word, begin_pos + 1) @@ -91,15 +87,13 @@ class Provider(CompanyProvider): return True - @classmethod - def siren(cls): + def siren(self): """ Generates a siren number (9 digits). """ - return cls.numerify(cls.siren_format) + return self.numerify(self.siren_format) - @classmethod - def siret(cls, max_sequential_digits=2): + def siret(self, max_sequential_digits=2): """ Generates a siret number (14 digits). It is in fact the result of the concatenation of a siren number (9 digits), @@ -110,10 +104,5 @@ class Provider(CompanyProvider): if max_sequential_digits > 4 or max_sequential_digits <= 0: max_sequential_digits = 2 - sequential_number = str(cls.random_number(max_sequential_digits)).zfill(4) - return cls.numerify(cls.siren() + ' ' + sequential_number + '#') - - - - - + sequential_number = str(self.random_number(max_sequential_digits)).zfill(4) + return self.numerify(self.siren() + ' ' + sequential_number + '#') diff --git a/src/faker/providers/fi_FI/company.py b/src/libs/faker/providers/company/hr_HR/__init__.py similarity index 55% rename from src/faker/providers/fi_FI/company.py rename to src/libs/faker/providers/company/hr_HR/__init__.py index e009352..7fd2eb0 100644 --- a/src/faker/providers/fi_FI/company.py +++ b/src/libs/faker/providers/company/hr_HR/__init__.py @@ -1,15 +1,14 @@ from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): formats = ( '{{last_name}} {{company_suffix}}', '{{last_name}} {{last_name}} {{company_suffix}}', - '{{last_name}} {{last_name}} {{company_suffix}}', - '{{last_name}}' + '{{last_name}}', ) company_suffixes = ( - 'As Oy', 'Tmi', 'Oy', 'Oyj', 'Ky', 'Osk', 'ry' + 'd.o.o.', 'd.d.', 'j.d.o.o.' ) diff --git a/src/libs/faker/providers/company/hu_HU/__init__.py b/src/libs/faker/providers/company/hu_HU/__init__.py new file mode 100644 index 0000000..879c3f2 --- /dev/null +++ b/src/libs/faker/providers/company/hu_HU/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}} és {{last_name}} {{company_suffix}}', + '{{last_name}} és társa {{company_suffix}}' + ) + + company_suffixes = ('Kft.', 'Kht.', 'Zrt.', 'Bt.', 'Nyrt.', 'Kkt.') + + def company_suffix(self): + return self.random_element(self.company_suffixes) diff --git a/src/libs/faker/providers/company/id_ID/__init__.py b/src/libs/faker/providers/company/id_ID/__init__.py new file mode 100644 index 0000000..ed373d7 --- /dev/null +++ b/src/libs/faker/providers/company/id_ID/__init__.py @@ -0,0 +1,26 @@ +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{company_prefix}} {{last_name}}', + '{{company_prefix}} {{last_name}} {{last_name}}', + '{{company_prefix}} {{last_name}} {{company_suffix}}', + '{{company_prefix}} {{last_name}} {{last_name}} {{company_suffix}}', + ) + + # From http://id.wikipedia.org/wiki/Jenis_badan_usaha + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Company.php + company_prefixes = ( + 'PT', 'CV', 'UD', 'PD', 'Perum', + ) + + # From http://id.wikipedia.org/wiki/Jenis_badan_usaha + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Company.php + company_suffixes = ( + '(Persero) Tbk', 'Tbk', + ) + + def company_prefix(self): + return self.random_element(self.company_prefixes) diff --git a/src/faker/providers/it_IT/company.py b/src/libs/faker/providers/company/it_IT/__init__.py similarity index 98% rename from src/faker/providers/it_IT/company.py rename to src/libs/faker/providers/company/it_IT/__init__.py index 8f70754..5633649 100644 --- a/src/faker/providers/it_IT/company.py +++ b/src/libs/faker/providers/company/it_IT/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -93,4 +93,4 @@ class Provider(CompanyProvider): for word_list in self.bsWords: result.append(self.random_element(word_list)) - return " ".join(result) \ No newline at end of file + return " ".join(result) diff --git a/src/libs/faker/providers/company/ja_JP/__init__.py b/src/libs/faker/providers/company/ja_JP/__init__.py new file mode 100644 index 0000000..649fafa --- /dev/null +++ b/src/libs/faker/providers/company/ja_JP/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{company_prefix}} {{last_name}}', + ) + + company_prefixes = ('株式会社', '有限会社', '合同会社') + + def company_prefix(self): + return self.random_element(self.company_prefixes) diff --git a/src/faker/providers/ko_KR/company.py b/src/libs/faker/providers/company/ko_KR/__init__.py similarity index 99% rename from src/faker/providers/ko_KR/company.py rename to src/libs/faker/providers/company/ko_KR/__init__.py index 5989b7e..cdb9555 100644 --- a/src/faker/providers/ko_KR/company.py +++ b/src/libs/faker/providers/company/ko_KR/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): formats = ( diff --git a/src/faker/providers/no_NO/company.py b/src/libs/faker/providers/company/no_NO/__init__.py similarity index 89% rename from src/faker/providers/no_NO/company.py rename to src/libs/faker/providers/company/no_NO/__init__.py index 8b980ab..0ce2674 100644 --- a/src/faker/providers/no_NO/company.py +++ b/src/libs/faker/providers/company/no_NO/__init__.py @@ -1,5 +1,6 @@ +# coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): diff --git a/src/libs/faker/providers/company/pl_PL/__init__.py b/src/libs/faker/providers/company/pl_PL/__init__.py new file mode 100644 index 0000000..7480295 --- /dev/null +++ b/src/libs/faker/providers/company/pl_PL/__init__.py @@ -0,0 +1,114 @@ +# coding=utf-8 +from .. import Provider as CompanyProvider + + +def regon_checksum(digits): + """ + Calculates and returns a control digit for given list of digits basing on REGON standard. + """ + weights_for_check_digit = [8, 9, 2, 3, 4, 5, 6, 7] + check_digit = 0 + + for i in range(0, 8): + check_digit += weights_for_check_digit[i] * digits[i] + + check_digit %= 11 + + if check_digit == 10: + check_digit = 0 + + return check_digit + + +def local_regon_checksum(digits): + """ + Calculates and returns a control digit for given list of digits basing on local REGON standard. + """ + weights_for_check_digit = [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8] + check_digit = 0 + + for i in range(0, 13): + check_digit += weights_for_check_digit[i] * digits[i] + + check_digit %= 11 + + if check_digit == 10: + check_digit = 0 + + return check_digit + + +def company_vat_checksum(digits): + """ + Calculates and returns a control digit for given list of digits basing on NIP standard. + """ + weights_for_check_digit = [6, 5, 7, 2, 3, 4, 5, 6, 7] + check_digit = 0 + + for i in range(0, 9): + check_digit += weights_for_check_digit[i] * digits[i] + + check_digit %= 11 + + return check_digit + + +class Provider(CompanyProvider): + + def regon(self): + """ + Returns 9 character Polish National Business Registry Number, + Polish: Rejestr Gospodarki Narodowej - REGON. + + https://pl.wikipedia.org/wiki/REGON + """ + voivodeship_number = self.random_int(0, 49) * 2 + 1 + regon_digits = [int(voivodeship_number / 10), voivodeship_number % 10] + + for _ in range(6): + regon_digits.append(self.random_digit()) + + regon_digits.append(regon_checksum(regon_digits)) + + return ''.join(str(digit) for digit in regon_digits) + + def local_regon(self): + """ + Returns 14 character Polish National Business Registry Number, + local entity number. + + https://pl.wikipedia.org/wiki/REGON + """ + regon_digits = [int(digit) for digit in list(self.regon())] + + for _ in range(4): + regon_digits.append(self.random_digit()) + + regon_digits.append(local_regon_checksum(regon_digits)) + + return ''.join(str(digit) for digit in regon_digits) + + def company_vat(self): + """ + Returns 10 character tax identification number, + Polish: Numer identyfikacji podatkowej. + + https://pl.wikipedia.org/wiki/NIP + """ + vat_digits = [] + + for _ in range(3): + vat_digits.append(self.random_digit_not_null()) + + for _ in range(6): + vat_digits.append(self.random_digit()) + + check_digit = company_vat_checksum(vat_digits) + + # in this case we must generate a tax number again, because check_digit cannot be 10 + if check_digit == 10: + return self.company_vat() + + vat_digits.append(check_digit) + + return ''.join(str(digit) for digit in vat_digits) diff --git a/src/libs/faker/providers/company/pt_BR/__init__.py b/src/libs/faker/providers/company/pt_BR/__init__.py new file mode 100644 index 0000000..6af6af2 --- /dev/null +++ b/src/libs/faker/providers/company/pt_BR/__init__.py @@ -0,0 +1,88 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +def company_id_checksum(digits): + digits = list(digits) + weights = 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 + + dv = sum(w * d for w, d in zip(weights[1:], digits)) + dv = (11 - dv) % 11 + dv = 0 if dv >= 10 else dv + digits.append(dv) + + dv2 = sum(w * d for w, d in zip(weights, digits)) + dv2 = (11 - dv2) % 11 + dv2 = 0 if dv2 >= 10 else dv2 + digits.append(dv2) + + return digits[-2:] + + +class Provider(CompanyProvider): + formats = ( + '{{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}}', + '{{last_name}}', + ) + + catch_phrase_formats = ( + '{{catch_phrase_noun}} {{catch_phrase_verb}} {{catch_phrase_attribute}}', + ) + + nouns = ( + 'a segurança', 'o prazer', 'o conforto', 'a simplicidade', 'a certeza', 'a arte', 'o poder', 'o direito', + 'a possibilidade', 'a vantagem', 'a liberdade' + ) + + verbs = ( + 'de conseguir', 'de avançar', 'de evoluir', 'de mudar', 'de inovar', 'de ganhar', 'de atingir seus objetivos', + 'de concretizar seus projetos', 'de realizar seus sonhos' + ) + + attributes = ( + 'de maneira eficaz', 'mais rapidamente', 'mais facilmente', 'simplesmente', 'com toda a tranquilidade', + 'antes de tudo', 'naturalmente', 'sem preocupação', 'em estado puro', 'com força total', + 'direto da fonte', 'com confiança' + ) + + company_suffixes = ('S/A', 'S.A.', 'Ltda.', '- ME', '- EI', 'e Filhos') + + def catch_phrase_noun(self): + """ + Returns a random catch phrase noun. + """ + return self.random_element(self.nouns) + + def catch_phrase_attribute(self): + """ + Returns a random catch phrase attribute. + """ + return self.random_element(self.attributes) + + def catch_phrase_verb(self): + """ + Returns a random catch phrase verb. + """ + return self.random_element(self.verbs) + + def catch_phrase(self): + """ + :example 'a segurança de evoluir sem preocupação' + """ + pattern = self.random_element(self.catch_phrase_formats) + catch_phrase = self.generator.parse(pattern) + catch_phrase = catch_phrase[0].upper() + catch_phrase[1:] + return catch_phrase + + def company_id(self): + digits = self.random_sample(range(10), 8) + [0, 0, 0, 1] + digits += company_id_checksum(digits) + return ''.join(str(d) for d in digits) + + def cnpj(self): + digits = self.company_id() + return '{}.{}.{}/{}-{}'.format(digits[:2], digits[2:5], digits[5:8], + digits[8:12], digits[12:]) diff --git a/src/faker/providers/pt_BR/company.py b/src/libs/faker/providers/company/pt_PT/__init__.py similarity index 57% rename from src/faker/providers/pt_BR/company.py rename to src/libs/faker/providers/company/pt_PT/__init__.py index 160c330..c486f54 100644 --- a/src/faker/providers/pt_BR/company.py +++ b/src/libs/faker/providers/company/pt_PT/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -16,24 +16,22 @@ class Provider(CompanyProvider): ) nouns = ( - 'a segurança', 'o prazer', 'o conforto', 'a simplicidade', 'a certeza', 'a arte', 'o poder', 'o direito', - 'a possibilidade', 'a vantagem', 'a liberdade' + 'a segurança', 'o prazer', 'o conforto', 'a simplicidade', 'a certeza', + 'a arte', 'o poder', 'o direito', 'a possibilidade', 'a vantagem', + 'a liberdade' ) verbs = ( - 'de conseguir', 'de avançar', 'de evoluir', 'de mudar', 'de inovar', 'de ganhar', 'de atingir seus objetivos', + 'de conseguir', 'de avançar', 'de evoluir', 'de mudar', 'de inovar', + 'de ganhar', 'de atingir os seus objetivos', 'de concretizar seus projetos', 'de realizar seus sonhos' ) attributes = ( - 'de maneira eficaz', 'mais rapidamentet', 'mais facilmente', 'simplesmente', 'com toda a tranquilidade', - 'antes de tudo', 'naturellemente', 'sem preocupação', 'em estado puro', 'com força total', + 'de maneira eficaz', 'mais rapidamente', 'mais facilmente', + 'simplesmente', 'com toda a tranquilidade', 'antes de tudo', + 'naturalmente', 'sem preocupação', 'em estado puro', 'com força total', 'direto da fonte', 'com confiança' ) - company_suffixes = ('S/A', 'S.A.', 'Ltda.', '- ME', '- EI', 'e Filhos') - - - - - + company_suffixes = ('S/A', 'S.A.', 'Lda.', 'e Filhos') diff --git a/src/libs/faker/providers/company/ru_RU/__init__.py b/src/libs/faker/providers/company/ru_RU/__init__.py new file mode 100644 index 0000000..653e79e --- /dev/null +++ b/src/libs/faker/providers/company/ru_RU/__init__.py @@ -0,0 +1,20 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + +class Provider(CompanyProvider): + formats = ( + '{{company_prefix}} «{{last_name}}»', + '{{company_prefix}} «{{last_name}} {{last_name}}»', + '{{company_prefix}} «{{last_name}}-{{last_name}}»', + '{{company_prefix}} «{{last_name}}, {{last_name}} и {{last_name}}»', + '{{last_name}}', + ) + + company_prefixes = ( + 'РАО', 'АО', 'ИП', 'НПО', + ) + + def company_prefix(self): + return self.random_element(self.company_prefixes) diff --git a/src/libs/faker/providers/company/sk_SK/__init__.py b/src/libs/faker/providers/company/sk_SK/__init__.py new file mode 100644 index 0000000..9ae3505 --- /dev/null +++ b/src/libs/faker/providers/company/sk_SK/__init__.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}}', + ) + + company_suffixes = ( + 's.r.o.', 'v.o.s.', 'a.s.', 'k.s.', + ) diff --git a/src/faker/providers/sl_SI/company.py b/src/libs/faker/providers/company/sl_SI/__init__.py similarity index 82% rename from src/faker/providers/sl_SI/company.py rename to src/libs/faker/providers/company/sl_SI/__init__.py index 5be41d2..63aa8df 100644 --- a/src/faker/providers/sl_SI/company.py +++ b/src/libs/faker/providers/company/sl_SI/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): diff --git a/src/libs/faker/providers/company/sv_SE/__init__.py b/src/libs/faker/providers/company/sv_SE/__init__.py new file mode 100644 index 0000000..2230c70 --- /dev/null +++ b/src/libs/faker/providers/company/sv_SE/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as CompanyProvider + + +class Provider(CompanyProvider): + formats = ( + '{{last_name}} {{company_suffix}}', + '{{last_name}} {{last_name}} {{company_suffix}}', + '{{last_name}} & {{last_name}} {{company_suffix}}', + ) + + company_suffixes = ( + 'AB', 'HB' + ) diff --git a/src/faker/providers/zh_CN/company.py b/src/libs/faker/providers/company/zh_CN/__init__.py similarity index 91% rename from src/faker/providers/zh_CN/company.py rename to src/libs/faker/providers/company/zh_CN/__init__.py index b4cab26..fb98961 100644 --- a/src/faker/providers/zh_CN/company.py +++ b/src/libs/faker/providers/company/zh_CN/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -22,6 +22,5 @@ class Provider(CompanyProvider): "东方峻景", "华成育卓", "趋势", "维涛", "通际名联"] company_suffixes = [n + "有限公司" for n in ["科技", "网络", "信息", "传媒"]] - @classmethod - def company_prefix(cls): - return cls.random_element(cls.company_prefixes) + def company_prefix(self): + return self.random_element(self.company_prefixes) diff --git a/src/faker/providers/zh_TW/company.py b/src/libs/faker/providers/company/zh_TW/__init__.py similarity index 93% rename from src/faker/providers/zh_TW/company.py rename to src/libs/faker/providers/company/zh_TW/__init__.py index f7ab631..aaea554 100644 --- a/src/faker/providers/zh_TW/company.py +++ b/src/libs/faker/providers/company/zh_TW/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..company import Provider as CompanyProvider +from .. import Provider as CompanyProvider class Provider(CompanyProvider): @@ -35,6 +35,5 @@ class Provider(CompanyProvider): company_suffixes = ("", "有限公司", "股份有限公司", "資訊有限公司") - @classmethod - def company_prefix(cls): - return cls.random_element(cls.company_prefixes) + def company_prefix(self): + return self.random_element(self.company_prefixes) diff --git a/src/libs/faker/providers/credit_card/__init__.py b/src/libs/faker/providers/credit_card/__init__.py new file mode 100644 index 0000000..a683f1c --- /dev/null +++ b/src/libs/faker/providers/credit_card/__init__.py @@ -0,0 +1,116 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import BaseProvider + + +class CreditCard(object): + + def __init__(self, name, prefixes, length=16, security_code='CVC', security_code_length=3): + self.name = name + self.prefixes = prefixes + self.length = length + self.security_code = security_code + self.security_code_length = security_code_length + + +class Provider(BaseProvider): + + prefix_maestro = ['5018', '5020', '5038', '5612', '5893', '6304', '6759', '6761', '6762', '6763', '0604', '6390'] + prefix_mastercard = ['51', '52', '53', '54', '55'] + prefix_visa = ['4'] + prefix_amex = ['34', '37'] + prefix_discover = ['6011'] + prefix_diners = ['300', '301', '302', '303', '304', '305'] + prefix_jcb16 = ['3088', '3096', '3112', '3158', '3337', '3528'] + prefix_jcb15 = ['2100', '1800'] + prefix_voyager = ['8699'] + + credit_card_types = OrderedDict(( + ('maestro', CreditCard('Maestro', prefix_maestro, 12, security_code='CVV')), + ('mastercard', CreditCard('Mastercard', prefix_mastercard, 16, security_code='CVV')), + ('visa16', CreditCard('VISA 16 digit', prefix_visa)), + ('visa13', CreditCard('VISA 13 digit', prefix_visa, 13)), + ('amex', CreditCard('American Express', prefix_amex, 15, security_code='CID', security_code_length=4)), + ('discover', CreditCard('Discover', prefix_discover)), + ('diners', CreditCard('Diners Club / Carte Blanche', prefix_diners, 14)), + ('jcb15', CreditCard('JCB 15 digit', prefix_jcb15, 15)), + ('jcb16', CreditCard('JCB 16 digit', prefix_jcb16)), + ('voyager', CreditCard('Voyager', prefix_voyager, 15)), + )) + credit_card_types['visa'] = credit_card_types['visa16'] + credit_card_types['jcb'] = credit_card_types['jcb16'] + + luhn_lookup = {'0': 0, '1': 2, '2': 4, '3': 6, '4': 8, + '5': 1, '6': 3, '7': 5, '8': 7, '9': 9} + + def credit_card_provider(self, card_type=None): + """ Returns the provider's name of the credit card. """ + if card_type is None: + card_type = self.random_element(self.credit_card_types.keys()) + return self._credit_card_type(card_type).name + + def credit_card_number(self, card_type=None): + """ Returns a valid credit card number. """ + card = self._credit_card_type(card_type) + prefix = self.random_element(card.prefixes) + number = self._generate_number(prefix, card.length) + return number + + def credit_card_expire(self, start='now', end='+10y', date_format='%m/%y'): + expire_date = self.generator.date_time_between(start, end) + return expire_date.strftime(date_format) + + def credit_card_full(self, card_type=None): + card = self._credit_card_type(card_type) + + tpl = ('{provider}\n' + '{owner}\n' + '{number} {expire_date}\n' + '{security}: {security_nb}\n') + + tpl = tpl.format(provider = card.name, + owner = self.generator.parse("{{first_name}} {{last_name}}"), + number = self.credit_card_number(card), + expire_date = self.credit_card_expire(), + security = card.security_code, + security_nb = self.credit_card_security_code(card)) + + return self.generator.parse(tpl) + + def credit_card_security_code(self, card_type=None): + """ Returns a security code string. """ + sec_len = self._credit_card_type(card_type).security_code_length + return self.numerify('#' * sec_len) + + def _credit_card_type(self, card_type=None): + """ Returns a random credit card type instance. """ + if card_type is None: + card_type = self.random_element(self.credit_card_types.keys()) + elif isinstance(card_type, CreditCard): + return card_type + return self.credit_card_types[card_type] + + def _generate_number(self, prefix, length): + """ + 'prefix' is the start of the CC number as a string, any number of digits. + 'length' is the length of the CC number to generate. Typically 13 or 16 + """ + number = prefix + # Generate random char digits + number += '#' * (length - len(prefix) - 1) + number = self.numerify(number) + reverse = number[::-1] + # Calculate sum + tot = 0 + pos = 0 + while pos < length - 1: + tot += Provider.luhn_lookup[reverse[pos]] + if pos != (length - 2): + tot += int(reverse[pos + 1]) + pos += 2 + # Calculate check digit + check_digit = (10 - (tot % 10)) % 10 + number += str(check_digit) + return number diff --git a/src/libs/faker/providers/credit_card/en_US/__init__.py b/src/libs/faker/providers/credit_card/en_US/__init__.py new file mode 100644 index 0000000..3467a2c --- /dev/null +++ b/src/libs/faker/providers/credit_card/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as CreditCardProvider + + +class Provider(CreditCardProvider): + pass diff --git a/src/libs/faker/providers/currency/__init__.py b/src/libs/faker/providers/currency/__init__.py new file mode 100644 index 0000000..28f8f42 --- /dev/null +++ b/src/libs/faker/providers/currency/__init__.py @@ -0,0 +1,185 @@ +# coding=utf-8 + +from .. import BaseProvider + + +class Provider(BaseProvider): + currencies = ( + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYR", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GGP", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "IMP", + "INR", + "IQD", + "IRR", + "ISK", + "JEP", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NIS", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SPL", + "SRD", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TVD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XDR", + "XOF", + "XPF", + "YER", + "ZAR", + "ZMW", + "ZWD" + ) + + # Source: https://en.wikipedia.org/wiki/List_of_cryptocurrencies + cryptocurrencies = ( + 'AMP', 'AUR', 'BC', 'BTC', 'BURST', 'DASH', 'DOGE', 'EMC', 'ETH', + 'GRC', 'KOI', 'LTC', 'MSC', 'MZC', 'NMC', 'NXT', 'POT', 'PPC', 'SIL', + 'TIT', 'VTC', 'XDN', 'XMR', 'XPM', 'XRP', 'ZEC', + ) + + def currency_code(self): + return self.random_element(self.currencies) + + def cryptocurrency_code(self): + return self.random_element(self.cryptocurrencies) diff --git a/src/libs/faker/providers/currency/en_US/__init__.py b/src/libs/faker/providers/currency/en_US/__init__.py new file mode 100644 index 0000000..977d614 --- /dev/null +++ b/src/libs/faker/providers/currency/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as CurrencyProvider + + +class Provider(CurrencyProvider): + pass diff --git a/src/faker/providers/date_time.py b/src/libs/faker/providers/date_time/__init__.py similarity index 60% rename from src/faker/providers/date_time.py rename to src/libs/faker/providers/date_time/__init__.py index 855af13..af49923 100644 --- a/src/faker/providers/date_time.py +++ b/src/libs/faker/providers/date_time/__init__.py @@ -1,16 +1,42 @@ # coding=utf-8 from __future__ import unicode_literals -from . import BaseProvider -import random + import re -from time import time, mktime -from datetime import timedelta, datetime + +from calendar import timegm +from datetime import timedelta +from time import time + +from dateutil import relativedelta +from dateutil.tz import tzlocal, tzutc + from faker.utils.datetime_safe import date, datetime, real_date, real_datetime from faker.utils import is_string +from .. import BaseProvider + +localized = True + + def datetime_to_timestamp(dt): - return mktime(dt.timetuple()) + if getattr(dt, 'tzinfo', None) is not None: + dt = dt.astimezone(tzutc()) + return timegm(dt.timetuple()) + + +def timestamp_to_datetime(timestamp, tzinfo): + if tzinfo is None: + pick = datetime.fromtimestamp(timestamp, tzlocal()) + pick = pick.astimezone(tzutc()).replace(tzinfo=None) + else: + pick = datetime.fromtimestamp(timestamp, tzinfo) + + return pick + + +class ParseError(ValueError): + pass timedelta_pattern = r'' @@ -220,165 +246,523 @@ class Provider(BaseProvider): regex = re.compile(timedelta_pattern) - @classmethod - def unix_time(cls): + def unix_time(self, end_datetime=None): """ Get a timestamp between January 1, 1970 and now :example 1061306726 """ - return random.randint(0, int(time())) + end_datetime = self._parse_end_datetime(end_datetime) + return self.generator.random.randint(0, end_datetime) - @classmethod - def date_time(cls): + def time_delta(self, end_datetime=None): + """ + Get a timedelta object + """ + end_datetime = self._parse_end_datetime(end_datetime) + ts = self.generator.random.randint(0, end_datetime) + return timedelta(seconds=ts) + + def date_time(self, tzinfo=None, end_datetime=None): """ Get a datetime object for a date between January 1, 1970 and now + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example DateTime('2005-08-16 20:39:21') :return datetime """ - return datetime.fromtimestamp(cls.unix_time()) + # NOTE: On windows, the lowest value you can get from windows is 86400 + # on the first day. Known python issue: + # https://bugs.python.org/issue30684 + return datetime(1970, 1, 1,tzinfo=tzinfo) + timedelta(seconds=self.unix_time(end_datetime=end_datetime)) - @classmethod - def date_time_ad(cls): + def date_time_ad(self, tzinfo=None, end_datetime=None): """ Get a datetime object for a date between January 1, 001 and now + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example DateTime('1265-03-22 21:15:52') :return datetime """ - ts = random.randint(-62135600400, int(time())) + end_datetime = self._parse_end_datetime(end_datetime) + ts = self.generator.random.randint(-62135600400, end_datetime) # NOTE: using datetime.fromtimestamp(ts) directly will raise # a "ValueError: timestamp out of range for platform time_t" # on some platforms due to system C functions; # see http://stackoverflow.com/a/10588133/2315612 - return datetime.fromtimestamp(0) + timedelta(seconds=ts) + # NOTE: On windows, the lowest value you can get from windows is 86400 + # on the first day. Known python issue: + # https://bugs.python.org/issue30684 + return datetime(1970, 1, 1,tzinfo=tzinfo) + timedelta(seconds=ts) - @classmethod - def iso8601(cls): + def iso8601(self, tzinfo=None, end_datetime=None): """ + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example '2003-10-21T16:05:52+0000' """ - return cls.date_time().isoformat() + return self.date_time(tzinfo,end_datetime=end_datetime).isoformat() - @classmethod - def date(cls, pattern='%Y-%m-%d'): + def date(self, pattern='%Y-%m-%d', end_datetime=None): """ Get a date string between January 1, 1970 and now :param pattern format :example '2008-11-27' """ - return cls.date_time().strftime(pattern) + return self.date_time(end_datetime=end_datetime).strftime(pattern) - @classmethod - def time(cls, pattern='%H:%M:%S'): + def date_object(self, end_datetime=None): + """ + Get a date object between January 1, 1970 and now + :example datetime.date(2016, 9, 20) + """ + return self.date_time(end_datetime=end_datetime).date() + + def time(self, pattern='%H:%M:%S', end_datetime = None): """ Get a time string (24h format by default) :param pattern format :example '15:02:34' """ - return cls.date_time().time().strftime(pattern) + return self.date_time(end_datetime=end_datetime).time().strftime(pattern) + + def time_object(self, end_datetime = None): + """ + Get a time object + :example datetime.time(15, 56, 56, 772876) + """ + return self.date_time(end_datetime=end_datetime).time() + + @classmethod + def _parse_end_datetime(cls, value): + if value is None: + return int(time()) + + return cls._parse_date_time(value) @classmethod - def _parse_date_time(cls, text): + def _parse_date_string(cls, value): + parts = cls.regex.match(value) + if not parts: + raise ParseError("Can't parse date string `{}`.".format(value)) + parts = parts.groupdict() + time_params = {} + for (name, param) in parts.items(): + if param: + time_params[name] = int(param) + + if 'years' in time_params: + if 'days' not in time_params: + time_params['days'] = 0 + time_params['days'] += 365.24 * time_params.pop('years') + + if not time_params: + raise ParseError("Can't parse date string `{}`.".format(value)) + return time_params + + @classmethod + def _parse_timedelta(cls, value): + if isinstance(value, timedelta): + return value.total_seconds() + if is_string(value): + time_params = cls._parse_date_string(value) + return timedelta(**time_params).total_seconds() + if isinstance(value, (int, float)): + return value + raise ParseError("Invalid format for timedelta '{0}'".format(value)) + + @classmethod + def _parse_date_time(cls, text, tzinfo=None): if isinstance(text, (datetime, date, real_datetime, real_date)): return datetime_to_timestamp(text) - now = datetime.now() + now = datetime.now(tzinfo) if isinstance(text, timedelta): return datetime_to_timestamp(now - text) if is_string(text): if text == 'now': - return datetime_to_timestamp(datetime.now()) - parts = cls.regex.match(text) - if not parts: - return - parts = parts.groupdict() - time_params = {} - for (name, param) in parts.items(): - if param: - time_params[name] = int(param) - - if 'years' in time_params: - if 'days' not in time_params: time_params['days'] = 0 - time_params['days'] += 365.24 * time_params.pop('years') - + return datetime_to_timestamp(datetime.now(tzinfo)) + time_params = cls._parse_date_string(text) return datetime_to_timestamp(now + timedelta(**time_params)) if isinstance(text, int): return datetime_to_timestamp(now + timedelta(text)) - raise ValueError("Invalid format for date '{0}'".format(text)) + raise ParseError("Invalid format for date '{0}'".format(text)) @classmethod - def date_time_between(cls, start_date='-30y', end_date='now'): + def _parse_date(cls, value): + if isinstance(value, (datetime, real_datetime)): + return value.date() + elif isinstance(value, (date, real_date)): + return value + today = date.today() + if isinstance(value, timedelta): + return today - value + if is_string(value): + if value in ('today', 'now'): + return today + time_params = cls._parse_date_string(value) + return today + timedelta(**time_params) + if isinstance(value, int): + return today + timedelta(value) + raise ParseError("Invalid format for date '{0}'".format(value)) + + def date_time_between(self, start_date='-30y', end_date='now', tzinfo=None): """ Get a DateTime object based on a random date between two given dates. Accepts date strings that can be recognized by strtotime(). :param start_date Defaults to 30 years ago :param end_date Defaults to "now" + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example DateTime('1999-02-02 11:42:52') :return DateTime """ - start_date = cls._parse_date_time(start_date) - end_date = cls._parse_date_time(end_date) - timestamp = random.randint(start_date, end_date) - return datetime.fromtimestamp(timestamp) + start_date = self._parse_date_time(start_date, tzinfo=tzinfo) + end_date = self._parse_date_time(end_date, tzinfo=tzinfo) + ts = self.generator.random.randint(start_date, end_date) + return datetime(1970, 1, 1,tzinfo=tzinfo) + timedelta(seconds=ts) - @classmethod - def date_time_this_century(cls): + def date_between(self, start_date='-30y', end_date='today'): """ - :example DateTime('1964-04-04 11:02:02') - """ - return cls.date_time_between('-%dy' % (datetime.now().year % 100)) + Get a Date object based on a random date between two given dates. + Accepts date strings that can be recognized by strtotime(). - @classmethod - def date_time_this_decade(cls): + :param start_date Defaults to 30 years ago + :param end_date Defaults to "today" + :example Date('1999-02-02') + :return Date """ - :example DateTime('2004-04-04 11:02:02') - """ - return cls.date_time_between('-%dy' % (datetime.now().year % 10)) - @classmethod - def date_time_this_year(cls): + start_date = self._parse_date(start_date) + end_date = self._parse_date(end_date) + return self.date_between_dates(date_start=start_date, date_end=end_date) + + def future_datetime(self, end_date='+30d', tzinfo=None): """ + Get a DateTime object based on a random date between 1 second form now + and a given date. + Accepts date strings that can be recognized by strtotime(). + + :param end_date Defaults to "+30d" + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('1999-02-02 11:42:52') + :return DateTime + """ + return self.date_time_between( + start_date='+1s', end_date=end_date, tzinfo=tzinfo, + ) + + def future_date(self, end_date='+30d', tzinfo=None): + """ + Get a Date object based on a random date between 1 day from now and a + given date. + Accepts date strings that can be recognized by strtotime(). + + :param end_date Defaults to "+30d" + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('1999-02-02 11:42:52') + :return DateTime + """ + return self.date_between(start_date='+1d', end_date=end_date) + + def past_datetime(self, start_date='-30d', tzinfo=None): + """ + Get a DateTime object based on a random date between a given date and 1 + second ago. + Accepts date strings that can be recognized by strtotime(). + + :param start_date Defaults to "-30d" + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('1999-02-02 11:42:52') + :return DateTime + """ + return self.date_time_between( + start_date=start_date, end_date='-1s', tzinfo=tzinfo, + ) + + def past_date(self, start_date='-30d', tzinfo=None): + """ + Get a Date object based on a random date between a given date and 1 day + ago. + Accepts date strings that can be recognized by strtotime(). + + :param start_date Defaults to "-30d" + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('1999-02-02 11:42:52') + :return DateTime + """ + return self.date_between(start_date=start_date, end_date='-1d') + + def date_time_between_dates(self, datetime_start=None, datetime_end=None, tzinfo=None): + """ + Takes two DateTime objects and returns a random datetime between the two + given datetimes. + Accepts DateTime objects. + + :param datetime_start: DateTime + :param datetime_end: DateTime + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('1999-02-02 11:42:52') + :return DateTime + """ + if datetime_start is None: + datetime_start = datetime.now(tzinfo) + + if datetime_end is None: + datetime_end = datetime.now(tzinfo) + + timestamp = self.generator.random.randint( + datetime_to_timestamp(datetime_start), + datetime_to_timestamp(datetime_end), + ) + if tzinfo is None: + pick = datetime.fromtimestamp(timestamp, tzlocal()) + pick = pick.astimezone(tzutc()).replace(tzinfo=None) + else: + pick = datetime.fromtimestamp(timestamp, tzinfo) + return pick + + def date_between_dates(self, date_start=None, date_end=None): + """ + Takes two Date objects and returns a random date between the two given dates. + Accepts Date or Datetime objects + + :param date_start: Date + :param date_end: Date + :return Date + """ + return self.date_time_between_dates(date_start, date_end).date() + + def date_time_this_century(self, before_now=True, after_now=False, tzinfo=None): + """ + Gets a DateTime object for the current century. + + :param before_now: include days in current century before today + :param after_now: include days in current century after today + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example DateTime('2012-04-04 11:02:02') + :return DateTime """ - return cls.date_time_between('-%dm' % (datetime.now().month)) + now = datetime.now(tzinfo) + this_century_start = datetime(now.year - (now.year % 100), 1, 1, tzinfo=tzinfo) + next_century_start = datetime(this_century_start.year + 100, 1, 1, tzinfo=tzinfo) - @classmethod - def date_time_this_month(cls): + if before_now and after_now: + return self.date_time_between_dates(this_century_start, next_century_start, tzinfo) + elif not before_now and after_now: + return self.date_time_between_dates(now, next_century_start, tzinfo) + elif not after_now and before_now: + return self.date_time_between_dates(this_century_start, now, tzinfo) + else: + return now + + def date_time_this_decade(self, before_now=True, after_now=False, tzinfo=None): """ + Gets a DateTime object for the decade year. + + :param before_now: include days in current decade before today + :param after_now: include days in current decade after today + :param tzinfo: timezone, instance of datetime.tzinfo subclass :example DateTime('2012-04-04 11:02:02') + :return DateTime """ - return cls.date_time_between('-%dd' % (datetime.now().day)) + now = datetime.now(tzinfo) + this_decade_start = datetime(now.year - (now.year % 10), 1, 1, tzinfo=tzinfo) + next_decade_start = datetime(this_decade_start.year + 10, 1, 1, tzinfo=tzinfo) - @classmethod - def am_pm(cls): - return cls.date('%p') + if before_now and after_now: + return self.date_time_between_dates(this_decade_start, next_decade_start, tzinfo) + elif not before_now and after_now: + return self.date_time_between_dates(now, next_decade_start, tzinfo) + elif not after_now and before_now: + return self.date_time_between_dates(this_decade_start, now, tzinfo) + else: + return now - @classmethod - def day_of_month(cls): - return cls.date('%d') + def date_time_this_year(self, before_now=True, after_now=False, tzinfo=None): + """ + Gets a DateTime object for the current year. - @classmethod - def day_of_week(cls): - return cls.date('%A') + :param before_now: include days in current year before today + :param after_now: include days in current year after today + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('2012-04-04 11:02:02') + :return DateTime + """ + now = datetime.now(tzinfo) + this_year_start = now.replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0) + next_year_start = datetime(now.year + 1, 1, 1, tzinfo=tzinfo) - @classmethod - def month(cls): - return cls.date('%m') + if before_now and after_now: + return self.date_time_between_dates(this_year_start, next_year_start, tzinfo) + elif not before_now and after_now: + return self.date_time_between_dates(now, next_year_start, tzinfo) + elif not after_now and before_now: + return self.date_time_between_dates(this_year_start, now, tzinfo) + else: + return now - @classmethod - def month_name(cls): - return cls.date('%B') + def date_time_this_month(self, before_now=True, after_now=False, tzinfo=None): + """ + Gets a DateTime object for the current month. - @classmethod - def year(cls): - return cls.date('%Y') + :param before_now: include days in current month before today + :param after_now: include days in current month after today + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('2012-04-04 11:02:02') + :return DateTime + """ + now = datetime.now(tzinfo) + this_month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) - @classmethod - def century(cls): + next_month_start = this_month_start + relativedelta.relativedelta(months=1) + if before_now and after_now: + return self.date_time_between_dates(this_month_start, next_month_start, tzinfo) + elif not before_now and after_now: + return self.date_time_between_dates(now, next_month_start, tzinfo) + elif not after_now and before_now: + return self.date_time_between_dates(this_month_start, now, tzinfo) + else: + return now + + def date_this_century(self, before_today=True, after_today=False): + """ + Gets a Date object for the current century. + + :param before_today: include days in current century before today + :param after_today: include days in current century after today + :example Date('2012-04-04') + :return Date + """ + today = date.today() + this_century_start = date(today.year - (today.year % 100), 1, 1) + next_century_start = date(this_century_start.year + 100, 1, 1) + + if before_today and after_today: + return self.date_between_dates(this_century_start, next_century_start) + elif not before_today and after_today: + return self.date_between_dates(today, next_century_start) + elif not after_today and before_today: + return self.date_between_dates(this_century_start, today) + else: + return today + + def date_this_decade(self, before_today=True, after_today=False): + """ + Gets a Date object for the decade year. + + :param before_today: include days in current decade before today + :param after_today: include days in current decade after today + :example Date('2012-04-04') + :return Date + """ + today = date.today() + this_decade_start = date(today.year - (today.year % 10), 1, 1) + next_decade_start = date(this_decade_start.year + 10, 1, 1) + + if before_today and after_today: + return self.date_between_dates(this_decade_start, next_decade_start) + elif not before_today and after_today: + return self.date_between_dates(today, next_decade_start) + elif not after_today and before_today: + return self.date_between_dates(this_decade_start, today) + else: + return today + + def date_this_year(self, before_today=True, after_today=False): + """ + Gets a Date object for the current year. + + :param before_today: include days in current year before today + :param after_today: include days in current year after today + :example Date('2012-04-04') + :return Date + """ + today = date.today() + this_year_start = today.replace(month=1, day=1) + next_year_start = date(today.year + 1, 1, 1) + + if before_today and after_today: + return self.date_between_dates(this_year_start, next_year_start) + elif not before_today and after_today: + return self.date_between_dates(today, next_year_start) + elif not after_today and before_today: + return self.date_between_dates(this_year_start, today) + else: + return today + + def date_this_month(self, before_today=True, after_today=False): + """ + Gets a Date object for the current month. + + :param before_today: include days in current month before today + :param after_today: include days in current month after today + :param tzinfo: timezone, instance of datetime.tzinfo subclass + :example DateTime('2012-04-04 11:02:02') + :return DateTime + """ + today = date.today() + this_month_start = today.replace(day=1) + + next_month_start = this_month_start + relativedelta.relativedelta(months=1) + if before_today and after_today: + return self.date_between_dates(this_month_start, next_month_start) + elif not before_today and after_today: + return self.date_between_dates(today, next_month_start) + elif not after_today and before_today: + return self.date_between_dates(this_month_start, today) + else: + return today + + def time_series(self, start_date='-30d', end_date='now', precision=None, distrib=None, tzinfo=None): + """ + Returns a generator yielding tuples of ``(, )``. + + The data points will start at ``start_date``, and be at every time interval specified by + ``precision``. + ``distrib`` is a callable that accepts ```` and returns ```` + + """ + start_date = self._parse_date_time(start_date, tzinfo=tzinfo) + end_date = self._parse_date_time(end_date, tzinfo=tzinfo) + + if end_date < start_date: + raise ValueError("`end_date` must be greater than `start_date`.") + + if precision is None: + precision = (end_date - start_date) / 30 + + precision = self._parse_timedelta(precision) + if distrib is None: + distrib = lambda dt: self.generator.random.uniform(0, precision) # noqa + + if not callable(distrib): + raise ValueError("`distrib` must be a callable. Got {} instead.".format(distrib)) + + datapoint = start_date + while datapoint < end_date: + dt = timestamp_to_datetime(datapoint, tzinfo) + datapoint += precision + yield (dt, distrib(dt)) + + def am_pm(self): + return self.date('%p') + + def day_of_month(self): + return self.date('%d') + + def day_of_week(self): + return self.date('%A') + + def month(self): + return self.date('%m') + + def month_name(self): + return self.date('%B') + + def year(self): + return self.date('%Y') + + def century(self): """ :example 'XVII' """ - return cls.random_element(cls.centuries) + return self.random_element(self.centuries) - @classmethod - def timezone(cls): - return random.choice(cls.random_element(cls.countries)['timezones']) + def timezone(self): + return self.generator.random.choice(self.random_element(self.countries)['timezones']) diff --git a/src/libs/faker/providers/date_time/ar_AA/__init__.py b/src/libs/faker/providers/date_time/ar_AA/__init__.py new file mode 100644 index 0000000..5634fc2 --- /dev/null +++ b/src/libs/faker/providers/date_time/ar_AA/__init__.py @@ -0,0 +1,253 @@ +# coding=utf-8 +from __future__ import unicode_literals + + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + DAY_NAMES = { + '0': 'السبت', + '1': 'الأحد', + '2': 'الإثنين', + '3': 'الثلاثاء', + '4': 'الأربعاء', + '5': 'الخميس', + '6': 'الجمعة', + } + + MONTH_NAMES = { + '01': 'كانون الثّاني', + '02': 'شباط', + '03': 'آذار', + '04': 'نيسان', + '05': 'أيّار', + '06': 'حزيران', + '07': 'تمّوز', + '08': 'آب', + '09': 'أيلول', + '10': 'تشرين الأول', + '11': 'تشرين الثاني', + '12': 'كانون الأول' + } + + centuries = [ + 'الأول', 'الثاني', 'الثالث', 'الرابع', 'الخامس', 'السادس', + 'السابع', 'الثامن', 'التاسع', 'العاشر', 'الحادي عشر', + 'الثاني عشر', 'الثالث عشر', 'الرابع عشر', 'الخامس عشر', + 'السادس عشر', 'الثامن عشر', 'التاسع عشر', 'العشرين', + 'الحادي والعشرين', 'الثاني والعشرين', + ] + + countries = [ + {'timezones': ['أوروب/أندورا'], 'code': 'AD', 'continent': 'أوروبا', 'name': 'أندورا', 'capital': 'أندورا لا فيلا'}, + {'timezones': ['آسيا/كابل'], 'code': 'AF', 'continent': 'آسيا', 'name': 'أفغانستان', 'capital': 'كابل'}, + {'timezones': ['أمريكا/أنتيغوا'], 'code': 'AG', 'continent': 'أمريكا الشمالية', 'name': 'أنتيغوا وباربودا', 'capital': "سانت جونز"}, + {'timezones': ['أوروبا/تيرانا'], 'code': 'AL', 'continent': 'أوروبا', 'name': 'ألبانيا', 'capital': 'تيرانا'}, + {'timezones': ['آسيا/يريفان'], 'code': 'AM', 'continent': 'آسيا', 'name': 'أرمينيا', 'capital': 'يريفان'}, + {'timezones': ['إفريقيا/لواندا'], 'code': 'AO', 'continent': 'إفريقيا', 'name': 'أنغولا', 'capital': 'لواندا'}, + {'timezones': ['أمريكا/الأرجنتين/بوينس_آيرس', 'أمريكا/الأرجنتين/Cordoba', 'أمريكا/الأرجنتين/خوخوي', 'أمريكا/الأرجنتين/توكومان', 'أمريكا/الأرجنتين/كاتاماركا', 'أمريكا/الأرجنتين/لا_ريوخا', 'أمريكا/الأرجنتين/سان_خوان', 'أمريكا/الأرجنتين/مندوزا', 'أمريكا/الأرجنتين/ريو_غاليغوس', 'أمريكا/الأرجنتين/أوشوايا'], 'code': 'AR', 'continent': 'أمريكا الجنوبية', 'name': 'الأرجنتين', 'capital': 'بوينس آيرس'}, + {'timezones': ['أوروبا/النمسا'], 'code': 'AT', 'continent': 'أوروبا', 'name': 'النمسا', 'capital': 'فيينا'}, + {'timezones': ['أستراليا/لورد_هاو', 'أستراليا/هوبارت', 'أستراليا/كري', 'أستراليا/ملبورن', 'أستراليا/سدني', 'أستراليا/بروكن_هل', 'أستراليا/بريزبن', 'أستراليا/ليندمان', 'أستراليا/أديلايد', 'أستراليا/داروين', 'أستراليا/برث'], 'code': 'AU', 'continent': 'أوقيانوسيا', 'name': 'أستراليا', 'capital': 'كانبرا'}, + {'timezones': ['آسيا/باكو'], 'code': 'AZ', 'continent': 'آسيا', 'name': 'أذربيجان', 'capital': 'باكو'}, + {'timezones': ['أمريكا/باربادوس'], 'code': 'BB', 'continent': 'أمريكا الشمالية', 'name': 'باربادوس', 'capital': 'بريدج تاون'}, + {'timezones': ['آسيا/دكا'], 'code': 'BD', 'continent': 'آسيا', 'name': 'بنغلادش', 'capital': 'دكا'}, + {'timezones': ['أوروبا/بروكسل'], 'code': 'BE', 'continent': 'أوروبا', 'name': 'بلجيكا', 'capital': 'بروكسل'}, + {'timezones': ['إفريقيا/واغادوغو'], 'code': 'BF', 'continent': 'إفريقيا', 'name': 'بوركينا فاسو', 'capital': 'واغادوغو'}, + {'timezones': ['أوروبا/صوفيا'], 'code': 'BG', 'continent': 'أوروبا', 'name': 'بلغاريا', 'capital': 'صوفيا'}, + {'timezones': ['آسيا/البحرين'], 'code': 'BH', 'continent': 'آسيا', 'name': 'البحرين', 'capital': 'المنامة'}, + {'timezones': ['إفريقيا/بوجمبورا'], 'code': 'BI', 'continent': 'إفريقيا', 'name': 'بوروندي', 'capital': 'بوجمبورا'}, + {'timezones': ['إفريقيا/بورتو نوفو'], 'code': 'BJ', 'continent': 'إفريقيا', 'name': 'بنين', 'capital': 'بورتو نوفو'}, + {'timezones': ['آسيا/بروناي'], 'code': 'BN', 'continent': 'آسيا', 'name': 'اتحاد بروناي (دار السلام)', 'capital': 'بندر سري بكاوان'}, + {'timezones': ['أمريكا/لاباز'], 'code': 'BO', 'continent': 'أمريكا الجنوبية', 'name': 'بوليفيا', 'capital': 'سوكري'}, + {'timezones': ['أمريكا/نورونها', 'أمريكا/بليم','أمريكا/فورتاليزا', 'أمريكا/ريسيفي', 'أمريكا/أراغوينا', 'أمريكا/ماسايو', 'أمريكا/باهيا', 'أمريكا/ساو_باولو', 'أمريكا/كامبو_غراندي', 'أمريكا/كويابا', 'أمريكا/بورتو_فاليو', 'أمريكا/بوا_فيستا', 'أمريكا/ماناوس', 'أمريكا/إيرونيبي', 'أمريكا/ريو_برانكو'], 'code': 'BR', 'continent': 'أمريكا الجنوبية', 'name': 'البرازيل', 'capital': 'برازيليا'}, + {'timezones': ['أمريكا/ناساو'], 'code': 'BS', 'continent': 'أمريكا الشمالية', 'name': 'باهاماس', 'capital': 'ناساو'}, + {'timezones': ['آسيا/تيمفو'], 'code': 'BT', 'continent': 'آسيا', 'name': 'بوتان', 'capital': 'تيمفو'}, + {'timezones': ['إفريقيا/غابورون'], 'code': 'BW', 'continent': 'إفريقيا', 'name': 'بوتسوانا', 'capital': 'غابورون'}, + {'timezones': ['أوروبا/مينسك'], 'code': 'BY', 'continent': 'أوروبا', 'name': 'روسيا البيضاء', 'capital': 'مينسك'}, + {'timezones': ['أمريكا/بليز'], 'code': 'BZ', 'continent': 'أمريكا الشمالية', 'name': 'بليز', 'capital': 'بلموبان'}, + {'timezones': ['أمريكا/سينت_جونز', 'أمريكا/هاليفاكس', 'أمريكا/جليس_باي', 'أمريكا/مونكتون', 'أمريكا/جووس_باي', 'أمريكا/بلانك_سابلون', 'أمريكا/مونتريال', 'أمريكا/تورونتو', 'أمريكا/نيبيغون', 'أمريكا/ثاندر_باي', 'أمريكا/بانغيرتانغ', 'أمريكا/إيكواليوت', 'أمريكا/أتيكوكان', 'أمريكا/رانكن_إنلت', 'أمريكا/وينيبيغ', 'أمريكا/رايني_ريفر', 'أمريكا/كامبريدج_باي', 'أمريكا/ريجينا', 'أمريكا/سويفت_كارنت', 'أمريكا/إدمونتون', 'أمريكا/يلو_نايف', 'أمريكا/إنوفك', 'أمريكا/دوسن_كريك', 'أمريكا/فانكوفر', 'أمريكا/وايت_هورس', 'أمريكا/داوسون'], 'code': 'CA', 'continent': 'أمريكا الشمالية', 'name': 'كندا', 'capital': 'أوتاوا'}, + {'timezones': ['إفريقيا/كينشاسا', 'إفريقيا/لوبومباشي'], 'code': 'CD', 'continent': 'إفريقيا', 'name': 'جمهورية الكونغو الديمقراطية', 'capital': 'كينشاسا'}, + {'timezones': ['إفريقيا/برازافيل'], 'code': 'CG', 'continent': 'إفريقيا', 'name': 'جمهورية الكونغو', 'capital': 'برازافيل'}, + {'timezones': ['إفريقيا/أبيدجان'], 'code': 'CI', 'continent': 'إفريقيا', 'name': "ساحل العاج", 'capital': 'ياموسوكرو'}, + {'timezones': ['أمريكا/سانتياغو', 'المحيط_الهاديء/جزيرة_القيامة'], 'code': 'CL', 'continent': 'أمريكا الجنوبية', 'name': 'تشيلي', 'capital': 'سانتياغو'}, + {'timezones': ['إفريقيا/دوالا'], 'code': 'CM', 'continent': 'إفريقيا', 'name': 'الكاميرون', 'capital': 'ياوندي'}, + {'timezones': ['آسيا/شانغهاي', 'آسيا/هاربن', 'آسيا/تشونغتشينغ', 'آسيا/أورومتشي', 'آسيا/كاشغر'], 'code': 'CN', 'continent': 'آسيا', 'name': "جمهورية الصين الشعبية", 'capital': 'بكين'}, + {'timezones': ['أمريكا/بوغوتا'], 'code': 'CO', 'continent': 'أمريكا الجنوبية', 'name': 'كولومبيا', 'capital': 'بوغوتا'}, + {'timezones': ['أمريكا/كوستاريكا'], 'code': 'CR', 'continent': 'أمريكا الشمالية', 'name': 'كوستاريكا', 'capital': 'سان خوسيه'}, + {'timezones': ['أمريكا/هافانا'], 'code': 'CU', 'continent': 'أمريكا الشمالية', 'name': 'كوبا', 'capital': 'هافانا'}, + {'timezones': ['الأطلنطي/الرأس_الأخضر'], 'code': 'CV', 'continent': 'إفريقيا', 'name': 'جمهورية الرأس الأخضر', 'capital': 'برايا'}, + {'timezones': ['آسيا/نيقوسيا'], 'code': 'CY', 'continent': 'آسيا', 'name': 'قبرص', 'capital': 'نيقوسيا'}, + {'timezones': ['أوروبا/براغ'], 'code': 'CZ', 'continent': 'أوروبا', 'name': 'جمهورية التشيك', 'capital': 'براغ'}, + {'timezones': ['أوروبا/برلين'], 'code': 'DE', 'continent': 'أوروبا', 'name': 'ألمانيا', 'capital': 'برلين'}, + {'timezones': ['إفريقيا/جيبوتي'], 'code': 'DJ', 'continent': 'إفريقيا', 'name': 'جيبوتي', 'capital': 'جيبوتي'}, + {'timezones': ['أوروبا/كوبنهاغن'], 'code': 'DK', 'continent': 'أوروبا', 'name': 'الدنمارك', 'capital': 'كوبنهاغن'}, + {'timezones': ['أمريكا/دومينيكا'], 'code': 'DM', 'continent': 'أمريكا الشمالية', 'name': 'دومينيكا', 'capital': 'روسياو'}, + {'timezones': ['أمريكا/سانتو_دومينغو'], 'code': 'DO', 'continent': 'أمريكا الشمالية', 'name': 'جمهورية الدومينيكان', 'capital': 'سانتو دومينغو'}, + {'timezones': ['أمريكا/غواياكيل', 'المحيط_الهاديء/أرخبيل_غالاباغوس'], 'code': 'EC', 'continent': 'أمريكا الجنوبية', 'name': 'الإكوادور', 'capital': 'كيتو'}, + {'timezones': ['أوروبا/تالين'], 'code': 'EE', 'continent': 'أوروبا', 'name': 'إستونيا', 'capital': 'تالين'}, + {'timezones': ['إفريقيا/القاهرة'], 'code': 'EG', 'continent': 'إفريقيا', 'name': 'مصر', 'capital': 'القاهرة'}, + {'timezones': ['إفريقيا/أسمرة'], 'code': 'ER', 'continent': 'إفريقيا', 'name': 'إرتيريا', 'capital': 'أسمرة'}, + {'timezones': ['إفريقيا/أديس أبابا'], 'code': 'ET', 'continent': 'إفريقيا', 'name': 'إثيوبيا', 'capital': 'أديس أبابا'}, + {'timezones': ['أوروبا/هلسنكي'], 'code': 'FI', 'continent': 'أوروبا', 'name': 'فنلندا', 'capital': 'هلسنكي'}, + {'timezones': ['المحيط_الهاديء/فيجي'], 'code': 'FJ', 'continent': 'أوقيانوسيا', 'name': 'فيجي', 'capital': 'سوفا'}, + {'timezones': ['أوروبا/باريس'], 'code': 'FR', 'continent': 'أوروبا', 'name': 'فرنسا', 'capital': 'باريس'}, + {'timezones': ['إفريقيا/ليبرفيل'], 'code': 'GA', 'continent': 'إفريقيا', 'name': 'الغابون', 'capital': 'ليبرفيل'}, + {'timezones': ['آسيا/تبليسي'], 'code': 'GE', 'continent': 'آسيا', 'name': 'جورجيا', 'capital': 'تبليسي'}, + {'timezones': ['إفريقيا/أكرا'], 'code': 'GH', 'continent': 'إفريقيا', 'name': 'غانا', 'capital': 'أكرا'}, + {'timezones': ['إفريقيا/بانجول'], 'code': 'GM', 'continent': 'إفريقيا', 'name': 'غامبيا', 'capital': 'بانجول'}, + {'timezones': ['إفريقيا/كوناكري'], 'code': 'GN', 'continent': 'إفريقيا', 'name': 'غينيا', 'capital': 'كوناكري'}, + {'timezones': ['أوروبا/أثينا'], 'code': 'GR', 'continent': 'أوروبا', 'name': 'اليونان', 'capital': 'أثينا'}, + {'timezones': ['أمريكا/غواتيمالا'], 'code': 'GT', 'continent': 'أمريكا الشمالية', 'name': 'غواتيمالا', 'capital': 'غواتيمالا سيتي'}, + {'timezones': ['أمريكا/غواتيمالا'], 'code': 'GT', 'continent': 'أمريكا الشمالية', 'name': 'هايتي', 'capital': 'بورت أو برانس'}, + {'timezones': ['إفريقيا/بيساو'], 'code': 'GW', 'continent': 'إفريقيا', 'name': 'غينيا بيساو', 'capital': 'بيساو'}, + {'timezones': ['أمريكا/غيانا'], 'code': 'GY', 'continent': 'أمريكا الجنوبية', 'name': 'غيانا', 'capital': 'جورج تاون'}, + {'timezones': ['أمريكا/تيجوسيجالبا'], 'code': 'HN', 'continent': 'أمريكا الشمالية', 'name': 'هندوراس', 'capital': 'تيجوسيجالبا'}, + {'timezones': ['أوروبا/بودابست'], 'code': 'HU', 'continent': 'أوروبا', 'name': 'هنغاريا', 'capital': 'بودابست'}, + {'timezones': ['آسيا/جاكرتا', 'آسيا/بونتياناك', 'آسيا/ماكاسار', 'آسيا/جايابورا'], 'code': 'ID', 'continent': 'آسيا', 'name': 'إندونسيا', 'capital': 'جاكرتا'}, + {'timezones': ['أوروبا/دبلن'], 'code': 'IE', 'continent': 'أوروبا', 'name': 'إيرلندا', 'capital': 'دبلن'}, + {'timezones': ['آسيا/القدس'], 'code': 'IL', 'continent': 'آسيا', 'name': 'فلسطين', 'capital': 'القدس'}, + {'timezones': ['آسيا/كالكتا'], 'code': 'IN', 'continent': 'آسيا', 'name': 'الهند', 'capital': 'نيو دلهي'}, + {'timezones': ['آسيا/بغداد'], 'code': 'IQ', 'continent': 'آسيا', 'name': 'العراق', 'capital': 'بغداد'}, + {'timezones': ['آسيا/طهران'], 'code': 'IR', 'continent': 'آسيا', 'name': 'إيران', 'capital': 'طهران'}, + {'timezones': ['الأطلنطي/ريكيافيك'], 'code': 'IS', 'continent': 'أوروبا', 'name': 'آيسلندا', 'capital': 'ريكيافيك'}, + {'timezones': ['أوروبا/روما'], 'code': 'IT', 'continent': 'أوروبا', 'name': 'إيطاليا', 'capital': 'روما'}, + {'timezones': ['أمريكا/جامايكا'], 'code': 'JM', 'continent': 'أمريكا الشمالية', 'name': 'جامايكا', 'capital': 'كينغستون'}, + {'timezones': ['آسيا/عمّان'], 'code': 'JO', 'continent': 'آسيا', 'name': 'الأردن', 'capital': 'عمّان'}, + {'timezones': ['آسيا/طوكيو'], 'code': 'JP', 'continent': 'آسيا', 'name': 'اليابان', 'capital': 'طوكيو'}, + {'timezones': ['إفريقيا/نيروبي'], 'code': 'KE', 'continent': 'إفريقيا', 'name': 'كينيا', 'capital': 'نيروبي'}, + {'timezones': ['آسيا/بشكيك'], 'code': 'KG', 'continent': 'آسيا', 'name': 'قيرغيزستان', 'capital': 'بشكيك'}, + {'timezones': ['المحيط_الهاديء/تاراوا', 'المحيط_الهاديء/إيديربيري', 'المحيط_الهاديء/كريتيماتي'], 'code': 'KI', 'continent': 'أوقيانوسيا', 'name': 'كيريباتي', 'capital': 'جنوب تاراوا'}, + {'timezones': ['آسيا/بيونغ_يانغ'], 'code': 'KP', 'continent': 'آسيا', 'name': 'كوريا الشمالية', 'capital': 'بيونغ يانغ'}, + {'timezones': ['آسيا/سيؤول'], 'code': 'KR', 'continent': 'آسيا', 'name': '؛كوريا الجنوبية', 'capital': 'سيؤول'}, + {'timezones': ['آسيا/الكويت'], 'code': 'KW', 'continent': 'آسيا', 'name': 'الكويت', 'capital': 'الكويت'}, + {'timezones': ['آسيا/بيروت'], 'code': 'LB', 'continent': 'آسيا', 'name': 'لبنان', 'capital': 'بيروت'}, + {'timezones': ['أوروبا/فادوز'], 'code': 'LI', 'continent': 'أوروبا', 'name': 'ليختنشتاين', 'capital': 'فادوز'}, + {'timezones': ['إفريقيا/مونروفيا'], 'code': 'LR', 'continent': 'إفريقيا', 'name': 'ليبيريا', 'capital': 'مونروفيا'}, + {'timezones': ['إفريقيا/ماسيرو'], 'code': 'LS', 'continent': 'إفريقيا', 'name': 'ليسوتو', 'capital': 'ماسيرو'}, + {'timezones': ['أوروبا/فيلنيوس'], 'code': 'LT', 'continent': 'أوروبا', 'name': 'ليتوانيا', 'capital': 'فيلنيوس'}, + {'timezones': ['أوروبا/لوكسمبرغ'], 'code': 'LU', 'continent': 'أوروبا', 'name': 'لوكسمبرغ', 'capital': 'لوكسمبرغ سيتي'}, + {'timezones': ['أوروبا/ربيغ'], 'code': 'LV', 'continent': 'أوروبا', 'name': 'لاتفيا', 'capital': 'ربيغ'}, + {'timezones': ['إفريقيا/طرابلس'], 'code': 'LY', 'continent': 'إفريقيا', 'name': 'ليبيا', 'capital': 'طرابلس'}, + {'timezones': ['الهندي/أنتاناناريفو'], 'code': 'MG', 'continent': 'إفريقيا', 'name': 'مدغشقر', 'capital': 'أنتاناناريفو'}, + {'timezones': ['المحيط_الهاديء/ماجورو', 'المحيط_الهاديء/كواجلين_أتول'], 'code': 'MH', 'continent': 'أوقيانوسيا', 'name': 'جزر مارشال', 'capital': 'ماجورو'}, + {'timezones': ['أوروبا/سكوبيه'], 'code': 'MK', 'continent': 'أوروبا', 'name': 'جمهورية مقدونيا', 'capital': 'سكوبيه'}, + {'timezones': ['إفريقيا/باماكو'], 'code': 'ML', 'continent': 'إفريقيا', 'name': 'مالي', 'capital': 'باماكو'}, + {'timezones': ['آسيا/رانغون'], 'code': 'MM', 'continent': 'آسيا', 'name': 'ميانمار', 'capital': 'نايبيداو'}, + {'timezones': ['آسيا/أولان_باتور', 'آسيا/Hovd', 'آسيا/تشويبالسان'], 'code': 'MN', 'continent': 'آسيا', 'name': 'مانغوليا', 'capital': 'أولان باتور'}, + {'timezones': ['إفريقيا/نواكشط'], 'code': 'MR', 'continent': 'إفريقيا', 'name': 'موريتانيا', 'capital': 'نواكشط'}, + {'timezones': ['أوروبا/مالطا'], 'code': 'MT', 'continent': 'أوروبا', 'name': 'مالطا', 'capital': 'فاليتا'}, + {'timezones': ['الهندي/موريشيوس'], 'code': 'MU', 'continent': 'إفريقيا', 'name': 'موريشيوس', 'capital': 'بور لويس'}, + {'timezones': ['الهندي/جزر_المالديف'], 'code': 'MV', 'continent': 'آسيا', 'name': 'جمهورية المالديف', 'capital': 'ماليه'}, + {'timezones': ['إفريقيا/بلانتاير'], 'code': 'MW', 'continent': 'إفريقيا', 'name': 'ملاوي', 'capital': 'ليلونغوي'}, + {'timezones': ['أمريكا/ميكسيكو_سيتي', 'أمريكا/كانكون', 'أمريكا/ميرديا', 'أمريكا/مونتيري', 'أمريكا/مازاتلان', 'أمريكا/شيواوا', 'أمريكا/ارموسييو_سونورا', 'أمريكا/تيخوانا'], 'code': 'MX', 'continent': 'أمريكا الشمالية', 'name': 'المكسيك', 'capital': 'ميكسيكو سيتي§'}, + {'timezones': ['آسيا/كوالا_لامبور', 'آسيا/Kuching'], 'code': 'MY', 'continent': 'آسيا', 'name': 'ماليزيا', 'capital': 'كوالا لامبور'}, + {'timezones': ['إفريقيا/مابوتو'], 'code': 'MZ', 'continent': 'إفريقيا', 'name': 'موزمبيق', 'capital': 'مابوتو'}, + {'timezones': ['إفريقيا/ويندهوك'], 'code': 'NA', 'continent': 'إفريقيا', 'name': 'ناميبيا', 'capital': 'ويندهوك'}, + {'timezones': ['إفريقيا/نيامي'], 'code': 'NE', 'continent': 'إفريقيا', 'name': 'النيجر', 'capital': 'نيامي'}, + {'timezones': ['إفريقيا/لاغوس'], 'code': 'NG', 'continent': 'إفريقيا', 'name': 'نيجيريا', 'capital': 'أبوجا'}, + {'timezones': ['أمريكا/ماناغوا'], 'code': 'NI', 'continent': 'أمريكا الشمالية', 'name': 'نيكاراغوا', 'capital': 'ماناغوا'}, + {'timezones': ['أوروبا/أمستردام'], 'code': 'NL', 'continent': 'أوروبا', 'name': 'هولندا', 'capital': 'أمستردام'}, + {'timezones': ['أوروبا/أوسلو'], 'code': 'NO', 'continent': 'أوروبا', 'name': 'النرويج', 'capital': 'أوسلو'}, + {'timezones': ['آسيا/كاتماندو'], 'code': 'NP', 'continent': 'آسيا', 'name': 'النيبال', 'capital': 'كاتماندو'}, + {'timezones': ['المحيط_الهاديء/ناورو'], 'code': 'NR', 'continent': 'أوقيانوسيا', 'name': 'ناورو', 'capital': 'يارين'}, + {'timezones': ['المحيط_الهاديء/أوكلاند', 'المحيط_الهاديء/تشاتهام'], 'code': 'NZ', 'continent': 'أوقيانوسيا', 'name': 'نيوزيلاندا', 'capital': 'ويلينغتون'}, + {'timezones': ['آسيا/مسقط'], 'code': 'OM', 'continent': 'آسيا', 'name': 'عمان', 'capital': 'مسقط'}, + {'timezones': ['أمريكا/بنما'], 'code': 'PA', 'continent': 'أمريكا الشمالية', 'name': 'بنما', 'capital': 'بنما'}, + {'timezones': ['أمريكا/ليما'], 'code': 'PE', 'continent': 'أمريكا الجنوبية', 'name': 'البيرو', 'capital': 'ليما'}, + {'timezones': ['المحيط_الهاديء/بورت_مورسبي'], 'code': 'PG', 'continent': 'أوقيانوسيا', 'name': 'بابوا غينيا الجديدة', 'capital': 'بورت مورسبي'}, + {'timezones': ['آسيا/مانيلا'], 'code': 'PH', 'continent': 'آسيا', 'name': 'الفيليبين', 'capital': 'مانيلا'}, + {'timezones': ['آسيا/كاراتشي'], 'code': 'PK', 'continent': 'آسيا', 'name': 'باكستان', 'capital': 'إسلام أباد'}, + {'timezones': ['أوروبا/وارسو'], 'code': 'PL', 'continent': 'أوروبا', 'name': 'بولندا', 'capital': 'وارسو'}, + {'timezones': ['أوروبا/لشبونة', 'الأطلنطي/ماديرا', 'الأطلنطي/الأزور'], 'code': 'PT', 'continent': 'أوروبا', 'name': 'البرتغال', 'capital': 'لشبونة'}, + {'timezones': ['المحيط_الهاديء/بالاو'], 'code': 'PW', 'continent': 'أوقيانوسيا', 'name': 'بالاو', 'capital': 'نجيرولمد'}, + {'timezones': ['أمريكا/أسونسيون'], 'code': 'PY', 'continent': 'أمريكا الجنوبية', 'name': 'بابرغوي', 'capital': 'أسونسيون'}, + {'timezones': ['آسيا/قطر'], 'code': 'QA', 'continent': 'آسيا', 'name': 'قطر', 'capital': 'الدوحة'}, + {'timezones': ['أوروبا/بوخارست'], 'code': 'RO', 'continent': 'أوروبا', 'name': 'رومانيا', 'capital': 'بوخارست'}, + {'timezones': ['أوروبا/كالينينغراد', 'أوروبا/موسكو', 'أوروبا/Volgograd', 'أوروبا/سمارة', 'آسيا/يكاترينبورغ', 'آسيا/أومسك', 'آسيا/نوفوسيبيرسك', 'آسيا/كراسنوياسك', 'آسيا/إروتسك', 'آسيا/ياكوتسك', 'آسيا/فالديفوستوك', 'آسيا/ساخالن', 'آسيا/ماغادان', 'آسيا/كامشتكا', 'آسيا/أنادير'], 'code': 'RU', 'continent': 'أوروبا', 'name': 'روسيا', 'capital': 'موسكو'}, + {'timezones': ['إفريقيا/كيغالي'], 'code': 'RW', 'continent': 'إفريقيا', 'name': 'رواندا', 'capital': 'كيغالي'}, + {'timezones': ['آسيا/الرياض'], 'code': 'SA', 'continent': 'آسيا', 'name': 'المملكة العربية السعودية', 'capital': 'الرياض'}, + {'timezones': ['المحيط_الهاديء/غوادالكانال'], 'code': 'SB', 'continent': 'أوقيانوسيا', 'name': 'جزر سولمون', 'capital': 'هونيارا'}, + {'timezones': ['الهندي/ماهي'], 'code': 'SC', 'continent': 'إفريقيا', 'name': 'سيشل', 'capital': 'فيكتوريا'}, + {'timezones': ['إفريقيا/الخرطوم'], 'code': 'SD', 'continent': 'إفريقيا', 'name': 'السودان', 'capital': 'الخرطوم'}, + {'timezones': ['أوروبا/ستوكهولم'], 'code': 'SE', 'continent':'أوروبا', 'name': 'السويد', 'capital': 'ستوكهولم'}, + {'timezones': ['آسيا/سنغافورة'], 'code': 'SG', 'continent': 'آسيا', 'name': 'سنغافورة', 'capital': 'سنغافورة'}, + {'timezones': ['أوروبا/ليوبليانا'], 'code': 'SI', 'continent': 'أوروبا', 'name': 'سلوفانيا', 'capital': 'ليوبليانا'}, + {'timezones': ['أوروبا/براتيسلافا'], 'code': 'SK', 'continent': 'أوروبا', 'name': 'سلوفاكيا', 'capital': 'براتيسلافا'}, + {'timezones': ['إفريقيا/فريتاون'], 'code': 'SL', 'continent': 'إفريقيا', 'name': 'سيراليون', 'capital': 'فريتاون'}, + {'timezones': ['أوروبا/سان_مارينو'], 'code': 'SM', 'continent': 'أوروبا', 'name': 'جمهورية سان مارينو', 'capital': 'سان مارينو'}, + {'timezones': ['إفريقيا/داكار'], 'code': 'SN', 'continent': 'إفريقيا', 'name': 'السنغال', 'capital': 'داكار'}, + {'timezones': ['إفريقيا/مقديشو'], 'code': 'SO', 'continent': 'إفريقيا', 'name': 'الصومال', 'capital': 'مقديشو'}, + {'timezones': ['أمريكا/باراماريبو'], 'code': 'SR', 'continent': 'أمريكا الجنوبية', 'name': 'Suriname', 'capital': 'باراماريبو'}, + {'timezones': ['إفريقيا/ساو_تومي'], 'code': 'ST', 'continent': 'إفريقيا', 'name': ' ساو تومي وبرينسيب', 'capital': 'ساو تومي'}, + {'timezones': ['آسيا/دممشق'], 'code': 'SY', 'continent': 'آسيا', 'name': 'سوريا', 'capital': 'دمشق'}, + {'timezones': ['إفريقيا/لومي'], 'code': 'TG', 'continent': 'إفريقيا', 'name': 'توغو', 'capital': 'لومي'}, + {'timezones': ['آسيا/بانغوك'], 'code': 'TH', 'continent': 'آسيا', 'name': 'تايلند', 'capital': 'بناغوك'}, + {'timezones': ['آسيا/دوشنبه'], 'code': 'TJ', 'continent': 'آسيا', 'name': 'طاجكيستان', 'capital': 'دوشنبه'}, + {'timezones': ['آسيا/عشق_آباد'], 'code': 'TM', 'continent': 'آسيا', 'name': 'تركمانستان', 'capital': 'عشق آباد'}, + {'timezones': ['إفريقيا/تونس'], 'code': 'TN', 'continent': 'إفريقيا', 'name': 'تونس', 'capital': 'تونس'}, + {'timezones': ['المحيط_الهاديء/تونغاتابو'], 'code': 'TO', 'continent': 'أوقيانوسيا', 'name': 'تونغا', 'capital': 'نوكو ألوفا'}, + {'timezones': ['أوروبا/إسطنبول'], 'code': 'TR', 'continent': 'آسيا', 'name': 'تركيا', 'capital': 'أنقرة'}, + {'timezones': ['أمريكا/بورت_أوف_سبين'], 'code': 'TT', 'continent': 'أمريكا الشمالية', 'name': 'ترينيداد وتوباغو', 'capital': 'بورت أوف سبين'}, + {'timezones': ['المحيط_الهاديء/فونافوتي'], 'code': 'TV', 'continent': 'أوقيانوسيا', 'name': 'توفالو', 'capital': 'فونافوتي'}, + {'timezones': ['إفريقيا/دار_السلام'], 'code': 'TZ', 'continent': 'إفريقيا', 'name': 'تانزانيا', 'capital': 'دودوما'}, + {'timezones': ['أوروبا/كييف', 'أوروبا/أوجهورود', 'أوروبا/زاباروجيا', 'أوروبا/سيمفروبول'], 'code': 'UA', 'continent': 'أوروبا', 'name': 'أوكرانيا', 'capital': 'كييف'}, + {'timezones': ['إفريقيا/كامبالا'], 'code': 'UG', 'continent': 'إفريقيا', 'name': 'أوغندا', 'capital': 'كامبالا'}, + {'timezones': ['أمريكا/نيويورك', 'أمريكا/ديترويت', 'أمريكا/كنتاكي/لويسفيل', 'أمريكا/كنتاكي/مونتيسللو', 'أمريكا/إنديانا/إنديانابولس', 'أمريكا/إنديانا/مارنغو', 'أمريكا/إنديانا/نوكس', 'أمريكا/إنديانا/فيفاي', 'أمريكا/شيكاغو', 'أمريكا/إنديانا/فانسان', 'أمريكا/إنديانا/بيترزبيرغ', 'أمريكا/مينومني', 'أمريكا/نورث_داكوتا/سينتر', 'أمريكا/نورث_داكوتا/نيو_سالم', 'أمريكا/دنفر', 'أمريكا/بويسي', 'أمريكا/شيبروك', 'أمريكا/فينيكس', 'أمريكا/لوس_أنجيلوس', 'أمريكا/أنكوريج', 'أمريكا/جونو', 'أمريكا/ياكوتات', 'أمريكا/نوم', 'أمريكا/أداك', 'المحيط_الهاديء/هونولولو'], 'code': 'US', 'continent': 'أمريكا الشمالية', 'name': 'الولايات المتحدة الأمريكية', 'capital': 'واشنطن'}, + {'timezones': ['أمريكا/مونتفيدو'], 'code': 'UY', 'continent': 'أمريكا الجنوبية', 'name': 'أوروغواي', 'capital': 'مونتفيدو'}, + {'timezones': ['آسيا/سمرقند', 'آسيا/طشقند'], 'code': 'UZ', 'continent': 'آسيا', 'name': 'أوزبكستان', 'capital': 'طشقند'}, + {'timezones': ['أوروبا/الفاتيكان'], 'code': 'VA', 'continent': 'أوروبا', 'name': 'الفاتيكان', 'capital': 'الفاتيكان'}, + {'timezones': ['أمريكا/كاركاس'], 'code': 'VE', 'continent': 'أمريكا الجنوبية', 'name': 'فنزويلا', 'capital': 'كاركاس'}, + {'timezones': ['آسيا/سايغون'], 'code': 'VN', 'continent': 'آسيا', 'name': 'فيتنام', 'capital': 'هانوي'}, + {'timezones': ['المحيط_الهاديء/أيفاتي'], 'code': 'VU', 'continent': 'أوقيانوسيا', 'name': 'فانواتو', 'capital': 'بورت فيلا'}, + {'timezones': ['آسيا/عدن'], 'code': 'YE', 'continent': 'آسيا', 'name': 'اليمن', 'capital': "صنعاء"}, + {'timezones': ['إفريقيا/لوساكا'], 'code': 'ZM', 'continent': 'إفريقيا', 'name': 'زامبيا', 'capital': 'لوساكا'}, + {'timezones': ['إفريقيا/هراري'], 'code': 'ZW', 'continent': 'إفريقيا', 'name': 'زيمبابوي', 'capital': 'هراري'}, + {'timezones': ['إفريقيا/الجزائر'], 'code': 'DZ', 'continent': 'إفريقيا', 'name': 'الجزائر', 'capital': 'الجزائر'}, + {'timezones': ['أوروبا/سراييفو'], 'code': 'BA', 'continent': 'أوروبا', 'name': 'البوسنة والهرسك', 'capital': 'سراييفو'}, + {'timezones': ['آسيا/بنوم_بنه'], 'code': 'KH', 'continent': 'آسيا', 'name': 'كمبوديا', 'capital': 'بنوم بنه'}, + {'timezones': ['إفريقيا/بانغي'], 'code': 'CF', 'continent': 'إفريقيا', 'name': 'جمهورية أفريقيا الوسطى', 'capital': 'بانغي'}, + {'timezones': ['إفريقيا/نجامينا'], 'code': 'TD', 'continent': 'إفريقيا', 'name': 'تشاد', 'capital': "نجامينا"}, + {'timezones': ['الهندي/كومورو'], 'code': 'KM', 'continent': 'إفريقيا', 'name': 'جزر القمر', 'capital': 'موروني'}, + {'timezones': ['أوروبا/زغرب'], 'code': 'HR', 'continent': 'أوروبا', 'name': 'كرواتيا', 'capital': 'زغرب'}, + {'timezones': ['آسيا/ديلي'], 'code': 'TL', 'continent': 'آسيا', 'name': 'تيمور الشرقية', 'capital': 'ديلي'}, + {'timezones': ['أمريكا/السلفادور'], 'code': 'SV', 'continent': 'أمريكا الشمالية', 'name': 'السلفادور', 'capital': 'سان سلفادور'}, + {'timezones': ['إفريقيا/مالابو'], 'code': 'GQ', 'continent': 'إفريقيا', 'name': 'غينيا الاستوائية', 'capital': 'مالابو'}, + {'timezones': ['أمريكا/غرينادا'], 'code': 'GD', 'continent': 'أمريكا الشمالية', 'name': 'غرينادا', 'capital': "سانت جورجز"}, + {'timezones': ['آسيا/ألماتي', 'آسيا/كيزيلوردا', 'آسيا/أقتوبي', 'آسيا/أقتاو', 'آسيا/أورال'], 'code': 'KZ', 'continent': 'آسيا', 'name': 'كازاخستان', 'capital': 'أستانة'}, + {'timezones': ['آسيا/فيينتيان'], 'code': 'LA', 'continent': 'آسيا', 'name': 'لاوس', 'capital': 'فيينتيان'}, + {'timezones': ['المحيط_الهاديء/تشوك', 'المحيط_الهاديء/بونابي', 'المحيط_الهاديء/كورساي'], 'code': 'FM', 'continent': 'أوقيانوسيا', 'name': 'ولايات ميكرونيسيا المتحدة', 'capital': 'باليكير'}, + {'timezones': ['أوروبا/كيشيناو'], 'code': 'MD', 'continent': 'أوروبا', 'name': 'مولدافيا', 'capital': 'كيشيناو'}, + {'timezones': ['أوروبا/موناكو'], 'code': 'MC', 'continent': 'أوروبا', 'name': 'موناكو', 'capital': 'موناكو'}, + {'timezones': ['أوروبا/بودغوريتسا'], 'code': 'ME', 'continent': 'أوروبا', 'name': 'الجبل الأسود', 'capital': 'بودغوريتسا'}, + {'timezones': ['إفريقيا/الدار_البيضاء'], 'code': 'MA', 'continent': 'إفريقيا', 'name': 'المغرب', 'capital': 'الرباط'}, + {'timezones': ['أمريكا/سانت_كيتس'], 'code': 'KN', 'continent': 'أمريكا الشمالية', 'name': 'سانت كيتس ونيفيس', 'capital': 'باستير'}, + {'timezones': ['أمريكا/سانت_لوسيا'], 'code': 'LC', 'continent': 'أمريكا الشمالية', 'name': 'سانت لوسيا', 'capital': 'كاستريس'}, + {'timezones': ['أمريكا/سينت_فينسينت'], 'code': 'VC', 'continent': 'أمريكا الشمالية', 'name': 'سانت فينسنت والغرينادين', 'capital': 'كينغستاون'}, + {'timezones': ['المحيط_الهاديء/أبيا'], 'code': 'WS', 'continent': 'أوقيانوسيا', 'name': 'ساموا', 'capital': 'أبيا'}, + {'timezones': ['أوروبا/بلغراد'], 'code': 'RS', 'continent': 'أوروبا', 'name': 'صربيا', 'capital': 'بلغراد'}, + {'timezones': ['إفريقيا/جوهانسبرغ'], 'code': 'ZA', 'continent': 'إفريقيا', 'name': 'جنوب إفريقيا', 'capital': 'بريتوريا'}, + {'timezones': ['أوروبا/مدريد', 'إفريقيا/سبتة', 'الأطلنطي/الكناري'], 'code': 'ES', 'continent': 'أوروبا', 'name': 'إسبانيا', 'capital': 'مدريد'}, + {'timezones': ['آسيا/كولمبو'], 'code': 'LK', 'continent': 'آسيا', 'name': 'سريلانكا', 'capital': 'سري جاياواردنابورا كوتي'}, + {'timezones': ['إفريقيا/مبابان'], 'code': 'SZ', 'continent': 'إفريقيا', 'name': 'سوازيلاند', 'capital': 'مبابان'}, + {'timezones': ['أوروبا/زيورخ'], 'code': 'CH', 'continent': 'أوروبا', 'name': 'سويسرا', 'capital': 'برن'}, + {'timezones': ['آسيا/دبي'], 'code': 'AE', 'continent': 'آسيا', 'name': 'الإمارات العربية المتحدة', 'capital': 'أبو ظبي'}, + {'timezones': ['أوروبا/لندن'], 'code': 'GB', 'continent': 'أوروبا', 'name': 'المملكة المتحدة', 'capital': 'لندن'}, + ] + + AM_PM = { + 'AM': 'ص', + 'PM': 'م', + } + + def month_name(self): + month = self.date('%m') + return self.MONTH_NAMES[month] + + def am_pm(self): + date = self.date('%p') + return self.AM_PM[date] + + def day_of_week(self): + day = self.date('%w') + return self.DAY_NAMES[day] diff --git a/src/libs/faker/providers/date_time/ar_EG/__init__.py b/src/libs/faker/providers/date_time/ar_EG/__init__.py new file mode 100644 index 0000000..9e68d71 --- /dev/null +++ b/src/libs/faker/providers/date_time/ar_EG/__init__.py @@ -0,0 +1,22 @@ +# coding=utf-8 +from __future__ import unicode_literals + + +from ..ar_AA import Provider as ArabicDateTimeProvider + + +class Provider(ArabicDateTimeProvider): + MONTH_NAMES = { + '01': 'يناير', + '02': 'فبراير', + '03': 'مارس', + '04': 'أبريل', + '05': 'مايو', + '06': 'يونيو', + '07': 'يوليو', + '08': 'أغسطس', + '09': 'سبتمبر', + '10': 'أكتوبر', + '11': 'نوفمبر', + '12': 'ديسمبر' + } diff --git a/src/libs/faker/providers/date_time/en_US/__init__.py b/src/libs/faker/providers/date_time/en_US/__init__.py new file mode 100644 index 0000000..542b583 --- /dev/null +++ b/src/libs/faker/providers/date_time/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + pass diff --git a/src/libs/faker/providers/date_time/fr_FR/__init__.py b/src/libs/faker/providers/date_time/fr_FR/__init__.py new file mode 100644 index 0000000..fbf1a9d --- /dev/null +++ b/src/libs/faker/providers/date_time/fr_FR/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "Dimanche", + "1": "Lundi", + "2": "Mardi", + "3": "Mercredi", + "4": "Jeudi", + "5": "Vendredi", + "6": "Samedi", + } + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "Janvier", + "02": "Février", + "03": "Mars", + "04": "Avril", + "05": "Mai", + "06": "Juin", + "07": "Juillet", + "08": "Août", + "09": "Septembre", + "10": "Octobre", + "11": "Novembre", + "12": "Décembre", + } + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/hr_HR/__init__.py b/src/libs/faker/providers/date_time/hr_HR/__init__.py new file mode 100644 index 0000000..53c3ccb --- /dev/null +++ b/src/libs/faker/providers/date_time/hr_HR/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "Nedjelja", + "1": "Ponedjeljak", + "2": "Utorak", + "3": "Srijeda", + "4": "Četvrtak", + "5": "Petak", + "6": "Subota", + } + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "Siječanj", + "02": "Veljača", + "03": "Ožujak", + "04": "Travanj", + "05": "Svibanj", + "06": "Lipanj", + "07": "Srpanj", + "08": "Kolovoz", + "09": "Rujan", + "10": "Listopad", + "11": "Studeni", + "12": "Prosinac", + } + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/hu_HU/__init__.py b/src/libs/faker/providers/date_time/hu_HU/__init__.py new file mode 100644 index 0000000..7b87d97 --- /dev/null +++ b/src/libs/faker/providers/date_time/hu_HU/__init__.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +from __future__ import unicode_literals +from .. import Provider as DateTimeProvider + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "hétfő", + "1": "kedd", + "2": "szerda", + "3": "csütörtök", + "4": "péntek", + "5": "szombat", + "6": "vasárnap", + } + + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "január", + "02": "február", + "03": "március", + "04": "április", + "05": "május", + "06": "junius", + "07": "julius", + "08": "augusztus", + "09": "szeptember", + "10": "október", + "11": "november", + "12": "december", + } + + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/id_ID/__init__.py b/src/libs/faker/providers/date_time/id_ID/__init__.py new file mode 100644 index 0000000..9e90ff1 --- /dev/null +++ b/src/libs/faker/providers/date_time/id_ID/__init__.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +from __future__ import unicode_literals +from .. import Provider as DateTimeProvider + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "Senin", + "1": "Selasa", + "2": "Rabu", + "3": "Kamis", + "4": "Jumat", + "5": "Sabtu", + "6": "Minggu", + } + + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "Januari", + "02": "Februari", + "03": "Maret", + "04": "April", + "05": "Mei", + "06": "Juni", + "07": "Juli", + "08": "Agustus", + "09": "September", + "10": "Oktober", + "11": "November", + "12": "Desember", + } + + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/ko_KR/__init__.py b/src/libs/faker/providers/date_time/ko_KR/__init__.py new file mode 100644 index 0000000..58737e5 --- /dev/null +++ b/src/libs/faker/providers/date_time/ko_KR/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "일요일", + "1": "월요일", + "2": "화요일", + "3": "수요일", + "4": "목요일", + "5": "금요일", + "6": "토요일", + } + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "1월", + "02": "2월", + "03": "3월", + "04": "4월", + "05": "5월", + "06": "6월", + "07": "7월", + "08": "8월", + "09": "9월", + "10": "10월", + "11": "11월", + "12": "12월", + } + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/pl_PL/__init__.py b/src/libs/faker/providers/date_time/pl_PL/__init__.py new file mode 100644 index 0000000..d2b3cc8 --- /dev/null +++ b/src/libs/faker/providers/date_time/pl_PL/__init__.py @@ -0,0 +1,41 @@ +# coding: utf-8 + +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + DAY_NAMES = { + '0': 'poniedziałek', + '1': 'wtorek', + '2': 'środa', + '3': 'czwartek', + '4': 'piątek', + '5': 'sobota', + '6': 'niedziela', + } + + MONTH_NAMES = { + '01': 'styczeń', + '02': 'luty', + '03': 'marzec', + '04': 'kwiecień', + '05': 'maj', + '06': 'czerwiec', + '07': 'lipiec', + '08': 'sierpień', + '09': 'wrzesień', + '10': 'październik', + '11': 'listopad', + '12': 'grudzień' + } + + def day_of_week(self): + day = self.date('%w') + return self.DAY_NAMES[day] + + def month_name(self): + month = self.month() + return self.MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/ru_RU/__init__.py b/src/libs/faker/providers/date_time/ru_RU/__init__.py new file mode 100644 index 0000000..0802eea --- /dev/null +++ b/src/libs/faker/providers/date_time/ru_RU/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "Воскресенье", + "1": "Понедельник", + "2": "Вторник", + "3": "Среда", + "4": "Четверг", + "5": "Пятница", + "6": "Суббота", + } + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "Январь", + "02": "Февраль", + "03": "Март", + "04": "Апрель", + "05": "Май", + "06": "Июнь", + "07": "Июль", + "08": "Август", + "09": "Сентябрь", + "10": "Октябрь", + "11": "Ноябрь", + "12": "Декабрь", + } + return MONTH_NAMES[month] diff --git a/src/libs/faker/providers/date_time/sl_SI/__init__.py b/src/libs/faker/providers/date_time/sl_SI/__init__.py new file mode 100644 index 0000000..34b6c8b --- /dev/null +++ b/src/libs/faker/providers/date_time/sl_SI/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .. import Provider as DateTimeProvider + + +class Provider(DateTimeProvider): + + def day_of_week(self): + day = self.date('%w') + DAY_NAMES = { + "0": "Nedelja", + "1": "Ponedeljek", + "2": "Torek", + "3": "Sreda", + "4": "Četrtek", + "5": "Petek", + "6": "Sobota", + } + return DAY_NAMES[day] + + def month_name(self): + month = self.month() + MONTH_NAMES = { + "01": "Januar", + "02": "Februar", + "03": "Marec", + "04": "April", + "05": "Maj", + "06": "Junij", + "07": "Julij", + "08": "Avgust", + "09": "September", + "10": "Oktober", + "11": "November", + "12": "December", + } + return MONTH_NAMES[month] diff --git a/src/faker/providers/file.py b/src/libs/faker/providers/file/__init__.py similarity index 72% rename from src/faker/providers/file.py rename to src/libs/faker/providers/file/__init__.py index e545364..a82357e 100644 --- a/src/faker/providers/file.py +++ b/src/libs/faker/providers/file/__init__.py @@ -1,7 +1,8 @@ # coding=utf-8 - from __future__ import unicode_literals -from faker.providers import BaseProvider +from collections import OrderedDict + +from .. import BaseProvider class Provider(BaseProvider): @@ -108,22 +109,103 @@ class Provider(BaseProvider): "video/x-flv", # Flash video (FLV files) ) - mime_types = { - 'application': application_mime_types, - 'audio': audio_mime_types, - 'image': image_mime_types, - 'message': message_mime_types, - 'model': model_mime_types, - 'multipart': multipart_mime_types, - 'text': text_mime_types, - 'video': video_mime_types - } + mime_types = OrderedDict(( + ('application', application_mime_types), + ('audio', audio_mime_types), + ('image', image_mime_types), + ('message', message_mime_types), + ('model', model_mime_types), + ('multipart', multipart_mime_types), + ('text', text_mime_types), + ('video', video_mime_types), + )) - @classmethod - def mime_type(cls, category=None): + audio_file_extensions = ( + "flac", + "mp3", + "wav", + ) + + image_file_extensions = ( + "bmp", + "gif", + "jpeg", + "jpg", + "png", + "tiff", + ) + + text_file_extensions = ( + "css", + "csv", + "html", + "js", + "json", + "txt", + ) + + video_file_extensions = ( + "mp4", + "avi", + "mov", + "webm", + ) + + office_file_extensions = ( + "doc", # legacy MS Word + "docx", # MS Word + "xls", # legacy MS Excel + "xlsx", # MS Excel + "ppt", # legacy MS PowerPoint + "pptx", # MS PowerPoint + "odt", # LibreOffice document + "ods", # LibreOffice spreadsheet + "odp", # LibreOffice presentation + "pages", # Apple Pages + "numbers", # Apple Numbers + "key", # Apple Keynote + "pdf", # Portable Document Format + ) + + file_extensions = OrderedDict(( + ("audio", audio_file_extensions), + ("image", image_file_extensions), + ("office", office_file_extensions), + ("text", text_file_extensions), + ("video", video_file_extensions), + )) + + def mime_type(self, category=None): """ :param category: application|audio|image|message|model|multipart|text|video """ - category = category if category else cls.random_element(list(cls.mime_types.keys())) - return cls.random_element(cls.mime_types[category]) + category = category if category else self.random_element(list(self.mime_types.keys())) + return self.random_element(self.mime_types[category]) + def file_name(self, category=None, extension=None): + """ + :param category: audio|image|office|text|video + :param extension: file extension + """ + extension = extension if extension else self.file_extension(category) + filename = self.generator.word() + return '{0}.{1}'.format(filename, extension) + + def file_extension(self, category=None): + """ + :param category: audio|image|office|text|video + """ + category = category if category else self.random_element(list(self.file_extensions.keys())) + return self.random_element(self.file_extensions[category]) + + def file_path(self, depth=1, category=None, extension=None): + """ + :param category: audio|image|office|text|video + :param extension: file extension + :param depth: depth of the file (depth >= 0) + """ + file = self.file_name(category, extension) + path = "/{0}".format(file) + for d in range(0, depth): + path = "/{0}{1}".format(self.generator.word(), path) + return path diff --git a/src/libs/faker/providers/file/en_US/__init__.py b/src/libs/faker/providers/file/en_US/__init__.py new file mode 100644 index 0000000..5d2a396 --- /dev/null +++ b/src/libs/faker/providers/file/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as FileProvider + + +class Provider(FileProvider): + pass diff --git a/src/libs/faker/providers/internet/__init__.py b/src/libs/faker/providers/internet/__init__.py new file mode 100644 index 0000000..acdda08 --- /dev/null +++ b/src/libs/faker/providers/internet/__init__.py @@ -0,0 +1,221 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from text_unidecode import unidecode + +from .. import BaseProvider + +from ipaddress import ip_address, ip_network, IPV4LENGTH, IPV6LENGTH + +# from faker.generator import random +# from faker.providers.lorem.la import Provider as Lorem +from faker.utils.decorators import lowercase, slugify, slugify_unicode + + +localized = True + + +class Provider(BaseProvider): + safe_email_tlds = ('org', 'com', 'net') + free_email_domains = ('gmail.com', 'yahoo.com', 'hotmail.com') + tlds = ( + 'com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org' + ) + + uri_pages = ( + 'index', 'home', 'search', 'main', 'post', 'homepage', 'category', + 'register', 'login', 'faq', 'about', 'terms', 'privacy', 'author' + ) + uri_paths = ( + 'app', 'main', 'wp-content', 'search', 'category', 'tag', 'categories', + 'tags', 'blog', 'posts', 'list', 'explore' + ) + uri_extensions = ( + '.html', '.html', '.html', '.htm', '.htm', '.php', '.php', '.jsp', + '.asp' + ) + + user_name_formats = ( + '{{last_name}}.{{first_name}}', + '{{first_name}}.{{last_name}}', + '{{first_name}}##', + '?{{last_name}}', + ) + email_formats = ( + '{{user_name}}@{{domain_name}}', + '{{user_name}}@{{free_email_domain}}', + ) + url_formats = ( + 'http://www.{{domain_name}}/', + 'http://{{domain_name}}/', + 'https://www.{{domain_name}}/', + 'https://{{domain_name}}/', + ) + uri_formats = ( + '{{url}}', + '{{url}}{{uri_page}}/', + '{{url}}{{uri_page}}{{uri_extension}}', + '{{url}}{{uri_path}}/{{uri_page}}/', + '{{url}}{{uri_path}}/{{uri_page}}{{uri_extension}}', + ) + image_placeholder_services = ( + 'https://placeholdit.imgix.net/~text' + '?txtsize=55&txt={width}x{height}&w={width}&h={height}', + 'https://www.lorempixel.com/{width}/{height}', + 'https://dummyimage.com/{width}x{height}', + ) + + replacements = tuple() + + def _to_ascii(self, string): + for search, replace in self.replacements: + string = string.replace(search, replace) + + string = unidecode(string) + return string + + @lowercase + def email(self): + pattern = self.random_element(self.email_formats) + return "".join(self.generator.parse(pattern).split(" ")) + + @lowercase + def safe_email(self): + return '{}@example.{}'.format( + self.user_name(), self.random_element(self.safe_email_tlds) + ) + + @lowercase + def free_email(self): + return self.user_name() + '@' + self.free_email_domain() + + @lowercase + def company_email(self): + return self.user_name() + '@' + self.domain_name() + + @lowercase + def free_email_domain(self): + return self.random_element(self.free_email_domains) + + @lowercase + def ascii_email(self): + pattern = self.random_element(self.email_formats) + return self._to_ascii( + "".join(self.generator.parse(pattern).split(" ")) + ) + + @lowercase + def ascii_safe_email(self): + return self._to_ascii( + self.user_name() + + '@example.' + + self.random_element(self.safe_email_tlds) + ) + + @lowercase + def ascii_free_email(self): + return self._to_ascii( + self.user_name() + '@' + self.free_email_domain() + ) + + @lowercase + def ascii_company_email(self): + return self._to_ascii( + self.user_name() + '@' + self.domain_name() + ) + + @slugify_unicode + def user_name(self): + pattern = self.random_element(self.user_name_formats) + username = self._to_ascii( + self.bothify(self.generator.parse(pattern)).lower() + ) + return username + + @lowercase + def domain_name(self, levels=1): + """ + Produce an Internet domain name with the specified number of + subdomain levels. + + >>> domain_name() + nichols-phillips.com + >>> domain_name(2) + williamson-hopkins.jackson.com + """ + if levels < 1: + raise ValueError("levels must be greater than or equal to 1") + if levels == 1: + return self.domain_word() + '.' + self.tld() + else: + return self.domain_word() + '.' + self.domain_name(levels - 1) + + @lowercase + @slugify_unicode + def domain_word(self,): + company = self.generator.format('company') + company_elements = company.split(' ') + company = self._to_ascii(company_elements.pop(0)) + return company + + def tld(self): + return self.random_element(self.tlds) + + def url(self): + pattern = self.random_element(self.url_formats) + return self.generator.parse(pattern) + + def ipv4(self, network=False): + """Produce a random IPv4 address or network with a valid CIDR""" + address = str(ip_address(self.generator.random.randint( + 0, (2 ** IPV4LENGTH) - 1))) + if network: + address += '/' + str(self.generator.random.randint(0, IPV4LENGTH)) + address = str(ip_network(address, strict=False)) + return address + + def ipv6(self, network=False): + """Produce a random IPv6 address or network with a valid CIDR""" + address = str(ip_address(self.generator.random.randint( + 2 ** IPV4LENGTH, (2 ** IPV6LENGTH) - 1))) + if network: + address += '/' + str(self.generator.random.randint(0, IPV6LENGTH)) + address = str(ip_network(address, strict=False)) + return address + + def mac_address(self): + mac = [self.generator.random.randint(0x00, 0xff) for i in range(0, 6)] + return ":".join(map(lambda x: "%02x" % x, mac)) + + def uri_page(self): + return self.random_element(self.uri_pages) + + def uri_path(self, deep=None): + deep = deep if deep else self.generator.random.randint(1, 3) + return "/".join( + [self.random_element(self.uri_paths) for _ in range(0, deep)] + ) + + def uri_extension(self): + return self.random_element(self.uri_extensions) + + def uri(self): + pattern = self.random_element(self.uri_formats) + return self.generator.parse(pattern) + + @slugify + def slug(self, value=None): + """Django algorithm""" + if value is None: + value = self.generator.text(20) + return value + + def image_url(self, width=None, height=None): + """ + Returns URL to placeholder image + Example: http://placehold.it/640x480 + """ + width_ = width or self.random_int(max=1024) + height_ = height or self.random_int(max=1024) + placeholder_url = self.random_element(self.image_placeholder_services) + return placeholder_url.format(width=width_, height=height_) diff --git a/src/libs/faker/providers/internet/ar_AA/__init__.py b/src/libs/faker/providers/internet/ar_AA/__init__.py new file mode 100644 index 0000000..722bc03 --- /dev/null +++ b/src/libs/faker/providers/internet/ar_AA/__init__.py @@ -0,0 +1,57 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + replacements = ( + ('س', 's'), + ('ق', 'q'), + ('ب', 'b'), + ('خ', 'x'), + ('ش', '$'), + ('َ', 'a'), + ('ئ', '}'), + ('إ', '<'), + ('ل', 'l'), + ('ٰ', '`'), + ('ف', 'f'), + ('و', 'w'), + ('ض', 'D'), + ('ي', 'y'), + ('ُ', 'u'), + ('ة', 'p'), + ('ظ', 'Z'), + ('ث', 'v'), + ('ـ', '_'), + ('ج', 'j'), + ('د', 'd'), + ('ح', 'H'), + ('ا', 'A'), + ('أ', '>'), + ('ر', 'r'), + ('ى', 'Y'), + ('ذ', '*'), + ('ْ', 'o'), + ('ن', 'n'), + ('ّ', '~'), + ('ك', 'k'), + ('ء', "'"), + ('ط', 'T'), + ('ت', 't'), + ('ه', 'h'), + ('ً', 'F'), + ('ؤ', '&'), + ('ٍ', 'K'), + ('ِ', 'i'), + ('ص', 'S'), + ('ٱ', '{'), + ('ٌ', 'N'), + ('م', 'm'), + ('ز', 'z'), + ('ع', 'E'), + ('آ', '|'), + ('غ', 'g') + ) diff --git a/src/libs/faker/providers/internet/bg_BG/__init__.py b/src/libs/faker/providers/internet/bg_BG/__init__.py new file mode 100644 index 0000000..ff8e95e --- /dev/null +++ b/src/libs/faker/providers/internet/bg_BG/__init__.py @@ -0,0 +1,43 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + user_name_formats = ( + '{{last_name_female}}.{{first_name_female}}', + '{{last_name_male}}.{{first_name_male}}', + '{{last_name_male}}.{{first_name_male}}', + '{{first_name_male}}.{{last_name_male}}', + '{{first_name}}##', + '?{{last_name}}', + '{{first_name}}{{year}}' + ) + + email_formats = ( + '{{user_name}}@{{free_email_domain}}', + '{{user_name}}@{{domain_name}}') + + free_email_domains = ( + 'gmail.com', 'yahoo.com', 'hotmail.com', 'mail.bg', 'abv.bg', 'dir.bg' + ) + + tlds = ('bg', 'com', 'biz', 'info', 'net', 'org', 'edu') + + replacements = ( + ('Б', 'b'), ('Г', 'r'), ('Д', 'd'), ('Ж', 'zh'), ('З', 'z'), ('И', 'i'), + ('Й', 'i'), ('Л', 'l'), ('П', 'p'), ('Ф', 'f'), ('Ц', 'ts'), ('Ч', 'ch'), + ('Ш', 'sh'), ('Щ', 'sht'), ('Ъ', 'u'), ('Ь', ''), ('Ю', 'yu'), ('Я', 'ya'), + ('б', 'b'), ('в', 'v'), ('д', 'd'), ('ж', 'zh'), ('з', 'z'), ('и', 'i'), + ('й', 'i'), ('к', 'k'), ('л', 'l'), ('м', 'm'), ('н', 'n'), ('п', 'p'), + ('т', 't'), ('ф', 'f'), ('ц', 'ts'), ('ч', 'ch'), ('ш', 'sh'), ('щ', 'sht'), + ('ъ', 'u'), ('ь', ''), ('ю', 'yu'), ('я', 'ya'), ('Б', 'b'), ('Г', 'r'), + ('Д', 'd'), ('Ж', 'zh'), ('З', 'z'), ('И', 'i'), ('Й', 'i'), ('Л', 'l'), + ('П', 'p'), ('Ф', 'f'), ('Ц', 'ts'), ('Ч', 'ch'), ('Ш', 'sh'), ('Щ', 'sht'), + ('Ъ', 'u'), ('Ь', ''), ('Ю', 'yu'), ('Я', 'ya'), ('б', 'b'), ('в', 'v'), + ('д', 'd'), ('ж', 'zh'), ('з', 'z'), ('и', 'i'), ('й', 'i'), ('к', 'k'), + ('л', 'l'), ('м', 'm'), ('н', 'n'), ('п', 'p'), ('т', 't'), ('ф', 'f'), + ('ц', 'ts'), ('ч', 'ch'), ('ш', 'sh'), ('щ', 'sht'), ('ъ', 'u'), ('ь', ''), + ('ю', 'yu'), ('я', 'ya') + ) diff --git a/src/libs/faker/providers/internet/bs_BA/__init__.py b/src/libs/faker/providers/internet/bs_BA/__init__.py new file mode 100644 index 0000000..88f22aa --- /dev/null +++ b/src/libs/faker/providers/internet/bs_BA/__init__.py @@ -0,0 +1,21 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'gmail.com', 'hotmail.com', 'yahoo.com', 'outlook.com', + 'bih.net.ba', 'tel.net.ba', + ) + + tlds = ('ba', 'com.ba', 'org.ba', 'net.ba', 'gov.ba', 'edu.ba', 'unsa.ba') + + replacements = ( + ('č', 'c'), ('Č', 'C'), + ('ć', 'c'), ('Ć', 'C'), + ('đ', 'dj'), ('Đ', 'Dj'), + ('š', 's'), ('Š', 'S'), + ('ž', 'z'), ('Ž', 'Z') + ) diff --git a/src/faker/providers/cs_CZ/internet.py b/src/libs/faker/providers/internet/cs_CZ/__init__.py similarity index 93% rename from src/faker/providers/cs_CZ/internet.py rename to src/libs/faker/providers/internet/cs_CZ/__init__.py index fb34998..91a98ad 100644 --- a/src/faker/providers/cs_CZ/internet.py +++ b/src/libs/faker/providers/internet/cs_CZ/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider class Provider(InternetProvider): diff --git a/src/libs/faker/providers/internet/de_AT/__init__.py b/src/libs/faker/providers/internet/de_AT/__init__.py new file mode 100644 index 0000000..ad4499a --- /dev/null +++ b/src/libs/faker/providers/internet/de_AT/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'chello.at', 'gmail.com', 'gmx.at', 'kabsi.at', + ) + tlds = ('at', 'co.at', 'com', 'net', 'org', ) + + replacements = ( + ('ä', 'ae'), ('Ä', 'Ae'), + ('ö', 'oe'), ('Ö', 'Oe'), + ('ü', 'ue'), ('Ü', 'Ue'), + ('ß', 'ss'), + ) diff --git a/src/libs/faker/providers/internet/de_DE/__init__.py b/src/libs/faker/providers/internet/de_DE/__init__.py new file mode 100644 index 0000000..231d57a --- /dev/null +++ b/src/libs/faker/providers/internet/de_DE/__init__.py @@ -0,0 +1,21 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as InternetProvider + +class Provider(InternetProvider): + + free_email_domains = ( + 'aol.de', 'gmail.com', 'gmx.de', 'googlemail.com', 'hotmail.de', + 'web.de', 'yahoo.de', + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'de', 'de', 'de', ) + + replacements = ( + ('ä', 'ae'), ('Ä', 'Ae'), + ('ö', 'oe'), ('Ö', 'Oe'), + ('ü', 'ue'), ('Ü', 'Ue'), + ('é', 'e'), ('É', 'E'), + ('à', 'a'), ('À', 'A'), + ('ß', 'ss'), + ) diff --git a/src/faker/providers/el_GR/internet.py b/src/libs/faker/providers/internet/el_GR/__init__.py similarity index 98% rename from src/faker/providers/el_GR/internet.py rename to src/libs/faker/providers/internet/el_GR/__init__.py index 0b107b1..42f45a9 100644 --- a/src/faker/providers/el_GR/internet.py +++ b/src/libs/faker/providers/internet/el_GR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider import re from faker.utils.decorators import slugify_domain diff --git a/src/libs/faker/providers/internet/en_AU/__init__.py b/src/libs/faker/providers/internet/en_AU/__init__.py new file mode 100644 index 0000000..9185be9 --- /dev/null +++ b/src/libs/faker/providers/internet/en_AU/__init__.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'gmail.com', 'yahoo.com', 'hotmail.com', 'yahoo.com.au', 'hotmail.com.au', + ) + + tlds = ('com', 'com.au', 'org', 'org.au', 'net', 'net.au', 'biz', 'info', 'edu', 'edu.au') diff --git a/src/libs/faker/providers/internet/en_US/__init__.py b/src/libs/faker/providers/internet/en_US/__init__.py new file mode 100644 index 0000000..1595cb0 --- /dev/null +++ b/src/libs/faker/providers/internet/en_US/__init__.py @@ -0,0 +1,7 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + pass \ No newline at end of file diff --git a/src/libs/faker/providers/internet/fa_IR/__init__.py b/src/libs/faker/providers/internet/fa_IR/__init__.py new file mode 100644 index 0000000..2be92e7 --- /dev/null +++ b/src/libs/faker/providers/internet/fa_IR/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + safe_email_tlds = ('com', 'net', 'ir', 'org') + free_email_domains = ('chmail.ir', 'mailfa.com', 'gmail.com', 'hotmail.com', 'yahoo.com') + tlds = ('com', 'com', 'com', 'net', 'org', 'ir', 'ir', 'ir') diff --git a/src/faker/providers/fi_FI/internet.py b/src/libs/faker/providers/internet/fi_FI/__init__.py similarity index 85% rename from src/faker/providers/fi_FI/internet.py rename to src/libs/faker/providers/internet/fi_FI/__init__.py index 8766720..5a6791e 100644 --- a/src/faker/providers/fi_FI/internet.py +++ b/src/libs/faker/providers/internet/fi_FI/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider class Provider(InternetProvider): diff --git a/src/libs/faker/providers/internet/fr_CH/__init__.py b/src/libs/faker/providers/internet/fr_CH/__init__.py new file mode 100644 index 0000000..8925e75 --- /dev/null +++ b/src/libs/faker/providers/internet/fr_CH/__init__.py @@ -0,0 +1,21 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + safe_email_tlds = ('org', 'com', 'net', 'ch',) + free_email_domains = ( + 'gmail.com', 'hotmail.fr', 'yahoo.fr', 'bluewin.ch', 'romandie.com', 'hispeed.ch', 'sunrise.ch', 'vtxnet.ch' + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'ch', 'ch', 'ch') + + replacements = ( + ('ä', 'ae'), ('à', 'a'), ('â', 'a'), + ('ç', 'c'), + ('é', 'e'), ('è', 'e'), ('ê', 'e'), ('ë', 'e'), + ('ï', 'i'), ('î', 'i'), + ('ö', 'oe'), ('ô', 'o'), + ('ü', 'ue'), ('ù', 'u'), ('ü', 'u'), + ('ß', 'ss'), + ) diff --git a/src/faker/providers/fr_FR/internet.py b/src/libs/faker/providers/internet/fr_FR/__init__.py similarity index 59% rename from src/faker/providers/fr_FR/internet.py rename to src/libs/faker/providers/internet/fr_FR/__init__.py index 075a73f..78b3af4 100644 --- a/src/faker/providers/fr_FR/internet.py +++ b/src/libs/faker/providers/internet/fr_FR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider class Provider(InternetProvider): @@ -9,3 +9,11 @@ class Provider(InternetProvider): 'voila.fr', 'gmail.com', 'hotmail.fr', 'yahoo.fr', 'laposte.net', 'free.fr', 'sfr.fr', 'orange.fr', 'bouygtel.fr', 'club-internet.fr', 'dbmail.com', 'live.com', 'ifrance.com', 'noos.fr', 'tele2.fr', 'tiscali.fr', 'wanadoo.fr') tlds = ('com', 'com', 'com', 'net', 'org', 'fr', 'fr', 'fr') + replacements = ( + ('à', 'a'), ('â', 'a'), ('ä', 'a'), + ('ç', 'c'), + ('é', 'e'), ('è', 'e'), ('ê', 'e'), ('ë', 'e'), ('É', 'e'), + ('ï', 'i'), ('î', 'i'), + ('ô', 'o'), ('ö', 'o'), + ('ù', 'u'), ('ü', 'u'), + ) diff --git a/src/libs/faker/providers/internet/hr_HR/__init__.py b/src/libs/faker/providers/internet/hr_HR/__init__.py new file mode 100644 index 0000000..128883c --- /dev/null +++ b/src/libs/faker/providers/internet/hr_HR/__init__.py @@ -0,0 +1,22 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'gmail.com', 'hotmail.com', 'yahoo.com', + 'net.hr', 'zg.t-com.hr', 'inet.hr', 't.ht.hr', 'vip.hr', + 'globalnet.hr', 'xnet.hr', 'yahoo.hr', 'zagreb.hr', + ) + + tlds = ('hr', 'com', 'com.hr', 'info', 'org', 'net', 'biz') + + replacements = ( + ('č', 'c'), ('Č', 'C'), + ('ć', 'c'), ('Ć', 'C'), + ('đ', 'dj'), ('Đ', 'Dj'), + ('š', 's'), ('Š', 'S'), + ('ž', 'z'), ('Ž', 'Z'), + ) diff --git a/src/libs/faker/providers/internet/hu_HU/__init__.py b/src/libs/faker/providers/internet/hu_HU/__init__.py new file mode 100644 index 0000000..618dd82 --- /dev/null +++ b/src/libs/faker/providers/internet/hu_HU/__init__.py @@ -0,0 +1,33 @@ +# coding=utf8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + +class Provider(InternetProvider): + + free_email_domains = ( + 'gmail.com', + 'hotmail.com', + 'yahoo.com' + ) + + tlds = ( + 'hu', + 'com', + 'com.hu', + 'info', + 'org', + 'net', + 'biz' + ) + + replacements = ( + ('ö', 'o'), + ('ü', 'u'), + ('á', 'a'), + ('é', 'e'), + ('í', 'i'), + ('ó', 'i'), + ('ő', 'o'), + ('ú', 'u'), + ('ű', 'u') + ) \ No newline at end of file diff --git a/src/libs/faker/providers/internet/id_ID/__init__.py b/src/libs/faker/providers/internet/id_ID/__init__.py new file mode 100644 index 0000000..1690492 --- /dev/null +++ b/src/libs/faker/providers/internet/id_ID/__init__.py @@ -0,0 +1,14 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + tlds = ( + # From https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains + 'com', 'org', 'net', 'int', 'edu', 'gov', 'mil', + + # From https://id.wikipedia.org/wiki/.id + 'id', 'ac.id', 'biz.id', 'co.id', 'desa.id', 'go.id', 'mil.id', + 'my.id', 'net.id', 'or.id', 'ponpes.id', 'sch.id', 'web.id', + ) diff --git a/src/libs/faker/providers/internet/it_IT/__init__.py b/src/libs/faker/providers/internet/it_IT/__init__.py new file mode 100644 index 0000000..6866eda --- /dev/null +++ b/src/libs/faker/providers/internet/it_IT/__init__.py @@ -0,0 +1,30 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + safe_email_tlds = ('com', 'net', 'eu', 'it', 'it', 'it') + free_email_domains = ( + 'libero.it', 'libero.it', 'libero.it', + 'tim.it', + 'tin.it', + 'alice.it', + 'virgilio.it', + 'tiscali.it', + 'fastwebnet.it', + 'vodafone.it', + 'poste.it', + 'gmail.com', 'gmail.com', 'gmail.com', + 'outlook.com', + 'live.com', + 'hotmail.com', + 'hotmail.it', + 'yahoo.com', + 'tele2.it', + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'eu', 'it', 'it', 'it', 'it') + replacements = ( + ('à', 'a'), ('é', 'e'), ('è', 'e'), + ('ì', 'i'), ('ò', 'o'), ('ù', 'u') + ) diff --git a/src/libs/faker/providers/internet/ja_JP/__init__.py b/src/libs/faker/providers/internet/ja_JP/__init__.py new file mode 100644 index 0000000..0229a10 --- /dev/null +++ b/src/libs/faker/providers/internet/ja_JP/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider +from faker.utils.decorators import slugify + + +class Provider(InternetProvider): + user_name_formats = ( + '{{last_romanized_name}}.{{first_romanized_name}}', + '{{first_romanized_name}}.{{last_romanized_name}}', + '{{first_romanized_name}}##', + '?{{last_romanized_name}}', + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'jp', 'jp', 'jp') + + @slugify + def domain_word(self): + return self.generator.format('last_romanized_name') diff --git a/src/libs/faker/providers/internet/ko_KR/__init__.py b/src/libs/faker/providers/internet/ko_KR/__init__.py new file mode 100644 index 0000000..8b55dba --- /dev/null +++ b/src/libs/faker/providers/internet/ko_KR/__init__.py @@ -0,0 +1,11 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + +class Provider(InternetProvider): + + free_email_domains = ( + 'gmail.com', 'daum.net', 'hotmail.com', 'hanmail.net', + 'naver.com', 'nate.com', 'live.com', 'dreamwiz.com', + ) + tlds = ('com', 'com', 'com', 'kr', 'kr', 'net', 'org',) \ No newline at end of file diff --git a/src/libs/faker/providers/internet/no_NO/__init__.py b/src/libs/faker/providers/internet/no_NO/__init__.py new file mode 100644 index 0000000..8162527 --- /dev/null +++ b/src/libs/faker/providers/internet/no_NO/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + +import re + + +class Provider(InternetProvider): + + tlds = ('com', 'com', 'com', 'net', 'org', 'no', 'no', 'no', 'no', 'no') + + replacements = ( + ('æ', 'ae'), ('Æ', 'Ae'), + ('ø', 'oe'), ('Ø', 'Oe'), + ('å', 'aa'), ('Å', 'Aa'), + ('ä', 'ae'), ('Ä', 'Ae'), + ('ö', 'oe'), ('Ö', 'Oe'), + ('ü', 'ue'), ('Ü', 'Ue'), + ) diff --git a/src/libs/faker/providers/internet/pl_PL/__init__.py b/src/libs/faker/providers/internet/pl_PL/__init__.py new file mode 100644 index 0000000..e239401 --- /dev/null +++ b/src/libs/faker/providers/internet/pl_PL/__init__.py @@ -0,0 +1,30 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'onet.pl', + 'interia.pl', + 'gmail.com', + 'o2.pl', + 'yahoo.com', + 'hotmail.com', + ) + + tlds = ('com', 'com', 'com', 'net', 'org', 'pl', 'pl', 'pl') + + replacements = ( + ('ą', 'a'), + ('ć', 'c'), + ('ę', 'e'), + ('ł', 'l'), + ('ń', 'n'), + ('ó', 'o'), + ('ś', 's'), + ('ź', 'z'), + ('ż', 'z'), + ) diff --git a/src/faker/providers/pt_BR/internet.py b/src/libs/faker/providers/internet/pt_BR/__init__.py similarity index 85% rename from src/faker/providers/pt_BR/internet.py rename to src/libs/faker/providers/internet/pt_BR/__init__.py index 6741461..ef539d3 100644 --- a/src/faker/providers/pt_BR/internet.py +++ b/src/libs/faker/providers/internet/pt_BR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider class Provider(InternetProvider): diff --git a/src/libs/faker/providers/internet/pt_PT/__init__.py b/src/libs/faker/providers/internet/pt_PT/__init__.py new file mode 100644 index 0000000..d1e9f27 --- /dev/null +++ b/src/libs/faker/providers/internet/pt_PT/__init__.py @@ -0,0 +1,9 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + safe_email_tlds = ('com', 'net', 'pt', 'pt') + free_email_domains = ('gmail.com', 'hotmail.com', 'clix.pt', 'sapo.pt') + tlds = ('com', 'com', 'com', 'net', 'org', 'pt', 'pt', 'pt') diff --git a/src/libs/faker/providers/internet/ru_RU/__init__.py b/src/libs/faker/providers/internet/ru_RU/__init__.py new file mode 100644 index 0000000..f957ad5 --- /dev/null +++ b/src/libs/faker/providers/internet/ru_RU/__init__.py @@ -0,0 +1,41 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + +class Provider(InternetProvider): + user_name_formats = ( + '{{last_name_female}}.{{first_name_female}}', + '{{last_name_male}}.{{first_name_male}}', + '{{last_name_male}}.{{first_name_male}}', + '{{first_name_male}}.{{last_name_male}}', + '{{first_name}}##', + '{{first_name}}_##', + '?{{last_name}}', + '{{first_name}}{{year}}' + '{{first_name}}_{{year}}' + ) + + email_formats = ( + '{{user_name}}@{{free_email_domain}}', + '{{user_name}}@{{domain_name}}') + + free_email_domains = ( + 'gmail.com', 'yahoo.com', 'hotmail.com', 'mail.ru', 'yandex.ru', 'rambler.ru' + ) + + tlds = ('ru', 'com', 'biz', 'info', 'net', 'org', 'edu') + + replacements = ( + ('А', 'a'), ('Б', 'b'), ('В', 'v'), ('Г', 'g'), ('Д', 'd'), ('Е', 'e'), + ('Ё', 'e'), ('Ж', 'zh'), ('З', 'z'), ('И', 'i'), ('Й', ''), ('К', 'k'), + ('Л', 'l'), ('М', 'm'), ('Н', 'n'), ('О', 'o'), ('П', 'p'), ('Р', 'r'), + ('С', 's'), ('Т', 't'), ('У', 'u'), ('Ф', 'f'), ('Х', 'h'), ('Ц', 'ts'), + ('Ч', 'ch'), ('Ш', 'sh'), ('Щ', 'shch'), ('Ъ', ''), ('Ы', 'i'), + ('Ь', ''), ('Э', 'e'), ('Ю', 'yu'), ('Я', 'ya'), ('а', 'a'), ('б', 'b'), + ('в', 'v'), ('г', 'g'), ('д', 'd'), ('е', 'e'), ('ё', 'e'), ('ж', 'zh'), + ('з', 'z'), ('и', 'i'), ('й', ''), ('к', 'k'), ('л', 'l'), ('м', 'm'), + ('н', 'n'), ('о', 'o'), ('п', 'p'), ('р', 'r'), ('с', 's'), ('т', 't'), + ('у', 'u'), ('ф', 'f'), ('х', 'h'), ('ц', 'ts'), ('ч', 'ch'), + ('ш', 'sh'), ('щ', 'shch'), ('ъ', ''), ('ы', 'i'), ('ь', ''), + ('э', 'e'), ('ю', 'ju'), ('я', 'ja') + ) diff --git a/src/libs/faker/providers/internet/sk_SK/__init__.py b/src/libs/faker/providers/internet/sk_SK/__init__.py new file mode 100644 index 0000000..5f6f1b0 --- /dev/null +++ b/src/libs/faker/providers/internet/sk_SK/__init__.py @@ -0,0 +1,27 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + user_name_formats = ( + '{{last_name_female}}.{{first_name_female}}', + '{{last_name_female}}.{{first_name_female}}', + '{{last_name_male}}.{{first_name_male}}', + '{{last_name_male}}.{{first_name_male}}', + '{{first_name_female}}.{{last_name_female}}', + '{{first_name_male}}.{{last_name_male}}', + '{{first_name}}##', + '?{{last_name}}', + '?{{last_name}}', + '?{{last_name}}', + ) + + email_formats = ('{{user_name}}@{{free_email_domain}}', ) + + free_email_domains = ( + 'zoznam.sk', 'gmail.com', 'centrum.sk', 'post.sk', 'chello.sk', 'pobox.sk', 'szm.sk', 'atlas.sk', 'azet.sk', + 'inmail.sk', + ) + + tlds = ('sk', 'com',) diff --git a/src/faker/providers/sl_SI/internet.py b/src/libs/faker/providers/internet/sl_SI/__init__.py similarity index 95% rename from src/faker/providers/sl_SI/internet.py rename to src/libs/faker/providers/internet/sl_SI/__init__.py index 962985a..1635198 100644 --- a/src/faker/providers/sl_SI/internet.py +++ b/src/libs/faker/providers/internet/sl_SI/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..internet import Provider as InternetProvider +from .. import Provider as InternetProvider class Provider(InternetProvider): diff --git a/src/libs/faker/providers/internet/sv_SE/__init__.py b/src/libs/faker/providers/internet/sv_SE/__init__.py new file mode 100644 index 0000000..11bd46d --- /dev/null +++ b/src/libs/faker/providers/internet/sv_SE/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + + free_email_domains = ( + 'telia.com', 'gmail.com', 'swipnet.se', 'googlemail.com', 'live.se', + 'spray.se', 'yahoo.de', + ) + tlds = ('com', 'com', 'com', 'se', 'se', 'se', 'net', 'org') + + replacements = ( + ('å', 'a'), ('Å', 'A'), + ('ä', 'a'), ('Ä', 'A'), + ('ö', 'o'), ('Ö', 'O'), + ) diff --git a/src/libs/faker/providers/internet/uk_UA/__init__.py b/src/libs/faker/providers/internet/uk_UA/__init__.py new file mode 100644 index 0000000..0d3871c --- /dev/null +++ b/src/libs/faker/providers/internet/uk_UA/__init__.py @@ -0,0 +1,27 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as InternetProvider + + +class Provider(InternetProvider): + free_email_domains = ( + 'email.ua', 'gmail.com', 'gov.ua', 'i.ua', 'meta.ua', 'ukr.net' + ) + tlds = ('com', 'info', 'net', 'org', 'ua', 'укр') + + replacements = ( + ('А', 'a'), ('Б', 'b'), ('В', 'v'), ('Г', 'h'), ('Ґ', 'g'), ('Д', 'd'), + ('Е', 'e'), ('Є', 'ye'), ('Ж', 'zh'), ('З', 'z'), ('И', 'y'), + ('І', 'i'), ('Ї', 'yi'), ('Й', 'y'), ('К', 'k'), ('Л', 'l'), + ('М', 'm'), ('Н', 'n'), ('О', 'o'), ('П', 'p'), ('Р', 'r'), ('С', 's'), + ('Т', 't'), ('У', 'u'), ('Ф', 'f'), ('Х', 'kh'), ('Ц', 'ts'), + ('Ч', 'ch'), ('Ш', 'sh'), ('Щ', 'shch'), ('Ь', 'ʹ'), ('Ю', 'yu'), + ('Я', 'ya'), ('а', 'a'), ('б', 'b'), ('в', 'v'), ('г', 'h'), + ('ґ', 'g'), ('д', 'd'), ('е', 'e'), ('є', 'ie'), ('ж', 'zh'), + ('з', 'z'), ('и', 'y'), ('і', 'i'), ('ї', 'i'), ('й', 'i'), + ('к', 'k'), ('л', 'l'), ('м', 'm'), ('н', 'n'), ('о', 'o'), ('п', 'p'), + ('р', 'r'), ('с', 's'), ('т', 't'), ('у', 'u'), ('ф', 'f'), + ('х', 'kh'), ('ц', 'ts'), ('ч', 'ch'), ('ш', 'sh'), ('щ', 'shch'), + ('ь', 'ʹ'), ('ю', 'iu'), ('я', 'ia') + ) diff --git a/src/libs/faker/providers/internet/zh_CN/__init__.py b/src/libs/faker/providers/internet/zh_CN/__init__.py new file mode 100644 index 0000000..c1c1b6c --- /dev/null +++ b/src/libs/faker/providers/internet/zh_CN/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider +from faker.utils.decorators import slugify + + +class Provider(InternetProvider): + user_name_formats = ( + '{{last_romanized_name}}.{{first_romanized_name}}', + '{{first_romanized_name}}.{{last_romanized_name}}', + '{{first_romanized_name}}##', + '?{{last_romanized_name}}', + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'cn', 'cn', 'cn') + + @slugify + def domain_word(self): + return self.generator.format('last_romanized_name') diff --git a/src/libs/faker/providers/internet/zh_TW/__init__.py b/src/libs/faker/providers/internet/zh_TW/__init__.py new file mode 100644 index 0000000..6eae6bb --- /dev/null +++ b/src/libs/faker/providers/internet/zh_TW/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as InternetProvider +from faker.utils.decorators import slugify + + +class Provider(InternetProvider): + user_name_formats = ( + '{{last_romanized_name}}.{{first_romanized_name}}', + '{{first_romanized_name}}.{{last_romanized_name}}', + '{{first_romanized_name}}##', + '?{{last_romanized_name}}', + ) + tlds = ('com', 'com', 'com', 'net', 'org', 'tw', 'tw', 'tw') + + @slugify + def domain_word(self): + return self.generator.format('last_romanized_name') diff --git a/src/libs/faker/providers/isbn/__init__.py b/src/libs/faker/providers/isbn/__init__.py new file mode 100644 index 0000000..ada8489 --- /dev/null +++ b/src/libs/faker/providers/isbn/__init__.py @@ -0,0 +1,72 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import BaseProvider +from .isbn import ISBN, ISBN10, ISBN13 +from .rules import RULES + + +class Provider(BaseProvider): + """ Generates fake ISBNs. ISBN rules vary across languages/regions + so this class makes no attempt at replicating all of the rules. It + only replicates the 978 EAN prefix for the English registration + groups, meaning the first 4 digits of the ISBN-13 will either be + 978-0 or 978-1. Since we are only replicating 978 prefixes, every + ISBN-13 will have a direct mapping to an ISBN-10. + + See https://www.isbn-international.org/content/what-isbn for the + format of ISBNs. + See https://www.isbn-international.org/range_file_generation for the + list of rules pertaining to each prefix/registration group. + """ + + def _body(self): + """ Generate the information required to create an ISBN-10 or + ISBN-13. + """ + ean = self.random_element(RULES.keys()) + reg_group = self.random_element(RULES[ean].keys()) + + # Given the chosen ean/group, decide how long the + # registrant/publication string may be. + # We must allocate for the calculated check digit, so + # subtract 1 + reg_pub_len = ISBN.MAX_LENGTH - len(ean) - len(reg_group) - 1 + + # Generate a registrant/publication combination + reg_pub = self.numerify('#' * reg_pub_len) + + # Use rules to separate the registrant from the publication + rules = RULES[ean][reg_group] + registrant, publication = self._registrant_publication(reg_pub, rules) + return [ean, reg_group, registrant, publication] + + @staticmethod + def _registrant_publication(reg_pub, rules): + """ Separate the registration from the publication in a given + string. + :param reg_pub: A string of digits representing a registration + and publication. + :param rules: A list of RegistrantRules which designate where + to separate the values in the string. + :returns: A (registrant, publication) tuple of strings. + """ + for rule in rules: + if rule.min <= reg_pub <= rule.max: + reg_len = rule.registrant_length + break + else: + raise Exception('Registrant/Publication not found in registrant ' + 'rule list.') + registrant, publication = reg_pub[:reg_len], reg_pub[reg_len:] + return registrant, publication + + def isbn13(self, separator='-'): + ean, group, registrant, publication = self._body() + isbn = ISBN13(ean, group, registrant, publication) + return isbn.format(separator) + + def isbn10(self, separator='-'): + ean, group, registrant, publication = self._body() + isbn = ISBN10(ean, group, registrant, publication) + return isbn.format(separator) diff --git a/src/libs/faker/providers/isbn/en_US/__init__.py b/src/libs/faker/providers/isbn/en_US/__init__.py new file mode 100644 index 0000000..e919282 --- /dev/null +++ b/src/libs/faker/providers/isbn/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as ISBNProvider + + +class Provider(ISBNProvider): + pass \ No newline at end of file diff --git a/src/libs/faker/providers/isbn/isbn.py b/src/libs/faker/providers/isbn/isbn.py new file mode 100644 index 0000000..56145e1 --- /dev/null +++ b/src/libs/faker/providers/isbn/isbn.py @@ -0,0 +1,62 @@ +# coding=utf-8 +""" +This module is responsible for generating the check digit and formatting +ISBN numbers. +""" + + +class ISBN(object): + + MAX_LENGTH = 13 + + def __init__(self, ean=None, group=None, registrant=None, publication=None): + self.ean = ean + self.group = group + self.registrant = registrant + self.publication = publication + + +class ISBN13(ISBN): + + def __init__(self, *args, **kwargs): + super(ISBN13, self).__init__(*args, **kwargs) + self.check_digit = self._check_digit() + + def _check_digit(self): + """ Calculate the check digit for ISBN-13. + See https://en.wikipedia.org/wiki/International_Standard_Book_Number + for calculation. + """ + weights = (1 if x % 2 == 0 else 3 for x in range(12)) + body = ''.join([self.ean, self.group, self.registrant, + self.publication]) + remainder = sum(int(b) * w for b, w in zip(body, weights)) % 10 + diff = 10 - remainder + check_digit = 0 if diff == 10 else diff + return str(check_digit) + + def format(self, separator=''): + return separator.join([self.ean, self.group, self.registrant, + self.publication, self.check_digit]) + + +class ISBN10(ISBN): + + def __init__(self, *args, **kwargs): + super(ISBN10, self).__init__(*args, **kwargs) + self.check_digit = self._check_digit() + + def _check_digit(self): + """ Calculate the check digit for ISBN-10. + See https://en.wikipedia.org/wiki/International_Standard_Book_Number + for calculation. + """ + weights = range(1, 10) + body = ''.join([self.group, self.registrant, self.publication]) + remainder = sum(int(b) * w for b, w in zip(body, weights)) % 11 + check_digit = 'X' if remainder == 10 else str(remainder) + return str(check_digit) + + def format(self, separator=''): + return separator.join([self.group, self.registrant, self.publication, + self.check_digit]) diff --git a/src/libs/faker/providers/isbn/rules.py b/src/libs/faker/providers/isbn/rules.py new file mode 100644 index 0000000..a18ecf4 --- /dev/null +++ b/src/libs/faker/providers/isbn/rules.py @@ -0,0 +1,45 @@ +# coding=utf-8 +""" +This module exists solely to figure how long a registrant/publication +number may be within an ISBN. The rules change based on the prefix and +language/region. This list of rules only encapsulates the 978 prefix +for English books. 978 is the largest and, until recently, the only +prefix. + +The complete list of prefixes and rules can be found at +https://www.isbn-international.org/range_file_generation +""" + +from collections import namedtuple + +RegistrantRule = namedtuple('RegistrantRule', ['min', 'max', 'registrant_length']) + +# Structure: RULES[`EAN Prefix`][`Registration Group`] = [Rule1, Rule2, ...] +RULES = { + '978': { + '0': [ + RegistrantRule('0000000', '1999999', 2), + RegistrantRule('2000000', '2279999', 3), + RegistrantRule('2280000', '2289999', 4), + RegistrantRule('2290000', '6479999', 3), + RegistrantRule('6480000', '6489999', 7), + RegistrantRule('6490000', '6999999', 3), + RegistrantRule('7000000', '8499999', 4), + RegistrantRule('8500000', '8999999', 5), + RegistrantRule('9000000', '9499999', 6), + RegistrantRule('9500000', '9999999', 7) + ], + '1': [ + RegistrantRule('0000000', '0999999', 2), + RegistrantRule('1000000', '3999999', 3), + RegistrantRule('4000000', '5499999', 4), + RegistrantRule('5500000', '7319999', 5), + RegistrantRule('7320000', '7399999', 7), + RegistrantRule('7400000', '8697999', 5), + RegistrantRule('8698000', '9729999', 6), + RegistrantRule('9730000', '9877999', 4), + RegistrantRule('9878000', '9989999', 6), + RegistrantRule('9990000', '9999999', 7) + ] + } +} diff --git a/src/libs/faker/providers/job/__init__.py b/src/libs/faker/providers/job/__init__.py new file mode 100644 index 0000000..de636fe --- /dev/null +++ b/src/libs/faker/providers/job/__init__.py @@ -0,0 +1,651 @@ +# coding=utf-8 +localized = True + +from .. import BaseProvider + + +class Provider(BaseProvider): + jobs = ( + "Academic librarian", + "Accommodation manager", + "Accountant, chartered", + "Accountant, chartered certified", + "Accountant, chartered management", + "Accountant, chartered public finance", + "Accounting technician", + "Actor", + "Actuary", + "Acupuncturist", + "Administrator", + "Administrator, arts", + "Administrator, charities/voluntary organisations", + "Administrator, Civil Service", + "Administrator, education", + "Administrator, local government", + "Administrator, sports", + "Adult guidance worker", + "Adult nurse", + "Advertising account executive", + "Advertising account planner", + "Advertising art director", + "Advertising copywriter", + "Advice worker", + "Aeronautical engineer", + "Agricultural consultant", + "Agricultural engineer", + "Aid worker", + "Air broker", + "Air cabin crew", + "Air traffic controller", + "Airline pilot", + "Ambulance person", + "Amenity horticulturist", + "Analytical chemist", + "Animal nutritionist", + "Animal technologist", + "Animator", + "Applications developer", + "Arboriculturist", + "Archaeologist", + "Architect", + "Architectural technologist", + "Archivist", + "Armed forces logistics/support/administrative officer", + "Armed forces operational officer", + "Armed forces technical officer", + "Armed forces training and education officer", + "Art gallery manager", + "Art therapist", + "Artist", + "Arts administrator", + "Arts development officer", + "Associate Professor", + "Astronomer", + "Audiological scientist", + "Automotive engineer", + "Banker", + "Barista", + "Barrister", + "Barrister's clerk", + "Best boy", + "Biochemist, clinical", + "Biomedical engineer", + "Biomedical scientist", + "Bonds trader", + "Bookseller", + "Brewing technologist", + "Broadcast engineer", + "Broadcast journalist", + "Broadcast presenter", + "Building control surveyor", + "Building services engineer", + "Building surveyor", + "Buyer, industrial", + "Buyer, retail", + "Cabin crew", + "Call centre manager", + "Camera operator", + "Careers adviser", + "Careers information officer", + "Cartographer", + "Catering manager", + "Ceramics designer", + "Charity fundraiser", + "Charity officer", + "Chartered accountant", + "Chartered certified accountant", + "Chartered legal executive (England and Wales)", + "Chartered loss adjuster", + "Chartered management accountant", + "Chartered public finance accountant", + "Chemical engineer", + "Chemist, analytical", + "Chief Executive Officer", + "Chief Financial Officer", + "Chief Marketing Officer", + "Chief of Staff", + "Chief Operating Officer", + "Chief Strategy Officer", + "Chief Technology Officer", + "Child psychotherapist", + "Chiropodist", + "Chiropractor", + "Civil engineer, consulting", + "Civil engineer, contracting", + "Civil Service administrator", + "Civil Service fast streamer", + "Claims inspector/assessor", + "Clinical biochemist", + "Clinical cytogeneticist", + "Clinical embryologist", + "Clinical molecular geneticist", + "Clinical psychologist", + "Clinical research associate", + "Clinical scientist, histocompatibility and immunogenetics", + "Clothing/textile technologist", + "Colour technologist", + "Commercial art gallery manager", + "Commercial horticulturist", + "Commercial/residential surveyor", + "Commissioning editor", + "Communications engineer", + "Community arts worker", + "Community development worker", + "Community education officer", + "Community pharmacist", + "Company secretary", + "Comptroller", + "Computer games developer", + "Conference centre manager", + "Conservation officer, historic buildings", + "Conservation officer, nature", + "Conservator, furniture", + "Conservator, museum/gallery", + "Consulting civil engineer", + "Contracting civil engineer", + "Contractor", + "Control and instrumentation engineer", + "Copy", + "Copywriter, advertising", + "Corporate investment banker", + "Corporate treasurer", + "Counselling psychologist", + "Counsellor", + "Curator", + "Customer service manager", + "Cytogeneticist", + "Dance movement psychotherapist", + "Dancer", + "Data processing manager", + "Data scientist", + "Database administrator", + "Dealer", + "Dentist", + "Designer, blown glass/stained glass", + "Designer, ceramics/pottery", + "Designer, exhibition/display", + "Designer, fashion/clothing", + "Designer, furniture", + "Designer, graphic", + "Designer, industrial/product", + "Designer, interior/spatial", + "Designer, jewellery", + "Designer, multimedia", + "Designer, television/film set", + "Designer, textile", + "Development worker, community", + "Development worker, international aid", + "Diagnostic radiographer", + "Dietitian", + "Diplomatic Services operational officer", + "Dispensing optician", + "Doctor, general practice", + "Doctor, hospital", + "Dramatherapist", + "Drilling engineer", + "Early years teacher", + "Ecologist", + "Economist", + "Editor, commissioning", + "Editor, film/video", + "Editor, magazine features", + "Editorial assistant", + "Education administrator", + "Education officer, community", + "Education officer, environmental", + "Education officer, museum", + "Educational psychologist", + "Electrical engineer", + "Electronics engineer", + "Embryologist, clinical", + "Emergency planning/management officer", + "Energy engineer", + "Energy manager", + "Engineer, aeronautical", + "Engineer, agricultural", + "Engineer, automotive", + "Engineer, biomedical", + "Engineer, broadcasting (operations)", + "Engineer, building services", + "Engineer, chemical", + "Engineer, civil (consulting)", + "Engineer, civil (contracting)", + "Engineer, communications", + "Engineer, control and instrumentation", + "Engineer, drilling", + "Engineer, electrical", + "Engineer, electronics", + "Engineer, energy", + "Engineer, land", + "Engineer, maintenance", + "Engineer, maintenance (IT)", + "Engineer, manufacturing", + "Engineer, manufacturing systems", + "Engineer, materials", + "Engineer, mining", + "Engineer, petroleum", + "Engineer, production", + "Engineer, site", + "Engineer, structural", + "Engineer, technical sales", + "Engineer, water", + "Engineering geologist", + "English as a foreign language teacher", + "English as a second language teacher", + "Environmental consultant", + "Environmental education officer", + "Environmental health practitioner", + "Environmental manager", + "Equality and diversity officer", + "Equities trader", + "Ergonomist", + "Estate agent", + "Estate manager/land agent", + "Event organiser", + "Exercise physiologist", + "Exhibition designer", + "Exhibitions officer, museum/gallery", + "Facilities manager", + "Farm manager", + "Fashion designer", + "Fast food restaurant manager", + "Field seismologist", + "Field trials officer", + "Film/video editor", + "Financial adviser", + "Financial controller", + "Financial manager", + "Financial planner", + "Financial risk analyst", + "Financial trader", + "Fine artist", + "Firefighter", + "Fish farm manager", + "Fisheries officer", + "Fitness centre manager", + "Food technologist", + "Forensic psychologist", + "Forensic scientist", + "Forest/woodland manager", + "Freight forwarder", + "Furniture conservator/restorer", + "Furniture designer", + "Further education lecturer", + "Futures trader", + "Gaffer", + "Games developer", + "Garment/textile technologist", + "General practice doctor", + "Geneticist, molecular", + "Geochemist", + "Geographical information systems officer", + "Geologist, engineering", + "Geologist, wellsite", + "Geophysical data processor", + "Geophysicist/field seismologist", + "Geoscientist", + "Glass blower/designer", + "Government social research officer", + "Graphic designer", + "Haematologist", + "Health and safety adviser", + "Health and safety inspector", + "Health physicist", + "Health promotion specialist", + "Health service manager", + "Health visitor", + "Herbalist", + "Heritage manager", + "Herpetologist", + "Higher education careers adviser", + "Higher education lecturer", + "Historic buildings inspector/conservation officer", + "Holiday representative", + "Homeopath", + "Horticultural consultant", + "Horticultural therapist", + "Horticulturist, amenity", + "Horticulturist, commercial", + "Hospital doctor", + "Hospital pharmacist", + "Hotel manager", + "Housing manager/officer", + "Human resources officer", + "Hydrogeologist", + "Hydrographic surveyor", + "Hydrologist", + "Illustrator", + "Immigration officer", + "Immunologist", + "Industrial buyer", + "Industrial/product designer", + "Information officer", + "Information systems manager", + "Insurance account manager", + "Insurance broker", + "Insurance claims handler", + "Insurance risk surveyor", + "Insurance underwriter", + "Intelligence analyst", + "Interior and spatial designer", + "International aid/development worker", + "Interpreter", + "Investment analyst", + "Investment banker, corporate", + "Investment banker, operational", + "IT consultant", + "IT sales professional", + "IT technical support officer", + "IT trainer", + "Jewellery designer", + "Journalist, broadcasting", + "Journalist, magazine", + "Journalist, newspaper", + "Land", + "Land/geomatics surveyor", + "Landscape architect", + "Lawyer", + "Learning disability nurse", + "Learning mentor", + "Lecturer, further education", + "Lecturer, higher education", + "Legal executive", + "Legal secretary", + "Leisure centre manager", + "Lexicographer", + "Librarian, academic", + "Librarian, public", + "Licensed conveyancer", + "Lighting technician, broadcasting/film/video", + "Lobbyist", + "Local government officer", + "Location manager", + "Logistics and distribution manager", + "Loss adjuster, chartered", + "Magazine features editor", + "Magazine journalist", + "Maintenance engineer", + "Make", + "Management consultant", + "Manufacturing engineer", + "Manufacturing systems engineer", + "Marine scientist", + "Market researcher", + "Marketing executive", + "Materials engineer", + "Mechanical engineer", + "Media buyer", + "Media planner", + "Medical illustrator", + "Medical laboratory scientific officer", + "Medical physicist", + "Medical sales representative", + "Medical secretary", + "Medical technical officer", + "Mental health nurse", + "Merchandiser, retail", + "Merchant navy officer", + "Metallurgist", + "Meteorologist", + "Microbiologist", + "Midwife", + "Minerals surveyor", + "Mining engineer", + "Mudlogger", + "Multimedia programmer", + "Multimedia specialist", + "Museum education officer", + "Museum/gallery conservator", + "Museum/gallery curator", + "Museum/gallery exhibitions officer", + "Music therapist", + "Music tutor", + "Musician", + "Nature conservation officer", + "Naval architect", + "Network engineer", + "Neurosurgeon", + "Newspaper journalist", + "Nurse, adult", + "Nurse, children's", + "Nurse, learning disability", + "Nurse, mental health", + "Nutritional therapist", + "Occupational hygienist", + "Occupational psychologist", + "Occupational therapist", + "Oceanographer", + "Office manager", + "Oncologist", + "Operational investment banker", + "Operational researcher", + "Operations geologist", + "Ophthalmologist", + "Optician, dispensing", + "Optometrist", + "Orthoptist", + "Osteopath", + "Outdoor activities/education manager", + "Paediatric nurse", + "Paramedic", + "Passenger transport manager", + "Patent attorney", + "Patent examiner", + "Pathologist", + "Pension scheme manager", + "Pensions consultant", + "Personal assistant", + "Personnel officer", + "Petroleum engineer", + "Pharmacist, community", + "Pharmacist, hospital", + "Pharmacologist", + "Photographer", + "Physicist, medical", + "Physiological scientist", + "Physiotherapist", + "Phytotherapist", + "Pilot, airline", + "Planning and development surveyor", + "Plant breeder/geneticist", + "Podiatrist", + "Police officer", + "Politician's assistant", + "Presenter, broadcasting", + "Press photographer", + "Press sub", + "Primary school teacher", + "Print production planner", + "Printmaker", + "Prison officer", + "Private music teacher", + "Probation officer", + "Producer, radio", + "Producer, television/film/video", + "Product designer", + "Product manager", + "Product/process development scientist", + "Production assistant, radio", + "Production assistant, television", + "Production designer, theatre/television/film", + "Production engineer", + "Production manager", + "Professor Emeritus", + "Programme researcher, broadcasting/film/video", + "Programmer, applications", + "Programmer, multimedia", + "Programmer, systems", + "Proofreader", + "Psychiatric nurse", + "Psychiatrist", + "Psychologist, clinical", + "Psychologist, counselling", + "Psychologist, educational", + "Psychologist, forensic", + "Psychologist, occupational", + "Psychologist, prison and probation services", + "Psychologist, sport and exercise", + "Psychotherapist", + "Psychotherapist, child", + "Psychotherapist, dance movement", + "Public affairs consultant", + "Public house manager", + "Public librarian", + "Public relations account executive", + "Public relations officer", + "Publishing copy", + "Publishing rights manager", + "Purchasing manager", + "Quality manager", + "Quantity surveyor", + "Quarry manager", + "Race relations officer", + "Radiation protection practitioner", + "Radio broadcast assistant", + "Radio producer", + "Radiographer, diagnostic", + "Radiographer, therapeutic", + "Ranger/warden", + "Records manager", + "Recruitment consultant", + "Recycling officer", + "Regulatory affairs officer", + "Research officer, government", + "Research officer, political party", + "Research officer, trade union", + "Research scientist (life sciences)", + "Research scientist (maths)", + "Research scientist (medical)", + "Research scientist (physical sciences)", + "Restaurant manager", + "Restaurant manager, fast food", + "Retail banker", + "Retail buyer", + "Retail manager", + "Retail merchandiser", + "Risk analyst", + "Risk manager", + "Runner, broadcasting/film/video", + "Rural practice surveyor", + "Sales executive", + "Sales professional, IT", + "Sales promotion account executive", + "Science writer", + "Scientific laboratory technician", + "Scientist, audiological", + "Scientist, biomedical", + "Scientist, clinical (histocompatibility and immunogenetics)", + "Scientist, forensic", + "Scientist, marine", + "Scientist, physiological", + "Scientist, product/process development", + "Scientist, research (life sciences)", + "Scientist, research (maths)", + "Scientist, research (medical)", + "Scientist, research (physical sciences)", + "Scientist, water quality", + "Secondary school teacher", + "Secretary/administrator", + "Secretary, company", + "Seismic interpreter", + "Senior tax professional/tax inspector", + "Set designer", + "Ship broker", + "Site engineer", + "Social research officer, government", + "Social researcher", + "Social worker", + "Software engineer", + "Soil scientist", + "Solicitor", + "Solicitor, Scotland", + "Sound technician, broadcasting/film/video", + "Special educational needs teacher", + "Special effects artist", + "Speech and language therapist", + "Sport and exercise psychologist", + "Sports administrator", + "Sports coach", + "Sports development officer", + "Sports therapist", + "Stage manager", + "Statistician", + "Structural engineer", + "Sub", + "Surgeon", + "Surveyor, building", + "Surveyor, building control", + "Surveyor, commercial/residential", + "Surveyor, hydrographic", + "Surveyor, insurance", + "Surveyor, land/geomatics", + "Surveyor, minerals", + "Surveyor, mining", + "Surveyor, planning and development", + "Surveyor, quantity", + "Surveyor, rural practice", + "Systems analyst", + "Systems developer", + "Tax adviser", + "Tax inspector", + "Teacher, adult education", + "Teacher, early years/pre", + "Teacher, English as a foreign language", + "Teacher, music", + "Teacher, primary school", + "Teacher, secondary school", + "Teacher, special educational needs", + "Teaching laboratory technician", + "Technical author", + "Technical brewer", + "Technical sales engineer", + "TEFL teacher", + "Telecommunications researcher", + "Television camera operator", + "Television floor manager", + "Television production assistant", + "Television/film/video producer", + "Textile designer", + "Theatre director", + "Theatre manager", + "Theatre stage manager", + "Theme park manager", + "Therapeutic radiographer", + "Therapist, art", + "Therapist, drama", + "Therapist, horticultural", + "Therapist, music", + "Therapist, nutritional", + "Therapist, occupational", + "Therapist, speech and language", + "Therapist, sports", + "Tour manager", + "Tourism officer", + "Tourist information centre manager", + "Town planner", + "Toxicologist", + "Trade mark attorney", + "Trade union research officer", + "Trading standards officer", + "Training and development officer", + "Translator", + "Transport planner", + "Travel agency manager", + "Tree surgeon", + "Veterinary surgeon", + "Video editor", + "Visual merchandiser", + "Volunteer coordinator", + "Warden/ranger", + "Warehouse manager", + "Waste management officer", + "Water engineer", + "Water quality scientist", + "Web designer", + "Wellsite geologist", + "Writer", + "Youth worker", + ) + + def job(self): + return self.random_element(self.jobs) diff --git a/src/libs/faker/providers/job/ar_AA/__init__.py b/src/libs/faker/providers/job/ar_AA/__init__.py new file mode 100644 index 0000000..c92dc45 --- /dev/null +++ b/src/libs/faker/providers/job/ar_AA/__init__.py @@ -0,0 +1,151 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + # Source: https://learnenglish100.com/grammar/career-job/ + jobs = ( + 'محاسب', + 'ممثل', + 'ممثلة', + 'محام', + 'مضيفة في الطائرة', + 'مضيفة جوية', + 'عالم', + 'عالم اثار', + 'فنان', + 'مؤلف', + 'خباز', + 'راقصة باليه', + 'مدير بنك', + 'حلاق', + 'أحيائي', + 'حداد', + 'مجلد كتب', + 'صاحب مكتبة', + 'نباتي', + 'عامل بناء', + 'جزار', + 'مشتري', + 'نجار', + 'رئيس طهاه', + 'صيدلي', + 'قائد شرطة', + 'موظف حكومي', + 'كاتب', + 'ملحن', + 'طباخ', + 'مصحح قانوني', + 'راقصة', + 'مصمم ديكور', + 'موصل طلبيات', + 'طبيب أسنان', + 'مصصم', + 'رجل مباحث', + 'مدير او مخرج', + 'طبيب', + 'رسام', + 'خياطة', + 'سائق', + 'صباغ', + 'خبير اقتصادي', + 'محرر', + 'محرر جريدة', + 'مھندس', + 'خبير في التراث الشعبي', + 'منسق ازياء', + 'اطفائي', + 'بائع زهور', + 'جيولوجي', + 'صائغ', + 'مصمم جرافيك', + 'بائع خضار وفاكهة', + 'حلاق', + 'مصفف شعر', + 'مصور', + 'وسيط تأمين', + 'مترجم', + 'مكوى', + 'بواب', + 'جوھري', + 'صحافي', + 'قاضي', + 'غسالة', + 'محام', + 'محاضر', + 'لغوي', + 'سائق شاحنة', + 'خادمة', + 'ساعي بريد', + 'مدير', + 'مدير تسويق', + 'عالم رياضيات', + 'ميكانيكي', + 'تاجر', + 'عالم أرصاد جوية', + 'داية', + 'عارضة أزياء', + 'صراف', + 'موسيقار', + 'مذيع', + 'موزع جرائد', + 'روائي', + 'ممرضة', + 'طبيب عيون', + 'صانع أدوات بصرية', + 'رسام', + 'مدير موظفين', + 'صيدلي', + 'فيلسوف', + 'مصور', + 'عالم فيزياء', + 'معالج طبيعي', + 'طيار', + 'كاتب مسرحي', + 'سمكري', + 'شاعر', + 'ضابط شرطة', + 'شرطي', + 'سياسي', + 'صاحب مطبعة', + 'منتج', + 'مبرمج', + 'طبيب نفساني', + 'ناشر', + 'وكيل عقارات', + 'موظف استقبال', + 'صحفي', + 'مساعد مبيعات', + 'بائع', + 'بائعة', + 'عالم', + 'نحات', + 'سكرتير', + 'سكرتيرة', + 'صباغ أحذية', + 'عامل أحذية', + 'ماسح احذية', + 'عامل بمتجر', + 'صاحب متجر', + 'مطرب', + 'مغني', + 'احصائي', + 'مدير متجر', + 'طبيب جراح', + 'خياط', + 'سائق تاكسي', + 'معلم', + 'موظف بدالة', + 'مترجم', + 'وكيل سفر', + 'سائق شاحنة', + 'خراط', + 'ضارب على الآلة الكاتبة', + 'منجد', + 'نادلة', + 'ساعاتي', + 'عامل', + 'كاتب', + 'خبير في عالم الحيوان', + ) diff --git a/src/libs/faker/providers/job/en_US/__init__.py b/src/libs/faker/providers/job/en_US/__init__.py new file mode 100644 index 0000000..931b844 --- /dev/null +++ b/src/libs/faker/providers/job/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + pass diff --git a/src/libs/faker/providers/job/fa_IR/__init__.py b/src/libs/faker/providers/job/fa_IR/__init__.py new file mode 100644 index 0000000..7fd2f29 --- /dev/null +++ b/src/libs/faker/providers/job/fa_IR/__init__.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + jobs = [ + "هنر‌پیشه", + "ناخدا", + "بخشدار", + "خیاط", + "گله‌دار", + "باغ‌دار", + "مؤذن", + "ساربان", + "آشپز", + "دندان‌پزشک", + "نجار", + "چوپان", + "خانه‌دار", + "شورا", + "نویسنده", + "گارسون", + "استاد", + "فروشنده", + "شیشه‌ساز", + "مدیر", + "نقاش ساختمان", + "قایقران", + "رفتگر", + "وزیر", + "خلبان", + "آرایشگر", + "روحانی", + "متخصص", + "فوتبالیست", + "قصاب", + "ساعت‌ساز", + "بقال", + "تلفن‌چی", + "تاجر", + "عینک‌ساز", + "خوشنویس", + "جنگلبان", + "معلم", + "مهندس", + "راننده", + "آذین گر", + "نظامی", + "نانوا", + "فرماندار", + "دانش‌آموز", + "دانشجو", + "تعمیرکار", + "کشاورز", + "هنرمند", + "معاون", + "بانکدار", + "آهنگر", + "رئیس", + "سرتیپ", + "سرایدار", + "کارمند", + "مربی", + "سرهنگ", + "غواص", + "پزشک", + "دربان", + "آتش‌نشان", + "ماهی‌گیر", + "میوه‌فروش", + "نگهبان", + "پاسدار", + "قاضی", + "وکیل", + "کارگر", + "شهردار", + "معدن‌چی", + "پرستار", + "افسر", + "عکاس", + "لوله‌کش", + "بازیگر", + "باربر", + "رئیس‌جمهور", + "نخست‌وزیر", + "روانشناس", + "خبر‌نگار", + "بازنشسته", + "مجسمه‌ساز", + "گروهبان", + "مغازه‌دار", + "خواننده", + "سرباز", + "سخن‌ران", + "جراح", + "سفال‌گر", + "جهانگرد", + "جوشکار", + "چشم‌پزشک", + "گزارش‌گر", + "خطاط" + ] diff --git a/src/libs/faker/providers/job/fr_CH/__init__.py b/src/libs/faker/providers/job/fr_CH/__init__.py new file mode 100644 index 0000000..423afcd --- /dev/null +++ b/src/libs/faker/providers/job/fr_CH/__init__.py @@ -0,0 +1,838 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + +# Source: SEFRI +# http://www.sbfi.admin.ch/bvz/berufe/index.html +class Provider(BaseProvider): + jobs=[ +"Accompagnant socioprofessionnel diplômé", +"Accompagnateur de randonnée avec brevet fédéral", +"Accompagnateur social avec brevet fédéral", +"Acousticien en systèmes auditifs CFC", +"Administrateur diplomé de biens immobiliers", +"Agent commercial de l'imprimerie avec brevet fédéral (BF)", +"Agent d'entretien de bateaux", +"Agent d'exploitation CFC", +"Agent de détention avec brevet fédéral", +"Agent de maintenance avec brevet fédéral", +"Agent de processus avec brevet fédéral", +"Agent de propreté AFP", +"Agent de propreté CFC", +"Agent de transport et logistique avec brevet fédéral", +"Agent de transports publics CFC", +"Agent de voyages avec brevet fédéral", +"Agent d’entretien de bateaux CFC", +"Agent d’entretien en assainissement AFP", +"Agent d’exploitation CFC", +"Agent en automatique avec brevet fédéral", +"Agent en information documentaire CFC", +"Agent en produits textiles AFP", +"Agent fiduciaire avec brevet fédéral", +"Agent professionnel de protection de personnes et de biens avec brevet fédéral", +"Agent professionnel de sécurité et de surveillance avec brevet fédéral", +"Agent relation client CFC", +"Agent technico-commercial avec brevet fédéral", +"Agent technique d'exploitation avec brevet fédéral", +"Agent technique des matières synthétiques CFC", +"Agriculteur CFC (Champ professionnel de l'agriculture)", +"agrocommerçant diplômé ES", +"Agropraticien AFP", +"agrotechnicien diplômé ES", +"Aide en informatique AFP", +"Aide en soins et accompagnement AFP", +"Aide en technique du bâtiment AFP", +"Aide-carreleur AFP", +"Aide-constructeur métallique AFP", +"Aide-maçon AFP", +"Aide-menuisier AFP", +"Aide-monteur frigoriste AFP", +"Aide-mouleur AFP", +"Aide-peintre AFP", +"Aide-plâtrier AFP", +"Aide-polybâtisseur AFP", +"ambulancier diplômé ES", +"Analyste financier et gestionnaire de fortunes diplômé", +"Arboriculteur CFC (Champ professionnel de l'agriculture)", +"Armurier", +"Armurier CFC", +"Art-thérapeute diplômé (DF)", +"Artisan du bois CFC", +"Artisan du cuir et du textile CFC", +"Artisan en conservation des monument historiques avec brevet fédéral", +"Assistant de bureau AFP", +"Assistant de direction avec brevet fédéral", +"Assistant de gestion en pharmacie avec brevet fédéral", +"Assistant dentaire CFC", +"Assistant du commerce de détail AFP", +"Assistant en audiovision avec brevet fédéral", +"Assistant en boucherie et charcuterie AFP", +"assistant en droit diplômé ES", +"Assistant en maintenance d'automobiles AFP", +"Assistant en médecine vétérinaire CFC", +"Assistant en médias imprimés AFP", +"Assistant en pharmacie CFC", +"Assistant en podologie CFC", +"Assistant en podologie CFC", +"Assistant en promotion de l’activité physique et de la santé CFC", +"Assistant en soins et santé communautaire CFC", +"Assistant en tourisme avec brevet fédéral", +"Assistant en traitement de surface AFP", +"Assistant médical CFC", +"Assistant socio-éducatif CFC", +"Assistant spécialisé en soins de longue durée et accompagnement avec brevet fédéral", +"Assistant vernisseur AFP", +"Assistant-constructeur de fondations AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de fondations AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de routes AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de routes AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de sols industriels et de chapes AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de sols industriels et de chapes AFP (champ professionnel Construction de voies de communication)", +"Assistant-constructeur de voies ferrées AFP (champ professionnel Construction de voies de communication)", +"Audioprothésiste avec brevet fédéral", +"Automaticien CFC", +"Aviculteur CFC (Champ professionnel de l'agriculture)", +"Bijoutier CFC", +"Bijoutier, maître", +"Bottier-orthopédiste", +"Bottier-orthopédiste CFC", +"Bottier-orthopédiste diplômé, maître", +"Boucher-charcutier CFC", +"Boucher-charcutier, maître", +"Boulanger-pâtissier-confiseur AFP", +"Boulanger-pâtissier-confiseur CFC", +"Cabin Crew Member avec brevet fédéral", +"Cadre diplomé des organisations de secours", +"Calorifugeur-tôlier", +"Calorifugeur-tôlier CFC", +"Calorifugeur-tôlier, maître", +"Carreleur CFC", +"Carreleur, maître", +"Carrossier, maître", +"Carrossier-peintre CFC", +"Carrossier-tôlier CFC", +"Caviste CFC (Champ professionnel de l'agriculture)", +"Céramiste", +"Céramiste CFC", +"Céramiste industriel CFC", +"Charpentier", +"Charpentier CFC", +"Charpentier, maître", +"Charron", +"Charron, maître", +"Chef boulanger-pâtissier-confiseur avec brevet fédéral", +"Chef carreleur avec brevet fédéral", +"Chef confiseur-pâtissier-glacier avec brevet fédéral", +"Chef cuisinier avec brevet fédéral", +"Chef d'atelier en machines agricoles avec brevet fédéral", +"Chef d'atelier en machines de chantier avec brevet fédéral", +"Chef d'atelier d'appareils à moteur avec brevet fédéral", +"Chef d'atelier et de montage en construction métallique avec brevet fédéral", +"Chef d'entreprise de l'hôtellerie et de la restauration diplomé", +"Chef d'entreprise diplomée en boulangerie-pâtisserie-confiserie", +"Chef d'établissement de l'hôtellerie et de la restauration avec brevet fédéral", +"Chef d'expédition diplômé", +"Chef d'exploitation agricole avec brevet fédéral", +"Chef d'exploitation arboricole avec brevet fédéral", +"Chef d'exploitation avicole avec brevet fédéral", +"Chef d'exploitation caviste avec brevet fédéral", +"Chef d'exploitation économie carnée avec brevet fédéral", +"Chef d'exploitation maraîchère avec brevet fédéral", +"Chef d'exploitation viticole avec brevet fédéral", +"Chef de commerce international diplômé", +"Chef de cuisine avec diplôme fédéral", +"Chef de la restauration avec diplôme fédéral", +"Chef de la restauration collective avec diplôme fédéral", +"Chef de logistique diplômé", +"Chef de marketing diplômé", +"Chef de production en menuiserie", +"Chef de production technique des matières synthétiques diplômé", +"Chef de projet en menuiserie", +"Chef de projet en montage solaire avec brevet fédéral", +"Chef de projet en technique du bâtiment avec brevet fédéral", +"Chef de projet et chef d'atelier en construction de tableaux électriques avec brevet fédéral", +"Chef de projet systèmes de sécurité avec brevet fédéral", +"Chef de projet verre avec brevet fédéral", +"Chef de projets constructeur sur métal avec diplôme fédéral", +"Chef de réception avec brevet fédéral", +"Chef de service après-vente diplômé", +"Chef de vente diplômé", +"Chef du secteur hôtelier-intendance avec diplôme fédéral", +"Chef monteur-frigoriste avec brevet fédéral", +"Chef poseur de revêtements de sols avec brevet fédéral", +"Chef-monteur en échafaudage avec brevet fédéral", +"Cidrier avec diplôme de maîtrise", +"Coiffeur AFP", +"Coiffeur avec brevet fédéral", +"Coiffeur avec diplôme fédéral", +"Coiffeur CFC", +"Coiffeur CFC", +"Coloriste avec brevet fédéral", +"Concepteur artisan avec brevet fédéral", +"Concepteur en multimédia", +"Concierge avec brevet fédéral", +"Conducteur d'engins forestier avec brevet fédéral", +"Conducteur de camion", +"Conducteur de véhicules légers AFP", +"Conducteur de véhicules lourds CFC", +"Confectionneur AFP", +"Conseil en brevets", +"Conseiller dans le domaine psychosocial avec diplôme fédéral", +"Conseiller de service à la clientèle dans la branche automobile avec brevet fédéral", +"Conseiller de vente automobile avec brevet fédéral", +"Conseiller de vente en horlogerie avec brevet fédéral", +"Conseiller en affections respiratoires et tuberculose avec brevet fédéral", +"Conseiller en aménagement intérieur avec brevet fédéral", +"Conseiller en couleurs et en styles de mode avec brevet fédéral", +"Conseiller en énergie et en efficacité énergétique avec diplôme fédéral", +"Conseiller en environnement avec brevet federal", +"Conseiller en milieu rural diplômé", +"Conseiller en organisation avec diplôme fédéral", +"Conseiller en relations publiques avec diplôme fédéral", +"Conseiller en revêtements de sols avec brevet fédéral", +"Conseiller en sécurité électrique avec brevet fédéral", +"Conseiller énergétique du bâtiment avec brevet fédéral", +"Conseiller financier avec brevet fédéral", +"Constructeur de ski (LU)", +"Constructeur d'appareils industriels", +"Constructeur d'éléments en béton préfabriqués CFC", +"Constructeur d'installation de ventilation CFC", +"Constructeur de bateaux", +"Constructeur de bateaux CFC", +"Constructeur de fondations CFC (champ professionnel Construction de voies de communication)", +"Constructeur de fondations CFC (champ professionnel Construction de voies de communication)", +"Constructeur de routes CFC (champ professionnel Construction de voies de communication)", +"Constructeur de routes CFC (champ professionnel Construction de voies de communication)", +"Constructeur de sols industriels et de chapes CFC (champ professionnel Construction de voies de communication)", +"Constructeur de sols industriels et de chapes CFC (champ professionnel Construction de voies de communication)", +"Constructeur de voies ferrées CFC (champ professionnel Construction de voies de communication)", +"Constructeur de voies ferrées CFC (champ professionnel Construction de voies de communication)", +"Constructeur d’appareils industriels CFC", +"Constructeur métallique CFC", +"Constructeur métallique, maître", +"Constructeur naval, maître", +"Contact Center Supervisor avec brevet fédéral", +"Contremaître charpentier avec brevet fédéral", +"Contremaître de construction de fondations avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître de construction de routes avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître de construction de sols industriels et de chapes avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître de sciage d'édifice avec brevet fédéral", +"Contremaître de voies ferrées avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître en chauffage avec brevet fédéral", +"Contremaître en entretien de routes avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître en ferblanterie avec brevet fédéral", +"Contremaître en ventilation avec brevet fédéral", +"Contremaître forestier avec brevet fédéral", +"Contremaître jardinier avec brevet fédéral", +"Contremaître maçon avec brevet fédéral", +"Contremaître paveur avec brevet fédéral (champ professionnel Construction de voies de communication)", +"Contremaître peintre avec brevet fédéral", +"Contremaître plâtrier-constructeur à sec avec brevet fédéral", +"Contremaître Polybat avec brevet fédéral", +"Contremaître ramoneur avec brevet fédéral", +"Contremaître sanitaire avec brevet fédéral", +"Contremaître vitrier avec brevet fédéral", +"Contrôleur de combustion avec brevet fédéral", +"contrôleur de la circulation aérienne diplomé ES", +"Contrôleur de matériaux de construction avec brevet fédéral", +"Coordinateur d'atelier automobile avec brevet fédéral", +"Coordinateur en médecine ambulatoire orientation clinique avec brevet fédéral", +"Coordinateur en médecine ambulatoire orientation gestion avec brevet fédéral", +"Cordonnier CFC", +"Cordonnier, maître", +"Correcteur avec brevet fédéral (BF)", +"Courtepointier CFC", +"Courtepointier diplômé", +"Courtier en immeubles avec brevet fédéral", +"Coutelier", +"Coutelier CFC", +"Coutelier, maître", +"Couturier avec brevet fédéral", +"Couturier diplômé", +"couturier d’intérieur AFP", +"Créateur de textiles intérieurs avec brevet fédéral", +"Créateur de tissu CFC", +"Créateur de vêtements", +"Créateur de vêtements CFC", +"Croupier avec brevet fédéral", +"Cuisinier CFC", +"Cuisinier en diététique CFC", +"Danseur interprète CFC", +"Déclarant de douane avec brevet fédéral", +"Décorateur d'intérieur avec brevet fédéral", +"Décorateur d'intérieurs", +"Décorateur d'intérieurs diplômé", +"Dermapigmentologue avec brevet fédéral", +"designer diplômé ES en arts visuels", +"designer diplômé ES en communication visuelle", +"designer diplômé ES en design de produit", +"Designer graphique diplomé", +"Dessinateur CFC (champ professionnel planification du territoireet de la construction)", +"Dessinateur en construction microtechnique CFC", +"Dessinateur-constructeur en génie civil diplômé", +"Dessinateur-constructeur en microtechnique", +"Dessinateur-constructeur industriel CFC", +"Dessinateur-constructeur sur métal CFC", +"Développeur immobilier avec brevet fédéral", +"Diagnosticien d'automobiles avec brevet fédéral", +"dipl. Abteilungsleiter Gesundheit NDS HF", +"dipl. Baubetriebsmanager NDS HF", +"dipl. Bauprojekt- und Immobilienmanager NDS HF", +"dipl. Berater in Veränderungsprozessen NDS HF", +"dipl. Betriebswirtschafter NDS HF", +"dipl. Business Analyst NDS HF", +"dipl. Business Banker NDS HF", +"dipl. Business Coach NDS HF", +"dipl. Business Engineer NDS HF", +"dipl. Controller NDS HF", +"dipl. Energieberater NDS HF", +"dipl. Erlebnispädagoge NDS HF", +"dipl. Experte in Leadership und Change Management NDS HF", +"dipl. Experte in strategischem Management NDS HF", +"dipl. Finanzchef NDS HF", +"dipl. Finanzexperte NDS HF", +"dipl. Geschäftsführer NDS HF", +"dipl. Hotelmanager NDS HF", +"dipl. HR-Experte NDS HF", +"dipl. Human Resource Manager NDS HF", +"dipl. in Leadership und Management NDS HF", +"dipl. in Unternehmens- und Mitarbeiterführung NDS HF", +"dipl. IT-Service-Manager NDS HF", +"dipl. Kommunikationstrainer NDS HF", +"dipl. Leiter Finanzen und Dienste NDS HF", +"dipl. Leiter interne Kommunikation und Management Support NDS", +"dipl. Logistikleiter NDS HF", +"dipl. logotherapeutischer Berater NDS HF", +"dipl. Marketing- und Verkaufsleiter NDS HF", +"dipl. Marketing- und Verkaufsmanager NDS HF", +"dipl. Marketingmanager NDS HF", +"dipl. Network Engineer NDS HF", +"dipl. Online-Marketingmanager NDS HF", +"dipl. Personalleiter NDS HF", +"dipl. Produktmanager Textil NDS HF", +"dipl. Projekt- und Prozessmanager NDS HF", +"dipl. Projektleiter NDS HF", +"dipl. Projektmanager NDS HF", +"dipl. Qualitäts- und Prozessmanager NDS HF", +"dipl. Qualitätsmanager NDS HF", +"dipl. Umfassende Leadership NDS HF", +"dipl. Umfassendes Controlling NDS HF", +"dipl. Unternehmensführer NDS HF", +"dipl. Unternehmensleiter NDS HF", +"Diplom in Energiemanagement NDS HF", +"Diplom in Unternehmensführung NDS HF", +"Directeur d'école d'une discipline sportive avec diplôme fédéral", +"Directeur d'institution de l'enfance diplômé EPD ES", +"Directeur d'institution sociale et médico-sociale diolomé", +"Directeur de studio de gymnastique avec brevet fédéral", +"Directeur des travaux du bâtiment diplômé", +"Directeur des travaux du génie civil diplômé", +"Dirigeant d'entreprise avec diplôme fédéral", +"Dirigeant de maintenance diplômé", +"Dirigeant diplomé en facility management", +"Doreur-Encadreur CFC", +"Droguiste CFC", +"Ebéniste CFC", +"Ebéniste, maître", +"Ecobiologiste de la construction avec brevet fédéral", +"Ecobiologiste de la construction diplômé", +"économiste bancaire diplomé ES", +"économiste d'assurance diplômé ES", +"économiste d'entreprise diplômé ES", +"Economiste d'entreprise PME avec diplôme fédéral", +"éducateur de l'enfance diplômé. ES", +"éducateur social diplomé ES", +"éducateur social diplômé ES", +"Electricien chef de projet avec brevet fédéral", +"Electricien de montage CFC", +"Electricien de montage CFC", +"Electricien de réseau", +"Electricien de réseau CFC", +"Electricien de réseau, maître, diplomé", +"Electronicien CFC", +"Electronicien en multimédia", +"Electronicien en multimédia avec brevet fédéral", +"Electronicien en multimédia CFC", +"Electroplaste avec brevet fédéral", +"Electroplaste CFC", +"Electroplaste diplômé", +"Employé de commerce", +"Employé de commerce CFC", +"Employé de remontées mécaniques AFP", +"Employé d’exploitation AFP", +"Employé en cuisine AFP", +"Employé en hôtellerie AFP", +"Employé en industrie laitière AFP", +"Employé en intendance AFP", +"Employé en intendance AFP", +"Employé en restauration AFP", +"Enquêteur de douane avec diplôme fédéral", +"Entraîneur de sport de performance avec brevet fédéral", +"Entraîneur diplômé de sport d'Elite", +"Entrepreneur de pompes funèbres avec brevet fédéral", +"Entrepreneur-construction diplômé", +"Esthéticien avec brevet fédéral", +"Esthéticien CFC", +"Esthéticien diplômé", +"Expert diplômé en assurance-maladie", +"Expert diplômé en assurances de pension", +"Expert diplômé en assurances sociales", +"Expert diplômé en conduite organisationelle", +"Expert diplômé en finance et en controlling", +"Expert diplômé en finance et investissements", +"Expert diplômé en tourisme", +"Expert domaine opératoire avec diplôme fédéral", +"Expert du domaine des privations de liberté avec diplôme fédéral", +"Expert du domaine éguin avec diplôme fédéral", +"Expert en analyses biomédicales et gestion de laboratoire avec diplôme fédéral", +"Expert en cytodiagnostic avec diplôme fédéral", +"Expert en douane diplomé ES", +"Expert en estimations immobilières avec brevet fédéral", +"Expert en finance de PME avec diplôme fédéral", +"Expert en gestion hospitalière avec diplôme fédéral", +"Expert en management de l'organisation avec diplôme fédéral", +"Expert en opérations des marchés financiers avec diplôme fédéral", +"Expert en prévention des infections associées aux soins avec diplôme fédéral", +"Expert en production avec brevet fédéral", +"Expert en soins d’anesthésie diplômé EPD ES", +"Expert en soins d’urgence diplômé EPD ES", +"Expert en soins intensifs diplômé EPD ES", +"Expert fiduciaire diplômé", +"Expert fiscal diplômé", +"Expert protection incendie avec diplôme fédéral", +"Expert-comptable diplômé", +"Expert-soudeur avec brevet fédéral", +"Exploitant de station d'épuration avec brevet fédéral", +"Facteur d'instruments de musique CFC", +"Fashion spécialiste avec brevet fédéral", +"Fashiondesigner avec diplôme fédéral", +"Ferblantier CFC", +"Fleuriste AFP", +"Fleuriste avec brevet fédéral", +"Fleuriste CFC", +"Fleuriste, maître", +"Flexographe CFC", +"Fontainier avec brevet fédéral", +"forestier diplômé ES", +"Forestier-bûcheron CFC", +"Forgeron, maître", +"Formateur avec brevet fédéral", +"Fourreur, maître", +"Gainier", +"Garde-faune avec brevet fédéral", +"Garde-frontière avec brevet fédéral", +"Garde-frontière avec diplôme fédéral", +"Garde-pêche avec brevet fédéral", +"Gardien d'immeuble diplômé", +"Gardien de cheval AFP", +"Gardien de chevaux AFP", +"Gardien d’animaux CFC", +"Garnisseur de meubles CFC", +"Garnisseur de meubles industriels avec brevet fédéral", +"Garnisseur de meubles industriels, maître", +"Garnisseur de meubles spécialisé avec brevet fédéral", +"Garnisseur en carrosserie", +"Géomaticien CFC", +"Gérant d'immeubles avec brevet fédéral", +"Gérant de caisse de pension diplômé", +"Gestionnaire d'entreprise diplômé de la branche automobile", +"Gestionnaire d'entreprise diplômé secteur automobile", +"Gestionnaire du commerce de détail CFC", +"Gestionnaire en intendance CFC", +"Gestionnaire en intendance CFC", +"Gestionnaire en tourisme de santé et d'activité avec diplôme fédéral", +"gestionnaire en tourisme diplômé ES", +"Gouvernant de maison avec brevet fédéral", +"Graphiste CFC", +"Graveur", +"Graveur CFC", +"Guide de montagne avec brevet fédéral", +"Guide touristique avec brevet fédéral", +"Horloger CFC", +"Horloger dans le domaine professionnel de l'industrie", +"Horloger dans le domaine professionnel du rhabillage", +"Horloger de production CFC", +"Horloger praticien", +"Horloger, maître", +"Horticulteur", +"Horticulteur AFP", +"Horticulteur CFC", +"Hôtelier-Restaurateur diplômé ES", +"hygiéniste dentaire diplômé ES", +"ICT-Manager diplomé", +"infirmier diplômé ES", +"infirmier diplômé ES", +"Informaticien CFC", +"Informaticien CFC", +"Informaticien de gestion avec brevet fédéral", +"informaticien de gestion diplômé ES", +"Informaticien en développement d'application TIC avec brevet fédéral", +"Informaticien en technique des systèmes et réseaux TIC avec brevet fédéral", +"Installateur en chauffage CFC", +"Installateur sanitaire CFC", +"Installateur-électricien CFC", +"Installateur-électricien CFC", +"Installateur-électricien diplômé", +"Instructeur de chiens guides d'aveugles avec diplôme fédéral", +"Instructeur de fitness avec brevet fédéral", +"intendant du secteur hôtelier d'établissement diplômé ES", +"Interactive Media Designer CFC", +"Key account manager diplômé", +"Laborantin CFC", +"Laborantin en physique", +"Laborantin en physique CFC", +"Laboriste", +"Libraire avec brevet fédéral", +"Libraire CFC", +"Logisticien AFP", +"Logisticien AFP", +"Logisticien avec brevet fédéral", +"Logisticien avec brevet fédéral", +"Logisticien avec diplôme fédéral", +"Logisticien CFC", +"Logisticien CFC", +"Luthier", +"Luthier, maître", +"Maçon CFC", +"Maître agriculteur", +"Maître arboriculteur", +"Maître aviculteur", +"Maître caviste", +"Maître chauffagiste avec diplôme fédéral", +"Maître dans l'industrie", +"Maître du cuir et du textile", +"Maître ferblantier avec diplôme fédéral", +"Maître jardinier", +"Maître maraîcher", +"Maître peintre", +"Maître Polybat", +"Maître poseur de revêtements de sols", +"Maître Ramoneur", +"Maître sanitaire avec diplôme fédéral", +"Maître scultpeur sur bois", +"maître socioprofessionnel diplômé ES", +"Maître tableaux électriques et automation", +"Maître textile avec diplôme fédéral", +"Maître viticulteur", +"Maître vitrier", +"Manager de médias diplômé", +"Manager de remontées mécanique avec diplôme fédéral", +"Manager en commerce de détail avec diplôme fédéral", +"Manager en publication avec diplôme fédéral (DF)", +"Manager en systèmes de transports publics diplômé", +"Maquettiste d'architecture", +"Maquilleur professionnel avec brevet fédéral", +"Maraîcher CFC (Champ professionnel de l'agriculture)", +"Marbrier CFC (Champ professionnel travail de la pierre)", +"Marbrier du bâtiment CFC (Champ professionnel travail de la pierre)", +"Marbrier, maître", +"Maréchal-ferrant CFC", +"Maréchal-forgeron, maître", +"marketing manager diplômé ES", +"Masseur médical avec brevet fédéral", +"Matelot de la navigation intérieure CFC", +"Mécanicien d'appareils à moteur CFC", +"Mécanicien d'appareils à moteur, maître", +"Mécanicien de production CFC", +"Mécanicien deux-roues", +"Mécanicien en bicyclettes et motocyclettes, maître", +"Mécanicien en bicyclettes, maître", +"Mécanicien en cycles CFC", +"Mécanicien en machines agricoles CFC", +"Mécanicien en machines agricoles, maître", +"Mécanicien en machines de chantier CFC", +"Mécanicien en machines de chantier, maître", +"Mécanicien en maintenance d'automobiles CFC", +"Mécanicien en motocycles", +"Mécanicien en motocycles CFC", +"Mécanicien en motocycles de petite cylindrée et cycles CFC", +"Mécatronicien d'automobiles CFC", +"Mécatronicien de remontées mécaniques CFC", +"Médiamaticien", +"Médiamaticien avec brevet fédéral", +"Médiamaticien CFC", +"Mentor d'entreprise avec brevet fédéral", +"Menuisier, maître", +"Menuisier", +"Meunier", +"Meunier CFC", +"Micromécanicien", +"Micromécanicien CFC", +"Modeleur-céramiste", +"Moniteur de conduite avec brevet fédéral", +"Monteur automaticien CFC", +"Monteur de faux plafonds avec brevet fédéral", +"Monteur de réseaux eau et gaz avec brevet fédéral", +"Monteur frigoriste CFC", +"Monteur-frigoriste", +"Mouleur CFC", +"Mouleur de fonderie", +"Mouleur de fonderie CFC", +"Naturopathe avec diplôme fédéral", +"Négociant de vins diplômé", +"Nettoyeur chimique diplômé", +"Nettoyeur de bâtiments diplomé", +"Nettoyeur de textiles CFC", +"Officier de l'état civil avec brevet fédéral", +"Opérateur d'installations de centrale nucléaire avec brevet fédéral", +"Opérateur de machines automatisées CFC", +"Opérateur de médias imprimés CFC", +"Opérateur de sciage d’édifice CFC", +"Opérateur en horlogerie AFP", +"Opérateur en horlogerie AFP", +"Opticien CFC", +"Opticien en instruments", +"Opticien en instruments de précision CFC", +"Orfèvre en argenterie, maître", +"Orthopédiste CFC", +"Orthopédiste diplômé", +"orthoptiste diplômé ES", +"Packaging Manager avec diplôme fédéral", +"Papetier", +"Papetier CFC", +"Pâtissier-confiseur diplômé", +"Paveur CFC (champ professionnel Construction de voies de communication)", +"Paveur CFC (champ professionnel Construction de voies de communication)", +"Paveur, maître", +"Pêcheur professionnel avec brevet fédéral", +"Peintre CFC", +"Peintre en automobiles avec brevet fédéral", +"Peintre en bâtiments", +"Peintre en décors de théâtre", +"Peintre en décors de théâtre CFC", +"Peintre verrier CFC", +"Photodesigner diplomé", +"Photographe", +"Photographe CFC", +"Photographe de laboratoire", +"Physiothérapeut pour animaux avec diplôme fédéral", +"pilote diplômé ES", +"Planificateur éclairagiste avec brevet fédéral", +"Planificateur en communication avec brevet fédéral", +"Planificateur-électricien CFC", +"Planificateur-électricien CFC", +"Planificateur-électricien diplômé", +"Plâtrier", +"Plâtrier constructeur à sec CFC", +"Plâtrier, maître", +"Plâtrier-peintre", +"podologue diplômé ES", +"Poêlier-fumiste CFC", +"Poêlier-fumiste, maître", +"Poêlier-fumiste, maître", +"Policier avec brevet fédéral", +"Policier avec diplôme fédéral", +"Polisseur AFP", +"Polybâtisseur CFC", +"Polydesigner 3D CFC", +"Polygraphe CFC", +"Polygraphe CFC", +"Polymécanicien CFC", +"Poseur de pierres AFP (champ professionnel Construction de voies de communication)", +"Poseur de pierres AFP (champ professionnel Construction de voies de communication)", +"Poseur de revêtements de sols", +"Poseur de sol – parquet CFC", +"Praticien des matières synthétiques AFP", +"Praticien en denrées alimentaires AFP", +"Praticien en mécanique AFP", +"Praticien en pneumatiques AFP", +"Praticien forestier AFP", +"Praticien sur bois AFP", +"Préparateur Humains avec brevet fédéral", +"Professeur d'escalade avec brevet fédéral", +"Professeur de canoë-kayak avec brevet fédéral", +"Professeur de danse de couple avec brevet fédéral", +"Professeur de golf avec brevet fédéral", +"Professeur de ju-jitsu avec brevet fédéral", +"Professeur de judo avec brevet fédéral", +"Professeur de karaté avec brevet fédéral", +"Professeur de patinage avec brevet fédéral", +"Professeur de planche à voile avec brevet fédéral", +"Professeur de sport de neige avec brevet fédéral", +"Professeur de sports aquatiques avec brevet fédéral", +"Professeur de tennis avec brevet fédéral", +"Professeur de voile avec brevet fédéral", +"Professeur en navigation de bateau moteur avec brevet fédéral", +"Professionnel du cheval CFC", +"Professionnel du cheval CFC", +"Projeteur constructeur sur métal avec brevet fédéral", +"Projeteur en sanitaire avec diplôme fédéral", +"Projeteur en technique du bâtiment", +"Projeteur en technique du bâtiment chauffage CFC (champ professionnel Planification en technique du bâtiment)", +"Projeteur en technique du bâtiment sanitaire CFC (champ professionnel Planification en technique du bâtiment)", +"Projeteur en technique du bâtiment ventilation CFC (champ professionnel Planification en technique du bâtiment)", +"Projeteur frigoriste CFC", +"Ramoneur CFC", +"Réalisateur publicaire avec diplôme fédéral", +"Réalisateur publicitaire CFC", +"Réalisateur publicitaire CFC", +"Recycleur CFC", +"Rédacteur publicitaire avec brevet fédéral", +"Rédacteur technique avec brevet fédéral", +"Réparateur de chaussures AFP", +"Repousseur-emboutisseur", +"Responsable Achats avec diplôme fédéral", +"Responsable d'équipe dans des institutions sociales et médico-sociales avec brevet fédéral", +"Responsable de formation avec diplôme fédéral", +"Responsable de la communication diplomé", +"Responsable de la restauration avec brevet fédéral", +"Responsable de ménage agricole avec brevet fédéral", +"Responsable de ménage agricole diplomé", +"Responsable diplômé en documentation technique", +"Responsable du secteur hôtelier - intendance avec brevet fédéral", +"Responsable en transport et logistique diplômé", +"Responsable diplômé en ressources humaines", +"Restaurateur de livres diplômé", +"Sapeur-pompier professionnel avec brevet fédéral", +"Scieur de l'industrie du bois CFC", +"Screen Communicator avec brevet fédéral", +"Sculpteur sur bois CFC", +"Sculpteur sur pierre CFC (Champ professionnel travail de la pierre)", +"Sculpteur sur pierre, maître", +"Secouriste routier avec brevet féderal", +"Sellier", +"Sérigraphe, maître", +"Serrurier sur véhicules avec brevet fédéral", +"Serrurier sur véhicules CFC", +"Sertisseur en joaillerie, maître", +"Sommelier avec brevet fédéral", +"Specialista in soluzioni mobile aziendali dipl. SPD SSS", +"Spécialiste assainissement d'ouvrage avec brevet federal", +"Spécialiste câble-crue avec brevet fédéral", +"Spécialiste d'achat", +"Spécialiste de commerce international avec brevet fédéral", +"Spécialiste de douane avec brevet fédéral", +"Spécialiste de la conduite d'équipe avec brevet fédéral", +"Spécialiste de la gestion et du développement des organisations syndicales avec brevet fédéral", +"Spécialiste de la migration avec brevet fédéral", +"Spécialiste de la nature et de l'environnement avec brevet fédéral", +"Spécialiste de la prévoyance en faveur du personnel avec brevet fédéral", +"Spécialiste de la sécurité dans les institutions de santé et du social avec brevet fédéral", +"Spécialiste de logistique avec brevet fédéral", +"Spécialiste de médias avec brevet fédéral", +"Spécialiste de réseau avec brevet fédéral", +"Spécialiste de traitement des matières premières avec brevet fédéral", +"Spécialiste de vente avec brevet federal", +"Spécialiste des branches de la boulangerie-pâtisserie-confiserie avec brevet fédéral", +"Spécialiste des installations de transport à câbles avec brevet fédéral", +"spécialiste des services de la navigation aérienne diplomé ES", +"Spécialiste du commerce de détail avec brevet fédéral", +"Spécialiste du commerce fruits et légumes avec brevet fédéral", +"Spécialiste du domain équin avec brevet fédéral", +"Spécialiste du service de pistes et de sauvetage avec brevet fédéral", +"spécialiste en activation diplômé ES", +"Spécialiste en administration publique avec brevet fédéral", +"Spécialiste en agriculture biodynamique avec brevet fédéral", +"Spécialiste en assurance avec brevet fédéral", +"Spécialiste en assurance-maladie avec brevet fédéral", +"Spécialiste en assurances sociales avec brevet fédéral", +"Spécialiste en bois avec brevet fédéral", +"Spécialiste en codage médical avec brevet fédéral", +"Spécialiste en commerce de textile avec brevet fédéral", +"Spécialiste en diagnostic neurophysiologique avec brevet fédéral", +"Spécialiste en finance et comptabilité avec brevet fédéral", +"Spécialiste en finition des médias imprimés avec brevet fédéral (BF)", +"Spécialiste en formation professionnelle avec brevet fédéral", +"Spécialiste en gestion de PME avec brevet fédéral", +"Spécialiste en gestion hospitalière avec brevet fédéral", +"Spécialiste en hôtellerie CFC", +"Spécialiste en impression et emballage avec brevet fédéral (BF)", +"Spécialiste en interprétariat communautaire et médiation interculturelle avec brevet fédéral", +"Spécialiste en marketing avec brevet fédéral", +"Spécialiste en matière de poursuite pour dettes et de la faillite avec brevet fédéral", +"Spécialiste en nettoyage de bâtiments avec brevet fédéral", +"Spécialiste en organisation d'entreprise avec brevet fédéral", +"Spécialiste en photographie avec brevet fédéral", +"Spécialiste en photographie CFC", +"Spécialiste en photographie diplômé", +"Spécialiste en pneumatiques avec brevet fédéral", +"Spécialiste en protection incendie avec brevet fédéral", +"Spécialiste en réadaptation de personnes malvoyantes et aveugles avec diplôme fédéral", +"Spécialiste en relations publiques avec brevet fédéral", +"Spécialiste en ressources humaines avec brevet fédéral", +"Spécialiste en restauration CFC", +"Spécialiste en restauration de système CFC", +"Spécialiste en soin aux arbres avec brevet fédéral", +"Spécialiste en systèmes thermiques avec brevet fédéral", +"Spécialiste en technologies de réadaptation avec brevet fédéral", +"Spécialiste en thermique avec brevet fédéral", +"Spécialiste en transports publics avec brevet fédéral", +"Spécialiste en vernissage industriel avec brevet fédéral", +"Spécialiste établissements de bains avec brevet fédéral", +"Spécialiste minage avec brevet fédéral", +"Spécialiste pharmaceutique avec brevet fédéral", +"Spécialiste pour installations de traitement des déchets avec brevet fédéral", +"Spécialiste pour la sécurité des citernes avec brevet fédéral", +"Styliste d'ongles avec brevet fédéral", +"Superviseur-Coach avec diplôme fédéral", +"Supply Chain Manager diplomé", +"Tailleur de pierre CFC (Champ professionnel travail de la pierre)", +"Tailleur, maître", +"Technicien ambulancier avec brevet fédéral", +"Technicien de fouilles archéologiques avec brevet fédéral", +"Technicien de laboratoire en sciences naturelles avec diplôme fédéral", +"technicien diplômé ES agroalimentaire", +"technicien diplômé ES en informatique", +"technicien diplômé ES en microtechnique", +"technicien diplômé ES en télécommunications", +"technicien diplômé ES génie électrique", +"technicien diplômé ES génie mécanique", +"technicien diplômé ES planification des travaux", +"technicien diplomé ES processus d'entreprise", +"technicien diplômé ES systèmes industriels", +"technicien diplômé ES technique des bâtiments", +"technicien diplômé ES technique du bois", +"Technicien du film avec brevet fédéral", +"Technicien du son avec brevet fédéral", +"Technicien du spectacle avec brevet fédéral", +"technicien en analyses biomédicales diplômé ES", +"Technicien en géomatique avec brevet fédéral", +"technicien en radiologie médicale diplômé ES", +"technicien en salle d’opération diplômé ES", +"Technicien sur aéronefs avec brevet fédéral", +"Technicien vitivinicole dipl. ES", +"Technicien-dentiste CFC", +"Technicien-dentiste, maître", +"Techniscéniste CFC", +"Techno-polygraphe avec brevet fédéral (BF)", +"Technologue de fonderie", +"Technologue de fonderie CFC", +"Technologue du lait CFC", +"Technologue en assainissement CFC", +"Technologue en chimie diplômé", +"Technologue en denrées alimentaires", +"Technologue en denrées alimentaires avec brevet fédéral", +"Technologue en denrées alimentaires avec diplôme fédéral", +"Technologue en denrées alimentaires CFC", +"Technologue en emballage CFC", +"Technologue en impression CFC", +"Technologue en industrie laitière", +"Technologue en industrie laitière avec brevet fédéral", +"Technologue en industrie laitière diplomé", +"Technologue en production chimique et pharmaceutique CFC", +"Technologue en production chimique et pharmaceutique CFC", +"Technologue en textile CFC", +"Télématicien CFC", +"Télématicien CFC", +"Télématicien chef de projet avec brevet fédéral", +"Télématicien diplômé", +"Termineur en habillage horloger CFC", +"Thérapeute Complémentaire avec diplôme fédéral", +"Thermiste avec brevet fédéral", +"Tôlier en carrosserie avec brevet fédéral", +"Tonnelier CFC", +"Tourneur, maître", +"Transitaire avec brevet fédéral", +"Typographiste pour la communication visuelle avec brevet fédéral", +"Vannier créateur CFC", +"Vérificateur des poids et mesures diplômé", +"Vernisseur industriel CFC", +"Vernisseur industriel CFC", +"Viticulteur CFC (Champ professionnel de l'agriculture)", +"Vitrier", +"Vitrier CFC", +"Web Project Manager diplômé", +"Zingueur avec brevet fédéral", +"Zingueur diplômé", + + ] diff --git a/src/libs/faker/providers/job/fr_FR/__init__.py b/src/libs/faker/providers/job/fr_FR/__init__.py new file mode 100644 index 0000000..13e3d60 --- /dev/null +++ b/src/libs/faker/providers/job/fr_FR/__init__.py @@ -0,0 +1,672 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + +# Source: ONISEP +# data.gouv.fr/s/resources/liste-des-metiers-onisep/20150112-173428/metier.csv +class Provider(BaseProvider): + jobs=["Accessoiriste", +"Accompagnateur de moyenne montagne", +"Accompagnateur de tourisme équestre", +"Accompagnateur de voyages", +"Acheteur", +"Acheteur d'espaces publicitaires", +"Acousticien", +"Actuaire", +"Adjoint", +"Administrateur de base de données", +"Administrateur de biens", +"Administrateur de logiciels de laboratoire", +"Administrateur de mission humanitaire", +"Administrateur de réseau", +"Administrateur de spectacle", +"Administrateur judiciaire ", +"Agenceur de cuisines et salles de bains", +"Agent", +"Agent artistique", +"Agent d'assurances ", +"Agent de développement des énergies renouvelables", +"Agent de développement local", +"Agent de développement touristique", +"Agent de la surveillance SNCF", +"Agent de propreté et d'hygiène", +"Agent de propreté urbaine", +"Agent de sécurité", +"Agent de service commercial train", +"Agent des méthodes", +"Agent de transit", +"Agriculteur", +"Agronome", +"Aide médico-psychologique", +"Aide-soignant", +"Ajusteur", +"Ambulancier", +"Analyste de crédit", +"Analyste financier", +"Anatomiste", +"Anesthésiste-réanimateur", +"Animalier de laboratoire", +"Animateur", +"Animateur 2D et 3D", +"Animateur d'activités physiques et sportives", +"Animateur de bassin versant", +"Animateur de radio et de télévision", +"Animateur du patrimoine", +"Animateur nature", +"Antiquaire", +"Apiculteur", +"Aquaculteur", +"Arboriculteur", +"Architecte", +"Architecte d'intérieur", +"Architecte naval ", +"Architecte produit industriel", +"Architecte réseau", +"Architecte web", +"Archiviste", +"Archéologue", +"Aérodynamicien", +"Aromaticien", +"Artiste de cirque", +"Ascensoriste", +"Assistant", +"Assistant", +"Assistant", +"Assistant de gestion en PME", +"Assistant dentaire", +"Assistant de service social", +"Assistant en ressources humaines", +"Astrophysicien", +"Attaché", +"Attaché", +"Attaché d'administration", +"Attaché de presse", +"Attaché de recherche clinique", +"Audioprothésiste", +"Auditeur externe", +"Auditeur interne", +"Auteur interprète", +"Auxiliaire de puériculture", +"Auxiliaire de vie sociale", +"Auxiliaire spécialisé vétérinaire", +"Avocat", +"Bactériologiste", +"Barman ", +"Batelier", +"Bibliothécaire", +"Bijoutier", +"Bio-informaticien", +"Biologiste en environnement", +"Biologiste médical", +"Biostatisticien", +"Ébéniste", +"Botaniste", +"Bottier", +"Boucher", +"Boulanger", +"Brodeur", +"Bronzier", +"Cadreur", +"Caissier", +"Canalisateur", +"Carreleur-mosaïste", +"Carrossier ", +"Cartographe", +"Caviste", +"Chanteur", +"Charcutier", +"Chargé", +"Chargé d'affaires en génie climatique", +"Chargé d'affaires en génie mécanique", +"Chargé de clientèle banque", +"Chargé de communication interne", +"Chargé de pharmacovigilance", +"Chargé de production", +"Chargé de projet événementiel", +"Chargé de recherche en acoustique musicale", +"Chargé de recherche et développement déchets", +"Chargé de référencement web", +"Chargé des méthodes outils et qualité en informatique", +"Chargé des relations publiques", +"Chargé de veille législative et réglementaire", +"Chargé d'études économiques", +"Chargé d'études en aménagement", +"Chargé d'études en marketing", +"Chargé d'études en valorisation agricole des déchets", +"Chargé d'études média", +"Chargé d'études naturalistes", +"Chargé d'études ressources humaines", +"Charpentier bois", +"Charpentier métallique", +"Chaudronnier", +"Chauffeur de taxi", +"Chef comptable", +"Chef de chantier", +"Chef de chantier en installations électriques", +"Chef de cultures légumières", +"Chef de fabrication des industries graphiques", +"Chef de mission humanitaire", +"Chef de produit marketing", +"Chef de produit touristique", +"Chef de projet biodiversité", +"Chef de projet démantèlement nucléaire", +"Chef de projet informatique", +"Chef de projet multimédia", +"Chef de projet éolien", +"Chef de projet sites et sols pollués", +"Chef de projet territorial", +"Chef de publicité", +"Chef de rayon", +"Chef de station de traitement des eaux", +"Chef des ventes", +"Chef d'exploitation d'usine d'incinération", +"Chef monteur", +"Chercheur en biologie", +"Chercheur en biologie du sport", +"Chercheur en chimie", +"Chercheur en physique ", +"Chirurgien", +"Chirurgien-dentiste", +"Éclairagiste", +"Clerc d'huissier", +"Climatologue", +"Coffreur", +"Cogniticien", +"Coiffeur", +"Collaborateur de notaire", +"Collecteur de fonds", +"Comédien", +"Commerçant en alimentation", +"Commercial export", +"Commissaire de police", +"Commissaire-priseur", +"Comptable", +"Concepteur", +"Concepteur de jeux vidéo", +"Concepteur de niveaux de jeu web", +"Concepteur multimédia", +"Conducteur", +"Conducteur de bus ou d'autocar", +"Conducteur de ligne de production alimentaire", +"Conducteur de machines agricoles", +"Conducteur de machines à imprimer ", +"Conducteur de machines à papier ", +"Conducteur de métro", +"Conducteur d'engins de travaux publics", +"Conducteur de scierie", +"Conducteur de train / TGV", +"Conducteur de travaux", +"Économe de flux", +"Économiste de la construction", +"Conseiller agricole", +"Conseiller d'éducation", +"Conseiller d'insertion et de probation", +"Conseiller d'orientation-psychologue", +"Conseiller en économie sociale et familiale", +"Conseiller en environnement", +"Conseiller en fusion-acquisition", +"Conseiller en génétique", +"Conseiller en insertion sociale et professionnelle", +"Conseiller en salle de remise en forme", +"Conseiller en séjours", +"Conseiller en voyages", +"Conseiller espace info-énergie", +"Conservateur du patrimoine", +"Consignataire de navire", +"Constructeur de routes", +"Consultant", +"Consultant en solutions intégrées", +"Consultant en validation", +"Consultant green IT", +"Contrôleur", +"Contrôleur", +"Contrôleur de gestion", +"Contrôleur de performances", +"Contrôleur technique automobile", +"Convoyeur de fonds", +"Coordonnateur d'études cliniques", +"Cordiste", +"Cordonnier", +"Correcteur", +"Costumier", +"Courtier", +"Couvreur", +"Céramiste", +"Credit manager", +"Cuisinier", +"Danseur", +"Déclarant en douane", +"Décolleteur", +"Décorateur scénographe", +"Designer", +"Designer d'interaction", +"Designer sonore", +"Dessinateur BTP", +"Dessinateur de BD", +"Dessinateur en construction mécanique", +"Directeur", +"Directeur artistique", +"Directeur d'agence bancaire", +"Directeur de centre pénitentiaire", +"Directeur de création", +"Directeur de la photographie", +"Directeur de magasin à grande surface", +"Directeur de restaurant", +"Directeur d'hôpital", +"Directeur d'hôtel", +"Directeur d'office de tourisme", +"Éditeur", +"Diététicien", +"Déménageur", +"Démographe", +"Documentaliste", +"Domoticien", +"Dépanneur en électroménager", +"Dresseur d'animaux", +"Éducateur", +"Éducateur", +"Éducateur", +"Éducateur de jeunes enfants", +"Éducateur de la protection judiciaire de la jeunesse", +"Développeur économique", +"Développeur d'applications mobiles", +"Développeur humanitaire", +"Développeur informatique", +"Employé de pressing", +"Employé de restaurant", +"Encadreur", +"Enquêteur privé", +"Enseignant", +"Enseignant", +"Enseignant d'art", +"Enseignant de la conduite automobile et de la sécurité routière", +"Enseignant humanitaire", +"Entraîneur ", +"Entraîneur de chevaux", +"Ergonome", +"Ergothérapeute", +"Esthéticien", +"Ethnologue", +"Expert automobile", +"Expert bilan carbone", +"Expert-comptable", +"Expert en sécurité informatique", +"Expert immobilier", +"Façadier", +"Facteur", +"Facteur d'instruments", +"Façonnier des industries graphiques", +"Femme de chambre ", +"Ferronnier d'art", +"Fiscaliste", +"Fleuriste", +"Formateur d'adultes", +"Formateur en informatique", +"Formulateur", +"Frigoriste", +"Garde ", +"Garde à cheval", +"Gardien de la paix", +"Gardien de police municipale", +"Garçon de café", +"Gendarme", +"Gestionnaire de contrats d'assurance", +"Gestionnaire de contrats informatiques", +"Gestionnaire de données cliniques", +"Gestionnaire de patrimoine", +"Gestionnaire de portefeuille", +"Généticien", +"Géochimiste", +"Géographe", +"Géologue", +"Géologue minier", +"Géologue modélisateur", +"Géomaticien", +"Géomètre-topographe", +"Géophysicien", +"Géotechnicien", +"Géothermicien", +"Gouvernante", +"Gérant de restauration collective", +"Graphiste", +"Greffier", +"Grutier", +"Guichetier", +"Guide conférencier des villes et pays d'art et d'histoire", +"Guide de haute montagne", +"Guide-interprète", +"Halieute", +"Histologiste", +"Horloger", +"Horticulteur", +"Hot liner", +"Hôte d'accueil", +"Hôtesse de l'air ", +"Huissier de justice", +"Hydraulicien", +"Hydrogéologue", +"Hydrologue", +"Iconographe", +"Illustrateur", +"Infirmier", +"Infirmier humanitaire", +"Informaticien", +" ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur", +"Ingénieur analyste de l'air", +"Ingénieur brevets", +"Ingénieur calcul", +"Ingénieur chimiste", +"Ingénieur chimiste en développement analytique", +"Ingénieur cloud computing", +"Ingénieur d'application", +"Ingénieur de la police technique et scientifique", +"Ingénieur du BTP", +"Ingénieur du son", +"Ingénieur efficacité énergétique du bâtiment", +"Ingénieur en aéronautique", +"Ingénieur en automatisme", +"Ingénieur en construction automobile", +"Ingénieur en construction navale", +"Ingénieur en génie climatique", +"Ingénieur en informatique", +"Ingénieur en électronique numérique", +"Ingénieur en mécanique", +"Ingénieur en mécanique", +"Ingénieur en métrologie", +"Ingénieur en énergie solaire", +"Ingénieur en production et expérimentations végétales", +"Ingénieur en R et D en énergies renouvelables", +"Ingénieur environnement", +"Ingénieur environnement et risques industriels", +"Ingénieur essais", +"Ingénieur fluides, énergies, réseaux, environnement", +"Ingénieur forage", +"Ingénieur gaz", +"Ingénieur hydroécologue", +"Ingénieur hydrogéomorphologue", +"Ingénieur maintenance aéronautique", +"Ingénieur métallurgiste", +"Ingénieur méthodes mécaniques", +"Ingénieur nucléaire", +"Ingénieur plasturgiste", +"Ingénieur procédés en chimie", +"Ingénieur process aval", +"Ingénieur production dans les biotechnologies", +"Ingénieur production en mécanique", +"Ingénieur radioprotection", +"Ingénieur recherche et développement en agroalimentaire", +"Ingénieur réservoir", +"Ingénieur structures", +"Ingénieur système", +"Ingénieur systèmes embarqués", +"Ingénieur technico-commerciale en électronique", +"Ingénieur technico-commercial en chimie", +"Ingénieur textile", +"Ingénieur télécoms et réseaux", +"Ingénieur études et développement en logiciels de simulation", +"Inspecteur", +"Inspecteur de banque", +"Inspecteur du permis de conduire et de la sécurité routière", +"Installateur en télécoms", +"Intégrateur web", +"Journaliste", +"Journaliste reporter d'images ", +"Juge des enfants", +"Juge d'instance", +"Juge d'instruction", +"Juriste d'entreprise", +"Juriste droit de l'environnement", +"Juriste en droit social", +"Juriste en propriété intellectuelle", +"Lad-jockey, lad-driver", +"Élagueur", +"Électricien", +"Électromécanicien ", +"Électronicien automobile", +"Éleveur", +"Libraire", +"Linguiste", +"Logisticien", +"Machiniste constructeur ou plateau", +"Magasinier cariste", +"Magistrat", +"Manager de risques", +"Mandataire judiciaire", +"Manipulateur en électroradiologie médicale", +"Maçon", +"Maquettiste", +"Maraîcher", +"Maréchal", +"Marchandiseur", +"Marin de commerce", +"Marin pêcheur", +"Maroquinier", +"Masseur-kinésithérapeute", +"Matelot", +"Maître-chien", +"Maître d'hôtel", +"Maître nageur sauveteur", +"Mécanicien", +"Mécanicien", +"Mécanicien bateaux", +"Mécanicien d'entretien d'avion", +"Mécanicien en matériel agricole", +"Mécanicien moto", +"Mécatronicien", +"Médecin généraliste", +"Médecin humanitaire", +"Médecin spécialiste", +"Médiateur", +"Menuisier", +"Microbiologiste", +"Microtechnicien", +"Militaire du rang ", +"Militaire technicien", +"Mixeur", +"Modiste", +"Modéliste", +"Moniteur", +"Moniteur de ski", +"Moniteur d'équitation", +"Monteur", +"Monteur en installations thermiques et climatiques", +"Monteur en réseaux de distribution électrique", +"Mouleur", +"Météorologiste", +"Musicien", +"Neurobiologiste", +"Notaire", +"Océanologue", +"Oenologue", +"Officier", +"Officier de gendarmerie", +"Officier de la marine marchande", +"Officier de l'armée de l'air", +"Officier de l'armée de terre", +"Officier de marine", +"Officier de police", +"Opérateur de fabrication de produits alimentaires", +"Opérateur de raffinerie", +"Opérateur en traitement des matériaux", +"Opérateur prépresse", +"Opérateur sur machine à commande numérique", +"Opticien", +"Optronicien", +"Orfèvre", +"Orthophoniste", +"Orthoprothésiste", +"Orthoptiste", +"Ostéopathe", +"Ouvrier", +"Ouvrier agricole", +"Ouvrier paysagiste", +"Palefrenier", +"Paléontologue", +"Parfumeur", +"Paysagiste", +"Pédiatre", +"Pédicure-podologue", +"Pédologue", +"Peintre en bâtiment", +"Pharmacien", +"Pharmacien dans l'industrie", +"Photographe", +"Pilote de ligne", +"Pilote de ligne automatisée ", +"Plombier", +"Plâtrier", +"Podo-orthésiste", +"Professeur dans l'enseignement agricole", +"Professeur d'éducation physique et sportive", +"Professeur de collège et de lycée", +"Professeur de lycée professionnel ou technique ", +"Professeur de maths ou de physique-chimie", +"Professeur de musique et de danse", +"Professeur des écoles ", +"Professeur documentaliste", +"Projectionniste", +"Prothésiste dentaire", +"Préparateur en pharmacie", +"Psychanalyste", +"Psychologue", +"Psychomotricien", +"Pâtissier", +"Puériculteur", +"Qualiticien", +"Réceptionniste", +"Rédacteur", +"Rédacteur en chef", +"Rédacteur on line", +"Relieur", +"Reporter-photographe", +"Responsable assurance qualité", +"Responsable biométrie", +"Responsable de fabrication en agroalimentaire", +"Responsable de formation", +"Responsable de laboratoire de contrôle en biologie", +"Responsable de la collecte des déchets ménagers", +"Responsable de la promotion des ventes", +"Responsable de la rémunération", +"Responsable de plate-forme biotechnologique", +"Responsable de projets culturels", +"Responsable de réseau d'assainissement", +"Responsable de réseau eau potable", +"Responsable de scierie", +"Responsable de site de traitement des déchets", +"Responsable des ressources humaines", +"Responsable d'ordonnancement", +"Responsable du back-office", +"Responsable du recrutement", +"Responsable du service après-vente", +"Responsable du soutien logistique intégré", +"Responsable micro", +"Responsable qualité en agroalimentaire", +"Restaurateur d'oeuvres d'art", +"Régisseur cinéma", +"Régisseur de spectacles", +"Régleur", +"Rudologue", +"Sage-femme ", +"Salesman", +"Sapeur", +"Scénariste", +"Scripte", +"Secrétaire", +"Secrétaire administratif", +"Secrétaire d'édition", +"Secrétaire de rédaction", +"Secrétaire des Affaires étrangères", +"Secrétaire juridique", +"Secrétaire médical", +"Sellier", +"Serrurier", +"Sociologue", +"Soigneur", +"Solier-moquettiste", +"Sommelier", +"Soudeur", +"Souffleur de verre ", +"Souscripteur", +"Sous-officier de l'armée de l'air", +"Sous-officier de l'armée de terre", +"Spécialiste des affaires réglementaires en chimie", +"Sportif de haut niveau", +"Sérigraphe", +"Staffeur-ornemaniste", +"Statisticien", +"Styliste ", +"Substitut du procureur", +"Surveillant de centre pénitentiaire", +"Syndic de copropriété", +"Tailleur", +"Tailleur de pierre", +"Étalagiste", +"Étanchéiste", +"Tapissier d'ameublement ", +"Technicien ", +"Technicien ", +"Technicien", +"Technicien", +"Technicien", +"Technicien automobile", +"Technicien biologiste", +"Technicien chimiste", +"Technicien céramiste", +"Technicien d'analyses biomédicales", +"Technicien de fabrication de mobilier et de menuiserie", +"Technicien de forge", +"Technicien de l'intervention sociale et familiale", +"Technicien de maintenance en génie climatique", +"Technicien de maintenance en informatique", +"Technicien de maintenance industrielle", +"Technicien de police technique et scientifique", +"Technicien des industries du verre", +"Technicien d'essais", +"Technicien d'exploitation de l'eau", +"Technicien d'exploitation du réseau gaz", +"Technicien d'intervention clientèle gaz", +"Technicien en automatismes", +"Technicien en engins de travaux publics", +"Technicien en lignes haute tension ", +"Technicien en métrologie", +"Technicien en optique de précision", +"Technicien en traitement des déchets", +"Technicien nucléaire", +"Technicien paysagiste", +"Technicien plasturgiste", +"Technicien télécoms et réseaux", +"Technico-commercial en agroalimentaire", +"Techniverrier", +"Teinturier", +"Testeur en informatique", +"Télévendeur", +"Toiletteur d'animaux", +"Tonnelier", +"Trader", +"Traducteur-interprète", +"Urbaniste", +"Veilleur stratégique", +"Vendeur-conseil en matériel agricole", +"Vendeur en animalerie", +"Vendeur en fournitures automobiles", +"Vendeur en magasin", +"Vendeur en micro-informatique et multimédia", +"Verrier au chalumeau", +"Visiteur", +"Viticulteur", +"Vitrailliste", +"Volcanologue", +"Vétérinaire", +"Webdesigner", +"Webmestre", +"Zoologiste"] diff --git a/src/libs/faker/providers/job/hr_HR/__init__.py b/src/libs/faker/providers/job/hr_HR/__init__.py new file mode 100644 index 0000000..bc9aaf0 --- /dev/null +++ b/src/libs/faker/providers/job/hr_HR/__init__.py @@ -0,0 +1,292 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + jobs = [ + "Agent posredovanja u prometu nekretnina", + "Alatničar", + "Arhivist", + "Arhivski savjetnik", + "Arhivski tehničar", + "Autoelektričar", + "Autolakirer", + "Autolimar", + "Automehaničar", + "Autoserviser", + "Bravar", + "Brodostrojarski inspektor", + "Brodski mehaničar", + "Dentalni asistent", + "Dentalni tehničar", + "Dimnjačar", + "Diplomirana medicinska sestra/medicinski tehničar", + "Diplomirani fizioterapeut", + "Diplomirani knjižničar", + "Diplomirani sanitarni inženjer", + "Direktor predstavništva", + "Direktor turističkog ureda turističke zajednice", + "Dispečer leta / operativni kontrolor prometa", + "Djelatnik koji obavlja poslove izvođenja glasnog pucnja", + "Djelatnik koji obavlja poslove izvođenja javnog vatrometa", + "Djelatnik koji obavlja poslove miniranja", + "Djelatnik koji obavlja poslove miniranja pri razminiranju", + "Djelatnik koji obavlja poslove podzemnih miniranja", + "Djelatnik koji obavlja poslove pripreme miniranja", + "Djelatnik koji obavlja poslove specijalnih miniranja", + "Djelatnik službe za zaštitu od požara", + "Djelatnik za obavljanje poslova zaštite od požara i unapređenje stanja zaštite od požara", + "Doktor dentalne medicine", + "Doktor dentalne medicine specijalist", + "Doktor medicine", + "Doktor medicine specijalist", + "Dokumentarist", + "Dokumentarist savjetnik", + "Dočasnik", + "Edukacijski rehabilitator", + "Elektroinstalater", + "Elektromehaničar", + "Elektroničar – mehaničar", + "Farmaceutski tehničar", + "Fasader", + "Fizioterapeutski tehničar", + "Fotograf", + "Frizer", + "Galanterist", + "Geološki tehničar", + "Glavni inspektor zaštite okoliša", + "Glavni nadzornik", + "Glazbalar", + "Graditelj brodova", + "Graditelj orgulja", + "Hidrograđevinski  inspektor", + "Informatičar", + "Informatičar savjetnik", + "Inspektor sigurnosti unutarnje plovidbe", + "Inspektor zaštite okoliša", + "Inspektor zaštite prirode", + "Instalater grijanja i klimatizacije", + "Instruktor vožnje", + "Inženjer geologije", + "Inženjer gradilišta", + "Inženjer medicinske radiologije", + "Inženjer medicinsko- laboratorijske dijagnostike", + "Inženjer naftnog rudarstva", + "Inženjer rudarstva", + "Kemijski čistač", + "Klesar", + "Klobučar", + "Knjižničar", + "Knjižničarski savjetnik", + "Kondukter", + "Kontrolor zračnog prometa", + "Konzervator", + "Konzervator savjetnik", + "Konzervator tehničar", + "Konzervator – restaurator savjetnik", + "Konzervator –  restaurator", + "Koordinator zaštite na radu", + "Kormilar", + "Kotlar", + "Kovač", + "Kozmetičar", + "Kriminalist", + "Krojač muške odjeće", + "Krojač ženske odjeće", + "Krovopokrivač", + "Krznar", + "Kuhar", + "Kustos", + "Lektor hrvatskog jezika na stranim visokoškolskim ustanovama", + "Limar", + "Ljekarnik", + "Ljekarnik specijalist", + "Ljevač", + "Lovac", + "Lovočuvar", + "Magistar sanitarnog inženjerstva", + "Magistar sestrinstva", + "Maser – kupeljar", + "Medicinska sestra opće njege", + "Medicinska sestra-medicinski tehničar", + "Medicinska sestra/medicinski tehničar specijalist", + "Medicinski biokemičar", + "Medicinski biokemičar specijalist", + "Mehaničar poljoprivredne mehanizacije", + "Mesar", + "Mlinar", + "Mljekar", + "Mornar", + "Muzejski pedagog", + "Muzejski pedagog savjetnik", + "Muzejski savjetnik", + "Muzejski tehničar", + "Nadzornik", + "Nadzornik tehničke ispravnosti vozila", + "Nadzornik za okoliš", + "Nastavnik predmetne nastave u srednjoj školi", + "Natkonobar", + "Nautički inspektor", + "Obućar", + "Ocjenjivač lovačkih trofeja", + "Odgajatelj u učeničkom domu", + "Odgojitelj djece predškolske dobi", + "Odgovorna osoba za ocjenjivanje sukladnosti građevinskih proizvoda", + "Odvjetnik", + "Ortopedski obućar", + "Osoba koja provodi energetske preglede građevina i/ili energetsko certificiranje zgrada", + "Osoba stručno osposobljena za gospodarski ribolov", + "Osoba stručno osposobljena za obavljanje akvakulture", + "Osoba stručno osposobljena za uzgoj riba i drugih morskih organizama", + "Osoblje za održavanje  zrakoplova (mehaničari, tehničari i inženjeri)", + "Ovlaštena osoba za izradu elaborata zaštite od požara", + "Ovlašteni arhitekt", + "Ovlašteni arhitekt – urbanist", + "Ovlašteni carinski službenik", + "Ovlašteni carinski zastupnik", + "Ovlašteni inženjer drvne tehnologije", + "Ovlašteni inženjer elektrotehnike", + "Ovlašteni inženjer geodezije", + "Ovlašteni inženjer građevinarstva", + "Ovlašteni inženjer strojarstva", + "Ovlašteni inženjer tehnologije prometa i transporta", + "Ovlašteni inženjer šumarstva", + "Ovlašteni ispitivač", + "Ovlašteni revident iz zaštite od požara", + "Ovlašteni revizor", + "Ovlašteni unutarnji revizor za javni sektor", + "Očni optičar", + "Pediker", + "Pekar", + "Pećar", + "Pirotehničar", + "Pirotehnički nadglednik", + "Pirotehnički nadzornik", + "Pismoslikar", + "Plinoinstalater", + "Policajac", + "Pomoćni djelatnik", + "Pomoćni knjižničar", + "Pomoćnik strojovođe", + "Porezni savjetnik", + "Precizni mehaničar", + "Predavač", + "Pregledač vagona", + "Preparator", + "Primalja", + "Primalja – asistentica", + "Privatni detektiv", + "Profesionalni diplomat", + "Profesionalni pilot aviona", + "Profesionalni pilot helikoptera", + "Prometni pilot aviona", + "Prometni pilot helikoptera", + "Prometnik vlakova", + "Prvostupnik fizioterapije", + "Prvostupnik medicinske radiologije", + "Prvostupnik medicinsko- laboratorijske dijagnostike", + "Prvostupnik primaljstva", + "Prvostupnik radiološke tehnologije", + "Prvostupnik radne terapije", + "Prvostupnik sanitarnog inženjerstva", + "Prvostupnik sestrinstva", + "Prvostupnik sestrinstva specijalist", + "Psiholog", + "Puškar", + "Radio inspektor sigurnosti plovidbe", + "Radiološki tehničar", + "Radnik na stručnim poslovima na izvršenju zadaća turističke zajednice", + "Radnik zaposlen na rukovodećim poslovima", + "Ravnatelj ustanove za predškolski odgoj i naobrazbu", + "Ravnatelj školske ustanove", + "Referent za poslove registracije vozila", + "Restaurator", + "Restaurator majstor", + "Restaurator savjetnik", + "Restaurator tehničar", + "Revident", + "Rudarski tehničar", + "Rukovatelj eksplozivnim tvarima", + "Rukovoditelj tehničkog plovila", + "Sanitarni tehničar", + "Sigurnosni savjetnik", + "Slastičar", + "Soboslikar – ličilac", + "Socijalni radnik", + "Sportski trener", + "Sportski učitelj / instruktor", + "Sportski voditelj", + "Staklar", + "Stalni sudski procjenitelj", + "Stalni sudski tumač", + "Stalni sudski vještak", + "Stolar", + "Strojar unutarnje plovidbe", + "Strojobravar", + "Strojovođa", + "Strukovni učitelj u srednjoj školi", + "Stručni radnik u djelatnosti socijalne skrbi", + "Stručni radnik u ustanovi socijalne skrbi", + "Stručni suradnik ovlaštenog inženjera geodezije", + "Stručni suradnik u predškolskoj ustanovi", + "Stručni suradnik u školskoj ustanovi", + "Stručni voditelj autoškole", + "Stručnjak zaštite na radu", + "Suradnik ovlaštenog inženjera geodezije", + "Suradnik u nastavi", + "Tapetar", + "Tesar", + "Tokar", + "Turistički pratitelj", + "Turistički vodič", + "Upravitelj prijevoza (osoba odgovorna za prijevoz)", + "Urar", + "Učitelj predmetne nastave u osnovnoj školi", + "Učitelj razredne nastave u osnovnoj školi", + "Učitelj stručnih predmeta", + "Veterinar", + "Veterinarski tehničar", + "Viši arhivist", + "Viši arhivski tehničar", + "Viši dokumentarist", + "Viši fotograf", + "Viši informatičar", + "Viši inspektor", + "Viši inspektor cestovnog prometa i cesta", + "Viši inspektor zaštite okoliša", + "Viši inspektor zaštite prirode", + "Viši knjižničar", + "Viši konzervator", + "Viši konzervator tehničar", + "Viši konzervator tehničar II stupnja", + "Viši konzervator –  restaurator", + "Viši kustos", + "Viši muzejski pedagog", + "Viši muzejski tehničar", + "Viši preparator", + "Viši restaurator", + "Viši restaurator tehničar", + "Vlakovođa", + "Voditelj ispostave", + "Voditelj poslovnice turističke agencije", + "Voditelj projekta", + "Voditelj radilišta", + "Voditelj radova", + "Voditelj skele u nacionalnoj plovidbi", + "Vodoinstalater", + "Vodoinstalater, instalater grijanja i klimatizacije", + "Vojnik", + "Vozač teretnog motornog vozila i autobusa", + "Vođa palube", + "Zapovjednik plovila (vrsta A, vrsta B, vrsta C)", + "Zaštitar", + "Zaštitar-tehničar", + "Zdravstveno laboratorijski tehničar", + "Zidar", + "Zlatar", + "Časnik", + "Član kabinske posade zrakoplova", + "Čuvar", + "Čuvar prirode", + ] diff --git a/src/libs/faker/providers/job/hu_HU/__init__.py b/src/libs/faker/providers/job/hu_HU/__init__.py new file mode 100644 index 0000000..3f296a9 --- /dev/null +++ b/src/libs/faker/providers/job/hu_HU/__init__.py @@ -0,0 +1,9 @@ +# coding=utf-8 +from .. import BaseProvider + +class Provider(BaseProvider): + # Derived from KSH's FEOR'08 + jobs = ('Titkár(nő)', 'Értékbecslő', 'Közterület-felügyelő', 'Építőmérnök', 'Köszörűs', 'Gépjármű- és motorkarbantartó', 'Mezőgazdasági mérnök', 'Számítógéphálózat- és rendszertechnikus', 'Adósságbehajtó', 'Fémöntőminta-készítő', 'Gyümölcs- és zöldségfeldolgozó', 'Telekommunikációs mérnök', 'Könyv- és lapkiadó szerkesztője', 'Geológus', 'Manikűrös', 'Energetikus', 'Kézbesítő', 'Kontroller', 'Mentőtiszt', 'Háztartási takarító és kisegítő', 'Dekoratőr', 'Tejfeldolgozó', 'Gyógytornász', 'Csomagkihordó', 'Kádár', 'Színész', 'Anyaggazdálkodó', 'Szoftverfejlesztő', 'Adó- és illetékhivatali ügyintéző', 'Utaskísérő', 'Táj- és kertépítészmérnök', 'Muzeológus', 'Koreográfus', 'Tetőfedő', 'Telepőr', 'Pedikűrös', 'Fémfeldolgozó', 'Intézményi takarító és kisegítő', 'Irodai szakmai irányító', 'Recepciós', 'Gépíró, szövegszerkesztő', 'Ifjúságsegítő', 'Pap', 'Adatbázis- és hálózati elemző', 'Szoftver- és alkalmazásfejlesztő', 'Burkoló', 'Történész', 'Intézményi takarító és kisegítő ', 'Kohó- és anyagtechnikus', 'Jogi asszisztens', 'Tőzsde- és pénzügyi ügynök', 'Varró', 'Bolti pénztáros', 'Kémikus', 'Kőműves', 'Szakorvos', 'Elemző közgazdász', 'Kézi mosó, vasaló', 'Irattáros', 'Földmérő és térinformatikus', 'Vendéglős', 'Élelmiszer-ipari mérnök', 'Kisállattartó és -tenyésztő', 'Szociológus', 'Lakatos', 'Pszichológus', 'Utcaseprő', 'Adatbázis-tervező és -üzemeltető', 'Gyermekfelügyelő', 'Metróvezető', 'Háztartási alkalmazott', 'Könyvelő', 'Általános irodai adminisztrátor', 'Épületasztalos', 'Ékszerkészítő', 'Üvegező', 'Könyvtári, levéltári nyilvántartó', 'Általános iskolai tanár, tanító', 'Szemétgyűjtő', 'Rendőr', 'Orvosi laboratóriumi asszisztens', 'Kubikos', 'Adatrögzítő', 'Informatikatanár', 'Fizikus', 'Vegyésztechnikus', 'Hímző', 'Ügynök', 'Kalapos', 'Egyéb művészetek tanára', 'Zöldségtermesztő', 'Dísznövény-, virág- és faiskolai kertész, csemetenevelő', 'Csipkeverő', 'Postai ügyfélkapcsolati foglalkozású', 'Tolmács', 'Kódoló', 'Fa- és könnyűipari mérnök', 'Szarvasmarha-, ló-, sertés-, juhtartó és -tenyésztő ', 'Település- és közlekedéstervező mérnök', 'Rendszergazda', 'Állatorvosi asszisztens', 'Újságíró', 'Piaci, utcai étel- és italárus', 'Néprajzkutató', 'Vám- és pénzügyőr', 'Hordár', 'Webrendszer-technikus', 'Hivatalsegéd', 'Üzletpolitikai elemző', 'Fogorvos', 'Statisztikus', 'Stukkózó', 'Utazásszervező', 'Épületbádogos', 'Szociális gondozó', 'Villamosipari technikus (elektronikai technikus)', 'Iratkezelő', 'Matróz', 'Trolibuszvezető', 'Banki pénztáros', 'Szikvízkészítő', 'Kovács', 'Minőségbiztosítási mérnök', 'Csillagász', 'Író', 'Könyvtáros', 'Fényképész', 'Bányászati technikus', 'Üzletpolitikai elemző, szervező', 'Jelnyelvi tolmács', 'Alkalmazásprogramozó', 'Cipőkészítő', 'Drágakőcsiszoló', 'Botanikus', 'Járműtakarító', 'Biztosítási ügynök', 'Gépészmérnök', 'Légiforgalmi irányító', 'Üveggyártó', 'Gumitermékgyártó', 'Repülőgépmotor-karbantartó', 'Építészmérnök', 'Tűzoltó', 'Könyvkötő', 'Pultos', 'Borász', 'Gyógyszerész', 'Kozmetikus', 'Segédápoló', 'Ápoló', 'Fordító', 'Munkavédelmi és üzembiztonsági foglalkozású', 'Végrehajtó, adósságbehajtó', 'Gyógyszertári asszisztens', 'Szőrmefestő', 'Bőrtermékkészítő', 'Műsorszóró és audiovizuális technikus', 'Kártevőirtó', 'Rakodómunkás', 'Szabásminta-készítő', 'Hulladékosztályozó', 'Erdő- és természetvédelmi mérnök', 'Készlet- és anyagnyilvántartó', 'Fogászati asszisztens', 'Séf', 'Könyvszakértő', 'Bróker', 'Áru- és divatbemutató', 'Kölcsönző', 'Épületgondnok', 'Telekommunikációs technikus', 'Környezetvédelmi technikus', 'Házvezető', 'Famegmunkáló', 'Szállodai recepciós', 'Kézi csomagoló', 'Ötvös', 'Csecsemő- és kisgyermeknevelő', 'Kerékpár-karbantartó', 'Operatőr', 'Ügyvéd', 'Szigetelő', 'Fizioterápiás asszisztens', 'Kereskedő', 'Biológus', 'Ruházati gép kezelője és gyártósor mellett dolgozó', 'Szűcs', 'Ügyféltájékoztató', 'Gyógynövénytermesztő', 'Lelkész', 'Énekes', 'Munka- és termelésszervező ', 'Légiforgalmi irányítástechnikus', 'Számítógép-hálózati elemző', 'Szabó', 'Szakács', 'Növényorvos ', 'Testőr', 'Erdő- és természetvédelmi technikus', 'Kőfaragó', 'Bányászati szakmai irányító', 'Régész', 'Lakossági kérdező', 'Számviteli ügyintéző', 'Természetvédelmi őr', 'Egyetemi, főiskolai oktató', 'Óvodapedagógus', 'Gyomírtó', 'Növényvédelmi szakértő', 'Védőnő', 'Egészségügyi dokumentátor ', 'Finommechanikai műszerész', 'Műszaki rajzoló', 'Demográfus', 'Általános orvos', 'Fedélzeti tiszt', 'Vagyonőr', 'Rendszerelemző', 'Tímár', 'Hajózómérnök', 'Hálózat- és multimédia-fejlesztő', 'Konyhai kisegítő', 'Mozigépész', 'Épületvillamossági szerelő', 'Bionövény-termesztő', 'Fogtechnikus', 'Büntetés-végrehajtási őr', 'Erdész', 'Vízgazdálkodási gépkezelő', 'Szerszámkészítő', 'Vegyészmérnök', 'Festő', 'Iratkezelő, irattáros', 'Légiforgalmi irányítástechnikai berendezések üzemeltetője', 'Masszőr', 'Zenetanár', 'Zálogházi ügyintéző és pénzkölcsönző', 'Jogtanácsos', 'Tehergépkocsi-vezető', 'Bolti eladó', 'Pénzintézeti ügyintéző', 'Növényorvosi asszisztens', 'Fitnesz- és rekreációs program irányítója', 'Zeneszerző', 'Építményszerkezet-szerelő', 'Vegyes profilú gazdálkodó', 'Pultfeltöltő', 'Képzőművész', 'Végrehajtó', 'Szerencsejáték-szervező', 'Jegypénztáros', 'Konyhafőnök', 'Műtőssegéd', 'Adótanácsadó', 'Jogász', 'Orvosi képalkotó diagnosztikai asszisztens', 'Zoológus', 'Látszerész', 'Szállítási, szállítmányozási nyilvántartó', 'Kárpitos', 'Házi gondozó', 'Táncművész', 'Cipész', 'Élelmiszer-ipari technikus', 'Zenész', 'Könyvelő (analitikus)', 'Felvásárló', 'Személyzeti és pályaválasztási szakértő', 'Bányamérnök', 'Pincér', 'Mosodai gép kezelője', 'Dietetikus', 'Rendező', 'Bognár', 'Targoncavezető', 'Hobbiállat-gondozó', 'Segédrendező', 'Marketing- és PR-ügyintéző', 'Bőrdíszműves', 'Darukezelő', 'Hallás- és beszédterapeuta', 'Konduktor', 'Villamosmérnök (energetikai mérnök)', 'Meteorológus', 'Táplálkozási tanácsadó', 'Cirkuszi előadóművész', 'Húsfeldolgozó', 'Vezető eladó', 'Könyvvizsgáló', 'Feldolgozóipari szakmai irányító', 'Pedagógiai szakértő', 'Telefonos értékesítési ügynök', 'Villamosvezető', 'Baromfitartó és -tenyésztő', 'Politológus', 'Mérőóra-leolvasó', 'Egyéb növénytermesztési foglalkozású', 'Méhész', 'Felvonószerelő', 'Személygépkocsi-vezető', 'Textilműves', 'Építő- és építésztechnikus', 'Bőröndös', 'Gipszkartonozó', 'Kalauz', 'Járművezető-oktató', 'Bérelszámoló', 'Bútorasztalos', 'Villanyszerelő', 'Kesztyűs', 'Nyomdai előkészítő', 'Mezőgazdasági technikus', 'Szőlő-, gyümölcstermesztő', 'Oktatási asszisztens', 'Édesiparitermék-gyártó', 'Fodrász', 'Nyomdász', 'Keramikus', 'Általános egészségügyi asszisztens', 'Ács', 'Kereskedelmi ügyintéző', 'Környezetfelmérő', 'Kéményseprő', 'Fotó- és mozgófilmlaboráns', 'Statisztikai ügyintéző', 'Szakképzett edző', 'Fa- és könnyűipari technikus', 'Múzeumi gyűjteménygondnok', 'Árufeltöltő', 'Idegenvezető', 'Mozdonyvezető', 'Kohó- és anyagmérnök', 'Műköves', 'Állatorvos', 'Földmérő és térinformatikai technikus ', 'Nyelvtanár', 'Ügyész', 'Sportoló', 'Címfestő', 'Nyelvész', 'Gyógypedagógus', 'Üzemanyagtöltő állomás kezelője', 'Fémcsiszoló', 'Kulturális szervező', 'Lakberendező', 'Grafikus és multimédia-tervező ', 'Középiskolai tanár', 'Cukrász', 'Légijármű-vezető', 'Sportszervező', 'Parkolóőr', 'Favágó', 'Matematikus', 'Pénzügyi elemző és befektetési tanácsadó', 'Konferencia- és rendezvényszervező', 'Faesztergályos', 'Kályha- és kandallóépítő', 'Közjegyző', 'Festékszóró', 'Statiszta', 'Minőségbiztosítási technikus', 'Épületszerkezet-tisztító', 'Menetjegyellenőr', 'Kereskedelmi tervező ', 'Munkaerő-piaci szolgáltatási ügyintéző', 'Adószakértő', 'Hegesztő', 'Gyorséttermi eladó', 'Iparművész', 'Díszítő', 'Szociálpolitikus', 'Gyártmány- és ruhatervező', 'Ingatlanforgalmazási ügyintéző', 'Kormányos', 'Díszletező', 'Segédszínész', 'Levéltáros', 'Robbantómester', 'Villamosipari technikus (energetikai technikus)', 'Ortopédiai eszközkészítő', 'Gépésztechnikus', 'Szociális segítő', 'Pék', 'Ipari alpinista', 'Villamosmérnök (elektronikai mérnök)', 'Személyi asszisztens', 'Ablaktisztító', 'Portás', 'Filozófus', 'Forgácsoló', 'Bábművész', 'Kárszakértő', 'Humánpolitikai adminisztrátor', 'Hangszerkészítő', 'Társadalombiztosítási és segélyezési hatósági ügyintéző', 'Optometrista', 'Szántóföldinövény-termesztő', 'Ingatlanügynök', 'Nyomozó', 'Egyéb, máshova nem sorolható technikus', 'Vezető takarító', 'Autóbuszvezető', 'Kárbecslő', 'Piaci árus', 'Bíró', 'Általános iskolai tanár', 'Szerszámköszörűs', 'Építőipari szakmai irányító') + + def job(self): + return self.random_element(self.jobs) diff --git a/src/libs/faker/providers/job/ko_KR/__init__.py b/src/libs/faker/providers/job/ko_KR/__init__.py new file mode 100644 index 0000000..dbf852a --- /dev/null +++ b/src/libs/faker/providers/job/ko_KR/__init__.py @@ -0,0 +1,436 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +# Reference : http://zetawiki.com/wiki/%ED%95%9C%EA%B5%AD%ED%91%9C%EC%A4%80%EC%A7%81%EC%97%85%EB%B6%84%EB%A5%98_%ED%91%9C +# on 2017-08-30 +class Provider(BaseProvider): + jobs=[ + '의회의원/고위공무원 및 공공단체임원', + '기업고위임원', + '정부행정 관리자', + '경영지원 관리자', + '기타 행정 및 경영지원 관리자', + '연구 관리자', + '교육 관리자', + '법률/경찰/소방 및 교도 관리자', + '보험 및 금융 관리자', + '보건의료관련 관리자', + '사회복지관련 관리자', + '문화/예술/디자인 및 영상관련 관리자', + '정보통신관련 관리자', + '기타 전문서비스 관리자', + '건설 및 광업 관련 관리자', + '전기/가스 및 수도 관련 관리자', + '제품 생산관련 관리자', + '기타 건설/전기 및 생산 관련 관리자', + '영업 및 판매 관련 관리자', + '운송관련 관리자', + '숙박/여행/오락 및 스포츠 관련 관리자', + '음식서비스관련 관리자', + '환경/청소 및 경비 관련 관리자', + '기타 판매 및 고객 서비스 관리자', + '생명과학 연구원', + '자연과학 연구원', + '인문과학 연구원', + '사회과학 연구원', + '생명과학 시험원', + '농림어업관련 시험원', + '자연과학 시험원', + '컴퓨터 하드웨어 기술자 및 연구원', + '통신공학 기술자 및 연구원', + '컴퓨터시스템 설계 및 분석가', + '시스템 소프트웨어 개발자', + '응용 소프트웨어 개발자', + '데이터베이스 개발자', + '네트워크시스템 개발자', + '컴퓨터 보안 전문가', + '웹 및 멀티미디어 기획자', + '웹 개발자', + '정보 시스템 운영자', + '통신 및 방송송출 장비 기사', + '건축가 및 건축공학 기술자', + '토목공학 기술자', + '조경 기술자', + '도시 및 교통설계 전문가', + '측량 및 지리정보 전문가', + '건설자재 시험원', + '화학공학 기술자 및 연구원', + '화학공학 시험원', + '금속 / 재료공학 연구원 및 기술자', + '금속 / 재료공학 시험원', + '환경공학 기술자 및 연구원', + '환경공학 시험원', + '전기공학 기술자 및 연구원', + '전자공학 기술자 및 연구원', + '기계공학 기술자 및 연구원', + '전기/전자 및 기계 공학 시험원', + '산업안전 및 위험 관리원', + '보건위생 및 환경 검사원', + '비파괴 검사원', + '항공기 조종사', + '선장/항해사 및 도선사', + '관제사', + '식품공학 기술자 및 연구원', + '섬유공학 기술자 및 연구원', + '가스/에너지 기술자 및 연구원', + '소방공학 기술자 및 연구원', + '식품/섬유 공학 및 에너지 시험원', + '캐드원', + '기타 공학관련 기술자 및 시험원', + '전문 의사', + '일반 의사', + '한의사', + '치과 의사', + '수의사', + '약사 및 한약사', + '간호사', + '영양사', + '임상병리사', + '방사선사', + '치과기공사', + '치과위생사', + '의지보조기기사', + '물리 및 작업 치료사', + '임상 심리사 및 기타 치료사', + '응급구조사', + '위생사', + '안경사', + '의무기록사', + '간호조무사', + '안마사', + '사회복지사', + '보육 교사', + '직업상담사 및 취업 알선원', + '상담 전문가 및 청소년 지도사', + '시민 단체 활동가', + '기타 사회복지관련 종사원', + '성직자', + '기타 종교관련 종사자', + '대학 교수', + '대학 시간강사', + '중/고등학교 교사', + '초등학교 교사', + '특수교육 교사', + '유치원 교사', + '문리 및 어학 강사', + '컴퓨터 강사', + '기술 및 기능계 강사', + '예능 강사', + '학습지 및 방문 교사', + '기타 문리/기술 및 예능 강사', + '장학관/연구관 및 교육 관련 전문가', + '대학 교육조교', + '보조 교사 및 기타 교사', + '판사 및 검사', + '변호사', + '법무사 및 집행관', + '변리사', + '정부 및 공공 행정 전문가', + '인사 및 노사 관련 전문가', + '회계사', + '세무사', + '관세사', + '경영 및 진단 전문가', + '투자 및 신용 분석가', + '자산 운용가', + '보험 및 금융 상품 개발자', + '증권 및 외환 딜러', + '손해사정인', + '기타 금융 및 보험 관련 전문가', + '상품기획 전문가', + '여행상품 개발자', + '광고 및 홍보 전문가', + '조사 전문가', + '행사기획자', + '감정평가 전문가', + '해외 영업원', + '기술 영업원', + '상품중개인 및 경매사', + '부동산 컨설턴트 및 중개인', + '기타 기술영업 및 중개 관련 종사자', + '작가 및 관련 전문가', + '번역가', + '통역가', + '기자 및 논설위원', + '출판물 전문가', + '큐레이터 및 문화재 보존원', + '사서 및 기록물관리사', + '감독 및 기술감독', + '배우 및 모델', + '아나운서 및 리포터', + '촬영기사', + '음향 및 녹음 기사', + '영상/녹화 및 편집 기사', + '조명기사 및 영사기사', + '기타 연극/영화 및 영상 관련 종사자', + '화가 및 조각가', + '사진기자 및 사진가', + '만화가 및 만화영화 작가', + '국악 및 전통예능인', + '지휘자/작곡가 및 연주가', + '가수 및 성악가', + '무용가 및 안무가', + '제품 디자이너', + '패션 디자이너', + '실내장식 디자이너', + '시각 디자이너', + '웹 및 멀티미디어 디자이너', + '경기감독 및 코치', + '직업 운동선수', + '경기심판 및 경기기록원', + '스포츠 및 레크레이션 강사', + '기타 스포츠 및 레크레이션 관련 전문가', + '연예인 및 스포츠 매니저', + '마술사 및 기타 문화/ 예술 관련 종사자', + '조세행정 사무원', + '관세행정 사무원', + '병무행정 사무원', + '국가/지방 및 공공행정 사무원', + '기획 및 마케팅 사무원', + '인사 및 교육/훈련 사무원', + '자재관리 사무원', + '생산 및 품질 관리 사무원', + '무역 사무원', + '운송 사무원', + '총무 사무원', + '회계 사무원', + '경리 사무원', + '비서', + '전산 자료 입력원 및 사무 보조원', + '출납창구 사무원', + '보험 심사원 및 사무원', + '금융관련 사무원', + '신용 추심원', + '법률관련 사무원', + '감사 사무원', + '통계관련 사무원', + '여행 사무원', + '안내 / 접수 사무원 및 전화교환원', + '고객 상담 및 모니터 요원', + '기타 사무원', + '경찰관', + '소방관', + '소년보호관 및 교도관', + '경호원', + '청원 경찰', + '무인 경비원', + '기타 경호 및 보안 관련 종사원', + '간병인', + '기타 의료/복지 관련 서비스 종사원', + '이용사', + '미용사', + '피부미용 및 체형관리사', + '메이크업 아티스트 및 분장사', + '애완동물 미용사', + '기타 미용관련 서비스 종사원', + '결혼 상담원 및 웨딩플래너', + '혼례 종사원', + '장례 상담원 및 장례 지도사', + '기타 이미용/예식 및 의료보조 서비스 종사원', + '항공기 객실승무원', + '선박 및 열차 객실승무원', + '여행 및 관광통역 안내원', + '숙박시설 서비스원', + '오락시설 서비스원', + '기타 여가 및 스포츠 관련 종사원', + '한식 주방장 및 조리사', + '중식 주방장 및 조리사', + '양식 주방장 및 조리사', + '일식 주방장 및 조리사', + '기타 주방장 및 조리사', + '바텐더', + '웨이터', + '기타 음식서비스 종사원', + '자동차 영업원', + '제품 및 광고 영업원', + '보험 설계사 및 간접투자증권 판매인', + '상점 판매원', + '매표원 및 복권 판매원', + '매장계산원 및 요금정산원', + '상품 대여원', + '방문 판매원', + '통신서비스판매원', + '텔레마케터', + '인터넷 판매원', + '노점 및 이동 판매원', + '홍보 도우미 및 판촉원', + '곡식작물 재배원', + '채소 및 특용작물 재배원', + '과수작물 재배원', + '원예작물 재배원', + '조경원', + '낙농업관련 종사원', + '가축 사육 종사원', + '기타 사육관련 종사원', + '조림/영림 및 벌목원', + '임산물채취 및 기타 임업 관련 종사원', + '양식원', + '어부 및 해녀', + '제빵원 및 제과원', + '떡제조원', + '정육원 및 도축원', + '식품 및 담배 등급원', + '김치 및 밑반찬 제조 종사원', + '기타 식품가공관련 종사원', + '패턴사', + '재단사', + '재봉사', + '제화원', + '기타 섬유 및 가죽 관련 기능 종사원', + '한복 제조원', + '양장 및 양복 제조원', + '모피 및 가죽의복 제조원', + '의복/가죽 및 모피 수선원', + '기타 의복 제조원', + '목제품 제조관련 종사원', + '가구 제조 및 수리원', + '악기제조 및 조율사', + '간판 제작 및 설치원', + '금형원', + '주조원', + '단조원', + '제관원', + '판금원', + '용접원', + '자동차 정비원', + '항공기 정비원', + '선박 정비원', + '철도 기관차 및 전동차 정비원', + '기타 운송장비 정비원', + '공업기계 설치 및 정비원', + '승강기 설치 및 정비원', + '물품 이동 장비 설치 및 정비원', + '냉동/냉장 /공조기 설치 및 정비원', + '보일러 설치 및 정비원', + '건설 및 광업기계 설치 및 정비원', + '농업용 및 기타 기계장비 설치 및 정비원', + '', + '가전제품 설치 및 수리원', + '기타 전기/전자기기 설치 및 수리원', + '산업전공', + '내선전공', + '외선전공', + '강구조물 가공원 및 건립원', + '경량 철골공', + '철근공', + '콘크리트공', + '건축 석공', + '건축 목공', + '조적공 및 석재 부설원', + '기타 건설관련 기능 종사원', + '미장공', + '방수공', + '단열공', + '바닥재 시공원', + '도배공 및 유리 부착원', + '건축 도장공', + '섀시 조립 및 설치원', + '기타 건축마감관련 기능 종사원', + '광원/채석원 및 석재 절단원', + '철로 설치 및 보수원', + '기타 채굴 및 토목 관련 종사자', + '영상 및 관련 장비 설치 및 수리원', + '통신 및 관련 장비 설치 및 수리원', + '통신/방송 및 인터넷 케이블 설치 및 수리원', + '공예원', + '귀금속 및 보석 세공원', + '건설 배관공', + '공업 배관공', + '기타 배관공', + '배관 세정원 및 방역원', + '기타 기능관련 종사원', + '제분 및 도정 관련 기계 조작원', + '곡물가공제품 기계 조작원', + '육류/어패류 및 낙농품 가공 기계조작원', + '과실 및 채소 관련 기계조작원', + '음료 제조관련 기계 조작원', + '기타 식품가공관련 기계조작원', + '섬유제조 기계조작원', + '표백 및 염색 관련 조작원', + '직조기 및 편직기 조작원', + '신발제조기 조작원 및 조립원', + '기타 직물 및 신발 관련 기계조작원 및 조립원', + '세탁관련 기계조작원', + '석유 및 천연가스제조 관련 제어장치 조작원', + '화학물 가공장치 조작원', + '기타 석유 및 화학물 가공장치 조작원', + '화학제품 생산기 조작원', + '타이어 및 고무제품 생산기 조작원', + '플라스틱제품 생산기 조작원', + '고무 및 플라스틱 제품 조립원', + '주조기 조작원', + '단조기 조작원', + '용접기 조작원', + '금속가공관련 제어장치 조작원', + '금속가공 기계조작원', + '제관기 조작원', + '판금기 조작원', + '도장기 조작원', + '도금 및 금속분무기 조작원', + '유리제조 및 가공기 조작원', + '점토제품 생산기 조작원', + '시멘트 및 광물제품 제조기 조작원', + '광석 및 석제품 가공기 조작원', + '기타 비금속제품관련 생산기 조작원', + '금속공작기계 조작원', + '냉/난방 관련 설비 조작원', + '자동조립라인 및 산업용 로봇 조작원', + '자동차 조립원', + '자동차 부분품 조립원', + '운송장비 조립원', + '일반기계 조립원', + '금속기계부품 조립원', + '발전 및 배전장치 조작원', + '전기 및 전자 설비 조작원', + '전기 부품 및 제품제조 기계조작원', + '전자 부품 및 제품 제조 기계조작원', + '전기/전자 부품 및 제품 조립원', + '철도 및 전동차 기관사', + '화물열차 차장 및 관련 종사원', + '택시 운전원', + '버스 운전원', + '화물차 및 특수차 운전원', + '기타 자동차 운전원', + '물품이동 장비 조작원', + '건설 및 채굴 기계 운전원', + '선박 갑판승무원 및 관련 종사원', + '상/하수도 처리장치 조작원', + '재활용 처리 및 소각로 조작원', + '목재 가공관련 기계 조작원', + '가구조립원', + '펄프 및 종이 제조장치 조작원', + '종이제품 생산기 조작원', + '기타 목재 및 종이 관련 기계조작원', + '인쇄기 조작원', + '사진인화 및 현상기 조작원', + '기타 제조관련 기계 조작원', + '건설 및 광업 단순 종사원', + '하역 및 적재 단순 종사원', + '우편물 집배원', + '택배원', + '음식 배달원', + '기타 배달원', + '제조관련 단순 종사원', + '청소원', + '환경 미화원 및 재활용품 수거원', + '경비원', + '검표원', + '가사 도우미', + '육아 도우미', + '패스트푸드원', + '주방 보조원', + '주유원', + '기타 판매관련 단순 종사원', + '농림어업관련 단순 종사원', + '계기 검침원 및 가스점검원', + '수금원', + '주차 관리원 및 안내원', + '구두 미화원', + '세탁원 및 다림질원', + '기타 서비스관련 단순 종사원', + '영관급 이상', + '위관급', + '장기 부사관 및 준위' + ] diff --git a/src/libs/faker/providers/job/pl_PL/__init__.py b/src/libs/faker/providers/job/pl_PL/__init__.py new file mode 100644 index 0000000..54e6bcb --- /dev/null +++ b/src/libs/faker/providers/job/pl_PL/__init__.py @@ -0,0 +1,226 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + jobs = [ + "Agent celny", + "Agent firmy inwestycyjnej", + "Agent literacki", + "Agent ubezpieczeniowy", + "Agronom", + "Aktor", + "Aktor dziecięcy", + "Aktor głosowy", + "Aktuariusz", + "Animator kultury", + "Ankieter", + "Antykwariusz", + "Arborysta", + "Archeolog", + "Architekt krajobrazu", + "Architekt wnętrz", + "Archiwista", + "Artysta-rezydent", + "Astronom", + "Audytor efektywności energetycznej", + "Babcia klozetowa", + "Bankowiec", + "Barista", + "Barman", + "Bibliotekarz", + "Bibliotekarz dyplomowany", + "Biegły rewident", + "Brakarz", + "Broker", + "Broker informacji", + "Broker ubezpieczeniowy", + "Certyfikator energetyczny", + "Charakteryzator", + "Detektyw", + "Deweloper budowlany", + "Doker", + "Doradca finansowy", + "Doradca inwestycyjny", + "Doradca podatkowy w Polsce", + "Doradca ubezpieczeniowy", + "Drwal", + "Dubler", + "Dyplomata", + "Dyrektor artystyczny", + "Dyrektor finansowy", + "Dyrektor kreatywny", + "Dziennikarz", + "Dżokej", + "Ebenista", + "Ekonomista", + "Ekwilibrystyka", + "Elektromonter pomiarów", + "Ergonomista", + "Fasowacz", + "Finansista", + "Fotoreporter", + "Geodeta", + "Geolog", + "Główny księgowy", + "Grabarz", + "Handlarz", + "Hostessa", + "Hutnik", + "Hycel", + "Hydraulik", + "Iluzjonista", + "Inscenizator", + "Instruktor", + "Integrator automatyki", + "Intendent", + "Inżynier", + "Inżynier budownictwa", + "Kasjer biletowy", + "Katecheta", + "Kawalkator", + "Kawiarka", + "Kelner", + "Kierowca", + "Kiper", + "Klechdarz", + "Konferansjer", + "Koniarze", + "Konserwator zabytków", + "Konsjerż", + "Konstruktor", + "Konsultant", + "Konsultant ślubny", + "Kontroler biletów", + "Kornak", + "Kosmonauta", + "Kostiumograf", + "Kosztorysant", + "Kowboj", + "Krojczy", + "Krupier", + "Ksiądz", + "Księgowy", + "Kuk", + "Kupiec", + "Kurator sądowy", + "Kurator sztuki", + "Kurier", + "Kurier rowerowy", + "Lalkarz", + "Leśniczy", + "Liczmen", + "Likwidator szkód", + "Listonosz", + "Łącznik", + "Makler giełd towarowych", + "Makler morski", + "Makler nadzorujący", + "Makler papierów wartościowych", + "Marketingowiec", + "Marynarz", + "Masztalerz", + "Menedżer kultury", + "Meteorolog", + "Mim", + "Model", + "Modelka dużych rozmiarów", + "Motorniczy", + "Nadleśniczy", + "Nauczyciel", + "Nauczyciel akademicki", + "Naukowiec", + "Niania", + "Oceanonauta", + "Ochroniarz", + "Pakowacz", + "Palacz", + "Perfumiarz", + "Pisarz", + "Plastyk", + "Podleśniczy", + "Poganiacz", + "Pokojówka", + "Politolog", + "Polityk", + "Portier", + "Pośrednik finansowy", + "Pośrednik ubezpieczeniowy", + "Pośrednik w obrocie nieruchomościami", + "Pracownicy uczelni w Polsce", + "Pracownik socjalny", + "Prezenter", + "Producent wykonawczy", + "Projektant gier komputerowych", + "Przedstawiciel handlowy", + "Przewodnik turystyczny", + "Psiarz", + "Psycholog", + "Pucybut", + "Rachmistrz", + "Ratownik", + "Ratownik przedmedyczny", + "Redaktor", + "Redaktor merytoryczny", + "Redaktor naukowy", + "Redaktor techniczny", + "Rekwizytor", + "Reporter wojenny", + "Reżyser", + "Robotnik", + "Rolnik", + "Rybak", + "Rzecznik prasowy", + "Rzeczoznawca", + "Rzeczoznawca budowlany", + "Rzeczoznawca majątkowy", + "Rzeczoznawca samochodowy", + "Salowa", + "Satyryk", + "Scenarzysta", + "Scenograf", + "Służący", + "Sprzątacz", + "Sprzedawca", + "Stajenny", + "Strażak", + "Sufler", + "Supermodelka", + "Syndyk", + "Syndyk licencjonowany", + "Szatniarz", + "Szczurołap", + "Szlifierz", + "Sztygar", + "Taksówkarz", + "Technik awionik", + "Technik budownictwa", + "Technik elektronik", + "Technik handlowiec", + "Technik kelner", + "Technik mechanik", + "Technik mechanik lotniczy", + "Technik mechanik okrętowy", + "Technik nawigator morski", + "Technik ochrony środowiska", + "Technik technologii drewna", + "Technik weterynarii", + "Technik żywienia i gospodarstwa domowego", + "Teksturator", + "Terapeuta", + "Terminolog", + "Tłumacz", + "Tłumacz literacki", + "Tłumacz przysięgły", + "Tokarz", + "Trener", + "Trener personalny", + "Urbanista", + "Lekarz weterynarii", + "Wydawca", + "Zarządca nieruchomości", + "Zoopsycholog", + "Żołnierz", + "Żongler" + ] diff --git a/src/faker/providers/ru_RU/job.py b/src/libs/faker/providers/job/ru_RU/__init__.py similarity index 99% rename from src/faker/providers/ru_RU/job.py rename to src/libs/faker/providers/job/ru_RU/__init__.py index 349a145..7d733ff 100644 --- a/src/faker/providers/ru_RU/job.py +++ b/src/libs/faker/providers/job/ru_RU/__init__.py @@ -1,11 +1,11 @@ # coding=utf-8 from __future__ import unicode_literals -from .. import BaseProvider +from .. import Provider as BaseProvider # Russian jobs taken from the Wikipedia page # https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D1%80%D0%BE%D1%84%D0%B5%D1%81%D1%81%D0%B8%D0%B9 class Provider(BaseProvider): - jobs=["Авиадиспетчер", + jobs=["Авиадиспетчер", "Авиатехник", "Авиационный техник", "Автогонщик", @@ -545,6 +545,3 @@ class Provider(BaseProvider): "Ювелир", "Юрисконсульт", "Юрист"] - @classmethod - def job(cls): - return cls.random_element(cls.jobs) diff --git a/src/libs/faker/providers/job/uk_UA/__init__.py b/src/libs/faker/providers/job/uk_UA/__init__.py new file mode 100644 index 0000000..a4c0646 --- /dev/null +++ b/src/libs/faker/providers/job/uk_UA/__init__.py @@ -0,0 +1,65 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +# Ukrainian job names taken from +# https://uk.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D1%80%D0%BE%D1%84%D0%B5%D1%81%D1%96%D0%B9 +# on 22th September 2014 +class Provider(BaseProvider): + jobs = [ + # А + 'Агроном', 'Адвокат', 'Актор', 'Акушер', 'Антрополог', 'Архітектор', 'Археолог', 'Астронавт', 'Астроном', + 'Астрофізик', + # Б + 'Бібліограф', 'Біолог', 'Бізнесмен', 'Ботанік', 'Будник', 'Бухгалтер', 'Бібліотекар', + # В + 'Ветеринар', 'Випробувач', 'Водій', 'Вчитель', 'Візажист', + # Г + 'Географ', 'Геолог' 'Геофізик' 'Гицель', 'Гінеколог', 'Гірник', 'Гірничий інженер', 'Головний меркшейдер', + 'Графік', 'Громадський діяч', + # Ґ + 'Ґрунтознавець', + # Д + 'Державний службовець', 'Дерун', 'Детектив', 'Дизайнер', 'Дипломат', 'Диригент', 'Доцент', 'Драматург', + 'Ді-джей', 'Дантист', + # Е + 'Економіст', 'Електрик', 'Електромонтер', 'Електромонтажник', 'Електрослюсар', 'Електротехнік', 'Епідеміолог', + 'Етнограф', + # Є + 'Євнух', 'Єгер', + # Ж + 'Журналіст', 'Живописець', + # З + 'Золотар', 'Зоолог', + # І + 'Інженер', 'Історик', + # К + 'Каскадер', 'Кінорежисер', 'Клавішник', 'Клоун', 'Композитор', 'Конструктор', 'Краєзнавець', 'Кушнір', + 'Кіноактор', 'Кінокритик', 'Кінорежисер', 'Кур\'єр', 'Кухар', 'Кінолог', 'Круп\'є', + # Л + 'Льотчик', 'Лікар', 'Літературознавець', 'Локсмайстер', + # М + 'Математик', 'Машиніст', 'Медик', 'Менеджер', 'Мистецтвознавець', 'Мірошник', 'Мікробіолог', 'Мінералог', + 'Мовознавець', 'Модель', 'Модельєр', 'Музикант', 'Музикознавець', 'Музичний редактор', 'Маркетолог', + 'М\'ясник', + # Н + 'Намотувальник', 'Науковець', 'Няня', 'Нотаріус', + # П + 'Палеонтолог', 'Паралегал', 'Парфюмер', 'Патологоанатом', 'Педагог', 'Пекар', 'Перекладач', 'Петрограф', + 'Письменник', 'Піаніст', 'Підприємець', 'Пілот', 'Правник', 'Програміст', 'Провізор', 'Прокурор', + 'Промисловець', 'Професор', 'Психолог', 'Публіцист', 'Продюсер', 'Паблік рилейшнз', + # Р + 'Режисер', 'Різноробочий', 'Реабілітолог', 'Редактор', 'Реставратор', 'Ріелтор', + # С + 'Сантехнік', 'Складальник', 'Скульптор', 'Соціолог', 'Співак', 'Сценарист', 'Стропальник', 'Стоматолог', + 'Слідчий', 'Стиліст', 'Секретар', + # Ф + 'Фармацевт', 'Фермер', 'Фізик', 'Філолог', 'Фольклорист', 'Фотограф', 'Фрілансер', 'Футболіст', 'Флорист', + # Х + 'Хімік', 'Художник', 'Хореограф', + # Ш + 'Шериф', 'Швачка', 'Штукатур', + # Ю + 'Ювелір', 'Юрист' + ] diff --git a/src/libs/faker/providers/job/zh_TW/__init__.py b/src/libs/faker/providers/job/zh_TW/__init__.py new file mode 100644 index 0000000..6aa4110 --- /dev/null +++ b/src/libs/faker/providers/job/zh_TW/__init__.py @@ -0,0 +1,483 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +# Taiwan jobs from +# http://www.104.com.tw/public/function01/utf8/jsonJobCat.js +# on Fri May 20 23:13:46 CST 2016 +class Provider(BaseProvider): + jobs = [ + 'BIOS工程師', + 'CAD/CAM工程師', + 'CNC機台操作人員', + 'CNC電腦程式編排人員', + 'EMC/電子安規工程師', + 'FAE工程師', + 'IC佈局工程師', + 'IC封裝/測試工程師', + 'ISO/品保人員', + 'Internet程式設計師', + 'LCD製程工程師', + 'LCD設備工程師', + 'MES工程師', + 'MIS程式設計師', + 'MIS/網管主管', + 'OP/旅行社人員', + 'PCB佈線工程師', + 'PCB技術人員', + 'RF通訊工程師', + 'SMT工程師', + '一般動物飼育工作者', + '不動產產權審核/估價師', + '不動產經紀人', + '不動產/商場開發人員', + '中等學校教師', + '中醫師', + '中餐廚師', + '主持人', + '主管特別助理', + '主辦會計', + '人力資源主管', + '人力資源人員', + '人力資源助理', + '人力/外勞仲介', + '代書/地政士', + '估算人員', + '作曲家', + '作業員/包裝員', + '保全人員/警衛', + '保全技術人員', + '保安服務工作', + '保稅人員', + '保險業務/經紀人', + '倉儲物流人員', + '倉管', + '催收人員', + '傳播媒體企劃人員', + '傳銷人員', + '儲備幹部', + '光學工程師', + '光電工程師', + '光電工程研發主管', + '內業工程師', + '公共衛生人員', + '公共衛生醫師', + '公家機關人員', + '券商後線人員', + '副教授', + '加油員', + '助教', + '助理工程師', + '助理教授', + '勞工安全衛生管理人員', + '勞工安全衛生管理師', + '包裝設計', + '化學工程研發人員', + '化學研究員', + '化工化學工程師', + '升學補習班老師', + '半導體工程師', + '半導體製程工程師', + '半導體設備工程師', + '印前製作/印刷技術人員', + '可靠度工程師', + '吊車/起重機設備操作員', + '呼吸治療師', + '品牌宣傳及媒體公關', + '品管/品保主管', + '品管/品保工程師', + '品管/檢驗人員', + '哲學/歷史/政治研究人員', + '售票/收銀人員', + '商業設計', + '商標/專利人員', + '噴漆人員', + '國內業務主管', + '國內業務人員', + '國外業務主管', + '國外業務人員', + '國小學校教師', + '國貿人員', + '圖書資料管理人員', + '土地開發人員', + '土木技師/土木工程師', + '地勤人員', + '地質與地球科學研究員', + '塑膠射出技術人員', + '塑膠模具技術人員', + '塗裝技術人員', + '壓鑄模具技術人員', + '外務/快遞/送貨', + '多媒體動畫設計師', + '多媒體開發主管', + '大樓管理員', + '大貨車司機', + '天文研究員', + '太陽能技術工程師', + '娛樂事業人員', + '媒體公關/宣傳採買', + '安全/衛生檢驗人員', + '安心服務員', + '安親班老師', + '客戶服務主管', + '客戶服務人員', + '室內設計/裝潢人員', + '家事服務人員', + '家庭代工', + '實驗化驗人員', + '寵物美容專業人員', + '專案業務主管', + '專案管理主管', + '專案管理師', + '專科護理師', + '導播', + '導演', + '導遊', + '小客車司機', + '小貨車司機', + '居家服務督導員', + '展場/櫥窗佈置人員', + '工務人員/助理', + '工商登記服務人員', + '工地監工/主任', + '工廠主管', + '工業工程師/生產線規劃', + '工業設計', + '工程助理', + '工程研發主管', + '工程配管繪圖', + '工讀生', + '市場調查/市場分析', + '平面設計/美編人員', + '幼教班老師', + '店長/賣場管理人員', + '廠務', + '廠務助理', + '廣告AE業務人員', + '廣告企劃主管', + '廣告文案/企劃', + '廣告設計', + '建築師', + '建築物清潔工', + '建築物電力系統維修工', + '建築設計/繪圖人員', + '影片製作技術人員', + '律師', + '復建技術師', + '微機電工程師', + '心理學研究人員', + '志工人員', + '志願役軍官/士官/士兵', + '應用科學研究員', + '成本會計', + '手工包裝工', + '才藝類老師', + '打版人員', + '技術文件/說明書編譯', + '按摩/推拿師', + '排版人員', + '採購主管', + '採購人員', + '採購助理', + '推土機設備操作員', + '播音/配音人員', + '攝影助理', + '攝影師', + '放射性設備使用技術員', + '救生員', + '教保員', + '教授', + '教育訓練人員', + '整體造型師', + '數位IC設計工程師', + '數學研究員', + '數理補習班老師', + '文件管理師', + '文編/校對/文字工作者', + '旅遊休閒類主管', + '日式廚師', + '日文翻譯/口譯人員', + '星象占卜人員', + '景觀設計師', + '會計師', + '服裝/皮包/鞋類設計', + '木工', + '材料研發人員', + '板金技術員', + '林木伐運工作者', + '染整技術人員', + '查帳/審計人員', + '核保/保險內勤人員', + '業務助理', + '業務支援工程師', + '樂器製造員', + '模特兒', + '機械加工技術人員', + '機械工程師', + '機械操作員', + '機械裝配員', + '機械設計/繪圖人員', + '機構工程師', + '機電技師/工程師', + '櫃檯接待人員', + '氣象研究員', + '水保工程師', + '水保技師', + '水利工程師', + '水產養殖工作者', + '水電工', + '水電工程師', + '水電工程繪圖人員', + '汽車美容人員', + '汽車銷售人員', + '汽車/機車引擎技術人員', + '汽車/機車技術維修人員', + '沖壓模具技術人員', + '油漆工', + '治療師', + '法務人員', + '法務助理', + '法務/智財主管', + '法律專業人員', + '泥水小工', + '泥水工', + '洗碗人員', + '活動企劃人員', + '派報生/傳單派送', + '消防員', + '消防專業人員', + '混凝土工', + '清潔工', + '測試人員', + '演員', + '演奏家', + '演算法開發工程師', + '焊接及切割技術員', + '照顧指導員', + '照顧服務員', + '熱傳工程師', + '燈光/音響師', + '營建主管', + '營建構造工', + '營造工程師', + '營運管理師', + '營養師', + '牙醫助理', + '牙醫師', + '物理治療師', + '物理研究員', + '物管/資材', + '特殊工程師', + '特殊教育教師', + '特用化學工程師', + '獸醫師', + '珠寶及貴金屬技術員', + '珠心算老師', + '理賠人員', + '環境工程師', + '生命禮儀師', + '生物學專業與研究', + '生物科技研發人員', + '生產技術/製程工程師', + '生產管理主管', + '生產設備工程師', + '生管', + '生管助理', + '生鮮人員', + '產品事業處主管', + '產品企劃主管', + '產品企劃開發人員', + '產品售後技術服務', + '產品管理師', + '產品維修人員', + '產品行銷人員', + '病理藥理研究人員', + '發包人員', + '發行企劃/出版人員', + '砌磚工', + '研究人員', + '研究助理', + '硬體工程研發主管', + '硬體測試工程師', + '硬體研發工程師', + '社工人員', + '社會/人類學研究人員', + '秘書', + '稅務人員', + '稽核人員', + '空服員', + '空調冷凍技術人員', + '節目助理', + '節目製作人員', + '粉末冶金模具技術人員', + '精密儀器製造工', + '精密拋光技術人員', + '系統整合/ERP專案師', + '系統維護/操作人員', + '紡織化學工程師', + '紡織工務', + '結構技師', + '統計學研究員', + '統計精算人員', + '經營管理主管', + '網站行銷企劃', + '網路安全分析師', + '網路管理工程師', + '網頁設計師', + '線切割技術員', + '總務主管', + '總務人員', + '總幹事', + '總機人員', + '織品設計', + '美姿美儀人員', + '美容工作者', + '美容類助理', + '美甲彩繪師', + '美療/芳療師', + '美術老師', + '美術設計', + '美髮工作者', + '美髮類助理', + '翻譯/口譯人員', + '聲學/噪音工程師', + '聲樂家', + '職能治療師', + '股務人員', + '自動控制工程師', + '舞蹈指導與舞蹈家', + '船務/押匯/報關人員', + '船長/大副/船員', + '花藝/園藝人員', + '英文翻譯/口譯人員', + '藝術品/珠寶鑑價/拍賣顧問', + '藝術指導/總監', + '藥學助理', + '藥師', + '融資/信用業務人員', + '行政主管', + '行政人員', + '行政助理', + '行銷企劃主管', + '行銷企劃人員', + '行銷企劃助理', + '補習班導師/管理人員', + '補習班老師', + '製鞋類人員', + '西餐廚師', + '西點/蛋糕師', + '視聽工程類人員', + '計程車司機', + '記帳/出納/一般會計', + '記者/採編', + '設計助理', + '診所助理', + '語文補習班老師', + '語言治療師', + '調酒師/吧台人員', + '調音技術員', + '講師', + '護理師', + '財務分析人員', + '財務或會計主管', + '財務會計助理', + '資料庫管理人員', + '資料輸入人員', + '資材主管', + '資源回收人員', + '資訊助理人員', + '資訊專業人員', + '資訊設備管制人員', + '車床人員', + '車縫/裁縫類人員', + '軟韌體測試工程師', + '軟體專案主管', + '軟體專案管理師', + '軟體設計工程師', + '農工業用機器裝修工', + '農林業設備操作員', + '農藝作物栽培工作者', + '農藝/畜產研究人員', + '通信測試維修人員', + '通訊工程研發主管', + '通訊軟體工程師', + '通路開發人員', + '連鎖店管理人員', + '遊戲企劃人員', + '運動教練', + '運輸交通專業人員', + '運輸物流類主管', + '都市/交通規劃人員', + '醫事放射師', + '醫事檢驗師', + '醫師', + '醫療人員', + '醫療器材研發工程師', + '醫療從業人員', + '醫療設備控制人員', + '醫藥業務代表', + '醫藥研發人員', + '醫院行政管理人員', + '量測/儀校人員', + '金屬建材架構人員', + '金融交易員', + '金融專業主管', + '金融承銷員', + '金融營業員', + '金融理財專員', + '金融研究員', + '銀行辦事員', + '銑床人員', + '鍋爐操作技術人員', + '鐵路車輛駕駛員', + '鑄造/鍛造模具技術人員', + '門市/店員/專櫃人員', + '防水施工人員', + '防火及建築檢驗人員', + '零件工程師', + '雷射操作技術員', + '電信及電力線路架設工', + '電信/通訊系統工程師', + '電台工作人員', + '電子商務技術主管', + '電子工程師', + '電子產品系統工程師', + '電子設備裝修工', + '電機工程技術員', + '電機技師/工程師', + '電機裝修工', + '電機設備裝配員', + '電源工程師', + '電玩程式設計師', + '電腦系統分析師', + '電腦組裝/測試', + '電腦繪圖人員', + '電腦補習班老師', + '電話及電報機裝修工', + '電話客服類人員', + '電話行銷人員', + '電鍍/表面處理技術人員', + '韌體設計工程師', + '音樂家', + '音樂老師', + '領班', + '領隊', + '類廚師', + '類比IC設計工程師', + '類講師', + '顧問人員', + '飛安人員', + '飛機裝修工', + '飛行機師', + '食品研發人員', + '食品衛生管理師', + '飯店工作人員', + '飯店餐廳主管', + '餐廚助手', + '餐飲服務生', + '駐校代表', + '驗光師', + '麵包師', + '麻醉醫師' + ] diff --git a/src/libs/faker/providers/lorem/__init__.py b/src/libs/faker/providers/lorem/__init__.py new file mode 100644 index 0000000..60ae59b --- /dev/null +++ b/src/libs/faker/providers/lorem/__init__.py @@ -0,0 +1,184 @@ +localized = True + +# 'Latin' is the default locale +default_locale = 'la' + + +from .. import BaseProvider + + +class Provider(BaseProvider): + """Will provide methods to retrieve lorem content + + Attributes: + sentence_punctuation (str): End of sentence punctuation + word_connector (str): Default connector between words + + Methods: + word: Generate a random word + words: Generate a list containing random words + sentence: Generate a random sentence + sentences: Generate a list containing sentences + paragraph: Generate a single paragraph + paragraphs: Generate many paragraphs + text: Generate a text string. + """ + word_connector = ' ' + sentence_punctuation = '.' + + def word(self, ext_word_list=None): + """ + :returns: A random word, eg: 'lorem' + + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum' + + :rtype: str + """ + if ext_word_list: + return self.random_element(ext_word_list) + return self.random_element(self.word_list) + + def words(self, nb=3, ext_word_list=None): + """ + :returns: An array of random words. for example: ['Lorem', 'ipsum', 'dolor'] + + Keyword arguments: + :param nb: how many words to return + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum' + + :rtype: list + """ + return [self.word(ext_word_list) for _ in range(0, nb)] + + def sentence(self, nb_words=6, variable_nb_words=True, ext_word_list=None): + """ + Generate a random sentence + :example 'Lorem ipsum dolor sit amet.' + + :param nb_words: around how many words the sentence should contain + :param variable_nb_words: set to false if you want exactly ``nb`` + words returned, otherwise the result may include a number of words + of ``nb`` +/-40% (with a minimum of 1) + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum'. + + :rtype: str + """ + if nb_words <= 0: + return '' + + if variable_nb_words: + nb_words = self.randomize_nb_elements(nb_words, min=1) + + words = self.words(nb=nb_words, ext_word_list=ext_word_list) + words[0] = words[0].title() + + return self.word_connector.join(words) + self.sentence_punctuation + + def sentences(self, nb=3, ext_word_list=None): + """ + Generate an array of sentences + :example ['Lorem ipsum dolor sit amet.', 'Consectetur adipisicing eli.'] + + Keyword arguments: + :param nb: how many sentences to return + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum'. + + :rtype: list + """ + return [self.sentence(ext_word_list=ext_word_list) for _ in range(0, nb)] + + def paragraph(self, nb_sentences=3, variable_nb_sentences=True, ext_word_list=None): + """ + :returns: A single paragraph. For example: 'Sapiente sunt omnis. Ut + pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' + + Keyword arguments: + :param nb_sentences: around how many sentences the paragraph should contain + :param variable_nb_sentences: set to false if you want exactly ``nb`` + sentences returned, otherwise the result may include a number of + sentences of ``nb`` +/-40% (with a minimum of 1) + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum'. + + :rtype: str + """ + if nb_sentences <= 0: + return '' + + if variable_nb_sentences: + nb_sentences = self.randomize_nb_elements(nb_sentences, min=1) + + para = self.word_connector.join(self.sentences( + nb_sentences, ext_word_list=ext_word_list + )) + + return para + + def paragraphs(self, nb=3, ext_word_list=None): + """ + Generate an array of paragraphs + :example [paragraph1, paragraph2, paragraph3] + :param nb: how many paragraphs to return + :param ext_word_list: a list of words you would like to have instead of + 'Lorem ipsum'. + + :rtype: list + """ + + return [self.paragraph(ext_word_list=ext_word_list) for _ in range(0, nb)] + + def text(self, max_nb_chars=200, ext_word_list=None): + """ + Generate a text string. + Depending on the ``max_nb_chars, returns a string made of words, sentences, or paragraphs. + :example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.' + + Keyword arguments: + :param max_nb_chars: Maximum number of characters the text should contain (minimum 5) + :param ext_word_list: a list of words you would like to have instead of 'Lorem ipsum'. + + :rtype str + """ + text = [] + if max_nb_chars < 5: + raise ValueError('text() can only generate text of at least 5 characters') + + if max_nb_chars < 25: + # join words + while not text: + size = 0 + # determine how many words are needed to reach the $max_nb_chars once; + while size < max_nb_chars: + word = (self.word_connector if size else '') + self.word(ext_word_list=ext_word_list) + text.append(word) + size += len(word) + text.pop() + text[0] = text[0][0].upper() + text[0][1:] + last_index = len(text) - 1 + text[last_index] += self.sentence_punctuation + elif max_nb_chars < 100: + # join sentences + while not text: + size = 0 + # determine how many sentences are needed to reach the $max_nb_chars once + while size < max_nb_chars: + sentence = (self.word_connector if size else '') + self.sentence(ext_word_list=ext_word_list) + text.append(sentence) + size += len(sentence) + text.pop() + else: + # join paragraphs + while not text: + size = 0 + # determine how many paragraphs are needed to reach the $max_nb_chars once + while size < max_nb_chars: + paragraph = ('\n' if size else '') + self.paragraph(ext_word_list=ext_word_list) + text.append(paragraph) + size += len(paragraph) + text.pop() + + return "".join(text) diff --git a/src/libs/faker/providers/lorem/ar_AA/__init__.py b/src/libs/faker/providers/lorem/ar_AA/__init__.py new file mode 100644 index 0000000..62a77f6 --- /dev/null +++ b/src/libs/faker/providers/lorem/ar_AA/__init__.py @@ -0,0 +1,119 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_list = ( + 'تاريخ', 'ثمّة', 'ويكيبيديا', 'واشتدّت', 'عن', 'أوروبا', + 'التغييرات', 'كثيرة', 'سنغافورة', 'اللازمة', 'جُل', 'قد', 'أن', + 'الشّعبين', 'للجزر', 'بالشرقي', 'ذات', 'والتي', 'نهاية', + 'عرفها', 'وسفن', 'وبولندا', 'بالمطالبة', 'وقوعها', 'معاملة', + 'العصبة', 'لمّ', 'البرية', 'بعدم', 'واُسدل', 'حالية', 'فمرّ', + 'قبضتهم', 'وإقامة', 'الأعمال', 'معارضة', 'الإمتعاض', '٢٠٠٤', + 'كانت', 'بينما', 'شعار', 'وتزويده', 'معقل', 'عشوائية', 'مدينة', + 'وفي', 'الأوروبيّون', 'فكان', 'ضرب', 'سكان', 'الأوروبية', + 'الأمريكي', 'وبغطاء', 'الربيع', 'المضي', 'جدول', 'التقليدية', + 'العاصمة', 'التنازلي', 'إبّان', 'بها', 'الجنوبي', 'وتنامت', + 'استدعى', 'الرئيسية', 'بالتوقيع', 'بداية', 'دخول', 'أثره', + 'الدنمارك', 'واقتصار', 'الساحل', 'الوزراء', 'الثالث', 'تونس', + 'الخاسرة', 'الحيلولة', 'لفشل', 'الإطلاق', 'ماذا', 'مواقعها', + 'الجديدة', 'والنفيس', 'الأرواح', 'أكثر', 'الأوربيين', + 'والفرنسي', 'أوزار', 'بلديهما', 'وايرلندا', 'يتم', 'جعل', + 'عرض', 'أفريقيا', 'إستعمل', 'التقليدي', 'عُقر', 'طوكيو', + 'اتفاقية', 'بمحاولة', 'اوروبا', 'منتصف', 'أسر', 'بالرّغم', + 'بضرب', 'إحكام', 'أجزاء', 'الخارجية', 'كنقطة', 'بشرية', + 'بقادة', 'لبلجيكا', 'استطاعوا', 'بسبب', 'تسمّى', 'الحرة', + 'يرتبط', 'شاسعة', 'الواقعة', 'مارد', 'والمعدات', 'لمحاكم', + 'بعلى', 'التبرعات', 'ضمنها', 'فعل', '٣٠', 'الاندونيسية', 'الى', + 'مكثّفة', 'وقدّموا', 'الأثنان', 'أخرى', 'العالمي', 'واحدة', + 'وترك', 'الحكم', 'بهناك', 'بأيدي', 'باستخدام', 'الذود', + 'ولكسمبورغ', 'بعشوائية', 'الأوضاع', 'رجوعهم', 'وأزيز', 'سياسة', + 'ليبين', 'رئيس', 'الجوي', 'سقطت', 'تكاليف', 'وكسبت', 'وعلى', + 'احداث', 'شموليةً', 'إيطاليا', 'عجّل', 'أحكم', 'الدمج', + 'محاولات', 'يعادل', 'بريطانيا-فرنسا', 'ديسمبر', 'قتيل', + 'التاريخ', 'استبدال', 'مقاومة', 'السيء', 'الصعداء', 'أعمال', + 'مسارح', 'ومضى', 'تعد', 'صفحة', 'النفط', 'وهولندا', + 'وبريطانيا', 'جهة', 'بين', 'اتّجة', 'واعتلاء', 'ومحاولة', + 'المارق', 'المؤلّفة', 'شمال', 'لهذه', 'بحث', 'وانهاء', 'غريمه', + 'وبحلول', 'وقبل', 'بتصفح', 'بال', 'الفرنسي', 'وسمّيت', 'ترتيب', + 'واستمرت', 'ببلا', 'الدولارات', 'إعمار', 'إعادة', 'به', + 'الضغوط', 'حصدت', 'بقسوة', 'الطريق', 'وانتهاءً', 'حول', + 'اكتوبر', 'الخاسر', 'ايطاليا', 'للأراضي', 'عالمية', 'جديدة', + 'أخر', 'غينيا', 'قُدُماً', 'و', 'مسؤولية', 'ابتدعها', 'أمّا', + 'الأول', 'أدوات', 'يطول', 'تُصب', 'الأولى', 'المسرح', 'بهيئة', + 'الخطّة', 'موالية', 'مليون', 'بالجانب', 'إيو', 'الهجوم', + 'أعلنت', 'المدن', 'علاقة', 'باستحداث', 'انتباه', 'بالولايات', + 'مدن', 'أساسي', 'لفرنسا', 'الجنوب', 'الثقيل', 'والعتاد', + 'بقعة', 'العدّ', 'اتفاق', 'تحت', 'الإحتفاظ', 'بوقامت', 'التي', + 'ب٠٨٠٤', 'ولاتّساع', 'الا', 'حكومة', 'مما', 'بحيث', 'مليارات', + 'شواطيء', 'التحالف', 'الأوروبي', 'قام', 'يتعلّق', 'مايو', + 'هاربر', 'العمليات', 'أما', 'يعبأ', 'وشعار', 'الإقتصادية', + 'والكساد', 'ليرتفع', 'وبالرغم', 'قِبل', 'الله', 'تكتيكاً', + 'اعتداء', 'ب٣٠', 'تسبب', 'للحكومة', 'الأهداف', 'اللا', 'ببعض', + 'الستار', 'وبلجيكا', 'وفنلندا', 'ميناء', 'الساحلية', 'مقاطعة', + 'وتم', 'السيطرة', 'تغييرات', 'ووصف', 'الجنود', 'بلمّ', 'لدحر', + 'بالحرب', 'كُلفة', 'وبدون', 'وصل', 'أفاق', 'الأبرياء', + 'مهمّات', 'العظمى', 'والقرى', 'وأكثرها', 'لان', 'مشارف', + 'مساعدة', 'أضف', 'مشروط', 'الكونجرس', 'للصين', 'الشمل', + 'اليميني', 'فكانت', 'سقوط', 'بتحت', 'بكلا', 'تصرّف', 'الأثناء', + 'بولندا', 'واندونيسيا', 'كلّ', 'إحتار', 'الخاطفة', 'كردة', + 'وحلفاؤها', 'إتفاقية', 'وبداية', 'يذكر', 'حادثة', 'مئات', + 'الأسيوي', 'غير', 'الانجليزية', 'استعملت', 'استمرار', 'المحيط', + 'وصافرات', 'وحتّى', 'الخاصّة', 'وزارة', 'بحق', 'بدارت', + 'ماليزيا', 'جزيرتي', 'اليابان', 'هامش', 'بوابة', 'وجهان', + 'وقرى', 'تجهيز', 'بولم', 'البولندي', 'الجو', 'لكل', 'فرنسية', + 'تحرّكت', 'يقوم', 'ولم', 'للإتحاد', 'الغالي', 'المشترك', + 'التكاليف', 'بولاتّساع', 'الفرنسية', 'بتحدّي', 'غرّة', 'الأرض', + 'مشاركة', 'فصل', 'بأم', 'والكوري', 'وقد', 'بـ', 'كل', 'بزمام', + 'أي', 'ماشاء', 'لغات', 'اليابانية', 'ونتج', 'الضروري', 'مع', + 'عقبت', 'لليابان', 'مسرح', 'فقامت', 'بتطويق', 'بتخصيص', + 'الوراء', 'تعداد', 'فبعد', 'تشكيل', 'الموسوعة', 'لكون', + 'واستمر', 'الأمريكية', 'إجلاء', 'بدون', 'قررت', 'الشتاء', + 'يتمكن', 'التخطيط', 'مكن', 'بريطانيا', 'أحدث', 'تشيكوسلوفاكيا', + 'وبدأت', 'الشهيرة', 'حدى', 'الإيطالية', 'يتسنّى', 'اقتصادية', + 'التجارية', 'بشكل', 'عسكرياً', 'على', 'ألمّ', 'لبولندا', + 'وسوء', 'جنوب', 'بالشتاء', 'الفترة', 'للمجهود', 'أسيا', + 'ارتكبها', 'بلها', 'قامت', 'أوراقهم', 'بجسيمة', 'بإعمار', + 'وتتحمّل', 'القوى', 'قبل', 'دنو', 'عدم', 'دار', 'الهادي', + 'خطّة', 'المجتمع', 'أملاً', 'دفّة', 'بخطوط', 'السفن', 'لعدم', + 'حاملات', 'بل', 'الإتفاقية', 'الأمور', 'بانه', 'مرجع', + 'النزاع', 'الدّفاع', 'بكلّ', 'ان', 'السبب', 'المشتّتون', + 'ودول', 'ألمانيا', 'والروسية', 'والفلبين', 'بلا', 'أواخر', + 'ببه', 'تزامناً', 'أطراف', 'يونيو', 'الأراضي', 'كانتا', + 'ويعزى', 'انتهت', 'بالثالث', 'وباستثناء', 'زهاء', 'الآخر', + 'أخذ', 'ليركز', 'يتبقّ', 'تمهيد', 'الإقتصادي', 'بالرغم', + 'سبتمبر', 'بقد', 'واتّجه', 'وصغار', 'الشتوية', 'سابق', 'بعض', + 'الشرق', 'المتساقطة', 'الصين', 'اسبوعين', 'لهيمنة', 'الصفحات', + 'أم', 'الساحة', 'القادة', 'لعملة', 'أمام', 'تحرير', 'عليها', + 'وحرمان', 'حلّت', 'بأضرار', 'الثقيلة', 'وجزر', 'الأرضية', + 'أراض', 'والحزب', 'وباءت', 'حقول', 'وبالتحديد', 'لإنعدام', + 'اعلان', 'خلاف', 'انه', 'بتونس', 'بمما', 'الأجل', 'أوسع', + 'الآلاف', 'تطوير', 'اليها', 'البشريةً', 'والإتحاد', 'إختار', + 'وبعض', 'بالمحور', 'غضون', 'شرسة', 'السادس', 'الإثنان', + 'لتقليعة', 'الجنرال', 'تصفح', 'ثانية', 'العناد', 'لم', + 'لإعادة', 'سليمان', 'هناك', 'جمعت', 'الباهضة', 'وبعدما', 'في', + 'تنفّس', 'ويتّفق', 'قدما', 'المنتصر', 'جيوب', 'انتصارهم', + 'قادة', 'تحرّك', 'الإمداد', 'الصينية', 'جسيمة', 'تكبّد', + 'وعُرفت', 'استرجاع', 'فشكّل', 'دول', 'فقد', 'الطرفين', + 'بالرّد', 'المعاهدات', 'الأخذ', 'لإعلان', 'كرسي', 'كلا', 'هذا', + 'الإنذار', 'عملية', 'شيء', 'ومن', 'جيما', 'الشرقية', 'بالعمل', + 'ما', 'الولايات', 'حاول', 'جديداً', 'حين', 'العالم', 'بنقطة', + 'خيار', 'بالجوي', 'والديون', 'بقيادة', 'بيكن', 'يبق', + 'ومطالبة', 'أراضي', 'حتى', 'بأراضي', 'معزّزة', 'الثانية', + 'دون', 'بالسيطرة', 'نتيجة', 'دارت', 'بالإنزال', 'أمدها', + 'الشهير', 'من', 'بلاده', 'تم', 'الصفحة', 'ساعة', 'الإكتفاء', + 'يكن', 'عل', 'أصقاع', 'بالأجل', 'تلك', 'إذ', 'الإتحاد', + 'المتحدة', 'إستيلاء', 'بعرض', 'بفصل', 'ممثّلة', 'شدّت', 'كان', + 'هنا؟', 'المبرمة', 'انذار', 'تعديل', 'ليتسنّى', 'وتنصيب', + 'قائمة', 'الإنزال', 'إعلان', 'للسيطرة', 'بعد', 'بالسادس', + 'العالمية', 'ببحشد', 'بحشد', 'إنطلاق', 'والنرويج', 'هُزم', + 'فاتّبع', 'لها', 'بأسر', 'الشرقي', 'المواد', 'الشمال', + 'الأحمر', '٠٨٠٤', 'ثم', 'نفس', 'وقام', 'عدد', 'أسابيع', 'هو', + 'كما', 'وحتى', 'المتاخمة', 'أهّل', 'أدنى', 'بفرض', 'وبعد', + 'المتّبعة', 'بقصف', 'الدول', 'لأداء', 'جورج', 'وفرنسا', + 'فرنسا', 'هذه', 'الحدود', 'الشطر', 'نقطة', 'بدول', 'فهرست', + 'حيث', 'استراليا', 'وإيطالي', 'دأبوا', 'الحكومة', 'الأمم', + 'فسقط', 'مرمى', 'ذلك', 'مكّن', 'وإعلان', 'بمباركة', 'والمانيا', + ) diff --git a/src/faker/providers/el_GR/lorem.py b/src/libs/faker/providers/lorem/el_GR/__init__.py similarity index 99% rename from src/faker/providers/el_GR/lorem.py rename to src/libs/faker/providers/lorem/el_GR/__init__.py index 474d474..1012ece 100644 --- a/src/faker/providers/el_GR/lorem.py +++ b/src/libs/faker/providers/lorem/el_GR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..lorem import Provider as LoremProvider +from .. import Provider as LoremProvider class Provider(LoremProvider): diff --git a/src/libs/faker/providers/lorem/he_IL/__init__.py b/src/libs/faker/providers/lorem/he_IL/__init__.py new file mode 100644 index 0000000..0b8d25b --- /dev/null +++ b/src/libs/faker/providers/lorem/he_IL/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_list = ( + "אאוגו", "אגת", "אדיפיסינג", "אדנדום", "אט", "איאקוליס", "איבן", "איף", + "איפסום", "אלית", "אלמנקום", "אמט", "אס", "אפאח", "אקווזמן", "ארווס", + "בגורמי", "בורק?", "בלובק", "בלינדו", "בלינך", "בליקרה", "בעליק", + "בעריר","בראיט", "ברומץ", "בריקנה", "ברשג", "גדדיש", "גולר", "גק", + "דול", "דולור", "דומור", "דז", "דיאם", "דלאמת", "דס", "הבקיץ", "הדש", + "הועניב", "היושבב", "הכייר", "השמה", "התידם", "וואל", "וולופטה", + "וחאית", "ולחת", "ולתיעם", "ומעיוט", "ומרגשח", "וסטיבולום", "וסתעד", + "וק", "ותלברו", "זותה", "חשלו", "טידום", "יבש", "יהול", "ישבעס", "כאנה", + "כלרשט", "להאמית", "לורם", "ליאמום", "ליבם", "ליץ", "לכימפו", "לכנו", + "לכנוץ", "למטכין", "למרקוח", "למרקל", "לפמעט", "לפריקך", "לפתיעם", + "לקטוס", "לרטי", "לתיג", "לתכי", "מא", "מגמש", "מונחף", "מונפרד", + "מונפרר", "מוסן", "מורגם", "מיחוצים", "מנורך", "מנכם", "מנק", "מנת", + "מרגשי", "נובש", "נולום", "נון", "נונסטי", "ניבאה", "ניסי", "ניצאחו", + "נמרגי", "נשואי", "סאפיאן", "סוברט", "סולגק", "סוליסי", "סחטיר", + "סטום", "סיט", "סילקוף", "סכעיט", "סת", "סתשם", "עמחליף", "ערששף", + "פוסיליס", "צוט", "צופעט", "צורק", "קוויז", "קוויס", "קולהע", "קולורס", + "קונדימנטום", "קונסקטורר", "קורוס", "קלאצי", "קלובר", "קראס", "קרהשק", + "רוגצה", "שבצק", "שהכים", "שלושע", "שמחויט", "שנרא", "שעותלשך", "שערש", + "תוק", "תצטנפל", "תצטריק", "תרבנך" + ) diff --git a/src/libs/faker/providers/lorem/ja_JP/__init__.py b/src/libs/faker/providers/lorem/ja_JP/__init__.py new file mode 100644 index 0000000..e8bf1ea --- /dev/null +++ b/src/libs/faker/providers/lorem/ja_JP/__init__.py @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_connector = '' + sentence_punctuation = '。' + word_list = ( + u'コミュニティ', + u'隠す', + u'葉', + u'陶器', + u'錯覚', + u'バーゲン', + u'リニア', + u'コーラス', + u'仕上げ', + u'叔父', + u'移動', + u'差別する', + u'極端な', + u'数字', + u'テント', + u'必要', + u'主人', + u'電池', + u'ソース', + u'野球', + u'ストレージ', + u'スキーム', + u'暖かい', + u'ささやき', + u'器官', + u'トリビュート', + u'同行', + u'ジャム', + u'パン', + u'索引', + u'トス', + u'織る', + u'パーセント', + u'拡張', + u'教授', + u'バスケット', + u'創傷', + u'フレーム', + u'明らかにする', + u'フェミニスト', + u'発生する', + u'怒り', + u'ボトル', + u'狐', + u'柔らかい', + u'リフト', + u'バス', + u'雪', + u'画面', + u'パイオニア', + u'マリン', + u'ダイヤモンド', + u'普通の', + u'意図', + u'ヘア', + u'日曜日', + u'プラスチック', + u'衝突', + u'評議会', + u'主婦', + u'保証金', + u'動物', + u'参加する', + u'教会', + u'コミュニケーション', + u'憲法', + u'本質的な', + u'探査', + u'呼ぶ', + u'供給', + u'スペル', + u'再現する', + u'合計', + u'ダッシュ', + u'擁する', + u'知覚', + u'シェービング', + u'コンペ', + u'オークション', + u'細かい', + u'ニュース', + u'癌', + u'トーン', + u'チーズ', + u'反射', + u'ブランチ', + u'コピー', + u'状況', + u'スマッシュ', + u'式', + u'協力', + u'管理する', + u'文言', + u'編組', + u'ジャーナル', + u'腐った', + u'見落とす', + u'ハードウェア', + u'ピック', + u'感謝する', + u'楽しんで', + u'人形', + u'建築', + u'見出し', + u'タワー', + u'ホイール', + u'省略', + u'ログ', + u'助けて', + u'不自然な', + u'出演者', + u'転倒', + u'運', + u'障害', + u'クルー', + u'追放する', + u'月', + u'カレッジ', + u'緩む', + u'分割', + u'欠乏', + u'通行料金', + u'電話', + u'狭い', + u'中央', + u'埋め込む', + u'革新', + u'ブレーキ', + u'コーナー', + u'溝', + u'脊椎', + u'ブラケット', + u'戦略的', + u'尿', + u'血まみれの', + u'尊敬する', + u'催眠術', + u'アクセルペダル', + u'厳しい', + u'サンプル', + u'奨励します', + u'指名', + u'クール', + u'クロス', + u'ヒール', + u'敵対的な', + u'近代化する', + u'部隊', + u'目的', + u'保持する', + u'中世', + u'デッド', + u'ノート', + u'デフォルト', + u'犯罪者', + u'キャビン', + u'副', + u'改善', + u'職人', + u'シュガー', + u'花嫁', + u'倫理', + u'偏差', + u'販売', + u'軸', + u'サラダ', + u'品質', + u'風景', + u'虐待', + u'立派な', + u'ベルベット', + u'ハンマー', + u'キャビネット', + u'トレーナー', + u'リハビリ', + u'サワー', + u'連続', + u'学生', + u'高い', + u'賞賛する', + u'行進', + u'ダニ', + u'証言する', + u'符号', + u'バナー', + u'バケツ', + u'カラム', + u'装置', + u'ヒット', + u'敵', + u'トースト', + u'試してみる', + u'大統領', + u'屋根裏', + u'メニュー', + u'残る', + u'リンク', + u'舗装', + u'インチ', + u'特徴', + u'は', + u'持つ', + u'持っていました', + u'あった', + u'〜', + u'ない', + u'今', + u'今日', + u'持ってる', + u'午前', + u'私', + u'君は', + u'彼', + u'彼女', + u'それ', + u'自体', + u'あなた自身', + u'じぶんの', + u'鉱山' + ) diff --git a/src/libs/faker/providers/lorem/la/__init__.py b/src/libs/faker/providers/lorem/la/__init__.py new file mode 100644 index 0000000..9a9f054 --- /dev/null +++ b/src/libs/faker/providers/lorem/la/__init__.py @@ -0,0 +1,37 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_list = ( + 'a', 'ab', 'accusamus', 'accusantium', 'ad', 'adipisci', 'alias', + 'aliquam', 'aliquid', 'amet', 'animi', 'aperiam', 'architecto', + 'asperiores', 'aspernatur', 'assumenda', 'at', 'atque', 'aut', 'autem', + 'beatae', 'blanditiis', 'commodi', 'consectetur', 'consequatur', + 'consequuntur', 'corporis', 'corrupti', 'culpa', 'cum', 'cumque', + 'cupiditate', 'debitis', 'delectus', 'deleniti', 'deserunt', 'dicta', + 'dignissimos', 'distinctio', 'dolor', 'dolore', 'dolorem', 'doloremque', + 'dolores', 'doloribus', 'dolorum', 'ducimus', 'ea', 'eaque', 'earum', + 'eius', 'eligendi', 'enim', 'eos', 'error', 'esse', 'est', 'et', 'eum', + 'eveniet', 'ex', 'excepturi', 'exercitationem', 'expedita', 'explicabo', + 'facere', 'facilis', 'fuga', 'fugiat', 'fugit', 'harum', 'hic', 'id', + 'illo', 'illum', 'impedit', 'in', 'incidunt', 'inventore', 'ipsa', + 'ipsam', 'ipsum', 'iste', 'itaque', 'iure', 'iusto', 'labore', + 'laboriosam', 'laborum', 'laudantium', 'libero', 'magnam', 'magni', + 'maiores', 'maxime', 'minima', 'minus', 'modi', 'molestiae', + 'molestias', 'mollitia', 'nam', 'natus', 'necessitatibus', 'nemo', + 'neque', 'nesciunt', 'nihil', 'nisi', 'nobis', 'non', 'nostrum', + 'nulla', 'numquam', 'occaecati', 'odio', 'odit', 'officia', 'officiis', + 'omnis', 'optio', 'pariatur', 'perferendis', 'perspiciatis', 'placeat', + 'porro', 'possimus', 'praesentium', 'provident', 'quae', 'quaerat', + 'quam', 'quas', 'quasi', 'qui', 'quia', 'quibusdam', 'quidem', 'quis', + 'quisquam', 'quo', 'quod', 'quos', 'ratione', 'recusandae', + 'reiciendis', 'rem', 'repellat', 'repellendus', 'reprehenderit', + 'repudiandae', 'rerum', 'saepe', 'sapiente', 'sed', 'sequi', + 'similique', 'sint', 'sit', 'soluta', 'sunt', 'suscipit', 'tempora', + 'tempore', 'temporibus', 'tenetur', 'totam', 'ullam', 'unde', 'ut', + 'vel', 'velit', 'veniam', 'veritatis', 'vero', 'vitae', 'voluptas', + 'voluptate', 'voluptatem', 'voluptates', 'voluptatibus', 'voluptatum' + ) diff --git a/src/libs/faker/providers/lorem/ru_RU/__init__.py b/src/libs/faker/providers/lorem/ru_RU/__init__.py new file mode 100644 index 0000000..9716645 --- /dev/null +++ b/src/libs/faker/providers/lorem/ru_RU/__init__.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_list = ( + 'войти', 'монета', 'вскинуть', 'желание', 'экзамен', 'налоговый', + 'вытаскивать', 'приятель', 'вздрагивать', 'куча', 'порт', 'точно', + 'заплакать', 'изба', 'правление', 'художественный', 'мучительно', + 'изображать', 'фонарик', 'миф', 'грустный', 'опасность', 'мера', + 'пастух', 'факультет', 'мелькнуть', 'полевой', 'другой', 'выраженный', + 'забирать', 'рот', 'народ', 'соответствие', 'тута', 'коммунизм', + 'решение', 'плод', 'собеседник', 'возмутиться', 'достоинство', + 'господь', 'болото', 'инфекция', 'голубчик', 'сынок', 'пространство', + 'прощение', 'прежде', 'хотеть', 'ленинград', 'даль', 'развитый', + 'близко', 'более', 'спорт', 'эпоха', 'ответить', 'освободить', 'совет', + 'проход', 'палец', 'вчера', 'приличный', 'ярко', 'белье', 'кузнец', + 'неожиданно', 'вперед', 'зато', 'кольцо', 'передо', 'мгновение', + 'плавно', 'табак', 'число', 'изучить', 'тяжелый', 'рассуждение', + 'салон', 'идея', 'что', 'светило', 'порода', 'сомнительный', 'бок', + 'очко', 'неудобно', 'советовать', 'отдел', 'помолчать', 'поздравлять', + 'пробовать', 'дошлый', 'смеяться', 'упорно', 'вздрогнуть', 'затянуться', + 'танцевать', 'песенка', 'выбирать', 'правильный', 'намерение', 'издали', + 'запустить', 'наслаждение', 'крыса', 'лететь', 'космос', 'радость', + 'поезд', 'находить', 'гулять', 'горький', 'бочок', 'ночь', 'счастье', + 'уничтожение', 'дьявол', 'коробка', 'спасть', 'кожа', 'провинция', + 'прелесть', 'тюрьма', 'низкий', 'сверкать', 'темнеть', 'солнце', + 'дружно', 'настать', 'блин', 'степь', 'самостоятельно', 'крутой', + 'картинка', 'зачем', 'рабочий', 'необычный', 'армейский', 'труп', + 'ягода', 'около', 'монета', 'естественный', 'юный', 'район', 'скрытый', + 'поймать', 'строительство', 'палата', 'миг', 'триста', 'штаб', 'ломать', + 'возможно', 'полюбить', 'человечек', 'легко', 'чувство', 'ручей', + 'карман', 'деньги', 'неправда', 'сравнение', 'грудь', 'отъезд', + 'возникновение', 'степь', 'возбуждение', 'деловой', 'следовательно', + 'жидкий', 'сынок', 'художественный', 'поколение', 'расстегнуть', 'пища', + 'ученый', 'секунда', 'успокоиться', 'вряд', 'аж', 'вскакивать', 'мимо', + 'падать', 'потянуться', 'угроза', 'растеряться', 'бегать', 'стакан', + 'о', 'кпсс', 'ныне', 'пол', 'реклама', 'при', 'школьный', 'премьера', + 'дальний', 'потрясти', 'освобождение', 'покидать', 'наступать', 'жить', + 'какой', 'обида', 'командование', 'девка', 'выражаться', 'головной', + 'второй', 'князь', 'социалистический', 'головка', 'привлекать', 'через', + 'господь', 'результат', 'отметить', 'ведь', 'падаль', 'покидать', + 'художественный', 'правый', 'висеть', 'лапа', 'каюта', 'слишком', + 'нервно', 'серьезный', 'зима', 'заработать', 'эффект', 'пропасть', + 'плод', 'что', 'висеть', 'холодно', 'единый', 'выкинуть', 'мрачно', + 'выгнать', 'умирать', 'иной', 'космос', 'природа', 'функция', + 'поставить', 'оборот', 'услать', 'очередной', 'медицина', 'функция', + 'зарплата', 'выдержать', 'расстройство', 'адвокат', 'задержать', + 'появление', 'инвалид', 'интеллектуальный', 'исследование', 'господь', + 'смертельный', 'спичка', 'вариант', 'рай', 'одиннадцать', 'чем', + 'манера', 'магазин', 'поговорить', 'полоска', 'помимо', 'построить', + 'домашний', 'механический', 'сохранять', 'отражение', 'научить', + 'тесно', 'аллея', 'прежний', 'посидеть', 'славный', 'очутиться', + 'лететь', 'невозможно', 'порядок', 'выразить', 'спешить', 'сынок', + 'ребятишки', 'угроза', 'оставить', 'цвет', 'налево', 'парень', + 'миллиард', 'горький', 'трубка', 'подробность', 'пасть', 'непривычный', + 'угодный', 'засунуть', 'цель', 'запретить', 'дремать', 'разуметься', + 'приходить', 'совещание', 'постоянный', 'анализ', 'терапия', 'приятель', + 'процесс', 'академик', 'металл', 'развернуться', 'жестокий', 'интернет', + 'банда', 'изменение', 'коллектив', 'похороны', 'устройство', + 'торопливый', 'разводить', 'промолчать', 'подземный', 'пламя', + 'редактор', 'теория', 'карандаш', 'упор', 'означать', 'бабочка', + 'четыре', 'столетие', 'разнообразный', 'витрина', 'нож', 'команда', + 'шлем', 'недостаток', 'протягивать', 'за', 'металл', 'добиться', + 'сутки', 'четко', 'предоставить', 'тысяча', 'запеть', 'бригада', + 'мелочь', 'выраженный', 'пересечь', 'сходить', 'вообще', 'рис', 'банк', + 'бак', 'передо', 'назначить', 'важный', 'правление', 'палка', 'трясти', + 'уронить', 'витрина', 'основание', 'да', 'перебивать', 'дыхание', + 'применяться', 'июнь', 'бетонный', 'избегать', 'умолять', 'мягкий', + 'заявление', 'конференция', 'встать', 'свежий', 'сопровождаться', + 'цепочка', 'выражение', 'угол', 'ботинок', 'ложиться', 'инструкция', + 'присесть', 'решетка', 'еврейский', 'порог', 'зеленый', 'граница', + 'ставить', 'смелый', 'сустав', 'роса', 'демократия', 'вывести', + 'конструкция', 'задрать', 'багровый', 'военный', 'направо', 'житель', + 'товар', 'неправда', 'материя', 'командующий', 'кидать', 'заложить', + 'лиловый', 'слать', 'горький', 'пространство', 'провал', 'мусор', + 'наткнуться', 'торговля', 'монета', 'место', 'спалить', 'бровь', + 'левый', 'хлеб', 'коричневый', 'потом', 'страсть', 'виднеться', + 'роскошный', 'способ', 'костер', 'заведение', 'пропадать', 'слишком', + 'пятеро', 'мальчишка', 'тусклый', 'неожиданный', 'плясать', 'дурацкий', + 'дрогнуть', 'сбросить', 'прошептать', 'беспомощный', 'рота', 'песня', + 'тревога', 'некоторый', 'термин', 'нажать', 'видимо', 'валюта', 'набор', + 'боец', 'райком', 'новый', 'скользить', 'руководитель', 'волк', + 'изредка', 'понятный', 'пропаганда', 'остановить', 'исполнять', 'ход', + 'госпожа', 'печатать', 'командир', 'снимать', 'казнь', 'невыносимый', + 'спорт', 'тревога', 'уточнить', 'актриса', 'полностью', 'покинуть', + 'сверкающий', 'мотоцикл', 'дорогой', 'указанный', 'ремень', 'посвятить', + 'один', 'а', 'доставать', 'хозяйка', 'носок', 'написать', 'еврейский', + 'призыв', 'увеличиваться', 'равнодушный' + ) diff --git a/src/libs/faker/providers/lorem/zh_CN/__init__.py b/src/libs/faker/providers/lorem/zh_CN/__init__.py new file mode 100644 index 0000000..5a5d620 --- /dev/null +++ b/src/libs/faker/providers/lorem/zh_CN/__init__.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_connector = '' + word_list = ( + u'一个', + u'我们', + u'时间', + u'中国', + u'可以', + u'公司', + u'没有', + u'信息', + u'下载', + u'软件', + u'注册', + u'自己', + u'产品', + u'工作', + u'论坛', + u'企业', + u'这个', + u'他们', + u'管理', + u'已经', + u'问题', + u'内容', + u'使用', + u'进行', + u'市场', + u'服务', + u'如果', + u'系统', + u'技术', + u'发展', + u'现在', + u'作者', + u'就是', + u'网络', + u'提供', + u'相关', + u'我的', + u'文章', + u'方式', + u'电话', + u'发表', + u'所有', + u'时候', + u'因为', + u'北京', + u'有限', + u'公司', + u'什么', + u'还是', + u'开始', + u'本站', + u'发布', + u'自己', + u'支持', + u'在线', + u'国家', + u'生活', + u'联系', + u'积分', + u'主题', + u'所以', + u'不能', + u'的人', + u'上海', + u'中心', + u'世界', + u'游戏', + u'需要', + u'价格', + u'用户', + u'通过', + u'要求', + u'不是', + u'免费', + u'个人', + u'但是', + u'地址', + u'网站', + u'情况', + u'最后', + u'设计', + u'同时', + u'这些', + u'活动', + u'手机', + u'推荐', + u'一些', + u'主要', + u'大家', + u'发现', + u'目前', + u'文件', + u'你的', + u'不过', + u'评论', + u'生产', + u'美国', + u'图片', + u'经济', + u'功能', + u'国际', + u'的是', + u'选择', + u'其他', + u'这样', + u'会员', + u'环境', + u'来自', + u'日期', + u'成为', + u'他的', + u'最新', + u'专业', + u'一下', + u'人员', + u'任何', + u'教育', + u'资料', + u'状态', + u'都是', + u'点击', + u'为了', + u'不会', + u'出现', + u'知道', + u'社会', + u'名称', + u'而且', + u'介绍', + u'音乐', + u'等级', + u'可能', + u'这种', + u'建设', + u'朋友', + u'虽然', + u'电子', + u'资源', + u'看到', + u'精华', + u'电影', + u'如何', + u'新闻', + u'阅读', + u'安全', + u'全国', + u'只有', + u'回复', + u'大学', + u'学生', + u'学习', + u'关于', + u'项目', + u'不同', + u'以及', + u'有关', + u'那么', + u'开发', + u'还有', + u'只是', + u'非常', + u'研究', + u'广告', + u'首页', + u'方法', + u'希望', + u'地方', + u'也是', + u'单位', + u'怎么', + u'应该', + u'今天', + u'以上', + u'更新', + u'帖子', + u'显示', + u'能力', + u'电脑', + u'记者', + u'查看', + u'位置', + u'不要', + u'由于', + u'无法', + u'详细', + u'投资', + u'是一', + u'一般', + u'进入', + u'发生', + u'这里', + u'感觉', + u'更多', + u'你们', + u'的话', + u'起来', + u'标准', + u'一样', + u'认为', + u'女人', + u'那个', + u'设备', + u'搜索', + u'之后', + u'然后', + u'学校', + u'销售', + u'组织', + u'说明', + u'提高', + u'为什', + u'作品', + u'或者', + u'喜欢', + u'东西', + u'方面', + u'简介', + u'必须', + u'经营', + u'科技', + u'作为', + u'其中', + u'运行', + u'工程', + u'解决', + u'操作', + u'经验', + u'地区', + u'重要', + u'直接', + u'登录', + u'合作', + u'结果', + u'影响', + u'这是', + u'行业', + u'对于', + u'表示', + u'程序', + u'包括', + u'留言', + u'规定', + u'处理', + u'男人', + u'各种', + u'部门', + u'数据', + u'具有', + u'商品', + u'系列', + u'大小', + u'因此', + u'关系', + u'可是', + u'比较', + u'文化', + u'一直', + u'法律', + u'这么', + u'您的', + u'城市', + u'分析', + u'基本', + u'最大', + u'类别', + u'两个', + u'日本', + u'得到', + u'一次', + u'继续', + u'成功', + u'她的', + u'责任', + u'深圳', + u'业务', + u'欢迎', + u'加入', + u'能够', + u'觉得', + u'部分', + u'中文', + u'根据', + u'人民', + u'政府', + u'控制', + u'其实', + u'之间', + u'一种', + u'威望', + u'实现', + u'语言', + u'出来', + u'谢谢', + u'社区', + u'品牌', + u'是否', + u'工具', + u'完全', + u'决定', + u'很多', + u'网上', + u'事情', + u'今年', + u'国内', + u'以后', + u'制作', + u'浏览', + u'过程', + u'完成', + u'类型', + u'来源', + u'质量', + u'有些', + u'一起', + u'当然', + u'汽车', + u'一点', + u'帮助', + u'增加', + u'历史', + u'以下', + u'不断', + u'应用', + u'那些', + u'密码', + u'计划', + u'如此', + u'次数', + u'到了', + u'拥有', + u'孩子', + u'原因', + u'参加', + u'只要', + u'报告', + u'当前', + u'客户', + u'正在', + u'注意', + u'标题', + u'空间', + u'一定', + u'一切', + u'特别', + u'全部', + u'准备', + ) diff --git a/src/libs/faker/providers/lorem/zh_TW/__init__.py b/src/libs/faker/providers/lorem/zh_TW/__init__.py new file mode 100644 index 0000000..0d99863 --- /dev/null +++ b/src/libs/faker/providers/lorem/zh_TW/__init__.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as LoremProvider + + +class Provider(LoremProvider): + word_connector = '' + word_list = ( + u'一個', + u'我們', + u'時間', + u'台灣', + u'可以', + u'公司', + u'沒有', + u'信息', + u'下載', + u'軟體', + u'注冊', + u'自己', + u'產品', + u'工作', + u'論壇', + u'企業', + u'這個', + u'他們', + u'管理', + u'已經', + u'問題', + u'內容', + u'使用', + u'進行', + u'市場', + u'服務', + u'如果', + u'系統', + u'技術', + u'發展', + u'現在', + u'作者', + u'就是', + u'網絡', + u'提供', + u'相關', + u'我的', + u'文章', + u'方式', + u'電話', + u'發表', + u'所有', + u'時候', + u'因為', + u'台北', + u'有限', + u'公司', + u'什麼', + u'還是', + u'開始', + u'本站', + u'發布', + u'自己', + u'支持', + u'在線', + u'國家', + u'生活', + u'聯系', + u'積分', + u'主題', + u'所以', + u'不能', + u'的人', + u'上海', + u'中心', + u'世界', + u'游戲', + u'需要', + u'價格', + u'用戶', + u'通過', + u'要求', + u'不是', + u'免費', + u'個人', + u'但是', + u'地址', + u'網站', + u'情況', + u'最后', + u'設計', + u'同時', + u'這些', + u'活動', + u'手機', + u'推薦', + u'一些', + u'主要', + u'大家', + u'發現', + u'目前', + u'文件', + u'你的', + u'不過', + u'評論', + u'生產', + u'美國', + u'圖片', + u'經濟', + u'功能', + u'國際', + u'的是', + u'選擇', + u'其他', + u'這樣', + u'會員', + u'環境', + u'來自', + u'日期', + u'成為', + u'他的', + u'最新', + u'專業', + u'一下', + u'人員', + u'任何', + u'教育', + u'資料', + u'狀態', + u'都是', + u'點擊', + u'為了', + u'不會', + u'出現', + u'知道', + u'社會', + u'名稱', + u'而且', + u'介紹', + u'音樂', + u'等級', + u'可能', + u'這種', + u'建設', + u'朋友', + u'雖然', + u'電子', + u'資源', + u'看到', + u'精華', + u'電影', + u'如何', + u'新聞', + u'閱讀', + u'安全', + u'全國', + u'隻有', + u'回復', + u'大學', + u'學生', + u'學習', + u'關於', + u'項目', + u'不同', + u'以及', + u'有關', + u'那麼', + u'開發', + u'還有', + u'隻是', + u'非常', + u'研究', + u'廣告', + u'首頁', + u'方法', + u'希望', + u'地方', + u'也是', + u'單位', + u'怎麼', + u'應該', + u'今天', + u'以上', + u'更新', + u'帖子', + u'顯示', + u'能力', + u'電腦', + u'記者', + u'查看', + u'位置', + u'不要', + u'由於', + u'無法', + u'詳細', + u'投資', + u'是一', + u'一般', + u'進入', + u'發生', + u'這裡', + u'感覺', + u'更多', + u'你們', + u'的話', + u'起來', + u'標准', + u'一樣', + u'認為', + u'女人', + u'那個', + u'設備', + u'搜索', + u'之后', + u'然后', + u'學校', + u'銷售', + u'組織', + u'說明', + u'提高', + u'為什', + u'作品', + u'或者', + u'喜歡', + u'東西', + u'方面', + u'簡介', + u'必須', + u'經營', + u'科技', + u'作為', + u'其中', + u'運行', + u'工程', + u'解決', + u'操作', + u'經驗', + u'地區', + u'重要', + u'直接', + u'登錄', + u'合作', + u'結果', + u'影響', + u'這是', + u'行業', + u'對於', + u'表示', + u'程序', + u'包括', + u'留言', + u'規定', + u'處理', + u'男人', + u'各種', + u'部門', + u'數據', + u'具有', + u'商品', + u'系列', + u'大小', + u'因此', + u'關系', + u'可是', + u'比較', + u'文化', + u'一直', + u'法律', + u'這麼', + u'您的', + u'城市', + u'分析', + u'基本', + u'最大', + u'類別', + u'兩個', + u'日本', + u'得到', + u'一次', + u'繼續', + u'成功', + u'她的', + u'責任', + u'深圳', + u'業務', + u'歡迎', + u'加入', + u'能夠', + u'覺得', + u'部分', + u'中文', + u'根據', + u'人民', + u'政府', + u'控制', + u'其實', + u'之間', + u'一種', + u'威望', + u'實現', + u'語言', + u'出來', + u'謝謝', + u'社區', + u'品牌', + u'是否', + u'工具', + u'完全', + u'決定', + u'很多', + u'網上', + u'事情', + u'今年', + u'國內', + u'以后', + u'制作', + u'瀏覽', + u'過程', + u'完成', + u'類型', + u'來源', + u'質量', + u'有些', + u'一起', + u'當然', + u'汽車', + u'一點', + u'幫助', + u'增加', + u'歷史', + u'以下', + u'不斷', + u'應用', + u'那些', + u'密碼', + u'計劃', + u'如此', + u'次數', + u'到了', + u'擁有', + u'孩子', + u'原因', + u'參加', + u'隻要', + u'報告', + u'當前', + u'客戶', + u'正在', + u'注意', + u'標題', + u'空間', + u'一定', + u'一切', + u'特別', + u'全部', + u'准備', + ) \ No newline at end of file diff --git a/src/libs/faker/providers/misc/__init__.py b/src/libs/faker/providers/misc/__init__.py new file mode 100644 index 0000000..69cfd3b --- /dev/null +++ b/src/libs/faker/providers/misc/__init__.py @@ -0,0 +1,179 @@ +# coding=utf-8 + +from __future__ import unicode_literals +import hashlib +import string +import uuid +import os +import sys + +from .. import BaseProvider + + +class Provider(BaseProvider): + # Locales supported by Linux Mint from `/usr/share/i18n/SUPPORTED` + language_locale_codes = { + 'aa': ('DJ', 'ER', 'ET'), 'af': ('ZA',), 'ak': ('GH',), 'am': ('ET',), + 'an': ('ES',), 'apn': ('IN',), + 'ar': ('AE', 'BH', 'DJ', 'DZ', 'EG', 'EH', 'ER', 'IL', 'IN', + 'IQ', 'JO', 'KM', 'KW', 'LB', 'LY', 'MA', 'MR', 'OM', + 'PS', 'QA', 'SA', 'SD', 'SO', 'SS', 'SY', 'TD', 'TN', + 'YE'), + 'as': ('IN',), 'ast': ('ES',), 'ayc': ('PE',), 'az': ('AZ', 'IN'), + 'be': ('BY',), 'bem': ('ZM',), 'ber': ('DZ', 'MA'), 'bg': ('BG',), + 'bhb': ('IN',), 'bho': ('IN',), 'bn': ('BD', 'IN'), 'bo': ('CN', 'IN'), + 'br': ('FR',), 'brx': ('IN',), 'bs': ('BA',), 'byn': ('ER',), + 'ca': ('AD', 'ES', 'FR', 'IT'), 'ce': ('RU',), 'ckb': ('IQ',), + 'cmn': ('TW',), 'crh': ('UA',), 'cs': ('CZ',), 'csb': ('PL',), + 'cv': ('RU',), 'cy': ('GB',), 'da': ('DK',), + 'de': ('AT', 'BE', 'CH', 'DE', 'LI', 'LU'), 'doi': ('IN',), + 'dv': ('MV',), 'dz': ('BT',), 'el': ('GR', 'CY'), + 'en': ('AG', 'AU', 'BW', 'CA', 'DK', 'GB', 'HK', 'IE', 'IN', 'NG', + 'NZ', 'PH', 'SG', 'US', 'ZA', 'ZM', 'ZW'), + 'eo': ('US',), + 'es': ('AR', 'BO', 'CL', 'CO', 'CR', 'CU', 'DO', 'EC', 'ES', 'GT', + 'HN', 'MX', 'NI', 'PA', 'PE', 'PR', 'PY', 'SV', 'US', 'UY', 'VE' + ), 'et': ('EE',), 'eu': ('ES', 'FR'), 'fa': ('IR',), + 'ff': ('SN',), 'fi': ('FI',), 'fil': ('PH',), 'fo': ('FO',), + 'fr': ('CA', 'CH', 'FR', 'LU'), 'fur': ('IT',), 'fy': ('NL', 'DE'), + 'ga': ('IE',), 'gd': ('GB',), 'gez': ('ER', 'ET'), 'gl': ('ES',), + 'gu': ('IN',), 'gv': ('GB',), 'ha': ('NG',), 'hak': ('TW',), + 'he': ('IL',), 'hi': ('IN',), 'hne': ('IN',), 'hr': ('HR',), + 'hsb': ('DE',), 'ht': ('HT',), 'hu': ('HU',), 'hy': ('AM',), + 'ia': ('FR',), 'id': ('ID',), 'ig': ('NG',), 'ik': ('CA',), + 'is': ('IS',), 'it': ('CH', 'IT'), 'iu': ('CA',), 'iw': ('IL',), + 'ja': ('JP',), 'ka': ('GE',), 'kk': ('KZ',), 'kl': ('GL',), + 'km': ('KH',), 'kn': ('IN',), 'ko': ('KR',), 'kok': ('IN',), + 'ks': ('IN',), 'ku': ('TR',), 'kw': ('GB',), 'ky': ('KG',), + 'lb': ('LU',), 'lg': ('UG',), 'li': ('BE', 'NL'), 'lij': ('IT',), + 'ln': ('CD',), 'lo': ('LA',), 'lt': ('LT',), 'lv': ('LV',), + 'lzh': ('TW',), 'mag': ('IN',), 'mai': ('IN',), 'mg': ('MG',), + 'mhr': ('RU',), 'mi': ('NZ',), 'mk': ('MK',), 'ml': ('IN',), + 'mn': ('MN',), 'mni': ('IN',), 'mr': ('IN',), 'ms': ('MY',), + 'mt': ('MT',), 'my': ('MM',), 'nan': ('TW',), 'nb': ('NO',), + 'nds': ('DE', 'NL'), 'ne': ('NP',), 'nhn': ('MX',), + 'niu': ('NU', 'NZ'), 'nl': ('AW', 'BE', 'NL'), 'nn': ('NO',), + 'nr': ('ZA',), 'nso': ('ZA',), 'oc': ('FR',), 'om': ('ET', 'KE'), + 'or': ('IN',), 'os': ('RU',), 'pa': ('IN', 'PK'), + 'pap': ('AN', 'AW', 'CW'), 'pl': ('PL',), 'ps': ('AF',), + 'pt': ('BR', 'PT'), 'quz': ('PE',), 'raj': ('IN',), 'ro': ('RO',), + 'ru': ('RU', 'UA'), 'rw': ('RW',), 'sa': ('IN',), 'sat': ('IN',), + 'sc': ('IT',), 'sd': ('IN', 'PK'), 'se': ('NO',), 'shs': ('CA',), + 'si': ('LK',), 'sid': ('ET',), 'sk': ('SK',), 'sl': ('SI',), + 'so': ('DJ', 'ET', 'KE', 'SO'), 'sq': ('AL', 'ML'), 'sr': ('ME', 'RS'), + 'ss': ('ZA',), 'st': ('ZA',), 'sv': ('FI', 'SE'), 'sw': ('KE', 'TZ'), + 'szl': ('PL',), 'ta': ('IN', 'LK'), 'tcy': ('IN',), 'te': ('IN',), + 'tg': ('TJ',), 'th': ('TH',), 'the': ('NP',), 'ti': ('ER', 'ET'), + 'tig': ('ER',), 'tk': ('TM',), 'tl': ('PH',), 'tn': ('ZA',), + 'tr': ('CY', 'TR'), 'ts': ('ZA',), 'tt': ('RU',), 'ug': ('CN',), + 'uk': ('UA',), 'unm': ('US',), 'ur': ('IN', 'PK'), 'uz': ('UZ',), + 've': ('ZA',), 'vi': ('VN',), 'wa': ('BE',), 'wae': ('CH',), + 'wal': ('ET',), 'wo': ('SN',), 'xh': ('ZA',), 'yi': ('US',), + 'yo': ('NG',), 'yue': ('HK',), 'zh': ('CN', 'HK', 'SG', 'TW'), + 'zu': ('ZA',) + } + + def boolean(self, chance_of_getting_true=50): + return self.generator.random.randint(1, 100) <= chance_of_getting_true + + def null_boolean(self): + return { + 0: None, + 1: True, + -1: False + }[self.generator.random.randint(-1, 1)] + + def binary(self, length=(1 * 1024 * 1024)): + """ Returns random binary blob. + + Default blob size is 1 Mb. + """ + blob = [self.generator.random.randrange(256) for o in range(length)] + return bytes(blob) if sys.version_info[0] >= 3 else bytearray(blob) + + def md5(self, raw_output=False): + """ + Calculates the md5 hash of a given string + :example 'cfcd208495d565ef66e7dff9f98764da' + """ + res = hashlib.md5(str(self.generator.random.random()).encode('utf-8')) + if raw_output: + return res.digest() + return res.hexdigest() + + def sha1(self, raw_output=False): + """ + Calculates the sha1 hash of a given string + :example 'b5d86317c2a144cd04d0d7c03b2b02666fafadf2' + """ + res = hashlib.sha1(str(self.generator.random.random()).encode('utf-8')) + if raw_output: + return res.digest() + return res.hexdigest() + + def sha256(self, raw_output=False): + """ + Calculates the sha256 hash of a given string + :example '85086017559ccc40638fcde2fecaf295e0de7ca51b7517b6aebeaaf75b4d4654' + """ + res = hashlib.sha256(str(self.generator.random.random()).encode('utf-8')) + if raw_output: + return res.digest() + return res.hexdigest() + + def locale(self): + language_code = self.language_code() + return language_code + '_' + self.random_element( + Provider.language_locale_codes[language_code] + ) + + def language_code(self): + return self.random_element(Provider.language_locale_codes.keys()) + + def uuid4(self): + """ + Generates a random UUID4 string. + """ + # Based on http://stackoverflow.com/q/41186818 + return str(uuid.UUID(int=self.generator.random.getrandbits(128))) + + def password(self, length=10, special_chars=True, digits=True, upper_case=True, lower_case=True): + """ + Generates a random password. + @param length: Integer. Length of a password + @param special_chars: Boolean. Whether to use special characters !@#$%^&*()_+ + @param digits: Boolean. Whether to use digits + @param upper_case: Boolean. Whether to use upper letters + @param lower_case: Boolean. Whether to use lower letters + @return: String. Random password + """ + choices = "" + required_tokens = [] + if special_chars: + required_tokens.append(self.generator.random.choice("!@#$%^&*()_+")) + choices += "!@#$%^&*()_+" + if digits: + required_tokens.append(self.generator.random.choice(string.digits)) + choices += string.digits + if upper_case: + required_tokens.append(self.generator.random.choice(string.ascii_uppercase)) + choices += string.ascii_uppercase + if lower_case: + required_tokens.append(self.generator.random.choice(string.ascii_lowercase)) + choices += string.ascii_lowercase + + assert len(required_tokens) <= length, "Required length is shorter than required characters" + + # Generate a first version of the password + chars = [self.generator.random.choice(choices) for x in range(length)] + + # Pick some unique locations + random_indexes = set() + while len(random_indexes) < len(required_tokens): + random_indexes.add(self.generator.random.randint(0, len(chars) - 1)) + + # Replace them with the required characters + for i, index in enumerate(random_indexes): + chars[index] = required_tokens[i] + + return ''.join(chars) diff --git a/src/libs/faker/providers/misc/en_US/__init__.py b/src/libs/faker/providers/misc/en_US/__init__.py new file mode 100644 index 0000000..e074813 --- /dev/null +++ b/src/libs/faker/providers/misc/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as MiscProvider + + +class Provider(MiscProvider): + pass diff --git a/src/libs/faker/providers/person/__init__.py b/src/libs/faker/providers/person/__init__.py new file mode 100644 index 0000000..242ee0e --- /dev/null +++ b/src/libs/faker/providers/person/__init__.py @@ -0,0 +1,96 @@ +localized = True + +from .. import BaseProvider + + +class Provider(BaseProvider): + formats = ['{{first_name}} {{last_name}}', ] + + first_names = ['John', 'Jane'] + + last_names = ['Doe', ] + + def name(self): + """ + :example 'John Doe' + """ + pattern = self.random_element(self.formats) + return self.generator.parse(pattern) + + def first_name(self): + return self.random_element(self.first_names) + + def last_name(self): + return self.random_element(self.last_names) + + def name_male(self): + if hasattr(self, 'formats_male'): + formats = self.formats_male + else: + formats = self.formats + pattern = self.random_element(formats) + return self.generator.parse(pattern) + + def name_female(self): + if hasattr(self, 'formats_female'): + formats = self.formats_female + else: + formats = self.formats + pattern = self.random_element(formats) + return self.generator.parse(pattern) + + def first_name_male(self): + if hasattr(self, 'first_names_male'): + return self.random_element(self.first_names_male) + return self.first_name() + + def first_name_female(self): + if hasattr(self, 'first_names_female'): + return self.random_element(self.first_names_female) + return self.first_name() + + def last_name_male(self): + if hasattr(self, 'last_names_male'): + return self.random_element(self.last_names_male) + return self.last_name() + + def last_name_female(self): + if hasattr(self, 'last_names_female'): + return self.random_element(self.last_names_female) + return self.last_name() + + def prefix(self): + if hasattr(self, 'prefixes'): + return self.random_element(self.prefixes) + if hasattr(self, 'prefixes_male') and hasattr(self, 'prefixes_female'): + prefixes = self.random_element((self.prefixes_male, self.prefixes_female)) + return self.random_element(prefixes) + return '' + + def prefix_male(self): + if hasattr(self, 'prefixes_male'): + return self.random_element(self.prefixes_male) + return self.prefix() + + def prefix_female(self): + if hasattr(self, 'prefixes_female'): + return self.random_element(self.prefixes_female) + return self.prefix() + + def suffix(self): + if hasattr(self, 'suffixes'): + return self.random_element(self.suffixes) + if hasattr(self, 'suffixes_male') and hasattr(self, 'suffixes_female'): + suffixes = self.random_element((self.suffixes_male, self.suffixes_female)) + return self.random_element(suffixes) + return '' + + def suffix_male(self): + if hasattr(self, 'suffixes_male'): + return self.random_element(self.suffixes_male) + return self.suffix() + + def suffix_female(self): + if hasattr(self, 'suffixes_female'): + return self.random_element(self.suffixes_female) + return self.suffix() diff --git a/src/libs/faker/providers/person/ar_AA/__init__.py b/src/libs/faker/providers/person/ar_AA/__init__.py new file mode 100644 index 0000000..d332475 --- /dev/null +++ b/src/libs/faker/providers/person/ar_AA/__init__.py @@ -0,0 +1,198 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + ) + + formats = formats_male + formats_female + + first_names_female = ( + 'اصيل', 'آلاء', 'آيات', 'ايمان', 'بهجة', 'تمام', 'بشري', 'حياة', + 'خاشعة', 'دانية', 'دعاء', 'زكية', 'نغم', 'لارا', 'زهرة', 'سبأ', + 'ضحى', 'ضياء', 'عالية', 'مريم', 'فداء', 'فرات', 'فردوس', + 'كاملة', 'كوثر', 'هاجر', 'هدى', 'يسرى', 'سجى', 'سلسبيل', 'شهد', + 'جنى', 'اسماءبناتمختلفةومعانيها:', 'ريتاج', 'يارا', 'وصاف', + 'ناردين', 'ميرا', 'مايا', 'مادلين', 'لينا', 'لورا', 'وسجايا', + 'روفيدا', 'ديمه', 'جيلان', 'جوانا', 'ألين', 'لتين', 'تالا', + 'سديم', 'جودي', 'ليان', 'دانة', 'ميار', 'لوجين', 'ربى', 'لورين', + 'ميرال', 'ريتال', 'جوليا', 'جالا', 'جوان', 'راما', 'هايدي', + 'ريفال', 'إلينا', 'أسيل', 'لوليا', 'ليساء', 'ميسون', 'جوين', + 'روبين', 'جمان', 'ميلاء', 'رواء', 'أناهيد', 'بيسان', 'ابتسام', + 'إباء', 'ابتكار', 'ابتهاج', 'ابتهال', 'بوران', 'محمد', + 'بنان', 'بيلسان', 'بتلاء', 'بدرالدّجى', 'تاليا', 'ترف', 'تالا', + 'ترانيم', 'جلنار', 'جميلة', 'جهراء', 'جواهر', 'جوريّة', 'ريمان', + 'ريما', 'ريناد', 'ريفال', 'راما', 'روعة', 'ريما', 'ريم', + 'اعتكاف', 'اعتماد', 'أغاريد', 'افتكار', 'أفراح', 'أفنان', + 'لاما', 'ليم', 'لوليا', 'ريمان', 'أجوان', 'بشرى', 'بلسم', + 'بلقيس', 'بلماء', 'بلند', 'بنان', 'بنفسج', 'بهابهاء', 'بهية', + 'نوره', 'نوف', 'نوال', 'ناديه', 'هدى', 'هناء', 'هيا', 'هند', + 'هنادي', 'وفاء', 'ياسمين', 'يسرى', 'غيداء', 'شادن', 'جود', + 'سلاف', 'جيلان', 'نشوة', 'ريان', 'دارين', '', 'أحلام', 'إخلاص', + 'أروى', 'أريج', 'أزهار', 'أسرار', 'آيات', 'ماذى', 'تولين', + 'هيام', 'ريناد', 'جميلة', 'حلا', 'عتاب', 'كرمة', 'ناهد', 'غوى', + 'ريف', 'بارعة', 'باسمة', 'باهرة', 'بتول', 'بثينة', 'أحمد', + ) + + first_names_male = ( + 'تاج', 'تامر', 'تحسين', 'تقي', 'تمّام', 'تميم', 'توفيق', 'ترف', + 'تاج الدّين', 'تقيّ الدّين', 'ثائر', 'ثابت', 'ثامر', 'ثروت', + 'ثقيف', 'ثاقب', 'جابر', 'جاد', 'جاسم', 'جرير', 'جسور', + 'جعفر', 'جلاء', 'جلال', 'جليل', 'جمال', 'جميل', 'جدير', + 'جرّاح', 'جلال الدّين', 'جمال الدّين','جهاد', 'حاتم', 'حارث', + 'حازم', 'حافظ', 'حامد', 'حبّاب', 'حسام', 'حسن', 'حسيب', + 'حسين', 'حسني', 'حسنين', 'حقّي', 'حكيم', 'حليم', 'حمّاد', + 'حمدان', 'حمدي', 'حمزة', 'حمود', 'حميد', 'حنبل', 'حنفي', + 'حيّان', 'حيدر', 'حفيظ', 'خاطر', 'خافق', 'خالد', 'خالدي', + 'خلدون', 'خلف', 'خلوصي', 'خليفة', 'خليل', 'خميس', 'خيري', + 'خضر', 'خطيب', 'دؤوب', 'داني', 'داهي', 'داوود', 'دريد', + 'دليل', 'دهمان', 'ديسم', 'ذيب', 'ذكي', 'ذريع', 'رائد', + 'رائف', 'رابح', 'راتب', 'راجح', 'راجي', 'رازي', 'راشد', 'راضي', + 'راغب', 'رامز', 'رامي', 'رامح', 'راني', 'راوي', 'رؤوف', 'رباح', + 'ريّان', 'ربيع', 'رجاء', 'رجائي', 'رجب', 'رخاء', 'رستم', + 'رسمي', 'رشاد', 'رشدي', 'رشيد', 'رضوان', 'رفيق', 'رمحي', + 'رمزي', 'رمضان', 'رهيف', 'روحي', 'رافع', 'رئيس', 'رحيب', + 'رزين', 'راسم', 'رضي', 'زاخر', 'زاكي', 'زاهر', 'زاهي', + 'زايد', 'زبير', 'زغلول', 'زكريا', 'زكي', 'زهدي', 'زهران', + 'زهير', 'زياد', 'زيد', 'زيدان', 'زين', 'سائد', 'ساجد', + 'سخاء', 'ساجي', 'ساطع', 'سالم', 'سامح', 'ساهر', 'سامر', + 'سامي', 'ساهد', 'سراج', 'سرحان', 'سرور', 'سعد', 'سعدون', + 'سعدي', 'سعود', 'سعيد', 'سفيان', 'سفير', 'سلام', 'سلطان', + 'سلمان', 'سليمان', 'سموح', 'سمير', 'سنان', 'سنام', 'سهل', + 'سهوان', 'سهيل', 'سيّد', 'سليم', 'سراج الدّين', 'سيفالدّين', + 'شادي', 'شافع', 'شاكر', 'شامخ', 'شامل', 'شبلي', 'شبيب', + 'شدّاد', 'شريف', 'شعبان', 'شعيب', 'شفيع', 'شعلان', 'شكري', + 'شكيب', 'شهب', 'شهاب', 'شهم', 'شهير', 'شوقي', 'شجاع', 'شاطر', + 'شيّق', 'صائب', 'صابر', 'صاحب', 'صادح' 'صادق', 'صارم', + 'صافي', 'صالح', 'صامد', 'صباح', 'صبحي', 'صبري', 'صبور', + 'صبيح', 'صخر', 'صدقي', 'صدّام', 'صدّاح', 'صعب', 'صقر', + 'صلاح', 'صنديد', 'صهيب', 'صدر الدّين', 'صلاح الدّين', 'ضاحك', + 'ضاحي', 'ضحّاك', 'ضرغام', 'ضياء', 'ضيائي', 'ضياءالدّين', + 'طائع', 'طائف', 'طائل', 'طارق', 'طالب', 'طامح', 'طاهر', + 'طبّاع', 'طريف', 'طلال', 'طلعت', 'طموح', 'طه', 'طيّب', + 'طيّع', 'ظافر', 'ظبي', 'ظريف', 'ظهير', 'ظاعن', 'ظاهر', + 'عائد', 'عابد', 'عادل', 'عارف', 'عاصم', 'عاطف' 'عاقل', + 'عاكف', 'عالم', 'عامر', 'عبّاس', 'عبّود', 'عتريس', 'عتيد', + 'عربي', 'عثمان', 'عدلي', 'عدنان', 'عدوي', 'عرفات', 'عرفه', + 'عرفان', 'عزاز', 'عزّت', 'عزمي', 'عصام', 'عصمت', 'عطاء', + 'عفيف', 'عقيل' 'علاء', 'علّام', 'علوان', 'علي', 'عماد', + 'عمّار', 'عمر', 'عمران', 'عمرو', 'عمير', 'عاتب', 'عتيق', + 'عذب', 'عزيز', 'عبد الحقّ', 'عبدالله', 'عبدالرّحمن', + 'عزّالدّين', 'علاءالدّين', 'علم الدّين', 'عبد الإله', 'مُتعب', + 'عبد الباري', 'عبد الباقي', 'عبد التّواب', 'عبد الجبّار', + 'عبد الجليل', 'عبد الحفيظ', 'عبد الحكيم', 'عبد الحليم', + 'عبد الحيّ', 'عبد المحيي', 'عبد الخالق', 'عبد الرّزاق', 'هزار', + 'عبد الرّشيد', 'عبد الرّحمن', 'عبد الرّحيم', 'عبد الرّؤوف', + 'عبد السّميع', 'عبد الشّكور', 'عبد الصّمد', 'عبد العليم', + 'عبد الغفّار', 'عبد الغفور', 'عبد القادر', 'مهنّد', 'نزيه', + 'عبد القدّوس', 'عبد القهّار', 'عبد الكريم', 'عبد اللطيف', + 'عبد المجيد', 'عبد المولى', 'عبد العزيز', 'عبد السّلام', + 'عبد الملك', 'عبد الواحد', 'عبد الغني', 'غازي', 'غالب', + 'غالي', 'غانم', 'غزوان', 'غسّان', 'غطفان', 'غزير', 'غامد', + 'فائق', 'فاتح', 'فاخر', 'فادي', 'كامل', 'مصعب', 'ممتاز', + 'فرج', 'فارس', 'فارع', 'فاروق', 'فاضل', 'فالح', 'فايد', 'فتوح', + 'فتحي', 'فخر', 'فخري', 'فداء', 'فدائي', 'فراس', 'فرج', 'فرحان', + 'فرزدق', 'فضل', 'فطين', 'فكري', 'فلاح', 'فهد', 'فهمي', 'فؤاد', + 'فوّاز', 'فوزي', 'فضل', 'فيّاض', 'فيصل', 'فخر الدّين', 'قاسم', + 'قاصد', 'قانت', 'قائد', 'قحطان', 'قدري', 'قصي', 'قنوع', 'قيس', + 'قبس', 'قصيد', 'قطب', 'قطز', 'كارم', 'كاسر', 'كاشف', 'كاظم', + 'كايد', 'كافور', 'كتوم', 'كرم', 'كريم', 'كسّاب', 'كمال', 'كنار', + 'كنعان', 'كنان', 'كبير', 'كليم', 'لبيب', 'لبيد', 'لطفي', 'لطوف', + 'لفيف', 'لقمان', 'لقاء', 'لؤي', 'لهفان', 'ليث', 'لمّاح', 'مأمون', + 'ماجد', 'مازن', 'مالك', 'ماهر', 'محمّد', 'مُتوكّل', 'مُتولي', + 'مُتيّم', 'مجد', 'مجاهد', 'مَجدي', 'محجوب', 'محسن', 'محفوظ', + 'محمود', 'مختار', 'مخلص', 'مُخيمر', 'مدحت', 'مراد', 'مرادي', + 'مرتجي', 'مرتقي', 'مرزوق', 'مرسال', 'مرتضي', 'مُرسي', 'مرشد', + 'مُرضي', 'مرعي', 'مروان', 'مزهر', 'مسرور', 'مُسعف', 'مَسعد', + 'مسعود', 'مسلم', 'مشرف', 'مشرق', 'مشفق', 'مصباح', 'مصطفى', + 'مُصلح', 'مطاوع', 'مظهر', 'مُعتز', 'معتوق', 'معزّ', 'معمّر', 'معن', + 'معين', 'مفيد', 'مقداد', 'مقدام', 'مكّي', 'مكرّم', 'ملهم', 'يونس', + 'ممدوح', 'مُناضل', 'مناف', 'مُنذر', 'منيف', 'منتصر', 'مُنجد', + 'منسي', 'منصور', 'مُنير', 'منيب', 'منيع', 'مهدي', 'مهران', + 'مهيب', 'موسى', 'موفّق', 'مؤمن', 'مؤنس', 'مؤيّد', 'ميّاد', 'مياس', + 'ميسور', 'ميمون', 'ميثاق', 'معارف', 'محييالدّين', 'مشاري', + 'نائل', 'ناجح', 'ناجي', 'نادر', 'نادي', 'ناصر', 'ناضر', 'ناصيف', + 'ناظم', 'ناعم', 'نافذ', 'نافع', 'نبهان', 'نبيل', 'نبيه', 'نبراس', + 'نورالحقّ', 'نجدت', 'نجوان', 'نجيب', 'نديم', 'نذير', 'نزار', + 'نسيب', 'نشأت', 'نصر', 'نضال', 'نصري', 'نصور', 'نصوح', 'نظام', + 'نظمي', 'نعيم', 'نعمان', 'نمر', 'نوّاف', 'نوح', 'نوّار', 'نور', + 'نورس', 'نشوان', 'نوري', 'نيازي', 'ناصر الدّين', 'نصر الدّين', + 'نور الدّين', 'نجم الدّين', 'هادي', 'هاشم', 'هاني', 'هايل', + 'هلال', 'هلالي', 'همام', 'هيكل', 'هيمان', 'هيثم', 'وائل', 'واثق', + 'وادع', 'واصف', 'واصل', 'وثّاب', 'وجدي', 'وجيه', 'وحيد', 'ودود', + 'وديع', 'وريد', 'وسام', 'وسيم', 'وسيل', 'وصفي', 'وضّاح', 'وفائي', + 'وفيق', 'وليد', 'وليف', 'ياسر', 'يافع', 'ياقوت', 'يانع', 'يحيى', + 'يزيد', 'يسار', 'يسري', 'يعرب', 'يعقوب', 'يقين', 'يمام', 'يوسف', + ) + + first_names = first_names_male + first_names_female + + last_names = ( + 'الخالدي', 'البديري', 'الشهابي', 'العفيفي', 'جزار', + 'الخطيب بني جماعة الكناني', 'الدجاني', 'الغوانمة', 'جار الله', + 'السروري', 'الامام', 'النقيب', 'المفتي', 'ابو السعود', + 'الفتياني', 'العلمي', 'بو مدين', 'نسيبة', 'النشاشيبي', 'العسلي', + 'الحسيني', 'الجاعوني', 'درويش', 'الأنصاري', 'جودة', 'النمري', + 'قطينة', 'الداودي', 'العارف', 'رصاص', 'البخاري', 'كمال', + 'الترجمان الصالح', 'غنيم', 'المؤقت', 'شتية', 'شرف', 'نور الدين', + 'الشعباني', 'الأيوبي', 'الجبشة', 'هندية', 'البشيتي', 'الوعري', + 'الموسوس', 'المظفر', 'الترهي', 'البغدادي', 'الهدمي', 'البامية', + 'الكلغاصي', 'اليوزباشي', 'المتولي', 'اسطمبولي', 'الألجاوي', + 'معتوق', 'حب رمان', 'القرجولي', 'نجم', 'طه', 'عبده', 'سموم', + 'نجيب', 'غوشة', 'اهرام', 'قرش', 'الكالوتي', 'حجازي', 'زحيكة', + 'جعفر', 'ازحيمان', 'الحواش', 'القضماني', 'طوطح', 'الشاويش', + 'بدرية', 'ابو الحاج', 'البيطار', 'صيام', 'قليبو', 'ارناؤوط', + 'الشرفاء', 'الحلاق', 'المملوك', 'السمان', 'طقش', 'وهبة', + 'عبد اللطيف', 'طزيز', 'السيفي', 'عويضة', 'القطب', 'الطحان', + 'النجار', 'القباني', 'عكاوي', 'الديسي', 'الزماميري', 'التوتنجي', + 'الحلواني', 'القزاز', 'الماني', 'الدقاق', 'الشامي', 'سوميرة', + 'ابو عيد', 'الخلفاوي', 'الدسوقي', 'المغربي', 'أفغاني', 'مراد', + 'زلاطيمو', 'سرندح', 'مشعشع', 'بحمدوني', 'بعلبكي', 'صيداوي', + 'صيداني', 'طرابلسي', 'جزيني', 'بيروتي', 'عرموني', 'متني', + 'شويفاتي', 'مزرعاني', 'بتروني', 'جبيلي', 'اميوني', 'زحلاوي', + 'الساحلي', 'القاعي', 'القلموني', 'البيسار القعقور', 'إياد', + 'الأزد', 'الأشراف', 'السادة', 'الأوس', 'أشجع', 'ألمع', 'أنمار', + 'بنو الأحمر', 'بنو الأحمر بن الحارث', 'بنو الأسمر', 'بنو أسد', + 'بنو أمية', 'أكلب', 'بنو النجار', 'البقوم', 'أولاد بوعزيز', + 'بارق', 'باهلة', 'بجيلة', 'بكر بن عبد مناة', 'بكر بن وائل', + 'بديرية', 'بلغازي', 'بلقرن', 'بلي', 'بيرقدار', 'بني بيات', + 'بكيل', 'ترابين', 'تغلب بن وائل', 'تميم', 'تنوخ', 'ثقيف', + 'الجعليين', 'جرهم', 'جديس', 'جذام', 'جهينة', + 'الحجر بن الهنوء بن الأزد', 'الحداء', 'الحكم بن سعد العشيرة', + 'بنو الحارث بن كعب', 'حرب', 'بنو حنيفة', 'حاشد', 'حميضة', + 'حمير', 'حوالة', 'الحويطات', 'الخزرج', 'بنو خالد', 'خثعم', + 'خزاعة', 'خندف', 'خولان', 'الدليم', 'الدواسر', 'بنو الدئل', + 'دوبلال', 'بنو ذي أصبح', 'راجح', 'بني رشيد', 'ربيعة', 'الرباب', + 'الرباطاب', 'السادة الراويون', 'الزرقان', 'زبيد', 'أولاد زيان', + 'بنو زيد', 'زهران', 'السهول', 'بنو سعد بن بكر', + 'بنو سعد بن ليث بن بكر', 'سليم', 'سبيع', 'الشايقية', 'الشحوح', + 'بنو شعبة', 'شمران', 'بنو شهر', 'بنو شيبان', 'بنو شيبة', 'شمر', + 'شهران', 'بنو صخر', 'بنو ضمرة', 'ضبيعة', 'طسم', 'طيء', 'الظفير', + 'عجرمة (العجارمة)', 'العجمان', 'العقيدات', 'العوازم', 'العوالق', + 'بنو العريج', 'عاملة', 'بنو عبس', 'بنو عجل', 'بنو عدي', + 'بنو عمرو', 'عامر بن صعصعة', 'عبد القيس', 'عتيبة', 'عدوان', + 'عذرة', 'عسير', 'عليان', 'عنز بن وائل', 'عنزة', 'عنس', 'عضل', + 'بني عطية', 'غامد', 'غطفان', 'بنو فراس', 'فراهيد', 'فهم', + 'القواسم', 'قحطان', 'قريش', 'قضاعة', 'قيس عيلان', 'بنو كنز', + 'الكواهلة', 'بنو كلب', 'كنانة', 'الكبابيش', 'كندة', 'كهلان', + 'الكثيري', 'بنو لام', 'لخم', 'بنو ليث', 'المرازيق', 'المنتفق', + 'الموركة', 'المهرة', 'بنو مالك', 'بنو معقل', 'بنو مهدي', + 'مزينة', 'مذحج', 'مرازيق البقوم', 'مضر', 'مطير', 'ميرفاب', + 'النمر', 'نهد', 'بني هاجر', 'بنو هاشم', 'بنو هلال', + 'قبيلة هذيل البقوم', 'هذيل', 'همدان', 'هوازن', 'بنو ياس', + 'بنو يعلى', 'يافع', 'يشكر', + ) + + prefixes_female = ( + 'السيدة', 'الآنسة', 'الدكتورة', 'الأستاذة', 'المهندسة', + ) + prefixes_male = ('السيد', 'المهندس', 'الدكتور', 'الأستاذ',) diff --git a/src/libs/faker/providers/person/ar_PS/__init__.py b/src/libs/faker/providers/person/ar_PS/__init__.py new file mode 100644 index 0000000..a4a7dac --- /dev/null +++ b/src/libs/faker/providers/person/ar_PS/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +from __future__ import unicode_literals +from ..ar_AA import Provider as ArabicPersonProvider + + +class Provider(ArabicPersonProvider): + last_names = ( + 'خوري', 'شاهين', 'البرغوثي', 'الحسيني', 'الزيدانية', 'جرار', + 'السكاكيني', 'طوقان', 'نسيبة', 'النشاشيبي', 'الخازن', 'ترابين', + 'دغمش', 'دلاشة', 'الزيتاوي', 'صليبا', 'التركمان', 'الإغباري', + 'كسواني', 'جزار', 'أبو اسنينة', 'التميمي', 'الجنيدي', 'بدر', + 'أبو شقدم', 'أبو غليون', 'أبو قمر', 'الأدغم', 'حوسة', 'الصالحي', + 'حمامي', 'هاشم', 'الحنبلي', 'أستيتية', 'مرمش', 'قرادة', + 'فطاير', 'الخماش', 'الخياط', 'النعنيش', 'مهيار', 'أبو شلبك', + ) diff --git a/src/libs/faker/providers/person/ar_SA/__init__.py b/src/libs/faker/providers/person/ar_SA/__init__.py new file mode 100644 index 0000000..00e3364 --- /dev/null +++ b/src/libs/faker/providers/person/ar_SA/__init__.py @@ -0,0 +1,17 @@ +# coding=utf-8 +from __future__ import unicode_literals +from ..ar_AA import Provider as ArabicPersonProvider + + +class Provider(ArabicPersonProvider): + last_names = ( + 'حجار', 'آل الشيخ', 'الحجار', 'حنبولي', 'آل سعود', 'آل علي', + 'آل جعفر', 'أبا الخيل', 'المهنا', 'مهنا', 'بن لادن', 'كانو', + 'الجفالي', 'فصيل', 'آل رفيع', 'آل بن لافي', 'آل العسكري', + 'آل بن ظافر', 'آل عواض', 'المشاولة', 'آل مقطة', 'آل عايض', + 'آل معيض', 'آل حسين', 'المغاولة', 'آل خضير', 'آل صفوان', + 'آل محمد بن علي بن جماز', 'آل عطفة', 'آل قصير', 'آل سلطان', + 'العليان', 'الشايع', 'أبو داوود', 'الدباغ', 'العجلان', 'الراشد', + 'المهيدب', 'العقيل', 'شربتلي', 'الخرافي', 'أبو داوود', 'الجابر', + 'بقشان', 'الحكير', + ) diff --git a/src/faker/providers/bg_BG/person.py b/src/libs/faker/providers/person/bg_BG/__init__.py similarity index 97% rename from src/faker/providers/bg_BG/person.py rename to src/libs/faker/providers/person/bg_BG/__init__.py index 8177a60..aae6012 100644 --- a/src/faker/providers/bg_BG/person.py +++ b/src/libs/faker/providers/person/bg_BG/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -210,35 +210,3 @@ class Provider(PersonProvider): formats = formats_male + formats_female first_names = first_names_male + first_names_female last_names = last_names_male + last_names_female - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def first_name(cls): - return cls.random_element(cls.first_names) - - @classmethod - def last_name_female(cls): - return cls.random_element(cls.last_names_female) - - @classmethod - def last_name_male(cls): - return cls.random_element(cls.last_names_male) - - @classmethod - def last_name(cls): - return cls.random_element(cls.last_names) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes_male) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes_female) diff --git a/src/faker/providers/cs_CZ/person.py b/src/libs/faker/providers/person/cs_CZ/__init__.py similarity index 81% rename from src/faker/providers/cs_CZ/person.py rename to src/libs/faker/providers/person/cs_CZ/__init__.py index 46343fa..9ee5a6e 100644 --- a/src/faker/providers/cs_CZ/person.py +++ b/src/libs/faker/providers/person/cs_CZ/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -48,6 +48,8 @@ class Provider(PersonProvider): 'Viktorie', 'Vladimíra', 'Vlasta', 'Věra', 'Zdenka', 'Zdeňka', 'Zuzana', 'Štěpánka', 'Šárka', 'Žaneta' ) + first_names = first_names_male + first_names_female + last_names_male = ( 'Bartoš', 'Beneš', 'Blažek', 'Bláha', 'Doležal', 'Dušek', 'Dvořák', 'Fiala', 'Holub', 'Horák', 'Hájek', 'Jelínek', 'Kadlec', 'Kolář', 'Kopecký', 'Kratochvíl', 'Krejčí', 'Král', 'Kučera', 'Kříž', 'Malý', 'Marek', 'Mareš', 'Mašek', @@ -64,6 +66,8 @@ class Provider(PersonProvider): 'Černá', 'Říhová', 'Šimková', 'Štěpánková', 'Šťastná' ) + last_names = last_names_male + last_names_female + degrees = ('JUDr.', 'Ing.', 'Bc.', 'Mgr.', 'MUDr.', 'RNDr.' ) prefixes_male = ('pan', ) + degrees @@ -71,43 +75,3 @@ class Provider(PersonProvider): prefixes_female = ('paní', 'slečna', ) + degrees suffixes = ('CSc.', 'DiS.', 'Ph.D.', 'Th.D.') - - @classmethod - def first_name(cls): - return cls.random_element((cls.first_name_male(), cls.first_name_female())) - - @classmethod - def last_name(cls): - return cls.random_element((cls.last_name_male(), cls.last_name_female())) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def last_name_male(cls): - return cls.random_element(cls.last_names_male) - - @classmethod - def last_name_female(cls): - return cls.random_element(cls.last_names_female) - - @classmethod - def prefix(cls): - return cls.random_element((cls.prefix_male(), cls.prefix_female())) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes_male) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes_female) - - @classmethod - def suffix(cls): - return cls.random_element(cls.suffixes) diff --git a/src/libs/faker/providers/person/de_AT/__init__.py b/src/libs/faker/providers/person/de_AT/__init__.py new file mode 100644 index 0000000..7796590 --- /dev/null +++ b/src/libs/faker/providers/person/de_AT/__init__.py @@ -0,0 +1,61 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{prefix}} {{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{prefix}} {{first_name}} {{last_name}}' + ) + + first_names = ( + 'Alexander', 'Alina', 'Andreas', 'Anna', 'Anton', + 'Benjamin', 'Bernhard', + 'Christian', 'Christop', + 'Daniel', 'David', 'Dominik', + 'Elena', 'Elias', 'Emil', 'Emilia', + 'Fabian', 'Felix', 'Florian', 'Franz', 'Fransizka', + 'Gabriel', 'Gernot', + 'Hanna', + 'Ingrid', 'Isabel' + 'Jakob', 'Jana', 'Jasmin', 'Johanna', 'Johannes', 'Jonas', 'Julia', 'Julian', + 'Katharinna', 'Konrad', 'Konstantin' + 'Lara', 'Laura', 'Lena', 'Leo', 'Leon', 'Linda', 'Luca', 'Lukas', + 'Marcel', 'Maria', 'Martin', 'Matthias', 'Max', 'Maximilian', 'Mia', 'Michael', 'Moritz', + 'Nico', 'Niklas', 'Nina', 'Noah', + 'Oliver', 'Olivia', + 'Paul', 'Paula', 'Philipp', 'Pia', + 'Raphael', 'Robert', + 'Samuel', 'Sarah', 'Sebastian', 'Simon', 'Sophie', + 'Theresa', 'Thomas', 'Tim', 'Tobias', + 'Valentin' + ) + + last_names = ( + 'Auer', 'Aigner', + 'Bauer', 'Baumgartner', 'Berger', 'Binder', 'Brunner', + 'Cap', 'Capek', 'Cech', 'Chum', + 'Deng', 'Denk', 'Daume', 'Dienstl', + 'Ebner', 'Eder', 'Egger', + 'Fasching', 'Felber', 'Ferstel', 'Fichtner', 'Fischer', 'Fuchs', + 'Gasser', 'Gastegger', 'Geier', 'Geisler', 'Grabner', 'Gruber', + 'Haas', 'Haiden', 'Hofer', 'Holzer', 'Huber', + 'Illes', 'Ircher', 'Itzlinger', + 'Jahn', 'Jobst', 'Jung', 'Jungbauer', 'Just', + 'Kainz', 'Karl', 'Karner', 'Koller', + 'Lang', 'Lechner', 'Lehner', 'Leitner', + 'Maier', 'Mair', 'Maurer', 'Mayer', 'Mayr', 'Moser', 'Müllner', + 'Pichler', 'Pucher', + 'Reiter', 'Riegler', + 'Schmid', 'Schneider', 'Schuster', 'Schwarz', 'Stadler', 'Steiner', + 'Wallner', 'Weber', 'Weiss', 'Wieser', 'Wimmer', 'Winkler', 'Winter', 'Wolf', + ) + + prefixes = ('Dr.', 'Mag.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.') diff --git a/src/libs/faker/providers/person/de_DE/__init__.py b/src/libs/faker/providers/person/de_DE/__init__.py new file mode 100644 index 0000000..70ac95f --- /dev/null +++ b/src/libs/faker/providers/person/de_DE/__init__.py @@ -0,0 +1,422 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}-{{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}-{{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{suffix}}', + '{{first_name_female}} {{last_name}} {{suffix}}', + '{{prefix_male}} {{first_name_male}} {{last_name}} {{suffix}}', + '{{prefix_female}} {{first_name_female}} {{last_name}} {{suffix}}', + ) + + # From http://de.wiktionary.org/wiki/Verzeichnis:Deutsch/Liste_der_h%C3%A4ufigsten_m%C3%A4nnlichen_Vornamen_Deutschlands + first_names_male = ( + 'Abbas', 'Abdul', 'Abdullah', 'Abraham', 'Abram', 'Achim', 'Ada', + 'Adalbert', 'Adam', 'Adelbert', 'Adem', 'Adolf', 'Adrian', 'Ahmad', + 'Ahmed', 'Ahmet', 'Alan', 'Alban', 'Albert', 'Alberto', 'Albin', + 'Albrecht', 'Aldo', 'Aleksandar', 'Aleksander', 'Aleksandr', 'Aleksej', + 'Alessandro', 'Alex', 'Alexander', 'Alexandre', 'Alexandros', 'Alexei', + 'Alexej', 'Alf', 'Alfons', 'Alfonso', 'Alfred', 'Alfredo', 'Ali', + 'Alois', 'Aloys', 'Alwin', 'Amir', 'Anastasios', 'Anatol', 'Anatoli', + 'Anatolij', 'Andre', 'Andreas', 'Andree', 'Andrei', 'Andrej', 'Andres', + 'Andrew', 'Andrey', 'Andrzej', 'André', 'Andy', 'Angelo', 'Anselm', + 'Ansgar', 'Ante', 'Anthony', 'Anto', 'Anton', 'Antonino', 'Antonio', + 'Antonios', 'Antonius', 'Apostolos', 'Aribert', 'Arif', 'Armin', 'Arnd', + 'Arndt', 'Arne', 'Arnfried', 'Arnim', 'Arno', 'Arnold', 'Arnulf', + 'Arthur', 'Artur', 'Athanasios', 'Attila', 'August', 'Augustin', 'Axel', + 'Aziz', 'Baldur', 'Balthasar', 'Baptist', 'Bartholomäus', 'Bastian', + 'Bayram', 'Bekir', 'Bela', 'Ben', 'Benedikt', 'Benjamin', 'Benno', + 'Berend', 'Bernard', 'Bernd', 'Bernd-Dieter', 'Berndt', 'Bernfried', + 'Bernhard', 'Bernt', 'Bernward', 'Bert', 'Berthold', 'Bertold', + 'Bertram', 'Birger', 'Björn', 'Bodo', 'Bogdan', 'Boris', 'Branko', + 'Brian', 'Bruno', 'Burckhard', 'Burghard', 'Burkard', 'Burkhard', + 'Burkhardt', 'Calogero', 'Carl', 'Carl-Heinz', 'Carlo', 'Carlos', + 'Carmelo', 'Carsten', 'Celal', 'Cemal', 'Cemil', 'Cengiz', 'Cetin', + 'Charles', 'Christian', 'Christof', 'Christoph', 'Christopher', + 'Christos', 'Claas', 'Claudio', 'Claudius', 'Claus', 'Claus-Dieter', + 'Claus-Peter', 'Clemens', 'Conrad', 'Constantin', 'Cord', 'Cornelius', + 'Cosimo', 'Curt', 'Czeslaw', 'Dagobert', 'Damian', 'Dan', 'Daniel', + 'Daniele', 'Danilo', 'Danny', 'Darius', 'Dariusz', 'Darko', 'David', + 'Denis', 'Dennis', 'Denny', 'Detlef', 'Detlev', 'Diedrich', 'Dierk', + 'Dieter', 'Diethard', 'Diethelm', 'Diether', 'Dietmar', 'Dietrich', + 'Dimitri', 'Dimitrios', 'Dino', 'Dirk', 'Ditmar', 'Dittmar', 'Dogan', + 'Domenico', 'Dominic', 'Dominik', 'Donald', 'Dragan', 'Drago', 'Dursun', + 'Dusan', 'Eberhard', 'Eberhardt', 'Eckard', 'Eckart', 'Eckehard', + 'Eckhard', 'Eckhardt', 'Eckhart', 'Edelbert', 'Edgar', 'Edmund', + 'Eduard', 'Edward', 'Edwin', 'Egbert', 'Eggert', 'Egon', 'Ehrenfried', + 'Ehrhard', 'Eitel', 'Ekkehard', 'Ekkehart', 'Ekrem', 'Elias', 'Elmar', + 'Emanuel', 'Emil', 'Emin', 'Emmerich', 'Engelbert', 'Engin', 'Enno', + 'Enrico', 'Enver', 'Ercan', 'Erdal', 'Erdogan', 'Erhard', 'Erhardt', + 'Eric', 'Erich', 'Erik', 'Erkan', 'Ernest', 'Ernst', 'Ernst-August', + 'Ernst-Dieter', 'Ernst-Otto', 'Erol', 'Erwin', 'Eugen', 'Evangelos', + 'Ewald', 'Fabian', 'Falk', 'Falko', 'Faruk', 'Fatih', 'Fedor', 'Felix', + 'Ferdi', 'Ferdinand', 'Ferenc', 'Fernando', 'Filippo', 'Florian', + 'Folker', 'Folkert', 'Francesco', 'Francis', 'Francisco', 'Franco', + 'Franjo', 'Frank', 'Frank-Michael', 'Frank-Peter', 'Franz', + 'Franz Josef', 'Franz-Josef', 'Franz-Peter', 'Franz-Xaver', 'Fred', 'Freddy', + 'Frederic', 'Frederik', 'Fredi', 'Fredo', 'Fredy', 'Fridolin', + 'Friedbert', 'Friedemann', 'Frieder', 'Friedhelm', 'Friedhold', + 'Friedo', 'Friedrich', 'Friedrich-Karl', 'Friedrich-Wilhelm', + 'Frithjof', 'Fritz', 'Gabor', 'Gabriel', 'Gaetano', 'Gebhard', 'Geert', + 'Georg', 'George', 'Georgios', 'Gerald', 'Gerard', 'Gerd', 'Gereon', + 'Gerfried', 'Gerhard', 'Gerhardt', 'Gerhart', 'German', 'Gernot', + 'Gero', 'Gerold', 'Gerolf', 'Gert', 'Gerwin', 'Gilbert', 'Gino', + 'Giorgio', 'Giovanni', 'Gisbert', 'Giuseppe', 'Goran', 'Gordon', + 'Gottfried', 'Gotthard', 'Gotthilf', 'Gotthold', 'Gottlieb', 'Gottlob', + 'Gregor', 'Grzegorz', 'Guenter', 'Guenther', 'Guido', 'Guiseppe', + 'Gunar', 'Gundolf', 'Gunnar', 'Gunter', 'Gunther', 'Guntram', 'Gustav', + 'Götz', 'Günter', 'Günther', 'H.-Dieter', 'Hagen', 'Hajo', 'Hakan', + 'Halil', 'Hannes', 'Hanni', 'Hanno', 'Hanns', 'Hans', 'Hans D.', + 'Hans Dieter', 'Hans Georg', 'Hans Josef', 'Hans Jörg', 'Hans Jürgen', + 'Hans Peter', 'Hans-Adolf', 'Hans-Albert', 'Hans-Bernd', 'Hans-Christian', + 'Hans-Detlef', 'Hans-Dieter', 'Hans-Dietrich', 'Hans-Eberhard', + 'Hans-Erich', 'Hans-Friedrich', 'Hans-Georg', 'Hans-Gerd', 'Hans-Gerhard', + 'Hans-Günter', 'Hans-Günther', 'Hans-H.', 'Hans-Heinrich', 'Hans-Helmut', + 'Hans-Henning', 'Hans-Herbert', 'Hans-Hermann', 'Hans-Hinrich', + 'Hans-J.', 'Hans-Joachim', 'Hans-Jochen', 'Hans-Josef', 'Hans-Jörg', + 'Hans-Jürgen', 'Hans-Karl', 'Hans-Ludwig', 'Hans-Martin', 'Hans-Michael', + 'Hans-Otto', 'Hans-Peter', 'Hans-Rainer', 'Hans-Rudolf', + 'Hans-Theo', 'Hans-Ulrich', 'Hans-Uwe', 'Hans-Walter', 'Hans-Werner', + 'Hans-Wilhelm', 'Hans-Willi', 'Hans-Wolfgang', 'Hansgeorg', + 'Hansjoachim', 'Hansjörg', 'Hansjürgen', 'Hanspeter', 'Harald', 'Hardy', + 'Harm', 'Harold', 'Harri', 'Harro', 'Harry', 'Hartmut', 'Hartmuth', + 'Hartwig', 'Hasan', 'Hassan', 'Hasso', 'Heiko', 'Heimo', 'Heiner', + 'Heinfried', 'Heini', 'Heino', 'Heinrich', 'Heinz', 'Heinz Dieter', + 'Heinz-Dieter', 'Heinz-Georg', 'Heinz-Gerd', 'Heinz-Günter', + 'Heinz-Günther', 'Heinz-Joachim', 'Heinz-Josef', 'Heinz-Jürgen', 'Heinz-Otto', + 'Heinz-Peter', 'Heinz-Walter', 'Heinz-Werner', 'Heinz-Wilhelm', 'Heinz-Willi', + 'Helfried', 'Helge', 'Hellmut', 'Hellmuth', 'Helmar', 'Helmut', + 'Helmuth', 'Hendrik', 'Henner', 'Henning', 'Henrik', 'Henry', 'Henryk', + 'Herbert', 'Heribert', 'Hermann', 'Hermann Josef', 'Hermann-Josef', + 'Herrmann', 'Herwig', 'Hilmar', 'Hinrich', 'Holger', 'Holm', 'Horst', + 'Horst-Dieter', 'Horst-Günter', 'Horst-Peter', 'Hubert', 'Hubertus', + 'Hugo', 'Hüseyin', 'Ian', 'Ibrahim', 'Ignatz', 'Ignaz', 'Igor', 'Ilhan', + 'Ilias', 'Ilija', 'Ilja', 'Immo', 'Imre', 'Ingbert', 'Ingmar', 'Ingo', + 'Ingolf', 'Ioannis', 'Isidor', 'Ismail', 'Ismet', 'Istvan', 'Ivan', + 'Ivo', 'Iwan', 'Jacek', 'Jacob', 'Jakob', 'James', 'Jan', 'Jan-Peter', + 'Janko', 'Jann', 'Janos', 'Janus', 'Janusz', 'Jaroslav', 'Jaroslaw', + 'Jens', 'Jens-Peter', 'Jens-Uwe', 'Jerzy', 'Jiri', 'Joachim', 'Jobst', + 'Jochem', 'Jochen', 'Joerg', 'Johan', 'Johann', 'Johannes', 'John', + 'Jonas', 'Jonas', 'Jonathan', 'Jorge', 'Jose', 'Josef', 'Joseph', + 'Josip', 'Jost', 'José', 'Jovan', 'Jozef', 'Juan', 'Juergen', 'Julian', + 'Julius', 'Juri', 'Jurij', 'Justus', 'Jörg', 'Jörg-Peter', 'Jörgen', + 'Jörn', 'Jürgen', 'Kai-Uwe', 'Kamil', 'Karl', 'Karl Heinz', 'Karl-August', + 'Karl-Dieter', 'Karl-Ernst', 'Karl-Friedrich', 'Karl-Georg', + 'Karl-Hans', 'Karl-Heinrich', 'Karl-Heinz', 'Karl-Hermann', 'Karl-Josef', + 'Karl-Jürgen', 'Karl-Ludwig', 'Karl-Otto', 'Karl-Peter', 'Karl-Werner', + 'Karl-Wilhelm', 'Karlfried', 'Karlheinz', 'Karsten', 'Kasimir', + 'Kaspar', 'Kay-Uwe', 'Kazim', 'Kemal', 'Kenan', 'Kenneth', 'Kevin', + 'Kilian', 'Klaas', 'Klaus', 'Klaus Dieter', 'Klaus Peter', 'Klaus-D.', + 'Klaus-Dieter', 'Klaus-Günter', 'Klaus-Jürgen', 'Klaus-Michael', + 'Klaus-Peter', 'Klaus-Ulrich', 'Klaus-Werner', 'Klemens', 'Knud', 'Knut', + 'Konrad', 'Konstantin', 'Konstantinos', 'Korbinian', 'Kornelius', + 'Kristian', 'Krzysztof', 'Kunibert', 'Kuno', 'Kurt', 'Ladislaus', + 'Lambert', 'Lars', 'Laszlo', 'Laurenz', 'Leander', 'Leif', 'Leo', + 'Leon', 'Leonard', 'Leonardo', 'Leonhard', 'Leonid', 'Leopold', + 'Leszek', 'Linus', 'Lorenz', 'Lorenzo', 'Lothar', 'Louis', 'Luciano', + 'Ludger', 'Ludwig', 'Luigi', 'Luis', 'Lukas', 'Lutz', 'Magnus', + 'Mahmoud', 'Mahmut', 'Maik', 'Malte', 'Manfred', 'Manuel', 'Marc', + 'Marcel', 'Marco', 'Marcus', 'Marek', 'Marian', 'Marijan', 'Mario', + 'Marius', 'Mariusz', 'Mark', 'Marko', 'Markus', 'Marten', 'Martin', + 'Marvin', 'Massimo', 'Mathias', 'Mato', 'Matteo', 'Matthias', + 'Matthäus', 'Mattias', 'Maurice', 'Maurizio', 'Max', 'Maxim', + 'Maximilian', 'Mehdi', 'Mehmet', 'Meik', 'Meinhard', 'Meinolf', + 'Meinrad', 'Mesut', 'Metin', 'Micha', 'Michael', 'Michail', 'Michel', + 'Miguel', 'Mijo', 'Mike', 'Mikhail', 'Milan', 'Milos', 'Miodrag', + 'Mirco', 'Mirko', 'Miroslav', 'Miroslaw', 'Mohamed', 'Mohammad', + 'Mohammed', 'Moritz', 'Muharrem', 'Murat', 'Mustafa', 'Muzaffer', + 'Necati', 'Nick', 'Nico', 'Nicolai', 'Nicolas', 'Nicolaus', 'Niels', + 'Niklas', 'Niko', 'Nikola', 'Nikolai', 'Nikolaj', 'Nikolaos', 'Nikolas', + 'Nikolaus', 'Nils', 'Norbert', 'Norman', 'Nurettin', 'Nuri', 'Olaf', + 'Ole', 'Oliver', 'Orhan', 'Ortwin', 'Oscar', 'Oskar', 'Osman', 'Oswald', + 'Oswin', 'Otfried', 'Othmar', 'Otmar', 'Ottfried', 'Ottmar', 'Otto', + 'Ottokar', 'Ottomar', 'Paolo', 'Pascal', 'Pasquale', 'Patric', + 'Patrick', 'Patrik', 'Paul', 'Paul-Gerhard', 'Paul-Heinz', 'Paulo', + 'Pavel', 'Pawel', 'Pedro', 'Peer', 'Pero', 'Petar', 'Peter', + 'Peter-Michael', 'Petros', 'Philip', 'Philipp', 'Philippe', 'Phillip', + 'Pierre', 'Pietro', 'Piotr', 'Pirmin', 'Pius', 'Rafael', 'Raik', + 'Raimund', 'Rainer', 'Ralf', 'Ralf-Dieter', 'Ralf-Peter', 'Ralph', + 'Ramazan', 'Ramon', 'Randolf', 'Raphael', 'Raymond', 'Raymund', 'Recep', + 'Reginald', 'Reimar', 'Reimer', 'Reimund', 'Reinald', 'Reiner', + 'Reinhard', 'Reinhardt', 'Reinhart', 'Reinhold', 'Remo', 'Renato', + 'Rene', 'René', 'Reza', 'Ricardo', 'Richard', 'Rico', 'Rigo', 'Riza', + 'Robby', 'Robert', 'Roberto', 'Robin', 'Rocco', 'Rochus', 'Roderich', + 'Roger', 'Roland', 'Rolf', 'Rolf-Dieter', 'Rolf-Peter', 'Roman', + 'Romuald', 'Ron', 'Ronald', 'Ronny', 'Rouven', 'Roy', 'Ruben', 'Rudi', + 'Rudolf', 'Rudolph', 'Rupert', 'Ryszard', 'Rüdiger', 'Saban', 'Sabri', + 'Sahin', 'Salih', 'Salvatore', 'Sami', 'Samir', 'Samuel', 'Sandor', + 'Sandro', 'Sebastian', 'Sebastiano', 'Sedat', 'Selim', 'Senol', 'Sepp', + 'Serge', 'Sergei', 'Sergej', 'Sergio', 'Severin', 'Siegbert', + 'Siegfried', 'Sieghard', 'Siegmar', 'Siegmund', 'Siegward', 'Sigfried', + 'Sigismund', 'Sigmar', 'Sigmund', 'Sigurd', 'Silvester', 'Silvio', + 'Simon', 'Slavko', 'Slawomir', 'Slobodan', 'Stanislaus', 'Stanislav', + 'Stanislaw', 'Stavros', 'Stefan', 'Stefano', 'Steffen', 'Stephan', + 'Stephen', 'Steve', 'Steven', 'Stjepan', 'Sven', 'Swen', 'Sylvester', + 'Sylvio', 'Sönke', 'Sören', 'Sükrü', 'Süleyman', 'Tadeusz', 'Tassilo', + 'Thaddäus', 'Theo', 'Theobald', 'Theodor', 'Theodoros', 'Thies', + 'Thilo', 'Thomas', 'Thoralf', 'Thorben', 'Thorsten', 'Tibor', 'Till', + 'Tillmann', 'Tilman', 'Tilmann', 'Tilo', 'Tim', 'Timm', 'Timo', 'Tino', + 'Tobias', 'Tom', 'Tomas', 'Tomasz', 'Tomislav', 'Toni', 'Tony', + 'Toralf', 'Torben', 'Torsten', 'Traugott', 'Udo', 'Ulf', 'Uli', + 'Ullrich', 'Ulrich', 'Urban', 'Urs', 'Utz', 'Uwe', 'Vadim', 'Valentin', + 'Valerij', 'Vassilios', 'Veit', 'Veli', 'Victor', 'Viktor', 'Vincent', + 'Vincenzo', 'Vinko', 'Vinzenz', 'Vitali', 'Vito', 'Vittorio', 'Vitus', + 'Vladimir', 'Vlado', 'Volker', 'Volkhard', 'Volkmar', 'Waldemar', + 'Walfried', 'Walter', 'Walther', 'Wenzel', 'Werner', 'Wieland', + 'Wieslaw', 'Wigbert', 'Wilfried', 'Wilhelm', 'Willfried', 'Willi', + 'William', 'Willibald', 'Willibert', 'Willy', 'Winfried', 'Witold', + 'Wladimir', 'Wojciech', 'Woldemar', 'Wolf', 'Wolf-Dieter', + 'Wolf-Dietrich', 'Wolf-Rüdiger', 'Wolfgang', 'Wolfhard', 'Wolfram', 'Wulf', + 'Xaver', 'Yilmaz', 'Yusuf', 'Zbigniew', 'Zdravko', 'Zeki', 'Zeljko', + 'Zenon', 'Zlatko', 'Zoltan', 'Zoran', + ) + + # From http://de.wiktionary.org/wiki/Verzeichnis:Deutsch/Liste_der_h%C3%A4ufigsten_weiblichen_Vornamen_Deutschlands + first_names_female = ( + 'Adele', 'Adelgunde', 'Adelheid', 'Adelinde', 'Adeline', 'Adina', + 'Adolfine', 'Adriana', 'Adriane', 'Aenne', 'Änne', 'Agata', 'Agatha', + 'Agathe', 'Agnes', 'Agnieszka', 'Albertine', 'Albina', 'Aleksandra', + 'Alena', 'Alexa', 'Alexandra', 'Alice', 'Alicia', 'Alicja', 'Alida', + 'Alina', 'Aline', 'Alla', 'Alma', 'Almut', 'Almuth', 'Aloisia', + 'Alwina', 'Alwine', 'Amalia', 'Amalie', 'Amanda', 'Amelie', 'Ana', + 'Anastasia', 'Andrea', 'Aneta', 'Anett', 'Anette', 'Angela', 'Angelica', + 'Angelika', 'Angelina', 'Angelique', 'Anica', 'Anika', 'Anita', 'Anja', + 'Anka', 'Anke', 'Ann', 'Ann-Kathrin', 'Anna', 'Anna-Lena', 'Anna-Luise', + 'Anna-Maria', 'Anna-Marie', 'Annaliese', 'Annamaria', 'Anne', + 'Anne-Kathrin', 'Anne-Katrin', 'Anne-Marie', 'Anne-Rose', 'Annedore', + 'Annegret', 'Annegrete', 'Annekatrin', 'Anneke', 'Annelene', 'Anneli', + 'Annelie', 'Annelies', 'Anneliese', 'Annelise', 'Annelore', 'Annemarie', + 'Annemie', 'Annerose', 'Annett', 'Annette', 'Anni', 'Annie', 'Annika', + 'Annita', 'Anny', 'Antje', 'Antoinette', 'Antonia', 'Antonie', + 'Antonietta', 'Antonina', 'Apollonia', 'Ariane', 'Arzu', 'Asta', + 'Astrid', 'Augusta', 'Auguste', 'Aurelia', 'Aynur', 'Ayse', 'Aysel', + 'Ayten', 'Babett', 'Babette', 'Barbara', 'Beata', 'Beate', 'Beatrice', + 'Beatrix', 'Belinda', 'Benita', 'Berit', 'Bernadette', 'Bernhardine', + 'Berta', 'Bertha', 'Betina', 'Betti', 'Bettina', 'Betty', 'Bianca', + 'Bianka', 'Birgid', 'Birgit', 'Birgitt', 'Birgitta', 'Birte', 'Birthe', + 'Blanka', 'Bozena', 'Branka', 'Brigitta', 'Brigitte', 'Brit', 'Brita', + 'Britt', 'Britta', 'Brunhild', 'Brunhilde', 'Bruni', 'Bärbel', + 'Camilla', 'Canan', 'Caren', 'Carin', 'Carina', 'Carla', 'Carmela', + 'Carmen', 'Carmine', 'Carola', 'Carolin', 'Carolina', 'Caroline', + 'Caterina', 'Catharina', 'Catherine', 'Cathleen', 'Cathrin', 'Catrin', + 'Cecilia', 'Centa', 'Chantal', 'Charlotte', 'Christa', 'Christa-Maria', + 'Christel', 'Christiana', 'Christiane', 'Christin', 'Christina', + 'Christine', 'Christl', 'Cilli', 'Cilly', 'Cindy', 'Claire', 'Clara', + 'Clarissa', 'Claudia', 'Cläre', 'Concetta', 'Conny', 'Constance', + 'Constanze', 'Cora', 'Cordula', 'Corina', 'Corinna', 'Corinne', + 'Cornelia', 'Cosima', 'Cristina', 'Cynthia', 'Cäcilia', 'Cäcilie', + 'Dagmar', 'Dajana', 'Damaris', 'Dana', 'Danica', 'Daniela', 'Danielle', + 'Danuta', 'Daria', 'Deborah', 'Delia', 'Denise', 'Desiree', 'Diana', + 'Diane', 'Dietlind', 'Dietlinde', 'Dina', 'Dolores', 'Donata', 'Dora', + 'Doreen', 'Dorina', 'Doris', 'Dorit', 'Dorle', 'Dorota', 'Dorothe', + 'Dorothea', 'Dorothee', 'Dragica', 'Dunja', 'Dörte', 'Dörthe', 'Edda', + 'Edelgard', 'Edeltraud', 'Edeltraut', 'Edeltrud', 'Edit', 'Edith', + 'Editha', 'Ehrentraud', 'Eileen', 'Ekaterina', 'Elena', 'Eleni', + 'Elenore', 'Eleonora', 'Eleonore', 'Elfi', 'Elfie', 'Elfriede', 'Elif', + 'Elisa', 'Elisabet', 'Elisabeth', 'Elise', 'Elizabeth', 'Elke', 'Ella', + 'Ellen', 'Elli', 'Ellinor', 'Elly', 'Elma', 'Elsa', 'Elsbeth', 'Else', + 'Elvira', 'Elwira', 'Elzbieta', 'Emilia', 'Emilie', 'Emine', 'Emma', + 'Emmi', 'Emmy', 'Erdmute', 'Erica', 'Erika', 'Erna', 'Ernestine', + 'Ester', 'Esther', 'Etta', 'Eugenia', 'Eugenie', 'Eva', 'Eva-Maria', + 'Eva-Marie', 'Evamaria', 'Evangelia', 'Evelin', 'Eveline', 'Evelyn', + 'Evelyne', 'Evi', 'Ewa', 'Fabienne', 'Fadime', 'Fanny', 'Fatima', + 'Fatma', 'Felicia', 'Felicitas', 'Felizitas', 'Filiz', 'Flora', + 'Florence', 'Florentine', 'Franca', 'Francesca', 'Francoise', 'Franka', + 'Franziska', 'Frauke', 'Frederike', 'Freia', 'Freya', 'Frida', 'Frieda', + 'Friedericke', 'Friederike', 'Friedhilde', 'Friedl', 'Friedlinde', + 'Gabi', 'Gabriela', 'Gabriele', 'Gabriella', 'Gaby', 'Galina', + 'Genoveva', 'Georgia', 'Georgine', 'Geraldine', 'Gerda', 'Gerdi', + 'Gerhild', 'Gerlind', 'Gerlinde', 'Gerta', 'Gerti', 'Gertraud', + 'Gertraude', 'Gertraut', 'Gertrud', 'Gertrude', 'Gesa', 'Gesche', + 'Gesine', 'Geza', 'Giesela', 'Gilda', 'Gina', 'Giovanna', 'Gisa', + 'Gisela', 'Gislinde', 'Gitta', 'Gitte', 'Giuseppina', 'Gloria', + 'Gordana', 'Grazyna', 'Greta', 'Gretchen', 'Grete', 'Gretel', 'Gretl', + 'Grit', 'Gudrun', 'Gudula', 'Gunda', 'Gundel', 'Gundi', 'Gundula', + 'Gunhild', 'Gusti', 'Gönül', 'Gülay', 'Gülsen', 'Gülten', 'Halina', + 'Hanife', 'Hanna', 'Hannah', 'Hannchen', 'Hanne', 'Hanne-Lore', + 'Hannelore', 'Hanny', 'Harriet', 'Hatice', 'Hedda', 'Hedi', 'Hedwig', + 'Hedy', 'Heide', 'Heide-Marie', 'Heidelinde', 'Heidelore', 'Heidemarie', + 'Heiderose', 'Heidi', 'Heidrun', 'Heike', 'Helen', 'Helena', 'Helene', + 'Helga', 'Hella', 'Helma', 'Helmtrud', 'Henni', 'Henny', 'Henri', + 'Henriette', 'Henrike', 'Herlinde', 'Herma', 'Hermine', 'Herta', + 'Hertha', 'Hilda', 'Hildburg', 'Hilde', 'Hildegard', 'Hildegart', + 'Hildegund', 'Hildegunde', 'Hilma', 'Hiltraud', 'Hiltrud', 'Hubertine', + 'Hulda', 'Hülya', 'Ida', 'Ildiko', 'Ilka', 'Ilona', 'Ilonka', 'Ilse', + 'Imelda', 'Imke', 'Ina', 'Ines', 'Inga', 'Inge', 'Ingeborg', 'Ingeburg', + 'Ingelore', 'Ingetraud', 'Ingetraut', 'Ingrid', 'Ingried', 'Inka', + 'Inken', 'Inna', 'Insa', 'Ira', 'Irena', 'Irene', 'Irina', 'Iris', + 'Irma', 'Irmela', 'Irmengard', 'Irmgard', 'Irmhild', 'Irmi', + 'Irmingard', 'Irmtraud', 'Irmtraut', 'Irmtrud', 'Isa', 'Isabel', + 'Isabell', 'Isabella', 'Isabelle', 'Isolde', 'Ivana', 'Ivanka', + 'Ivonne', 'Iwona', 'Jacqueline', 'Jadwiga', 'Jana', 'Jane', 'Janet', + 'Janett', 'Janette', 'Janin', 'Janina', 'Janine', 'Janna', 'Jaqueline', + 'Jasmin', 'Jasmina', 'Jeanette', 'Jeannette', 'Jeannine', 'Jelena', + 'Jennifer', 'Jenny', 'Jessica', 'Jessika', 'Jo', 'Joana', 'Joanna', + 'Johanna', 'Johanne', 'Jolanda', 'Jolanta', 'Jolanthe', 'Josefa', + 'Josefine', 'Josephine', 'Judith', 'Julia', 'Juliana', 'Juliane', + 'Julie', 'Justina', 'Justine', 'Jutta', 'Karen', 'Karin', 'Karina', + 'Karla', 'Karola', 'Karolin', 'Karolina', 'Karoline', 'Kata', 'Katalin', + 'Katarina', 'Katarzyna', 'Katerina', 'Katharina', 'Katharine', + 'Katherina', 'Kathi', 'Kathleen', 'Kathrin', 'Kathy', 'Kati', 'Katja', + 'Katrin', 'Katy', 'Kerstin', 'Kira', 'Kirsten', 'Kirstin', 'Klara', + 'Klaudia', 'Klothilde', 'Kläre', 'Konstanze', 'Kordula', 'Korinna', + 'Kornelia', 'Kreszentia', 'Kreszenz', 'Kriemhild', 'Krista', + 'Kristiane', 'Kristin', 'Kristina', 'Kristine', 'Krystyna', 'Kunigunda', + 'Kunigunde', 'Käte', 'Käthe', 'Käthi', 'Laila', 'Lara', 'Larissa', + 'Laura', 'Lea', 'Leila', 'Lena', 'Lene', 'Leni', 'Leokadia', 'Leonie', + 'Leonore', 'Leopoldine', 'Leyla', 'Lia', 'Liane', 'Lidia', 'Lidija', + 'Lidwina', 'Liesa', 'Liesbeth', 'Lieschen', 'Liesel', 'Lieselotte', + 'Lili', 'Lilian', 'Liliana', 'Liliane', 'Lilija', 'Lilli', 'Lilly', + 'Lilo', 'Lina', 'Linda', 'Lioba', 'Lisa', 'Lisbeth', 'Liselotte', + 'Lisette', 'Lissi', 'Lissy', 'Ljiljana', 'Ljubica', 'Ljudmila', 'Loni', + 'Lore', 'Loretta', 'Lotte', 'Lotti', 'Louise', 'Lucia', 'Lucie', + 'Ludmila', 'Ludmilla', 'Ludwina', 'Luisa', 'Luise', 'Luitgard', 'Luka', + 'Luzia', 'Luzie', 'Lydia', 'Madeleine', 'Madlen', 'Magarete', 'Magda', + 'Magdalena', 'Magdalene', 'Magret', 'Magrit', 'Maike', 'Maja', + 'Malgorzata', 'Mandy', 'Manja', 'Manuela', 'Mara', 'Marcella', 'Mareen', + 'Mareike', 'Mareile', 'Maren', 'Marga', 'Margaret', 'Margareta', + 'Margarete', 'Margaretha', 'Margarethe', 'Margarita', 'Margit', + 'Margita', 'Margitta', 'Margot', 'Margret', 'Margrit', 'Maria', 'Maria-Luise', + 'Maria-Theresia', 'Mariana', 'Marianna', 'Marianne', 'Marica', + 'Marie', 'Marie-Louise', 'Marie-Luise', 'Marie-Theres', 'Marie-Therese', + 'Mariechen', 'Mariele', 'Marieluise', 'Marietta', 'Marija', 'Marika', + 'Marina', 'Mariola', 'Marion', 'Marisa', 'Marit', 'Marita', 'Maritta', + 'Marjan', 'Marleen', 'Marlen', 'Marlene', 'Marlies', 'Marliese', + 'Marlis', 'Marta', 'Martha', 'Martina', 'Martine', 'Mary', 'Marzena', + 'Mathilde', 'Maya', 'Mechthild', 'Mechthilde', 'Mechtild', 'Meike', + 'Melanie', 'Melissa', 'Melita', 'Melitta', 'Meral', 'Mercedes', + 'Meryem', 'Meta', 'Mia', 'Michaela', 'Michaele', 'Michelle', 'Milena', + 'Milica', 'Milka', 'Mina', 'Minna', 'Mira', 'Mirella', 'Miriam', + 'Mirja', 'Mirjam', 'Mirjana', 'Miroslawa', 'Mona', 'Monica', 'Monika', + 'Monique', 'Monja', 'Myriam', 'Nada', 'Nadeschda', 'Nadeshda', 'Nadia', + 'Nadin', 'Nadine', 'Nadja', 'Nancy', 'Natali', 'Natalia', 'Natalie', + 'Natalija', 'Natalja', 'Natascha', 'Nathalie', 'Nelli', 'Nelly', + 'Nermin', 'Nevenka', 'Nicole', 'Nina', 'Nora', 'Norma', 'Notburga', + 'Nuran', 'Nuray', 'Nurten', 'Oda', 'Olav', 'Olena', 'Olga', 'Olivia', + 'Ortrud', 'Ortrun', 'Ottilie', 'Oxana', 'Pamela', 'Paola', 'Pascale', + 'Patricia', 'Patrizia', 'Paula', 'Paulina', 'Pauline', 'Peggy', 'Petra', + 'Philomena', 'Pia', 'Polina', 'Priska', 'Rabea', 'Radmila', 'Rahel', + 'Raisa', 'Raissa', 'Ramona', 'Raphaela', 'Rebecca', 'Rebekka', 'Regina', + 'Regine', 'Reingard', 'Reinhild', 'Reinhilde', 'Rena', 'Renata', + 'Renate', 'Reni', 'Resi', 'Ria', 'Ricarda', 'Rita', 'Romana', 'Romy', + 'Rosa', 'Rosa-Maria', 'Rosalia', 'Rosalie', 'Rosalinde', 'Rose', 'Rose-Marie', + 'Rosel', 'Roselinde', 'Rosemarie', 'Rosi', 'Rosina', 'Rosita', + 'Rosl', 'Rosmarie', 'Roswita', 'Roswitha', 'Rotraud', 'Rotraut', 'Ruth', + 'Ruthild', 'Sabina', 'Sabine', 'Sabrina', 'Samira', 'Sandra', 'Sandy', + 'Sara', 'Sarah', 'Sarina', 'Saskia', 'Selma', 'Semra', 'Senta', + 'Serpil', 'Sevim', 'Sibel', 'Sibilla', 'Sibille', 'Sibylla', 'Sibylle', + 'Sieglinde', 'Siegrid', 'Siegried', 'Siegrun', 'Siglinde', 'Sigrid', + 'Sigrun', 'Silja', 'Silke', 'Silva', 'Silvana', 'Silvia', 'Simona', + 'Simone', 'Sina', 'Sinaida', 'Slavica', 'Sofia', 'Sofie', 'Solveig', + 'Songül', 'Sonia', 'Sonja', 'Sophia', 'Sophie', 'Stefani', 'Stefania', + 'Stefanie', 'Steffi', 'Stella', 'Stephanie', 'Stilla', 'Susan', + 'Susana', 'Susann', 'Susanna', 'Susanne', 'Suse', 'Susi', 'Suzanne', + 'Svea', 'Svenja', 'Svetlana', 'Swantje', 'Swetlana', 'Sybilla', + 'Sybille', 'Sylke', 'Sylvana', 'Sylvia', 'Sylvie', 'Sylwia', 'Tabea', + 'Tamara', 'Tania', 'Tanja', 'Tatiana', 'Tatjana', 'Telse', 'Teresa', + 'Thea', 'Theda', 'Thekla', 'Theodora', 'Theres', 'Theresa', 'Therese', + 'Theresia', 'Tilly', 'Tina', 'Traude', 'Traudel', 'Traudl', 'Traute', + 'Trude', 'Trudel', 'Trudi', 'Tülay', 'Türkan', 'Ulla', 'Ulrike', + 'Undine', 'Ursel', 'Ursula', 'Urszula', 'Urte', 'Uschi', 'Uta', 'Ute', + 'Valentina', 'Valentine', 'Valeri', 'Valeria', 'Valerie', 'Valeska', + 'Vanessa', 'Vera', 'Verena', 'Veronica', 'Veronika', 'Veronique', + 'Vesna', 'Victoria', 'Viktoria', 'Viola', 'Violetta', 'Virginia', + 'Viviane', 'Walburga', 'Waldtraut', 'Walentina', 'Walli', 'Wally', + 'Waltraud', 'Waltraut', 'Waltrud', 'Wanda', 'Wencke', 'Wendelin', + 'Wenke', 'Wera', 'Wibke', 'Wiebke', 'Wilfriede', 'Wilhelmine', 'Wilma', + 'Wiltrud', 'Xenia', 'Yasemin', 'Yasmin', 'Yvette', 'Yvonne', 'Zdenka', + 'Zehra', 'Zenta', 'Zeynep', 'Zita', 'Zofia', + ) + + first_names = first_names_male + first_names_female + + last_names = ( + 'Ackermann', 'Adler', 'Adolph', 'Albers', 'Anders', 'Atzler', 'Aumann', + 'Austermühle', 'Bachmann', 'Bähr', 'Bärer', 'Barkholz', 'Barth', + 'Bauer', 'Baum', 'Becker', 'Beckmann', 'Beer', 'Beier', 'Bender', + 'Benthin', 'Berger', 'Beyer', 'Bien', 'Biggen', 'Binner', 'Birnbaum', + 'Bloch', 'Blümel', 'Bohlander', 'Bonbach', 'Bolander', 'Bolnbach', + 'Bolzmann', 'Börner', 'Bohnbach', 'Boucsein', 'Briemer', 'Bruder', + 'Buchholz', 'Budig', 'Butte', 'Carsten', 'Caspar', 'Christoph', + 'Cichorius', 'Conradi', 'Davids', 'Dehmel', 'Dietz', + 'Dippel', 'Ditschlerin', 'Dobes', 'Döhn', 'Döring', 'Dörr', 'Dörschner', + 'Dowerg', 'Drewes', 'Drub', 'Drubin', 'Dussen van', 'Eberhardt', + 'Ebert', 'Eberth', 'Eckbauer', 'Ehlert', 'Eigenwillig', 'Eimer', + 'Ernst', 'Etzler', 'Etzold', 'Faust', 'Fechner', 'Fiebig', 'Finke', + 'Fischer', 'Flantz', 'Fliegner', 'Förster', 'Franke', 'Freudenberger', + 'Fritsch', 'Fröhlich', 'Gehringer', 'Geisel', 'Geisler', 'Geißler', + 'Gerlach', 'Gertz', 'Gierschner', 'Gieß', 'Girschner', 'Gnatz', + 'Gorlitz', 'Gotthard', 'Graf', 'Grein Groth', 'Gröttner', 'Gude', + 'Gunpf', 'Gumprich', 'Gute', 'Gutknecht', 'Haase', 'Haering', 'Hänel', + 'Häring', 'Hahn', 'Hamann', 'Hande', 'Harloff', 'Hartmann', 'Hartung', + 'Hauffer', 'Hecker', 'Heidrich', 'Hein', 'Heinrich', 'Heintze', 'Heinz', + 'Hellwig', 'Henck', 'Hendriks', 'Henk', 'Henschel', 'Hentschel', + 'Hering', 'Hermann', 'Herrmann', 'Hermighausen', 'Hertrampf', 'Heser', + 'Heß', 'Hesse', 'Hettner', 'Hethur', 'Heuser', 'Hiller', 'Heydrich', + 'Höfig', 'Hofmann', 'Holsten', 'Holt', 'Holzapfel', 'Hölzenbecher', + 'Hörle', 'Hövel', 'Hoffmann', 'Hornich', 'Hornig', 'Hübel', 'Huhn', + 'Jacob', 'Jacobi Jäckel', 'Jähn', 'Jäkel', 'Jäntsch', 'Jessel', + 'Jockel', 'Johann', 'Jopich', 'Junck', 'Juncken', 'Jungfer', 'Junitz', + 'Junk', 'Junken', 'Jüttner', 'Kabus', 'Kade', 'Käster', 'Kallert', + 'Kambs', 'Karge', 'Karz', 'Kaul', 'Kensy', 'Keudel', 'Killer', + 'Kitzmann', 'Klapp', 'Klemm', 'Klemt', 'Klingelhöfer', 'Klotz', + 'Knappe', 'Kobelt', 'Koch', 'Koch II', 'Köhler', 'Köster', 'Kohl', + 'Kostolzin', 'Kramer', 'Kranz', 'Krause', 'Kraushaar', 'Krebs', 'Krein', + 'Kreusel', 'Kroker', 'Kruschwitz', 'Kuhl', 'Kühnert', 'Kusch', + 'Lachmann', 'Ladeck', 'Lange', 'Langern', 'Lehmann', 'Liebelt', + 'Lindau', 'Lindner', 'Linke', 'Löchel', 'Löffler', 'Loos', 'Lorch', + 'Losekann', 'Löwer', 'Lübs', 'Mälzer', 'Mangold', 'Mans', 'Margraf', + 'Martin', 'Matthäi', 'Meister', 'Mende', 'Mentzel', 'Metz', 'Meyer', + 'Mielcarek', 'Mies', 'Misicher', 'Mitschke', 'Mohaupt', 'Mosemann', + 'Möchlichen', 'Mude', 'Mühle', 'Mülichen', 'Müller', 'Naser', 'Nerger', + 'Nette', 'Neureuther', 'Neuschäfer', 'Niemeier', 'Noack', 'Nohlmans', + 'Oderwald', 'Oestrovsky', 'Ortmann', 'Otto', 'Paffrath', 'Pärtzelt', + 'Patberg', 'Pechel', 'Pergande', 'Peukert', 'Pieper', 'Plath', 'Pohl', + 'Pölitz', 'Preiß', 'Pruschke', 'Putz', 'Rädel', 'Radisch', 'Reichmann', + 'Reinhardt', 'Reising', 'Renner', 'Reuter', 'Riehl', 'Ring', 'Ritter', + 'Rogge', 'Rogner', 'Rohleder', 'Röhrdanz', 'Röhricht', 'Roht', 'Römer', + 'Rörricht', 'Rose', 'Rosemann', 'Rosenow', 'Roskoth', 'Rudolph', + 'Ruppersberger', 'Ruppert', 'Rust', 'Sager', 'Salz', 'Säuberlich', + 'Sauer', 'Schaaf', 'Schacht', 'Schäfer', 'Scheel', 'Scheibe', 'Schenk', + 'Scheuermann', 'Schinke', 'Schleich', 'Schleich', 'auch Schlauchin', + 'Schlosser', 'Schmidt', 'Schmidtke', 'Schmiedecke', 'Schmiedt', + 'Schönland', 'Scholl', 'Scholtz', 'Scholz', 'Schomber', 'Schottin', + 'Schuchhardt', 'Schüler', 'Schulz', 'Schuster', 'Schweitzer', + 'Schwital', 'Segebahn', 'Seifert', 'Seidel', 'Seifert', 'Seip', + 'Siering', 'Söding', 'Sölzer', 'Sontag', 'Sorgatz', 'Speer', 'Spieß', + 'Stadelmann', 'Stahr', 'Staude', 'Steckel', 'Steinberg', 'Stey', + 'Stiebitz', 'Stiffel', 'Stoll', 'Stolze', 'Striebitz', 'Stroh', + 'Stumpf', 'Süßebier', 'Täsche', 'Textor', 'Thanel', 'Thies', + 'Tintzmann', 'Tlustek', 'Trapp', 'Trommler', 'Tröst', 'Trub', 'Trüb', + 'Trubin', 'Trupp', 'Tschentscher', 'Ullmann', 'Ullrich', + 'van der Dussen', 'Vogt', 'Vollbrecht', 'Wagenknecht', 'Wagner', 'Wähner', + 'Walter', 'Warmer', 'Weihmann', 'Weimer', 'Weinhage', 'Weinhold', + 'Weiß', 'Weitzel', 'Weller', 'Wende', 'Wernecke', 'Werner', 'Wesack', + 'Wiek', 'Wieloch', 'Wilms', 'Wilmsen', 'Winkler', 'Wirth', 'Wohlgemut', + 'Wulf', 'Wulff', 'Zahn', 'Zänker', 'Ziegert', 'Zimmer', 'Zirme', + 'Zobel', 'Zorbach', + ) + + prefixes_male = ( + 'Herr', 'Dr.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.', + ) + prefixes_female = ( + 'Frau', 'Dr.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.', + ) + + suffixes = ('B.Sc.', 'B.A.', 'B.Eng.', 'MBA.', ) diff --git a/src/faker/providers/dk_DK/person.py b/src/libs/faker/providers/person/dk_DK/__init__.py similarity index 89% rename from src/faker/providers/dk_DK/person.py rename to src/libs/faker/providers/person/dk_DK/__init__.py index 3cb1b0b..8ba3ef4 100644 --- a/src/faker/providers/dk_DK/person.py +++ b/src/libs/faker/providers/person/dk_DK/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): formats = ( @@ -97,17 +97,19 @@ class Provider(PersonProvider): 'Yvonne', 'Zahra', 'Zara', 'Zehnia', 'Zelma', 'Zenia', 'Åse', ) + first_names = first_names_male + first_names_female + last_names = ( 'Jensen', 'Nielsen', 'Hansen', 'Pedersen', 'Andersen', 'Christensen', 'Larsen', 'Sørensen', 'Rasmussen', 'Petersen', 'Jørgensen', 'Madsen', 'Kristensen', 'Olsen', 'Christiansen', 'Thomsen', 'Poulsen', 'Johansen', 'Knudsen', 'Mortensen', 'Møller', 'Jacobsen', 'Jakobsen', 'Olesen', 'Frederiksen', 'Mikkelsen', 'Henriksen', 'Laursen', - 'Lund', 'Schmidt', 'Eriksen', 'Holm', ' Kristiansen', 'Clausen', 'Simonsen', + 'Lund', 'Schmidt', 'Eriksen', 'Holm', 'Kristiansen', 'Clausen', 'Simonsen', 'Svendsen', 'Andreasen', 'Iversen', 'Jeppesen', 'Mogensen', 'Jespersen', 'Nissen', 'Lauridsen', 'Frandsen', 'Østergaard', 'Jepsen', 'Kjær', 'Carlsen', 'Vestergaard', 'Jessen', 'Nørgaard', 'Dahl', 'Christoffersen', 'Skov', 'Søndergaard', 'Bertelsen', 'Bruun', 'Lassen', 'Bach', 'Gregersen', 'Friis', 'Johnsen', 'Steffensen', - 'Kjeldsen', 'Bech', 'Krogh', ' Lauritsen', 'Danielsen', 'Mathiesen', 'Andresen', + 'Kjeldsen', 'Bech', 'Krogh', 'Lauritsen', 'Danielsen', 'Mathiesen', 'Andresen', 'Brandt', 'Winther', 'Toft', 'Ravn', 'Mathiasen', 'Dam', 'Holst', 'Nilsson', 'Lind', 'Berg', 'Schou', 'Overgaard', 'Kristoffersen', 'Schultz', 'Klausen', 'Karlsen', 'Paulsen', 'Hermansen', 'Thorsen', 'Koch', 'Thygesen', @@ -116,31 +118,8 @@ class Provider(PersonProvider): prefixes_male = ( 'Hr', 'Dr.', 'Prof.', 'Univ.Prof.' ) + prefixes_female = ( 'Fru', 'Dr.', 'Prof.', 'Univ.Prof.' ) - @classmethod - def first_name(cls): - return cls.random_element((cls.first_name_male(), cls.first_name_female())) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def prefix(cls): - return cls.random_element((cls.prefix_male(), cls.prefix_female())) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes_male) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes_female) - diff --git a/src/faker/providers/el_GR/person.py b/src/libs/faker/providers/person/el_GR/__init__.py similarity index 98% rename from src/faker/providers/el_GR/person.py rename to src/libs/faker/providers/person/el_GR/__init__.py index 1574402..1996294 100644 --- a/src/faker/providers/el_GR/person.py +++ b/src/libs/faker/providers/person/el_GR/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -436,35 +436,3 @@ class Provider(PersonProvider): ) last_names = last_names_male + last_names_female - - def name_male(self): - pattern = self.random_element(self.formats_male) - return self.generator.parse(pattern) - - def name_female(self): - pattern = self.random_element(self.formats_female) - return self.generator.parse(pattern) - - @classmethod - def first_name(cls): - return cls.random_element(cls.first_names) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def last_name(cls): - return cls.random_element(cls.last_names) - - @classmethod - def last_name_male(cls): - return cls.random_element(cls.last_names_male) - - @classmethod - def last_name_female(cls): - return cls.random_element(cls.last_names_female) diff --git a/src/faker/providers/en_US/person.py b/src/libs/faker/providers/person/en/__init__.py similarity index 98% rename from src/faker/providers/en_US/person.py rename to src/libs/faker/providers/person/en/__init__.py index 966371c..acff3e0 100644 --- a/src/faker/providers/en_US/person.py +++ b/src/libs/faker/providers/person/en/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -745,7 +745,7 @@ class Provider(PersonProvider): 'Destin', 'Destry', 'Devan', 'Devante', 'Devaughn', 'Deven', 'Devin', 'Devon', 'Devonta', 'Devontae', 'Devonte', 'Devyn', 'Deward', 'Dewayne', 'Dewey', 'Dewitt', 'Dexter', 'Diallo', 'Diamond', 'Diane', - 'Dick', 'Dickie', 'Diego', 'Dijon', 'Dilan', 'Dillan', 'Dillard', + 'Dickie', 'Diego', 'Dijon', 'Dilan', 'Dillan', 'Dillard', 'Dillion', 'Dillon', 'Dimitri', 'Dimitrios', 'Dink', 'Dino', 'Dion', 'Dionicio', 'Dionte', 'Dirk', 'Dixon', 'Doc', 'Dock', 'Doctor', 'Doll', 'Dolph', 'Dolphus', 'Domenic', 'Domenick', 'Domenico', 'Domingo', @@ -1119,7 +1119,7 @@ class Provider(PersonProvider): 'Heller', 'Herman', 'Hermann', 'Hermiston', 'Herzog', 'Hessel', 'Hettinger', 'Hickle', 'Hilll', 'Hills', 'Hilpert', 'Hintz', 'Hirthe', 'Hodkiewicz', 'Hoeger', 'Homenick', 'Hoppe', 'Howe', 'Howell', 'Hudson', 'Huel', 'Huels', 'Hyatt', - 'Jacobi', 'Jacobs', 'Jacobson', 'Jakubowski', 'Jaskolski', 'Jast', 'Jenkins', 'Jerde', 'Jewess', 'Johns', + 'Jacobi', 'Jacobs', 'Jacobson', 'Jakubowski', 'Jaskolski', 'Jast', 'Jenkins', 'Jerde', 'Johns', 'Johnson', 'Johnston', 'Jones', 'Kassulke', 'Kautzer', 'Keebler', 'Keeling', 'Kemmer', 'Kerluke', 'Kertzmann', 'Kessler', 'Kiehn', 'Kihn', 'Kilback', 'King', 'Kirlin', 'Klein', 'Kling', 'Klocko', 'Koch', 'Koelpin', 'Koepp', 'Kohler', 'Konopelski', @@ -1161,58 +1161,5 @@ class Provider(PersonProvider): prefixes_female = ('Mrs.', 'Ms.', 'Miss', 'Dr.') prefixes_male = ('Mr.', 'Dr.') - prefixes = prefixes_female + prefixes_male - suffixes_female = ('MD', 'DDS', 'PhD', 'DVM') suffixes_male = ('Jr.', 'Sr.', 'I', 'II', 'III', 'IV', 'V', 'MD', 'DDS', 'PhD', 'DVM') - - suffixes = suffixes_female + suffixes_male - - def name_male(self): - pattern = self.random_element(self.formats_male) - return self.generator.parse(pattern) - - def name_female(self): - pattern = self.random_element(self.formats_female) - return self.generator.parse(pattern) - - @classmethod - def first_name(cls): - return cls.random_element(cls.first_names) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def last_name(cls): - return cls.random_element(cls.last_names) - - @classmethod - def prefix(cls): - return cls.random_element((cls.prefix_male(), cls.prefix_female())) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes_male) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes_female) - - - @classmethod - def suffix(cls): - return cls.random_element((cls.suffix_male(), cls.suffix_female())) - - @classmethod - def suffix_male(cls): - return cls.random_element(cls.suffixes_male) - - @classmethod - def suffix_female(cls): - return cls.random_element(cls.suffixes_female) diff --git a/src/libs/faker/providers/person/en_GB/__init__.py b/src/libs/faker/providers/person/en_GB/__init__.py new file mode 100644 index 0000000..569a4ce --- /dev/null +++ b/src/libs/faker/providers/person/en_GB/__init__.py @@ -0,0 +1,593 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}-{{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}-{{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}' + ) + + # Names from http://webarchive.nationalarchives.gov.uk/20160105160709/http://ons.gov.uk/ons/publications/re-reference-tables.html?edition=tcm%3A77-243767 + + first_names_male = ( + 'David', 'Paul', 'Christopher', 'Thomas', 'John', 'Mark', 'James', + 'Stephen', 'Andrew', 'Jack', 'Michael', 'Daniel', 'Peter', 'Richard', + 'Matthew', 'Robert', 'Ryan', 'Joshua', 'Alan', 'Ian', 'Simon', 'Luke', + 'Samuel', 'Jordan', 'Anthony', 'Adam', 'Lee', 'Alexander', 'William', + 'Kevin', 'Darren', 'Benjamin', 'Philip', 'Gary', 'Joseph', 'Brian', + 'Steven', 'Liam', 'Keith', 'Martin', 'Jason', 'Jonathan', 'Jake', + 'Graham', 'Nicholas', 'Craig', 'George', 'Colin', 'Neil', 'Lewis', + 'Nigel', 'Oliver', 'Timothy', 'Stuart', 'Kenneth', 'Raymond', 'Jamie', + 'Nathan', 'Geoffrey', 'Connor', 'Terence', 'Trevor', 'Adrian', 'Harry', + 'Malcolm', 'Scott', 'Callum', 'Wayne', 'Aaron', 'Barry', 'Ashley', + 'Bradley', 'Patrick', 'Gareth', 'Jacob', 'Sean', 'Kieran', 'Derek', + 'Carl', 'Dean', 'Charles', 'Sam', 'Shaun', 'Ben', 'Roger', 'Mohammed', + 'Leslie', 'Ronald', 'Kyle', 'Clive', 'Edward', 'Antony', 'Jeremy', + 'Justin', 'Jeffrey', 'Christian', 'Roy', 'Karl', 'Alex', 'Gordon', + 'Dominic', 'Joe', 'Marc', 'Reece', 'Dennis', 'Russell', 'Gavin', 'Rhys', + 'Phillip', 'Allan', 'Robin', 'Charlie', 'Gerald', 'Ross', 'Francis', + 'Eric', 'Julian', 'Bernard', 'Dale', 'Donald', 'Damian', 'Frank', + 'Shane', 'Cameron', 'Norman', 'Duncan', 'Louis', 'Frederick', 'Tony', + 'Howard', 'Conor', 'Douglas', 'Garry', 'Elliot', 'Marcus', 'Arthur', + 'Vincent', 'Max', 'Mathew', 'Abdul', 'Henry', 'Martyn', 'Ricky', + 'Leonard', 'Lawrence', 'Glen', 'Mitchell', 'Gerard', 'Gregory', 'Iain', + 'Billy', 'Bryan', 'Joel', 'Clifford', 'Josh', 'Leon', 'Stewart', + 'Mohammad', 'Dylan', 'Graeme', 'Terry', 'Guy', 'Elliott', 'Stanley', + 'Danny', 'Brandon', 'Victor', 'Toby', 'Hugh', 'Mohamed', 'Brett', + 'Albert', 'Tom', 'Declan', 'Maurice', 'Glenn', 'Leigh', 'Denis', + 'Damien', 'Bruce', 'Jay', 'Owen' + ) + + first_names_female = ( + 'Susan', 'Sarah', 'Rebecca', 'Linda', 'Julie', 'Claire', 'Laura', + 'Lauren', 'Christine', 'Karen', 'Nicola', 'Gemma', 'Jessica', + 'Margaret', 'Jacqueline', 'Emma', 'Charlotte', 'Janet', 'Deborah', + 'Lisa', 'Hannah', 'Patricia', 'Tracey', 'Joanne', 'Sophie', 'Carol', + 'Jane', 'Michelle', 'Victoria', 'Amy', 'Elizabeth', 'Helen', 'Samantha', + 'Emily', 'Mary', 'Diane', 'Rachel', 'Anne', 'Sharon', 'Ann', 'Tracy', + 'Amanda', 'Jennifer', 'Chloe', 'Angela', 'Louise', 'Katie', 'Lucy', + 'Barbara', 'Alison', 'Sandra', 'Caroline', 'Clare', 'Kelly', 'Bethany', + 'Gillian', 'Natalie', 'Jade', 'Pauline', 'Megan', 'Elaine', 'Alice', + 'Lesley', 'Catherine', 'Hayley', 'Pamela', 'Danielle', 'Holly', 'Wendy', + 'Abigail', 'Valerie', 'Olivia', 'Jean', 'Dawn', 'Donna', 'Stephanie', + 'Leanne', 'Kathleen', 'Natasha', 'Denise', 'Sally', 'Katherine', + 'Georgia', 'Maureen', 'Maria', 'Zoe', 'Judith', 'Kerry', 'Debra', + 'Melanie', 'Stacey', 'Eleanor', 'Paula', 'Shannon', 'Sheila', 'Joanna', + 'Paige', 'Janice', 'Lorraine', 'Georgina', 'Lynn', 'Andrea', 'Suzanne', + 'Nicole', 'Yvonne', 'Chelsea', 'Lynne', 'Anna', 'Kirsty', 'Shirley', + 'Alexandra', 'Marion', 'Beverley', 'Melissa', 'Rosemary', 'Kimberley', + 'Carole', 'Fiona', 'Kate', 'Joan', 'Marie', 'Jenna', 'Marilyn', 'Jodie', + 'June', 'Grace', 'Mandy', 'Rachael', 'Lynda', 'Tina', 'Kathryn', + 'Molly', 'Jayne', 'Amber', 'Marian', 'Jasmine', 'Brenda', 'Sara', + 'Kayleigh', 'Teresa', 'Harriet', 'Julia', 'Ashleigh', 'Heather', 'Kim', + 'Ruth', 'Jemma', 'Carly', 'Leah', 'Eileen', 'Francesca', 'Naomi', + 'Hilary', 'Abbie', 'Sylvia', 'Katy', 'Irene', 'Cheryl', 'Rosie', + 'Dorothy', 'Aimee', 'Vanessa', 'Ellie', 'Frances', 'Sian', 'Josephine', + 'Gail', 'Jill', 'Lydia', 'Joyce', 'Charlene', 'Hollie', 'Hazel', + 'Annette', 'Bethan', 'Amelia', 'Beth', 'Rita', 'Geraldine', 'Diana', + 'Lindsey', 'Carolyn' + ) + + first_names = first_names_male + first_names_female + + last_names = OrderedDict(( + ('Savage', 0.04), + ('Winter', 0.03), + ('Metcalfe', 0.03), + ('Harper', 0.06), + ('Burgess', 0.06), + ('Bailey', 0.15), + ('Potts', 0.03), + ('Boyle', 0.03), + ('Brown', 0.51), + ('Jennings', 0.05), + ('Payne', 0.09), + ('Day', 0.09), + ('Holland', 0.07), + ('Higgins', 0.05), + ('Rhodes', 0.04), + ('Hancock', 0.04), + ('Howells', 0.03), + ('Fowler', 0.04), + ('Sims', 0.03), + ('Thomas', 0.35), + ('Parker', 0.17), + ('Bentley', 0.04), + ('Barnett', 0.05), + ('Manning', 0.03), + ('Collier', 0.03), + ('Holloway', 0.03), + ('Hartley', 0.04), + ('George', 0.05), + ('Tomlinson', 0.04), + ('Howard', 0.09), + ('Long', 0.06), + ('Farmer', 0.03), + ('Collins', 0.15), + ('Rice', 0.03), + ('Townsend', 0.04), + ('Rees', 0.07), + ('Bruce', 0.03), + ('Hammond', 0.05), + ('Ford', 0.09), + ('Tucker', 0.05), + ('Wallis', 0.03), + ('Hamilton', 0.06), + ('Ferguson', 0.04), + ('Hooper', 0.03), + ('Francis', 0.07), + ('Reeves', 0.04), + ('Barlow', 0.04), + ('Short', 0.04), + ('Cunningham', 0.05), + ('Hopkins', 0.06), + ('Nicholson', 0.06), + ('Archer', 0.04), + ('Green', 0.25), + ('Glover', 0.04), + ('Gibson', 0.09), + ('Spencer', 0.08), + ('Warner', 0.04), + ('Webb', 0.12), + ('Whitehouse', 0.03), + ('Dean', 0.06), + ('Griffiths', 0.16), + ('Clark', 0.2), + ('Hardy', 0.05), + ('Iqbal', 0.03), + ('Baldwin', 0.04), + ('O\'Neill', 0.06), + ('Blake', 0.05), + ('Lees', 0.03), + ('Harvey', 0.1), + ('Clarke', 0.24), + ('Daniels', 0.04), + ('Browne', 0.03), + ('Macdonald', 0.04), + ('Kirk', 0.04), + ('Khan', 0.14), + ('Davidson', 0.05), + ('Dale', 0.04), + ('Sanders', 0.04), + ('Wilkins', 0.04), + ('Connor', 0.03), + ('Daly', 0.03), + ('Lane', 0.06), + ('Kennedy', 0.06), + ('Bray', 0.03), + ('Burrows', 0.04), + ('Hayes', 0.07), + ('Wyatt', 0.03), + ('Gould', 0.03), + ('Dyer', 0.03), + ('Nash', 0.05), + ('Bryan', 0.03), + ('Pope', 0.03), + ('Fraser', 0.04), + ('Steele', 0.03), + ('Walsh', 0.09), + ('Wade', 0.04), + ('Marsden', 0.03), + ('Humphries', 0.03), + ('O\'Brien', 0.08), + ('Thompson', 0.28), + ('Lord', 0.03), + ('Coleman', 0.06), + ('Jarvis', 0.04), + ('Noble', 0.03), + ('Williamson', 0.06), + ('Carpenter', 0.03), + ('Gardner', 0.06), + ('Farrell', 0.04), + ('Clayton', 0.05), + ('Akhtar', 0.05), + ('Gallagher', 0.05), + ('Skinner', 0.04), + ('Birch', 0.04), + ('Kay', 0.04), + ('Barrett', 0.07), + ('Bates', 0.06), + ('Lucas', 0.04), + ('O\'Connor', 0.06), + ('Chamberlain', 0.03), + ('Chapman', 0.12), + ('Ryan', 0.08), + ('Thorpe', 0.04), + ('Lawson', 0.04), + ('Howell', 0.04), + ('Martin', 0.23), + ('Kelly', 0.16), + ('Dobson', 0.04), + ('Stevens', 0.1), + ('Brennan', 0.04), + ('Lloyd', 0.11), + ('Quinn', 0.05), + ('Morton', 0.04), + ('Wilson', 0.35), + ('Barnes', 0.11), + ('Henry', 0.03), + ('Smith', 1.15), + ('Pritchard', 0.05), + ('Phillips', 0.18), + ('Dixon', 0.1), + ('Sharpe', 0.03), + ('Robertson', 0.07), + ('White', 0.27), + ('Bird', 0.06), + ('Abbott', 0.04), + ('Kirby', 0.04), + ('Hussain', 0.11), + ('Barber', 0.05), + ('Harris', 0.25), + ('Doyle', 0.05), + ('Jordan', 0.05), + ('Burns', 0.06), + ('Hodgson', 0.06), + ('Atkins', 0.04), + ('Stokes', 0.05), + ('Rogers', 0.12), + ('Parkes', 0.03), + ('Brookes', 0.04), + ('Herbert', 0.03), + ('Gordon', 0.05), + ('Kemp', 0.05), + ('Webster', 0.07), + ('Sinclair', 0.03), + ('McLean', 0.03), + ('Saunders', 0.09), + ('Stephens', 0.05), + ('Newton', 0.07), + ('Potter', 0.05), + ('Storey', 0.03), + ('Stanley', 0.04), + ('Turnbull', 0.03), + ('Duncan', 0.03), + ('Rose', 0.08), + ('Mills', 0.11), + ('Sheppard', 0.03), + ('Butcher', 0.03), + ('Fry', 0.03), + ('Ross', 0.06), + ('Shepherd', 0.06), + ('Goodwin', 0.05), + ('Holt', 0.05), + ('Haynes', 0.04), + ('Cook', 0.15), + ('Ward', 0.21), + ('Godfrey', 0.03), + ('Stone', 0.07), + ('Dodd', 0.04), + ('Parsons', 0.07), + ('Ingram', 0.03), + ('Nixon', 0.03), + ('Evans', 0.39), + ('Hargreaves', 0.03), + ('Owen', 0.11), + ('Chan', 0.03), + ('Connolly', 0.03), + ('Charlton', 0.03), + ('Middleton', 0.04), + ('Hyde', 0.03), + ('Patel', 0.24), + ('Owens', 0.03), + ('Lamb', 0.04), + ('Palmer', 0.11), + ('Cooper', 0.22), + ('McCarthy', 0.06), + ('Black', 0.04), + ('Dickinson', 0.04), + ('Gilbert', 0.05), + ('Leach', 0.03), + ('North', 0.03), + ('Byrne', 0.06), + ('Frost', 0.05), + ('Simmons', 0.04), + ('Matthews', 0.11), + ('Alexander', 0.04), + ('Ahmed', 0.1), + ('Gibbons', 0.03), + ('Stevenson', 0.05), + ('Rowley', 0.03), + ('Miles', 0.05), + ('Hanson', 0.03), + ('Bolton', 0.03), + ('Craig', 0.03), + ('Ali', 0.12), + ('Carroll', 0.04), + ('Allan', 0.03), + ('Sanderson', 0.03), + ('Fletcher', 0.1), + ('Burton', 0.08), + ('Oliver', 0.07), + ('Davison', 0.04), + ('Douglas', 0.04), + ('Field', 0.04), + ('Pickering', 0.03), + ('Pugh', 0.04), + ('Rowe', 0.05), + ('Mahmood', 0.03), + ('Sykes', 0.03), + ('Crawford', 0.03), + ('Williams', 0.66), + ('Parkin', 0.03), + ('Patterson', 0.04), + ('Power', 0.03), + ('Price', 0.17), + ('Murphy', 0.14), + ('Hale', 0.03), + ('Nicholls', 0.06), + ('Hall', 0.25), + ('Jones', 0.94), + ('Hughes', 0.26), + ('Stephenson', 0.05), + ('Morley', 0.04), + ('Knight', 0.11), + ('Kerr', 0.03), + ('Heath', 0.04), + ('Pollard', 0.03), + ('Lowe', 0.07), + ('O\'Sullivan', 0.04), + ('Buckley', 0.05), + ('Bond', 0.05), + ('Dennis', 0.03), + ('Lewis', 0.25), + ('Weston', 0.04), + ('Joyce', 0.03), + ('Reynolds', 0.09), + ('Bishop', 0.06), + ('Norris', 0.04), + ('Barry', 0.03), + ('Whittaker', 0.04), + ('Carey', 0.03), + ('Hill', 0.22), + ('Kent', 0.04), + ('Ashton', 0.04), + ('Wilkinson', 0.13), + ('Powell', 0.12), + ('Henderson', 0.06), + ('Freeman', 0.06), + ('Dunn', 0.07), + ('Kaur', 0.09), + ('French', 0.04), + ('Parry', 0.06), + ('Walton', 0.06), + ('Fisher', 0.1), + ('Naylor', 0.03), + ('Duffy', 0.04), + ('Humphreys', 0.04), + ('Randall', 0.03), + ('Bevan', 0.03), + ('Doherty', 0.03), + ('Moore', 0.21), + ('Armstrong', 0.07), + ('Sullivan', 0.05), + ('Swift', 0.03), + ('Pearce', 0.09), + ('Tyler', 0.03), + ('Bradshaw', 0.04), + ('Allen', 0.19), + ('Mellor', 0.03), + ('Whitehead', 0.05), + ('Jackson', 0.24), + ('Grant', 0.07), + ('Fox', 0.09), + ('Wright', 0.28), + ('Anderson', 0.13), + ('Foster', 0.13), + ('Gibbs', 0.04), + ('Butler', 0.11), + ('Jenkins', 0.1), + ('John', 0.04), + ('Morrison', 0.04), + ('Talbot', 0.03), + ('Blackburn', 0.03), + ('Osborne', 0.05), + ('Flynn', 0.04), + ('Richards', 0.14), + ('Hurst', 0.03), + ('Bibi', 0.05), + ('Houghton', 0.03), + ('Johnson', 0.34), + ('Yates', 0.06), + ('Mistry', 0.03), + ('Donnelly', 0.03), + ('Parkinson', 0.04), + ('Thomson', 0.05), + ('Woods', 0.07), + ('Todd', 0.04), + ('Dawson', 0.08), + ('Hart', 0.07), + ('Graham', 0.1), + ('Berry', 0.07), + ('Willis', 0.05), + ('Miah', 0.04), + ('Brooks', 0.09), + ('Horton', 0.03), + ('Riley', 0.07), + ('Lambert', 0.05), + ('Waters', 0.04), + ('Lynch', 0.05), + ('Moss', 0.06), + ('Slater', 0.05), + ('Knowles', 0.04), + ('Benson', 0.03), + ('Adams', 0.13), + ('King', 0.2), + ('Davies', 0.48), + ('Richardson', 0.15), + ('Vincent', 0.03), + ('Holmes', 0.11), + ('Conway', 0.03), + ('Marshall', 0.14), + ('Faulkner', 0.03), + ('Garner', 0.03), + ('Booth', 0.08), + ('Harrison', 0.2), + ('Campbell', 0.11), + ('Cole', 0.08), + ('Goddard', 0.04), + ('Walters', 0.05), + ('Ellis', 0.13), + ('Edwards', 0.27), + ('Peters', 0.04), + ('Atkinson', 0.08), + ('Wood', 0.24), + ('Briggs', 0.04), + ('Elliott', 0.09), + ('Chandler', 0.03), + ('Hope', 0.03), + ('Hunter', 0.07), + ('Newman', 0.07), + ('Pratt', 0.03), + ('Rahman', 0.03), + ('Hicks', 0.04), + ('Cox', 0.14), + ('Reid', 0.07), + ('Morris', 0.21), + ('Banks', 0.04), + ('Myers', 0.03), + ('Mitchell', 0.16), + ('Davey', 0.04), + ('Peacock', 0.03), + ('Reed', 0.07), + ('Carter', 0.15), + ('Miller', 0.14), + ('Perkins', 0.04), + ('Read', 0.05), + ('Hilton', 0.03), + ('Moran', 0.03), + ('Welch', 0.03), + ('Vaughan', 0.04), + ('Clements', 0.03), + ('Griffin', 0.05), + ('Russell', 0.1), + ('O\'Donnell', 0.03), + ('Hobbs', 0.03), + ('Marsh', 0.07), + ('Porter', 0.07), + ('Gill', 0.08), + ('Leonard', 0.03), + ('McKenzie', 0.03), + ('Thornton', 0.04), + ('Fitzgerald', 0.03), + ('Greenwood', 0.05), + ('Pearson', 0.1), + ('James', 0.19), + ('Coles', 0.03), + ('Roberts', 0.33), + ('Nelson', 0.05), + ('Forster', 0.03), + ('Gough', 0.03), + ('Mann', 0.05), + ('Law', 0.03), + ('Barker', 0.1), + ('Cartwright', 0.04), + ('Bradley', 0.08), + ('Sharp', 0.05), + ('Warren', 0.06), + ('Summers', 0.03), + ('Little', 0.04), + ('Perry', 0.08), + ('Fuller', 0.04), + ('West', 0.09), + ('Mason', 0.12), + ('Finch', 0.03), + ('Norton', 0.03), + ('Burke', 0.05), + ('Holden', 0.04), + ('Lee', 0.2), + ('Smart', 0.04), + ('Bull', 0.04), + ('Bryant', 0.04), + ('Gray', 0.12), + ('Watts', 0.08), + ('Brady', 0.03), + ('Baker', 0.2), + ('Barton', 0.05), + ('Davis', 0.17), + ('Baxter', 0.05), + ('Taylor', 0.53), + ('Carr', 0.07), + ('Wong', 0.04), + ('Cameron', 0.03), + ('Gardiner', 0.03), + ('Hawkins', 0.07), + ('Shaw', 0.15), + ('Wallace', 0.05), + ('Young', 0.16), + ('Shah', 0.06), + ('Gregory', 0.07), + ('Ball', 0.08), + ('Norman', 0.04), + ('Lawrence', 0.09), + ('Bowen', 0.04), + ('Wheeler', 0.05), + ('Bartlett', 0.04), + ('Sutton', 0.06), + ('Lyons', 0.03), + ('Hutchinson', 0.05), + ('Poole', 0.05), + ('Cooke', 0.06), + ('Franklin', 0.03), + ('Howe', 0.04), + ('Walker', 0.27), + ('Johnston', 0.05), + ('Austin', 0.05), + ('Chadwick', 0.03), + ('Bell', 0.15), + ('Wall', 0.04), + ('Woodward', 0.05), + ('Preston', 0.04), + ('Bennett', 0.16), + ('Murray', 0.1), + ('Begum', 0.13), + ('McDonald', 0.06), + ('Hudson', 0.07), + ('Cross', 0.06), + ('Singh', 0.13), + ('Howarth', 0.03), + ('Hewitt', 0.05), + ('Curtis', 0.06), + ('Harding', 0.07), + ('May', 0.05), + ('Wells', 0.07), + ('Giles', 0.03), + ('Watson', 0.17), + ('Nolan', 0.03), + ('Andrews', 0.09), + ('Hayward', 0.04), + ('Schofield', 0.04), + ('Hunt', 0.12), + ('Robson', 0.06), + ('Arnold', 0.05), + ('Morgan', 0.19), + ('Coates', 0.03), + ('Page', 0.07), + ('Simpson', 0.13), + ('Stewart', 0.09), + ('Robinson', 0.29), + ('Fleming', 0.03), + ('Scott', 0.18), + ('Chambers', 0.06), + ('Turner', 0.23), + ('Watkins', 0.06), + )) + + prefixes_female = ('Mrs.', 'Ms.', 'Miss', 'Dr.') + prefixes_male = ('Mr.', 'Dr.') diff --git a/src/libs/faker/providers/person/en_TH/__init__.py b/src/libs/faker/providers/person/en_TH/__init__.py new file mode 100644 index 0000000..49a0959 --- /dev/null +++ b/src/libs/faker/providers/person/en_TH/__init__.py @@ -0,0 +1,82 @@ +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name}} {{last_name}}', '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', '{{prefix}} {{first_name}} {{last_name}}') + + prefixes_male = ( + "GEN", "LT GEN", "MAJ GEN", "COL", "LT COL", "MAJ", "CAPT", "LT", "SUB LT", + "S M 1", + "S M 2", "S M 3", "SGT", "CPL", "PFC", "PVT", "ADM", "V ADM", "R ADM", "CAPT", + "CDR", + "L CDR", "LT", "LT JG", "SUB LT", "CPO 1", "CPO 2", "CPO 3", "PO 1", "PO 2", + "PO 3", + "SEA-MAN", "ACM", "AM", "AVM", "GP CAPT", "WG CDR", "SQN LDR", "FLT LT", + "FLG OFF", + "PLT OFF", "FS 1", "FS 2", "FS 3", "SGT", "CPL", "LAC", "AMN", "POL GEN", + "POL LT GEN", "POL MAJ GEN", "POL COL", "POL LT COL", "POL MAJ", "POL CAPT", + "POL LT", + "POL SUB LT", "POL SEN SGT MAJ", "POL SGT MAJ", "POL SGT", "POL CPL", "POL L/C", + "POL CONST", "MR", "REV", "M L", "M R", "SAMANERA", "PHRA", + "PHRA ATHIKAN", "CHAO ATHIKAN", "PHRAPALAD", "PHRASAMU", "PHRABAIDIKA", + "PHRAKHU PALAD", "PHRAKHU SAMU", "PHRAKHU BAIDIKA", "PHRAMAHA", + "PHRAKHU DHAMMADHORN", + "PHRAKHU VINAIDHORN") + + prefixes_female = ( + "GEN", "LT GEN", "MAJ GEN", "COL", "LT COL", "MAJ", "CAPT", "LT", "SUB LT", + "S M 1", + "S M 2", "S M 3", "SGT", "CPL", "PFC", "PVT", "ADM", "V ADM", "R ADM", "CAPT", + "CDR", + "L CDR", "LT", "LT JG", "SUB LT", "CPO 1", "CPO 2", "CPO 3", "PO 1", "PO 2", + "PO 3", + "SEA-MAN", "ACM", "AM", "AVM", "GP CAPT", "WG CDR", "SQN LDR", "FLT LT", + "FLG OFF", + "PLT OFF", "FS 1", "FS 2", "FS 3", "SGT", "CPL", "LAC", "AMN", "POL GEN", + "POL LT GEN", "POL MAJ GEN", "POL COL", "POL LT COL", "POL MAJ", "POL CAPT", + "POL LT", + "POL SUB LT", "POL SEN SGT MAJ", "POL SGT MAJ", "POL SGT", "POL CPL", "POL L/C", + "POL CONST", "MRS", "MISS", "REV", "M L") + + prefixes = prefixes_male + prefixes_female + + first_names = ( + "Pornchanok", "Patchaploy", "Peem", "Kodchaporn", "Pattapon", "Sarunporn", + "Jinjuta", + "Sorawut", "Suvakit", "Prima", "Darin", "Pintusorn", "Kulnun", "Nutcha", + "Nutkrita", + "Sittikorn", "Wasin", "Apisara", "Nattawun", "Tunradee", "Niracha", "Tunchanok", + "Kamolchanok", "Jaruwan", "Pachongruk", "Pakjira", "Pattatomporn", "Suwijuk", + "Noppakao", "Ratchanon", "Atit", "Kunaporn", "Arisara", "Todsawun", "Chaiwut", + "Puntira", "Supasita", "Patcharaporn", "Phubes", "Pattamon", "Chanya", + "Pannawich", + "Chawin", "Pada", "Chanikan", "Nutwadee", "Chalisa", "Prames", "Supasit", + "Sitiwat", + "Teetat", "Yada", "Phenphitcha", "Anon", "Chaifah", "Pawan", "Aunyaporn", + "Yanisa", + "Pak", "Chayanin", "Chayapat", "Jitrin", "Wassaya", "Pitipat", "Nichakarn", + "Parin", + "Thanatcha",) + + last_names = ( + "Prachayaroch", "Prachayaroch", "Kamalanon", "Tianvarich", "Bunlerngsri", + "Sukhenai", + "Posalee", "Chaisatit", "Sujjaboriboon", "Kamalanon", "Neerachapong", + "Pianduangsri", + "Pasuk", "Losatapornpipit", "Suraprasert", "Matinawin", "Choeychuen", "Wasunun", + "Kumsoontorn", "Sireelert", "Boonpungbaramee", "Sorattanachai", "Benchapatranon", + "Intaum", "Pikatsingkorn", "Srisoontorn", "Polpo", "Kongchayasukawut", + "Charoensuksopol", "Bunlupong", "Chomsri", "Tungkasethakul", "Chowitunkit", + "Todsapornpitakul", "Wimolnot", "Kittakun", "Methavorakul", "Pitanuwat", + "Phusilarungrueng", "Turongkinanon", "Kitprapa", "Pothanun", "Youprasert", + "Methavorakul", "Vethayasas", "Sooksawang", "Anekvorakul", "Pichpandecha", + "Sittisaowapak", "Suraprachit", "Kongsri", "Trikasemmart", "Habpanom", + "Wannapaitoonsri", "Vinyuvanichkul", "Pongpanitch", "Permchart", "Chaihirankarn", + "Thantananont", "Norramon", "Prayoonhong", "Lertsattayanusak", "Polauaypon", + "Prakalpawong", "Titipatrayunyong", "Krittayanukoon", "Siripaiboo",) diff --git a/src/libs/faker/providers/person/en_US/__init__.py b/src/libs/faker/providers/person/en_US/__init__.py new file mode 100644 index 0000000..e14d22e --- /dev/null +++ b/src/libs/faker/providers/person/en_US/__init__.py @@ -0,0 +1,1780 @@ +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = OrderedDict(( + ('{{first_name_female}} {{last_name}}', 0.97), + ('{{prefix_female}} {{first_name_female}} {{last_name}}', 0.015), + ('{{first_name_female}} {{last_name}} {{suffix_female}}', 0.02), + ('{{prefix_female}} {{first_name_female}} {{last_name}} {{suffix_female}}', 0.005), + )) + + formats_male = OrderedDict(( + ('{{first_name_male}} {{last_name}}', 0.97), + ('{{prefix_male}} {{first_name_male}} {{last_name}}', 0.015), + ('{{first_name_male}} {{last_name}} {{suffix_male}}', 0.02), + ('{{prefix_male}} {{first_name_male}} {{last_name}} {{suffix_male}}', 0.005), + )) + + # Using random_element's dictionary weighting means that the + # formats = formats_male + formats_female + # has to be replaced with something dict and python 2.x compatible + + formats = formats_male.copy() + formats.update(formats_female) + + # Top 200 names of the decade from the 60's-90's from: + # https://www.ssa.gov/OACT/babynames/decades/names1960s.html + # Weightings derived from total number on each name + + first_names_female = OrderedDict(( + ('April', 0.004529083), + ('Abigail', 0.002043839), + ('Adriana', 0.000488767), + ('Adrienne', 0.000622931), + ('Aimee', 0.000424727), + ('Alejandra', 0.000415754), + ('Alexa', 0.000663005), + ('Alexandra', 0.002835711), + ('Alexandria', 0.000964993), + ('Alexis', 0.003446735), + ('Alice', 0.000589904), + ('Alicia', 0.003766845), + ('Alisha', 0.000475942), + ('Alison', 0.001506047), + ('Allison', 0.003740866), + ('Alyssa', 0.00324341), + ('Amanda', 0.015360768), + ('Amber', 0.006928794), + ('Amy', 0.012860314), + ('Ana', 0.000853679), + ('Andrea', 0.006747028), + ('Angel', 0.001161117), + ('Angela', 0.011954085), + ('Angelica', 0.001102746), + ('Angie', 0.00030166), + ('Anita', 0.001383767), + ('Ann', 0.002627483), + ('Anna', 0.004691502), + ('Anne', 0.002089582), + ('Annette', 0.001487399), + ('Ariana', 0.000412668), + ('Ariel', 0.000615774), + ('Ashlee', 0.000696534), + ('Ashley', 0.014773009), + ('Audrey', 0.001139165), + ('Autumn', 0.000918594), + ('Bailey', 0.000691916), + ('Barbara', 0.004839169), + ('Becky', 0.000960944), + ('Belinda', 0.000502227), + ('Beth', 0.002246113), + ('Bethany', 0.001249385), + ('Betty', 0.000840241), + ('Beverly', 0.000990272), + ('Bianca', 0.000624835), + ('Bonnie', 0.001351901), + ('Brandi', 0.002077216), + ('Brandy', 0.002177499), + ('Breanna', 0.000876003), + ('Brenda', 0.005737124), + ('Briana', 0.00093665), + ('Brianna', 0.002543549), + ('Bridget', 0.000787232), + ('Brittany', 0.007258404), + ('Brittney', 0.001566147), + ('Brooke', 0.002410152), + ('Caitlin', 0.001808319), + ('Caitlyn', 0.000481194), + ('Candace', 0.000550662), + ('Candice', 0.000653199), + ('Carla', 0.00195185), + ('Carly', 0.000498725), + ('Carmen', 0.000891783), + ('Carol', 0.002972719), + ('Caroline', 0.001198127), + ('Carolyn', 0.002647225), + ('Carrie', 0.002934659), + ('Casey', 0.001177707), + ('Cassandra', 0.002501243), + ('Cassidy', 0.000452129), + ('Cassie', 0.000344886), + ('Catherine', 0.004460622), + ('Cathy', 0.001413248), + ('Charlene', 0.000538865), + ('Charlotte', 0.000530417), + ('Chelsea', 0.00280043), + ('Chelsey', 0.000368501), + ('Cheryl', 0.004166447), + ('Cheyenne', 0.000696907), + ('Chloe', 0.000565807), + ('Christie', 0.000397873), + ('Christina', 0.008735669), + ('Christine', 0.007488758), + ('Christy', 0.00141861), + ('Cindy', 0.003360109), + ('Claire', 0.000553835), + ('Claudia', 0.00096055), + ('Colleen', 0.001836203), + ('Connie', 0.001821845), + ('Courtney', 0.00484939), + ('Cristina', 0.000328734), + ('Crystal', 0.006365045), + ('Cynthia', 0.007655379), + ('Daisy', 0.000437443), + ('Dana', 0.003395805), + ('Danielle', 0.006671783), + ('Darlene', 0.000952737), + ('Dawn', 0.005014983), + ('Deanna', 0.002049026), + ('Debbie', 0.001842922), + ('Deborah', 0.005386088), + ('Debra', 0.004123572), + ('Denise', 0.004592291), + ('Desiree', 0.000991497), + ('Destiny', 0.001055515), + ('Diamond', 0.000331732), + ('Diana', 0.003699348), + ('Diane', 0.003058996), + ('Dominique', 0.000847857), + ('Donna', 0.00570819), + ('Doris', 0.000398026), + ('Dorothy', 0.000722426), + ('Ebony', 0.000399624), + ('Eileen', 0.000544271), + ('Elaine', 0.000601175), + ('Elizabeth', 0.014954075), + ('Ellen', 0.000747267), + ('Emily', 0.009100581), + ('Emma', 0.001272059), + ('Erica', 0.004344471), + ('Erika', 0.002105537), + ('Erin', 0.005450719), + ('Evelyn', 0.000825095), + ('Faith', 0.000427113), + ('Felicia', 0.001717294), + ('Frances', 0.000546897), + ('Gabriela', 0.000526937), + ('Gabriella', 0.00044123), + ('Gabrielle', 0.001090096), + ('Gail', 0.00071934), + ('Gina', 0.002841095), + ('Glenda', 0.000384982), + ('Gloria', 0.001155623), + ('Grace', 0.00087202), + ('Gwendolyn', 0.000407831), + ('Hailey', 0.000662917), + ('Haley', 0.001557939), + ('Hannah', 0.004189822), + ('Hayley', 0.000478305), + ('Heather', 0.010945254), + ('Heidi', 0.002239941), + ('Helen', 0.000636675), + ('Holly', 0.003487028), + ('Isabel', 0.000352305), + ('Isabella', 0.000410282), + ('Jackie', 0.000566748), + ('Jaclyn', 0.00047708), + ('Jacqueline', 0.004811242), + ('Jade', 0.000446264), + ('Jaime', 0.000853175), + ('Jamie', 0.005067663), + ('Jane', 0.0009486), + ('Janet', 0.002489993), + ('Janice', 0.001593308), + ('Jasmin', 0.000333374), + ('Jasmine', 0.003025422), + ('Jean', 0.000815969), + ('Jeanette', 0.000767293), + ('Jeanne', 0.000515381), + ('Jenna', 0.001804052), + ('Jennifer', 0.029218839), + ('Jenny', 0.000932667), + ('Jessica', 0.020047608), + ('Jill', 0.003253018), + ('Jillian', 0.000988587), + ('Jo', 0.000442083), + ('Joan', 0.000802793), + ('Joann', 0.000544336), + ('Joanna', 0.001176284), + ('Joanne', 0.000729824), + ('Jocelyn', 0.000456878), + ('Jodi', 0.001252405), + ('Jody', 0.000741861), + ('Jordan', 0.001653057), + ('Joy', 0.000916515), + ('Joyce', 0.001009488), + ('Judith', 0.000870706), + ('Judy', 0.001101586), + ('Julia', 0.003301891), + ('Julie', 0.008211731), + ('Kaitlin', 0.000674473), + ('Kaitlyn', 0.001478623), + ('Kara', 0.001549119), + ('Karen', 0.009643845), + ('Kari', 0.000794323), + ('Karina', 0.000494764), + ('Karla', 0.000387696), + ('Katelyn', 0.001476128), + ('Katherine', 0.006581479), + ('Kathleen', 0.00503549), + ('Kathryn', 0.004177806), + ('Kathy', 0.002710214), + ('Katie', 0.003056216), + ('Katrina', 0.001565446), + ('Kayla', 0.004621465), + ('Kaylee', 0.000551734), + ('Kelli', 0.000932163), + ('Kellie', 0.000299187), + ('Kelly', 0.009342929), + ('Kelsey', 0.002470383), + ('Kendra', 0.001401079), + ('Kerri', 0.000316215), + ('Kerry', 0.000352984), + ('Kiara', 0.000390037), + ('Kim', 0.002518642), + ('Kimberly', 0.015594077), + ('Kirsten', 0.000369486), + ('Krista', 0.001266872), + ('Kristen', 0.004345587), + ('Kristi', 0.001022926), + ('Kristie', 0.000380189), + ('Kristin', 0.003613728), + ('Kristina', 0.002316281), + ('Kristine', 0.000977709), + ('Kristy', 0.001097734), + ('Krystal', 0.001238113), + ('Kylie', 0.00049739), + ('Lacey', 0.00045469), + ('Latasha', 0.00032904), + ('Latoya', 0.000646371), + ('Laura', 0.010815096), + ('Lauren', 0.007015421), + ('Laurie', 0.002200786), + ('Leah', 0.001997571), + ('Leslie', 0.003606134), + ('Linda', 0.006437751), + ('Lindsay', 0.002185466), + ('Lindsey', 0.002646153), + ('Lisa', 0.01872729), + ('Loretta', 0.000482945), + ('Lori', 0.006040316), + ('Lorraine', 0.000486753), + ('Lydia', 0.000370274), + ('Lynn', 0.001522308), + ('Mackenzie', 0.000761056), + ('Madeline', 0.000808921), + ('Madison', 0.002011184), + ('Makayla', 0.000439391), + ('Mallory', 0.000688633), + ('Mandy', 0.000355566), + ('Marcia', 0.000403213), + ('Margaret', 0.003839968), + ('Maria', 0.006593123), + ('Mariah', 0.00097598), + ('Marie', 0.001520229), + ('Marilyn', 0.000590889), + ('Marisa', 0.000339983), + ('Marissa', 0.001582627), + ('Martha', 0.001290028), + ('Mary', 0.014288466), + ('Maureen', 0.000753855), + ('Mckenzie', 0.000334512), + ('Meagan', 0.000729999), + ('Megan', 0.007686786), + ('Meghan', 0.001481578), + ('Melanie', 0.003400117), + ('Melinda', 0.002078113), + ('Melissa', 0.014890692), + ('Melody', 0.000404264), + ('Mercedes', 0.000334643), + ('Meredith', 0.000766987), + ('Mia', 0.000319935), + ('Michaela', 0.000506998), + ('Michele', 0.003519551), + ('Michelle', 0.01527423), + ('Mikayla', 0.000410195), + ('Mindy', 0.000306891), + ('Miranda', 0.001421193), + ('Misty', 0.001564614), + ('Molly', 0.001710641), + ('Monica', 0.004324095), + ('Monique', 0.001272125), + ('Morgan', 0.002527025), + ('Nancy', 0.005023343), + ('Natalie', 0.003658398), + ('Natasha', 0.001739815), + ('Nichole', 0.001001237), + ('Nicole', 0.011156655), + ('Nina', 0.000298115), + ('Norma', 0.000470754), + ('Olivia', 0.001967609), + ('Paige', 0.001106313), + ('Pam', 0.000374454), + ('Pamela', 0.005816222), + ('Patricia', 0.008349353), + ('Patty', 0.000383493), + ('Paula', 0.002478284), + ('Peggy', 0.000810606), + ('Penny', 0.000836564), + ('Phyllis', 0.000562437), + ('Priscilla', 0.000350226), + ('Rachael', 0.001098128), + ('Rachel', 0.00876108), + ('Raven', 0.000404855), + ('Rebecca', 0.010563161), + ('Rebekah', 0.000858581), + ('Regina', 0.001941739), + ('Renee', 0.00257883), + ('Rhonda', 0.002879221), + ('Rita', 0.000719187), + ('Roberta', 0.000461715), + ('Robin', 0.00409199), + ('Robyn', 0.00032138), + ('Rose', 0.000697125), + ('Ruth', 0.001041946), + ('Sabrina', 0.001920969), + ('Sally', 0.000532912), + ('Samantha', 0.008186124), + ('Sandra', 0.006473426), + ('Sandy', 0.000497106), + ('Sara', 0.005619879), + ('Sarah', 0.014434273), + ('Savannah', 0.000978344), + ('Selena', 0.000329106), + ('Shannon', 0.005952552), + ('Shari', 0.000449043), + ('Sharon', 0.004796469), + ('Shawna', 0.000354209), + ('Sheena', 0.000355763), + ('Sheila', 0.00220129), + ('Shelby', 0.001575601), + ('Shelia', 0.000403673), + ('Shelley', 0.000922227), + ('Shelly', 0.001339469), + ('Sheri', 0.000913166), + ('Sherri', 0.001285038), + ('Sherry', 0.002445235), + ('Sheryl', 0.00057025), + ('Shirley', 0.000833259), + ('Sierra', 0.000954816), + ('Sonia', 0.000332739), + ('Sonya', 0.000914085), + ('Sophia', 0.000535976), + ('Stacey', 0.002836761), + ('Stacie', 0.0003903), + ('Stacy', 0.00311717), + ('Stefanie', 0.00034644), + ('Stephanie', 0.013595762), + ('Sue', 0.000472877), + ('Summer', 0.000411508), + ('Susan', 0.0088973), + ('Suzanne', 0.001943577), + ('Sydney', 0.001220101), + ('Sylvia', 0.000625798), + ('Tabitha', 0.000428404), + ('Tamara', 0.00212948), + ('Tami', 0.000403651), + ('Tammie', 0.00042337), + ('Tammy', 0.006493584), + ('Tanya', 0.002039024), + ('Tara', 0.00316834), + ('Tasha', 0.000355807), + ('Taylor', 0.003996871), + ('Teresa', 0.005060003), + ('Terri', 0.001823903), + ('Terry', 0.00060494), + ('Theresa', 0.003492762), + ('Tiffany', 0.006594283), + ('Tina', 0.005186419), + ('Toni', 0.000891695), + ('Tonya', 0.002404133), + ('Tracey', 0.001511146), + ('Traci', 0.00086193), + ('Tracie', 0.000301901), + ('Tracy', 0.00498572), + ('Tricia', 0.000449196), + ('Valerie', 0.003218022), + ('Vanessa', 0.003779189), + ('Veronica', 0.003017805), + ('Vicki', 0.00088653), + ('Vickie', 0.000695199), + ('Victoria', 0.005237677), + ('Virginia', 0.001496482), + ('Wanda', 0.001336186), + ('Wendy', 0.004058263), + ('Whitney', 0.001690768), + ('Yesenia', 0.000331951), + ('Yolanda', 0.001213819), + ('Yvette', 0.000483427), + ('Yvonne', 0.001005483), + ('Zoe', 0.000367407), + )) + + first_names_male = OrderedDict(( + ('Aaron', 0.006741589), + ('Adam', 0.007124922), + ('Adrian', 0.001521889), + ('Alan', 0.002344657), + ('Albert', 0.001316595), + ('Alec', 0.000442958), + ('Alejandro', 0.000862489), + ('Alex', 0.002111833), + ('Alexander', 0.005215733), + ('Alexis', 0.000277915), + ('Alfred', 0.000318919), + ('Allen', 0.001679613), + ('Alvin', 0.00024794), + ('Andre', 0.001400621), + ('Andres', 0.000335574), + ('Andrew', 0.013475074), + ('Angel', 0.000902262), + ('Anthony', 0.013783357), + ('Antonio', 0.002392535), + ('Arthur', 0.001342637), + ('Austin', 0.003785615), + ('Barry', 0.001102751), + ('Benjamin', 0.006535474), + ('Bernard', 0.000298691), + ('Bill', 0.000430013), + ('Billy', 0.001749806), + ('Blake', 0.001218155), + ('Bob', 0.000235731), + ('Bobby', 0.001666977), + ('Brad', 0.000984544), + ('Bradley', 0.003845018), + ('Brady', 0.000277522), + ('Brandon', 0.009518346), + ('Brendan', 0.000736758), + ('Brent', 0.001889131), + ('Brett', 0.002248371), + ('Brian', 0.01597677), + ('Bruce', 0.001883335), + ('Bryan', 0.00456454), + ('Bryce', 0.000457406), + ('Caleb', 0.001485861), + ('Calvin', 0.001168738), + ('Cameron', 0.00180755), + ('Carl', 0.002011802), + ('Carlos', 0.00266638), + ('Casey', 0.001440035), + ('Cesar', 0.000304898), + ('Chad', 0.003858817), + ('Charles', 0.010889881), + ('Chase', 0.000971942), + ('Chris', 0.001389507), + ('Christian', 0.003097779), + ('Christopher', 0.02783596), + ('Clarence', 0.000299289), + ('Clayton', 0.000662222), + ('Clifford', 0.00053078), + ('Clinton', 0.000579307), + ('Cody', 0.00353482), + ('Cole', 0.000578811), + ('Colin', 0.00078508), + ('Collin', 0.000406057), + ('Colton', 0.000520845), + ('Connor', 0.000981073), + ('Corey', 0.002476612), + ('Cory', 0.001813005), + ('Craig', 0.00338161), + ('Cristian', 0.000333847), + ('Curtis', 0.002140235), + ('Dakota', 0.000797614), + ('Dale', 0.001171354), + ('Dalton', 0.000615113), + ('Damon', 0.00034308), + ('Dan', 0.000388496), + ('Daniel', 0.018881874), + ('Danny', 0.001873879), + ('Darin', 0.000234962), + ('Darius', 0.000336189), + ('Darrell', 0.001218582), + ('Darren', 0.001253738), + ('Darryl', 0.00067019), + ('Daryl', 0.000260918), + ('Dave', 0.000269673), + ('David', 0.031073833), + ('Dean', 0.000965375), + ('Dennis', 0.003318992), + ('Derek', 0.003095299), + ('Derrick', 0.001955921), + ('Devin', 0.001312474), + ('Devon', 0.000485877), + ('Dillon', 0.000558361), + ('Dominic', 0.000438221), + ('Don', 0.000378322), + ('Donald', 0.005689572), + ('Douglas', 0.004513687), + ('Drew', 0.000596868), + ('Duane', 0.00061855), + ('Dustin', 0.003088938), + ('Dwayne', 0.000711382), + ('Dylan', 0.002329096), + ('Earl', 0.000348347), + ('Eddie', 0.0007944), + ('Edgar', 0.000379536), + ('Eduardo', 0.000465358), + ('Edward', 0.005702242), + ('Edwin', 0.001117833), + ('Elijah', 0.000592183), + ('Eric', 0.012024659), + ('Erik', 0.001997096), + ('Ernest', 0.000746556), + ('Ethan', 0.001143978), + ('Eugene', 0.000784243), + ('Evan', 0.001570691), + ('Fernando', 0.000557608), + ('Francis', 0.000330837), + ('Francisco', 0.001084335), + ('Frank', 0.003276449), + ('Franklin', 0.000237561), + ('Fred', 0.000396618), + ('Frederick', 0.001104188), + ('Gabriel', 0.001906504), + ('Garrett', 0.001124861), + ('Gary', 0.005023109), + ('Gavin', 0.000295373), + ('Gene', 0.00023426), + ('Geoffrey', 0.000425978), + ('George', 0.004423984), + ('Gerald', 0.00165841), + ('Gilbert', 0.000246726), + ('Glen', 0.000374338), + ('Glenn', 0.001111421), + ('Gordon', 0.00027075), + ('Grant', 0.00068322), + ('Greg', 0.000623492), + ('Gregg', 0.000235885), + ('Gregory', 0.007676443), + ('Guy', 0.000262645), + ('Harold', 0.000929467), + ('Harry', 0.000586934), + ('Hayden', 0.000279454), + ('Hector', 0.000798691), + ('Henry', 0.001856232), + ('Herbert', 0.000234226), + ('Howard', 0.000712921), + ('Hunter', 0.001034679), + ('Ian', 0.001863192), + ('Isaac', 0.001001951), + ('Isaiah', 0.000625441), + ('Ivan', 0.000350433), + ('Jack', 0.001839748), + ('Jackson', 0.000403253), + ('Jacob', 0.007845384), + ('Jaime', 0.000421378), + ('Jake', 0.000565782), + ('James', 0.029601617), + ('Jamie', 0.00093552), + ('Jared', 0.002538802), + ('Jason', 0.01520513), + ('Javier', 0.000625202), + ('Jay', 0.001411462), + ('Jeff', 0.001271436), + ('Jeffery', 0.002627873), + ('Jeffrey', 0.01225709), + ('Jeremiah', 0.001209605), + ('Jeremy', 0.006336079), + ('Jermaine', 0.000450156), + ('Jerome', 0.000634299), + ('Jerry', 0.003150273), + ('Jesse', 0.003884552), + ('Jesus', 0.001628965), + ('Jim', 0.000567714), + ('Jimmy', 0.001607489), + ('Joe', 0.001621544), + ('Joel', 0.002537742), + ('John', 0.028683008), + ('Johnathan', 0.000840448), + ('Johnny', 0.002117065), + ('Jon', 0.001561184), + ('Jonathan', 0.009963971), + ('Jonathon', 0.000701157), + ('Jordan', 0.003451546), + ('Jorge', 0.001180553), + ('Jose', 0.005368207), + ('Joseph', 0.018604763), + ('Joshua', 0.014808101), + ('Juan', 0.003233598), + ('Julian', 0.000693736), + ('Justin', 0.010197889), + ('Karl', 0.000362437), + ('Keith', 0.004622866), + ('Kelly', 0.000775283), + ('Kenneth', 0.008318145), + ('Kent', 0.000329418), + ('Kerry', 0.000261448), + ('Kevin', 0.014324157), + ('Kirk', 0.0003801), + ('Kristopher', 0.000580692), + ('Kurt', 0.000716375), + ('Kyle', 0.006350049), + ('Lance', 0.001048495), + ('Larry', 0.003658807), + ('Lawrence', 0.001670294), + ('Lee', 0.001223883), + ('Leon', 0.000236347), + ('Leonard', 0.000756713), + ('Leroy', 0.000260234), + ('Leslie', 0.000234637), + ('Levi', 0.000347184), + ('Logan', 0.001325812), + ('Lonnie', 0.000258576), + ('Louis', 0.001212255), + ('Lucas', 0.001098237), + ('Luis', 0.002427777), + ('Luke', 0.001221455), + ('Malik', 0.000306813), + ('Manuel', 0.001331369), + ('Marc', 0.001431947), + ('Marco', 0.000290586), + ('Marcus', 0.002604122), + ('Mario', 0.001229337), + ('Mark', 0.014382277), + ('Martin', 0.002085226), + ('Marvin', 0.000732962), + ('Mason', 0.000562037), + ('Mathew', 0.000605555), + ('Matthew', 0.020425018), + ('Maurice', 0.000777078), + ('Max', 0.000311276), + ('Maxwell', 0.000357478), + ('Melvin', 0.00061932), + ('Michael', 0.045602241), + ('Micheal', 0.001273847), + ('Miguel', 0.001416267), + ('Mike', 0.001221797), + ('Mitchell', 0.001747788), + ('Nathan', 0.005039405), + ('Nathaniel', 0.001887558), + ('Neil', 0.000240331), + ('Nicholas', 0.010021219), + ('Nicolas', 0.000362522), + ('Noah', 0.000960947), + ('Norman', 0.000389043), + ('Omar', 0.000639052), + ('Oscar', 0.000946583), + ('Parker', 0.000277522), + ('Patrick', 0.007153255), + ('Paul', 0.009272953), + ('Pedro', 0.000275726), + ('Perry', 0.000258644), + ('Peter', 0.004340385), + ('Philip', 0.002262956), + ('Phillip', 0.00280273), + ('Preston', 0.000292022), + ('Ralph', 0.000836891), + ('Randall', 0.001614722), + ('Randy', 0.003021926), + ('Ray', 0.000379451), + ('Raymond', 0.003493952), + ('Reginald', 0.00095108), + ('Ricardo', 0.001197276), + ('Richard', 0.014131961), + ('Rick', 0.000440016), + ('Rickey', 0.00023833), + ('Ricky', 0.001856882), + ('Riley', 0.000322031), + ('Robert', 0.026938092), + ('Roberto', 0.000906024), + ('Rodney', 0.002180555), + ('Roger', 0.002038032), + ('Ronald', 0.00576775), + ('Ronnie', 0.000905938), + ('Ross', 0.00026863), + ('Roy', 0.001311346), + ('Ruben', 0.000774821), + ('Russell', 0.002096221), + ('Ryan', 0.01128178), + ('Samuel', 0.00498019), + ('Scott', 0.010580999), + ('Sean', 0.005593456), + ('Sergio', 0.000568518), + ('Seth', 0.001537416), + ('Shane', 0.002530218), + ('Shannon', 0.000421583), + ('Shaun', 0.000748761), + ('Shawn', 0.004474546), + ('Spencer', 0.000912094), + ('Stanley', 0.000739032), + ('Stephen', 0.007675365), + ('Steve', 0.001407564), + ('Steven', 0.013292898), + ('Stuart', 0.000238826), + ('Tanner', 0.000639292), + ('Taylor', 0.00133036), + ('Terrance', 0.000203311), + ('Terrence', 0.000203704), + ('Terry', 0.002873624), + ('Theodore', 0.000596561), + ('Thomas', 0.0143364), + ('Tim', 0.000711126), + ('Timothy', 0.012632608), + ('Todd', 0.00414612), + ('Tom', 0.000499283), + ('Tommy', 0.000778737), + ('Tony', 0.002511563), + ('Tracy', 0.000728259), + ('Travis', 0.004022458), + ('Trevor', 0.001692523), + ('Tristan', 0.000408759), + ('Troy', 0.002695415), + ('Tyler', 0.005962323), + ('Tyrone', 0.000587207), + ('Vernon', 0.000246401), + ('Victor', 0.002340621), + ('Vincent', 0.002494515), + ('Walter', 0.001525891), + ('Warren', 0.000317414), + ('Wayne', 0.00160966), + ('Wesley', 0.001733835), + ('William', 0.020025989), + ('Willie', 0.001379247), + ('Wyatt', 0.000306591), + ('Xavier', 0.000415222), + ('Zachary', 0.005918634), + )) + + first_names = first_names_male.copy() + first_names.update(first_names_female) + + # Top 1000 US surnames from US Census data + # Weighted by number of occurrences + # By way of http://names.mongabay.com/data/1000.html on 2/10/2016 + last_names = OrderedDict(( + ('Smith', 0.021712045), + ('Johnson', 0.01696938), + ('Williams', 0.014016962), + ('Brown', 0.012610763), + ('Jones', 0.012451866), + ('Miller', 0.010305045), + ('Davis', 0.009798219), + ('Garcia', 0.007842422), + ('Rodriguez', 0.007348561), + ('Wilson', 0.007154951), + ('Martinez', 0.007082045), + ('Anderson', 0.006966203), + ('Taylor', 0.006582218), + ('Thomas', 0.006493824), + ('Hernandez', 0.006454314), + ('Moore', 0.006383948), + ('Martin', 0.006146745), + ('Jackson', 0.006086567), + ('Thompson', 0.005887767), + ('White', 0.005843424), + ('Lopez', 0.005679145), + ('Lee', 0.005535909), + ('Gonzalez', 0.005461513), + ('Harris', 0.005423356), + ('Clark', 0.005010598), + ('Lewis', 0.00465937), + ('Robinson', 0.004596305), + ('Walker', 0.004580579), + ('Perez', 0.00446375), + ('Hall', 0.004327121), + ('Young', 0.004257495), + ('Allen', 0.00423392), + ('Sanchez', 0.004031749), + ('Wright', 0.004023754), + ('King', 0.004011135), + ('Scott', 0.003838487), + ('Green', 0.003778053), + ('Baker', 0.003776901), + ('Adams', 0.00377448), + ('Nelson', 0.003766713), + ('Hill', 0.003762455), + ('Ramirez', 0.003554281), + ('Campbell', 0.003398636), + ('Mitchell', 0.003357336), + ('Roberts', 0.003346207), + ('Carter', 0.0033127), + ('Phillips', 0.003214932), + ('Evans', 0.003127113), + ('Turner', 0.003067045), + ('Torres', 0.002971158), + ('Parker', 0.002962725), + ('Collins', 0.002904264), + ('Edwards', 0.002897155), + ('Stewart', 0.002859044), + ('Flores', 0.002856449), + ('Morris', 0.002848582), + ('Nguyen', 0.002833697), + ('Murphy', 0.00274576), + ('Rivera', 0.002736275), + ('Cook', 0.002693623), + ('Rogers', 0.002690041), + ('Morgan', 0.002525543), + ('Peterson', 0.002513125), + ('Cooper', 0.00246795), + ('Reed', 0.0024437), + ('Bailey', 0.002429747), + ('Bell', 0.002419112), + ('Gomez', 0.002408494), + ('Kelly', 0.002379209), + ('Howard', 0.002327986), + ('Ward', 0.002321973), + ('Cox', 0.002318775), + ('Diaz', 0.00230051), + ('Richardson', 0.002280051), + ('Wood', 0.002259639), + ('Watson', 0.002215168), + ('Brooks', 0.002199808), + ('Bennett', 0.002184311), + ('Gray', 0.002162912), + ('James', 0.002131032), + ('Reyes', 0.002124517), + ('Cruz', 0.002111304), + ('Hughes', 0.002095999), + ('Price', 0.002090206), + ('Myers', 0.002054278), + ('Long', 0.002042126), + ('Foster', 0.002019703), + ('Sanders', 0.002018442), + ('Ross', 0.002009844), + ('Morales', 0.001988655), + ('Powell', 0.001978704), + ('Sullivan', 0.001970362), + ('Russell', 0.001968461), + ('Ortiz', 0.001961617), + ('Jenkins', 0.001952974), + ('Gutierrez', 0.001945371), + ('Perry', 0.001942986), + ('Butler', 0.001926859), + ('Barnes', 0.00192272), + ('Fisher', 0.001921377), + ('Henderson', 0.001919686), + ('Coleman', 0.001906255), + ('Simmons', 0.001842531), + ('Patterson', 0.00181427), + ('Jordan', 0.00180198), + ('Reynolds', 0.001787233), + ('Hamilton', 0.001775656), + ('Graham', 0.001773307), + ('Kim', 0.001773243), + ('Gonzales', 0.001772028), + ('Alexander', 0.001767542), + ('Ramos', 0.001764371), + ('Wallace', 0.001743026), + ('Griffin', 0.001741893), + ('West', 0.001722047), + ('Cole', 0.001715916), + ('Hayes', 0.001712992), + ('Chavez', 0.001698299), + ('Gibson', 0.001685096), + ('Bryant', 0.001679075), + ('Ellis', 0.001662381), + ('Stevens', 0.001657657), + ('Murray', 0.001630218), + ('Ford', 0.001630062), + ('Marshall', 0.001619244), + ('Owens', 0.001611212), + ('Mcdonald', 0.001609019), + ('Harrison', 0.001604295), + ('Ruiz', 0.001602943), + ('Kennedy', 0.001568285), + ('Wells', 0.001559139), + ('Alvarez', 0.001542527), + ('Woods', 0.0015425), + ('Mendoza', 0.001540243), + ('Castillo', 0.001511972), + ('Olson', 0.001493963), + ('Webb', 0.001493771), + ('Washington', 0.001489705), + ('Tucker', 0.001488763), + ('Freeman', 0.001486507), + ('Burns', 0.001481636), + ('Henry', 0.001474683), + ('Vasquez', 0.001461863), + ('Snyder', 0.001456143), + ('Simpson', 0.001445891), + ('Crawford', 0.001444795), + ('Jimenez', 0.001438892), + ('Porter', 0.001433163), + ('Mason', 0.0014207), + ('Shaw', 0.001417849), + ('Gordon', 0.001415674), + ('Wagner', 0.001411855), + ('Hunter', 0.001410886), + ('Romero', 0.001405057), + ('Hicks', 0.00140365), + ('Dixon', 0.001389003), + ('Hunt', 0.001388738), + ('Palmer', 0.00137431), + ('Robertson', 0.001373323), + ('Black', 0.001372291), + ('Holmes', 0.001372108), + ('Stone', 0.001368782), + ('Meyer', 0.001367521), + ('Boyd', 0.001365803), + ('Mills', 0.001351485), + ('Warren', 0.001351458), + ('Fox', 0.001346441), + ('Rose', 0.001342485), + ('Rice', 0.001338062), + ('Moreno', 0.001334846), + ('Schmidt', 0.001330067), + ('Patel', 0.001325508), + ('Ferguson', 0.001299832), + ('Nichols', 0.001296908), + ('Herrera', 0.0012864), + ('Medina', 0.001273307), + ('Ryan', 0.001273142), + ('Fernandez', 0.001272841), + ('Weaver', 0.001268354), + ('Daniels', 0.001268034), + ('Stephens', 0.001267724), + ('Gardner', 0.001266974), + ('Payne', 0.0012612), + ('Kelley', 0.001256878), + ('Dunn', 0.001251395), + ('Pierce', 0.001247393), + ('Arnold', 0.001245547), + ('Tran', 0.001243537), + ('Spencer', 0.001228443), + ('Peters', 0.001226505), + ('Hawkins', 0.001224998), + ('Grant', 0.001224705), + ('Hansen', 0.001219589), + ('Castro', 0.001217578), + ('Hoffman', 0.001212014), + ('Hart', 0.001210378), + ('Elliott', 0.001210296), + ('Cunningham', 0.00120517), + ('Knight', 0.001204841), + ('Bradley', 0.001199624), + ('Carroll', 0.001197166), + ('Hudson', 0.001195091), + ('Duncan', 0.001191674), + ('Armstrong', 0.001187681), + ('Berry', 0.001182409), + ('Andrews', 0.001181632), + ('Johnston', 0.001178114), + ('Ray', 0.001176826), + ('Lane', 0.001176214), + ('Riley', 0.001169206), + ('Carpenter', 0.001161101), + ('Perkins', 0.001159986), + ('Aguilar', 0.001154942), + ('Silva', 0.001152795), + ('Richards', 0.001148126), + ('Willis', 0.001147888), + ('Matthews', 0.001140688), + ('Chapman', 0.001138632), + ('Lawrence', 0.001135955), + ('Garza', 0.00113421), + ('Vargas', 0.001132583), + ('Watkins', 0.001118832), + ('Wheeler', 0.00111186), + ('Larson', 0.001106195), + ('Carlson', 0.001097606), + ('Harper', 0.001095267), + ('George', 0.001094444), + ('Greene', 0.001092855), + ('Burke', 0.001088935), + ('Guzman', 0.001081762), + ('Morrison', 0.001077641), + ('Munoz', 0.001076133), + ('Jacobs', 0.001055721), + ('Obrien', 0.001054304), + ('Lawson', 0.001052486), + ('Franklin', 0.001049498), + ('Lynch', 0.001045743), + ('Bishop', 0.00104196), + ('Carr', 0.001040662), + ('Salazar', 0.001036788), + ('Austin', 0.001033974), + ('Mendez', 0.0010301), + ('Gilbert', 0.001027084), + ('Jensen', 0.001026408), + ('Williamson', 0.001025348), + ('Montgomery', 0.00102469), + ('Harvey', 0.001024617), + ('Oliver', 0.001020094), + ('Howell', 0.001001756), + ('Dean', 0.000998064), + ('Hanson', 0.000996685), + ('Weber', 0.000985601), + ('Garrett', 0.000984788), + ('Sims', 0.000979918), + ('Burton', 0.000979132), + ('Fuller', 0.000974783), + ('Soto', 0.000974317), + ('Mccoy', 0.000972946), + ('Welch', 0.00096676), + ('Chen', 0.000964384), + ('Schultz', 0.000959067), + ('Walters', 0.000952844), + ('Reid', 0.00095034), + ('Fields', 0.00094335), + ('Walsh', 0.000943113), + ('Little', 0.000938563), + ('Fowler', 0.000937667), + ('Bowman', 0.000934186), + ('Davidson', 0.000932404), + ('May', 0.000929498), + ('Day', 0.000929041), + ('Schneider', 0.00091878), + ('Newman', 0.000918214), + ('Brewer', 0.000917976), + ('Lucas', 0.000917538), + ('Holland', 0.000912677), + ('Wong', 0.000908172), + ('Banks', 0.000907276), + ('Santos', 0.000904526), + ('Curtis', 0.000904206), + ('Pearson', 0.000902105), + ('Delgado', 0.000901621), + ('Valdez', 0.000901027), + ('Pena', 0.000898605), + ('Rios', 0.000882377), + ('Douglas', 0.000881062), + ('Sandoval', 0.000879947), + ('Barrett', 0.000876228), + ('Hopkins', 0.000864414), + ('Keller', 0.000861645), + ('Guerrero', 0.000860293), + ('Stanley', 0.000857232), + ('Bates', 0.000856555), + ('Alvarado', 0.000856373), + ('Beck', 0.000851238), + ('Ortega', 0.000850963), + ('Wade', 0.00084825), + ('Estrada', 0.000848222), + ('Contreras', 0.00084666), + ('Barnett', 0.000843252), + ('Caldwell', 0.00083458), + ('Santiago', 0.00083119), + ('Lambert', 0.000828001), + ('Powers', 0.000826019), + ('Chambers', 0.000825324), + ('Nunez', 0.000824255), + ('Craig', 0.000818618), + ('Leonard', 0.000815027), + ('Lowe', 0.000814844), + ('Rhodes', 0.000812459), + ('Byrd', 0.00081149), + ('Gregory', 0.000811481), + ('Shelton', 0.000807059), + ('Frazier', 0.00080705), + ('Becker', 0.000805122), + ('Maldonado', 0.000804226), + ('Fleming', 0.000803614), + ('Vega', 0.000801595), + ('Sutton', 0.000798351), + ('Cohen', 0.000797008), + ('Jennings', 0.00079529), + ('Parks', 0.000788967), + ('Mcdaniel', 0.000788702), + ('Watts', 0.000787889), + ('Barker', 0.000778688), + ('Norris', 0.000778605), + ('Vaughn', 0.000777006), + ('Vazquez', 0.000775992), + ('Holt', 0.000774018), + ('Schwartz', 0.000773918), + ('Steele', 0.000770756), + ('Benson', 0.00076966), + ('Neal', 0.000766151), + ('Dominguez', 0.000765073), + ('Horton', 0.000763173), + ('Terry', 0.000762387), + ('Wolfe', 0.000759417), + ('Hale', 0.000757983), + ('Lyons', 0.000751614), + ('Graves', 0.000750892), + ('Haynes', 0.000749595), + ('Miles', 0.000748644), + ('Park', 0.000748251), + ('Warner', 0.000747648), + ('Padilla', 0.000747475), + ('Bush', 0.000744907), + ('Thornton', 0.000741864), + ('Mccarthy', 0.000740439), + ('Mann', 0.00074032), + ('Zimmerman', 0.000739608), + ('Erickson', 0.000739534), + ('Fletcher', 0.000739498), + ('Mckinney', 0.00073661), + ('Page', 0.000735487), + ('Dawson', 0.000732718), + ('Joseph', 0.000731256), + ('Marquez', 0.000730534), + ('Reeves', 0.00072931), + ('Klein', 0.000728104), + ('Espinoza', 0.000724787), + ('Baldwin', 0.000723224), + ('Moran', 0.000717696), + ('Love', 0.000715659), + ('Robbins', 0.000713996), + ('Higgins', 0.000713685), + ('Ball', 0.000708696), + ('Cortez', 0.000708066), + ('Le', 0.000707709), + ('Griffith', 0.00070749), + ('Bowen', 0.000704283), + ('Sharp', 0.000702364), + ('Cummings', 0.000700893), + ('Ramsey', 0.000700144), + ('Hardy', 0.000699988), + ('Swanson', 0.000699358), + ('Barber', 0.000699038), + ('Acosta', 0.000698791), + ('Luna', 0.000695593), + ('Chandler', 0.000695474), + ('Daniel', 0.000686529), + ('Blair', 0.000686529), + ('Cross', 0.00068652), + ('Simon', 0.000683824), + ('Dennis', 0.000683322), + ('Oconnor', 0.000683066), + ('Quinn', 0.00068101), + ('Gross', 0.000678762), + ('Navarro', 0.000675884), + ('Moss', 0.000673874), + ('Fitzgerald', 0.000671791), + ('Doyle', 0.000671754), + ('Mclaughlin', 0.000668191), + ('Rojas', 0.00066767), + ('Rodgers', 0.000667213), + ('Stevenson', 0.000666034), + ('Singh', 0.00066375), + ('Yang', 0.000663613), + ('Figueroa', 0.000662754), + ('Harmon', 0.000661667), + ('Newton', 0.000660881), + ('Paul', 0.00066015), + ('Manning', 0.000658514), + ('Garner', 0.000658359), + ('Mcgee', 0.000657198), + ('Reese', 0.000655636), + ('Francis', 0.000655353), + ('Burgess', 0.000654265), + ('Adkins', 0.000653571), + ('Goodman', 0.000653151), + ('Curry', 0.00065189), + ('Brady', 0.000650345), + ('Christensen', 0.000650062), + ('Potter', 0.000649688), + ('Walton', 0.000648719), + ('Goodwin', 0.000642652), + ('Mullins', 0.000642222), + ('Molina', 0.000641537), + ('Webster', 0.000640733), + ('Fischer', 0.000640477), + ('Campos', 0.000639152), + ('Avila', 0.000638175), + ('Sherman', 0.000638147), + ('Todd', 0.000637873), + ('Chang', 0.00063738), + ('Blake', 0.000633021), + ('Malone', 0.00063282), + ('Wolf', 0.000629604), + ('Hodges', 0.000629266), + ('Juarez', 0.000628507), + ('Gill', 0.000627722), + ('Farmer', 0.000624158), + ('Hines', 0.00062266), + ('Gallagher', 0.00062202), + ('Duran', 0.000621755), + ('Hubbard', 0.000621527), + ('Cannon', 0.000620631), + ('Miranda', 0.0006181), + ('Wang', 0.000617406), + ('Saunders', 0.000614116), + ('Tate', 0.000614098), + ('Mack', 0.000613604), + ('Hammond', 0.000612773), + ('Carrillo', 0.000612691), + ('Townsend', 0.000610854), + ('Wise', 0.000609803), + ('Ingram', 0.000609136), + ('Barton', 0.000608743), + ('Mejia', 0.000607939), + ('Ayala', 0.000607766), + ('Schroeder', 0.000606825), + ('Hampton', 0.000606514), + ('Rowe', 0.000604933), + ('Parsons', 0.000604915), + ('Frank', 0.000602311), + ('Waters', 0.000601388), + ('Strickland', 0.000601361), + ('Osborne', 0.000601251), + ('Maxwell', 0.000601041), + ('Chan', 0.000600493), + ('Deleon', 0.000599387), + ('Norman', 0.000596381), + ('Harrington', 0.00059512), + ('Casey', 0.000592232), + ('Patton', 0.00059184), + ('Logan', 0.000590049), + ('Bowers', 0.000589318), + ('Mueller', 0.000587572), + ('Glover', 0.00058643), + ('Floyd', 0.000586074), + ('Hartman', 0.000583205), + ('Buchanan', 0.000583187), + ('Cobb', 0.000582401), + ('French', 0.00057701), + ('Kramer', 0.000575858), + ('Mccormick', 0.000572569), + ('Clarke', 0.0005715), + ('Tyler', 0.00057139), + ('Gibbs', 0.000571208), + ('Moody', 0.000569654), + ('Conner', 0.000569572), + ('Sparks', 0.000568649), + ('Mcguire', 0.000567571), + ('Leon', 0.000566822), + ('Bauer', 0.000566319), + ('Norton', 0.000564729), + ('Pope', 0.000564227), + ('Flynn', 0.000564199), + ('Hogan', 0.000563322), + ('Robles', 0.00056303), + ('Salinas', 0.000562692), + ('Yates', 0.000561029), + ('Lindsey', 0.000559192), + ('Lloyd', 0.000558781), + ('Marsh', 0.000557365), + ('Mcbride', 0.000556222), + ('Owen', 0.000552449), + ('Solis', 0.000548648), + ('Pham', 0.00054777), + ('Lang', 0.000546802), + ('Pratt', 0.000546418), + ('Lara', 0.000545779), + ('Brock', 0.000545331), + ('Ballard', 0.00054513), + ('Trujillo', 0.000544664), + ('Shaffer', 0.000541173), + ('Drake', 0.000539602), + ('Roman', 0.000539282), + ('Aguirre', 0.00053835), + ('Morton', 0.000537162), + ('Stokes', 0.000536239), + ('Lamb', 0.000535033), + ('Pacheco', 0.000534841), + ('Patrick', 0.00053231), + ('Cochran', 0.000532091), + ('Shepherd', 0.000529368), + ('Cain', 0.000528801), + ('Burnett', 0.000528674), + ('Hess', 0.000528335), + ('Li', 0.000528007), + ('Cervantes', 0.000527084), + ('Olsen', 0.000524087), + ('Briggs', 0.000523538), + ('Ochoa', 0.000522743), + ('Cabrera', 0.000522387), + ('Velasquez', 0.000522314), + ('Montoya', 0.00052151), + ('Roth', 0.000521099), + ('Meyers', 0.000518485), + ('Cardenas', 0.000517334), + ('Fuentes', 0.000515717), + ('Weiss', 0.000513085), + ('Wilkins', 0.000512309), + ('Hoover', 0.000512309), + ('Nicholson', 0.000511559), + ('Underwood', 0.000511441), + ('Short', 0.000510801), + ('Carson', 0.000510052), + ('Morrow', 0.000508617), + ('Colon', 0.000507228), + ('Holloway', 0.000506808), + ('Summers', 0.000506123), + ('Bryan', 0.000505008), + ('Petersen', 0.00050424), + ('Mckenzie', 0.000503318), + ('Serrano', 0.000503071), + ('Wilcox', 0.000502431), + ('Carey', 0.000501856), + ('Clayton', 0.000501408), + ('Poole', 0.000499864), + ('Calderon', 0.000499727), + ('Gallegos', 0.000499553), + ('Greer', 0.000498996), + ('Rivas', 0.000498786), + ('Guerra', 0.000498667), + ('Decker', 0.000497525), + ('Collier', 0.000497196), + ('Wall', 0.000497077), + ('Whitaker', 0.000496547), + ('Bass', 0.000496117), + ('Flowers', 0.000495944), + ('Davenport', 0.000495295), + ('Conley', 0.000495185), + ('Houston', 0.00049365), + ('Huff', 0.000492426), + ('Copeland', 0.00049132), + ('Hood', 0.00049101), + ('Monroe', 0.000488616), + ('Massey', 0.00048847), + ('Roberson', 0.000486085), + ('Combs', 0.00048592), + ('Franco', 0.000485747), + ('Larsen', 0.000483937), + ('Pittman', 0.000481434), + ('Randall', 0.000479661), + ('Skinner', 0.000479616), + ('Wilkinson', 0.000479552), + ('Kirby', 0.00047946), + ('Cameron', 0.00047915), + ('Bridges', 0.000477514), + ('Anthony', 0.000476472), + ('Richard', 0.000476399), + ('Kirk', 0.00047565), + ('Bruce', 0.000475175), + ('Singleton', 0.000473283), + ('Mathis', 0.000473274), + ('Bradford', 0.000472635), + ('Boone', 0.000472205), + ('Abbott', 0.000471666), + ('Charles', 0.000470734), + ('Allison', 0.000470606), + ('Sweeney', 0.00047057), + ('Atkinson', 0.000470469), + ('Horn', 0.000469473), + ('Jefferson', 0.0004693), + ('Rosales', 0.000469071), + ('York', 0.000469053), + ('Christian', 0.000467618), + ('Phelps', 0.000467408), + ('Farrell', 0.000466869), + ('Castaneda', 0.000466814), + ('Nash', 0.000466193), + ('Dickerson', 0.000466156), + ('Bond', 0.000465818), + ('Wyatt', 0.00046485), + ('Foley', 0.000464649), + ('Chase', 0.000463963), + ('Gates', 0.000463698), + ('Vincent', 0.000462602), + ('Mathews', 0.000462419), + ('Hodge', 0.000462136), + ('Garrison', 0.000461268), + ('Trevino', 0.000461012), + ('Villarreal', 0.000460071), + ('Heath', 0.000459669), + ('Dalton', 0.00045838), + ('Valencia', 0.000457101), + ('Callahan', 0.000456178), + ('Hensley', 0.000455566), + ('Atkins', 0.000454616), + ('Huffman', 0.000454461), + ('Roy', 0.000454351), + ('Boyer', 0.000453218), + ('Shields', 0.000452807), + ('Lin', 0.000451016), + ('Hancock', 0.000450742), + ('Grimes', 0.000449965), + ('Glenn', 0.000449929), + ('Cline', 0.000449252), + ('Delacruz', 0.00044917), + ('Camacho', 0.000447726), + ('Dillon', 0.0004462), + ('Parrish', 0.000446109), + ('Oneill', 0.000444583), + ('Melton', 0.000444017), + ('Booth', 0.000443889), + ('Kane', 0.000443404), + ('Berg', 0.000442975), + ('Harrell', 0.000442893), + ('Pitts', 0.000442811), + ('Savage', 0.000441943), + ('Wiggins', 0.000441833), + ('Brennan', 0.000441294), + ('Salas', 0.000441166), + ('Marks', 0.000441157), + ('Russo', 0.00043974), + ('Sawyer', 0.000438397), + ('Baxter', 0.000437283), + ('Golden', 0.000437118), + ('Hutchinson', 0.000436844), + ('Liu', 0.000435528), + ('Walter', 0.000435071), + ('Mcdowell', 0.000434258), + ('Wiley', 0.000434048), + ('Rich', 0.00043381), + ('Humphrey', 0.000433746), + ('Johns', 0.000432093), + ('Koch', 0.000432065), + ('Suarez', 0.000431599), + ('Hobbs', 0.000431462), + ('Beard', 0.000430621), + ('Gilmore', 0.000429909), + ('Ibarra', 0.000428492), + ('Keith', 0.00042714), + ('Macias', 0.000427067), + ('Khan', 0.000426829), + ('Andrade', 0.000426729), + ('Ware', 0.000426546), + ('Stephenson', 0.000426363), + ('Henson', 0.000425879), + ('Wilkerson', 0.000425843), + ('Dyer', 0.000425559), + ('Mcclure', 0.000424929), + ('Blackwell', 0.000424838), + ('Mercado', 0.000424308), + ('Tanner', 0.000424079), + ('Eaton', 0.000423997), + ('Clay', 0.000422727), + ('Barron', 0.000422106), + ('Beasley', 0.00042195), + ('Oneal', 0.000421786), + ('Small', 0.000418944), + ('Preston', 0.000418944), + ('Wu', 0.000418624), + ('Zamora', 0.000418542), + ('Macdonald', 0.000418323), + ('Vance', 0.000418149), + ('Snow', 0.000417473), + ('Mcclain', 0.000416294), + ('Stafford', 0.000414366), + ('Orozco', 0.000413818), + ('Barry', 0.000411579), + ('English', 0.00041147), + ('Shannon', 0.000410282), + ('Kline', 0.000410264), + ('Jacobson', 0.000410026), + ('Woodard', 0.000409624), + ('Huang', 0.000408573), + ('Kemp', 0.000408445), + ('Mosley', 0.000408418), + ('Prince', 0.000407888), + ('Merritt', 0.00040776), + ('Hurst', 0.000407404), + ('Villanueva', 0.000407248), + ('Roach', 0.000406188), + ('Nolan', 0.000405887), + ('Lam', 0.000405558), + ('Yoder', 0.000404279), + ('Mccullough', 0.000403164), + ('Lester', 0.0004013), + ('Santana', 0.000400898), + ('Valenzuela', 0.000399938), + ('Winters', 0.000399865), + ('Barrera', 0.000399482), + ('Orr', 0.000398988), + ('Leach', 0.000398988), + ('Berger', 0.000397983), + ('Mckee', 0.000397974), + ('Strong', 0.000396832), + ('Conway', 0.000396512), + ('Stein', 0.000395927), + ('Whitehead', 0.000395735), + ('Bullock', 0.000393095), + ('Escobar', 0.000392492), + ('Knox', 0.000392327), + ('Meadows', 0.000391843), + ('Solomon', 0.000391432), + ('Velez', 0.000391258), + ('Odonnell', 0.000391094), + ('Kerr', 0.000390692), + ('Stout', 0.000389878), + ('Blankenship', 0.000389824), + ('Browning', 0.000389632), + ('Kent', 0.00038922), + ('Lozano', 0.000388946), + ('Bartlett', 0.000388444), + ('Pruitt', 0.000387996), + ('Buck', 0.000387795), + ('Barr', 0.000387713), + ('Gaines', 0.000387137), + ('Durham', 0.000387101), + ('Gentry', 0.000387028), + ('Mcintyre', 0.000386826), + ('Sloan', 0.000386333), + ('Rocha', 0.000385036), + ('Melendez', 0.000385036), + ('Herman', 0.000384597), + ('Sexton', 0.000384496), + ('Moon', 0.000384332), + ('Hendricks', 0.00038266), + ('Rangel', 0.000382559), + ('Stark', 0.000382514), + ('Lowery', 0.00038075), + ('Hardin', 0.000380695), + ('Hull', 0.000380622), + ('Sellers', 0.000379754), + ('Ellison', 0.000378822), + ('Calhoun', 0.000378758), + ('Gillespie', 0.000378219), + ('Mora', 0.000377808), + ('Knapp', 0.000377068), + ('Mccall', 0.000376739), + ('Morse', 0.000375652), + ('Dorsey', 0.000375579), + ('Weeks', 0.000375113), + ('Nielsen', 0.000374692), + ('Livingston', 0.000374299), + ('Leblanc', 0.000373925), + ('Mclean', 0.00037345), + ('Bradshaw', 0.000372746), + ('Glass', 0.000372106), + ('Middleton', 0.00037196), + ('Buckley', 0.000371942), + ('Schaefer', 0.000371549), + ('Frost', 0.000370809), + ('Howe', 0.000370562), + ('House', 0.000369849), + ('Mcintosh', 0.00036963), + ('Ho', 0.000369265), + ('Pennington', 0.000368588), + ('Reilly', 0.000368324), + ('Hebert', 0.000368077), + ('Mcfarland', 0.00036772), + ('Hickman', 0.000367538), + ('Noble', 0.000367474), + ('Spears', 0.000367346), + ('Conrad', 0.000366423), + ('Arias', 0.000366277), + ('Galvan', 0.000365911), + ('Velazquez', 0.000365765), + ('Huynh', 0.000365591), + ('Frederick', 0.000364659), + ('Randolph', 0.000363134), + ('Cantu', 0.000361845), + ('Fitzpatrick', 0.000360931), + ('Mahoney', 0.000360374), + ('Peck', 0.000360301), + ('Villa', 0.000360027), + ('Michael', 0.000359725), + ('Donovan', 0.000358821), + ('Mcconnell', 0.000358209), + ('Walls', 0.00035787), + ('Boyle', 0.000357642), + ('Mayer', 0.000357368), + ('Zuniga', 0.000356875), + ('Giles', 0.000356372), + ('Pineda', 0.000356345), + ('Pace', 0.000356125), + ('Hurley', 0.000356089), + ('Mays', 0.000355568), + ('Mcmillan', 0.000355403), + ('Crosby', 0.000354928), + ('Ayers', 0.000354855), + ('Case', 0.000354152), + ('Bentley', 0.00035374), + ('Shepard', 0.000353658), + ('Everett', 0.000353631), + ('Pugh', 0.00035353), + ('David', 0.000353238), + ('Mcmahon', 0.000352306), + ('Dunlap', 0.000351931), + ('Bender', 0.000351456), + ('Hahn', 0.000350451), + ('Harding', 0.000350323), + ('Acevedo', 0.000349336), + ('Raymond', 0.00034866), + ('Blackburn', 0.000348468), + ('Duffy', 0.000346869), + ('Landry', 0.00034686), + ('Dougherty', 0.00034633), + ('Bautista', 0.000345818), + ('Shah', 0.00034569), + ('Potts', 0.000344356), + ('Arroyo', 0.000344274), + ('Valentine', 0.000344192), + ('Meza', 0.000344128), + ('Gould', 0.00034411), + ('Vaughan', 0.000343479), + ('Fry', 0.000343032), + ('Rush', 0.000342374), + ('Avery', 0.0003421), + ('Herring', 0.000341305), + ('Dodson', 0.000340802), + ('Clements', 0.000340245), + ('Sampson', 0.000340217), + ('Tapia', 0.000339916), + ('Bean', 0.000339404), + ('Lynn', 0.000339221), + ('Crane', 0.000339203), + ('Farley', 0.000339139), + ('Cisneros', 0.000338536), + ('Benton', 0.000338372), + ('Ashley', 0.000338271), + ('Mckay', 0.000337604), + ('Finley', 0.000336928), + ('Best', 0.000336818), + ('Blevins', 0.000336626), + ('Friedman', 0.000336553), + ('Moses', 0.00033638), + ('Sosa', 0.00033637), + ('Blanchard', 0.000335923), + ('Huber', 0.000335603), + ('Frye', 0.000335484), + ('Krueger', 0.000335283), + ('Bernard', 0.000333931), + ('Rosario', 0.000333867), + ('Rubio', 0.000333794), + ('Mullen', 0.000332981), + ('Benjamin', 0.000332953), + ('Haley', 0.000332898), + ('Chung', 0.000332798), + ('Moyer', 0.000332789), + ('Choi', 0.000332505), + ('Horne', 0.000331573), + ('Yu', 0.000331546), + ('Woodward', 0.000331153), + ('Ali', 0.000329664), + ('Nixon', 0.00032928), + ('Hayden', 0.000329161), + ('Rivers', 0.000328759), + ('Estes', 0.000327471), + ('Mccarty', 0.000326365), + ('Richmond', 0.000326338), + ('Stuart', 0.00032621), + ('Maynard', 0.000325726), + ('Brandt', 0.000325433), + ('Oconnell', 0.000325378), + ('Hanna', 0.000325278), + ('Sanford', 0.000324967), + ('Sheppard', 0.000324867), + ('Church', 0.00032473), + ('Burch', 0.000324565), + ('Levy', 0.000324044), + ('Rasmussen', 0.000323944), + ('Coffey', 0.000323843), + ('Ponce', 0.000323459), + ('Faulkner', 0.000323359), + ('Donaldson', 0.000323341), + ('Schmitt', 0.000322783), + ('Novak', 0.000322381), + ('Costa', 0.000321879), + ('Montes', 0.000321595), + ('Booker', 0.000320727), + ('Cordova', 0.000320481), + ('Waller', 0.000319814), + ('Arellano', 0.000319795), + ('Maddox', 0.00031953), + ('Mata', 0.000318781), + ('Bonilla', 0.000318196), + ('Stanton', 0.000318087), + ('Compton', 0.000317867), + ('Kaufman', 0.000317849), + ('Dudley', 0.000317703), + ('Mcpherson', 0.000317639), + ('Beltran', 0.000317392), + ('Dickson', 0.000317045), + ('Mccann', 0.00031699), + ('Villegas', 0.000316917), + ('Proctor', 0.000316899), + ('Hester', 0.000316835), + ('Cantrell', 0.000316826), + ('Daugherty', 0.000316607), + ('Cherry', 0.000316287), + ('Bray', 0.000315921), + ('Davila', 0.000315611), + ('Rowland', 0.000315218), + ('Madden', 0.00031498), + ('Levine', 0.00031498), + ('Spence', 0.000314642), + ('Good', 0.000314596), + ('Irwin', 0.000314085), + ('Werner', 0.000313884), + ('Krause', 0.00031382), + ('Petty', 0.000313207), + ('Whitney', 0.000312961), + ('Baird', 0.000312796), + ('Hooper', 0.000311435), + ('Pollard', 0.000311389), + ('Zavala', 0.000311289), + ('Jarvis', 0.000311124), + ('Holden', 0.000311042), + ('Hendrix', 0.00031096), + ('Haas', 0.00031096), + ('Mcgrath', 0.000310951), + ('Bird', 0.00031032), + ('Lucero', 0.000309955), + ('Terrell', 0.000309882), + ('Riggs', 0.000309461), + ('Joyce', 0.000309233), + ('Rollins', 0.000308812), + ('Mercer', 0.000308812), + ('Galloway', 0.000308593), + ('Duke', 0.000308337), + ('Odom', 0.000308081), + ('Andersen', 0.000306172), + ('Downs', 0.000306044), + ('Hatfield', 0.00030577), + ('Benitez', 0.00030556), + ('Archer', 0.000305285), + ('Huerta', 0.00030471), + ('Travis', 0.000304628), + ('Mcneil', 0.000303714), + ('Hinton', 0.00030344), + ('Zhang', 0.000303376), + ('Hays', 0.000303303), + ('Mayo', 0.000302681), + ('Fritz', 0.000302151), + ('Branch', 0.000301896), + ('Mooney', 0.000301101), + ('Ewing', 0.000300845), + ('Ritter', 0.000300287), + ('Esparza', 0.000299447), + ('Frey', 0.000299109), + ('Braun', 0.00029857), + ('Gay', 0.000298533), + ('Riddle', 0.000298369), + ('Haney', 0.000298277), + ('Kaiser', 0.000297574), + ('Holder', 0.000296651), + ('Chaney', 0.000296349), + ('Mcknight', 0.00029592), + ('Gamble', 0.000295838), + ('Vang', 0.000295435), + ('Cooley', 0.000295015), + ('Carney', 0.000294969), + ('Cowan', 0.000294604), + ('Forbes', 0.000294476), + ('Ferrell', 0.000293983), + ('Davies', 0.0002939), + ('Barajas', 0.000293736), + ('Shea', 0.000293023), + ('Osborn', 0.000292795), + ('Bright', 0.000292777), + ('Cuevas', 0.00029253), + ('Bolton', 0.000292347), + ('Murillo', 0.000292064), + ('Lutz', 0.000291845), + ('Duarte', 0.000291442), + ('Kidd', 0.000291351), + ('Key', 0.000291315), + ('Cooke', 0.000291114), + )) + + prefixes_female = OrderedDict(( + ('Mrs.', 0.5), + ('Ms.', 0.1), + ('Miss', 0.1), + ('Dr.', 0.3), + )) + prefixes_male = OrderedDict(( + ('Mr.', 0.7), + ('Dr.', 0.3), + )) + + suffixes_female = OrderedDict(( + ('MD', 0.5), + ('DDS', 0.3), + ('PhD', 0.1), + ('DVM', 0.2), + )) + + # Removed Sr and I as they'd almost never be part of legal names. + suffixes_male = OrderedDict(( + ('Jr.', 0.2), + ('II', 0.05), + ('III', 0.03), + ('IV', 0.015), + ('V', 0.005), + ('MD', 0.3), + ('DDS', 0.2), + ('PhD', 0.1), + ('DVM', 0.1), + )) diff --git a/src/faker/providers/es_ES/person.py b/src/libs/faker/providers/person/es_ES/__init__.py similarity index 74% rename from src/faker/providers/es_ES/person.py rename to src/libs/faker/providers/person/es_ES/__init__.py index 2415445..8b41c84 100644 --- a/src/faker/providers/es_ES/person.py +++ b/src/libs/faker/providers/person/es_ES/__init__.py @@ -1,71 +1,68 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): - formats = ( - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{prefix}} {{last_name}}', - '{{first_name}} {{last_name}}-{{last_name}}', - '{{first_name}} {{first_name}} {{last_name}} {{last_name}}', + formats_male = ( + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{prefix}} {{last_name}}', + '{{first_name_male}} {{last_name}}-{{last_name}}', + '{{first_name_male}} {{first_name_male}} {{last_name}} {{last_name}}', ) - first_names = ( - 'Aaron', 'Abel', 'Abraham', 'Abram', 'Abril', 'Ada', 'Adam', - 'Adria', 'Adrian', 'Adriana', 'Adrián', 'Adán', 'Africa', 'Aina', - 'Ainara', 'Ainhoa', 'Aitana', 'Aitor', 'Alan', 'Alana', 'Alba', - 'Alberto', 'Aleix', 'Alejandra', 'Alejandro', 'Alex', 'Alexa', 'Alexandra', - 'Alexandría', 'Alexia', 'Alexis', 'Alfredo', 'Alicia', 'Alina', 'Alma', - 'Alonso', 'Alonzo', 'Alvaro', 'Amanda', 'Amaya', 'Amelia', 'América', - 'Ana', 'Ander', 'Andrea', 'Andres', 'Andrés', 'Ane', 'Angel', - 'Angela', 'Angelina', 'Angélica', 'Anna', 'Antonio', 'Ariadna', 'Ariana', - 'Arlet', 'Armando', 'Arnau', 'Aroa', 'Arturo', 'Asia', 'Asier', - 'Aurora', 'Aya', 'Benjamín', 'Berta', 'Biel', 'Blanca', 'Brenda', - 'Bruno', 'Camila', 'Candela', 'Carla', 'Carlos', 'Carlota', 'Carmen', - 'Carolina', 'Cecilia', 'Celeste', 'Celia', 'Cesar', 'Chloe', 'Clara', - 'Claudia', 'Cristian', 'Cristina', 'César', 'Daniel', 'Daniela', 'Daniella', - 'Dario', 'David', 'Diana', 'Diego', 'Dulce', 'Eduardo', 'Elena', - 'Eliana', 'Elisa', 'Elsa', 'Elías', 'Emanuel', 'Emilia', 'Emiliano', - 'Emilio', 'Emma', 'Enrique', 'Eric', 'Erik', 'Erika', 'Ernesto', - 'Esmeralda', 'Esteban', 'Estrella', 'Eva', 'Ezequiel', 'Fabián', 'Felipe', - 'Fernanda', 'Fernando', 'Francisco', 'Francisco javier', 'Fátima', 'Gabriel', 'Gabriela', - 'Gael', 'Gerard', 'Gerardo', 'Gloria', 'Gonzalo', 'Guadalupe', 'Guillem', - 'Guillermo', 'Gustavo', 'Hector', 'Helena', 'Hugo', 'Héctor', 'Ian', - 'Ignacio', 'Iker', 'Ines', 'Irati', 'Irene', 'Iria', 'Iris', - 'Isaac', 'Isabel', 'Isabela', 'Isabella', 'Ismael', 'Israel', 'Ivan', - 'Iván', 'Izan', 'Jaime', 'JairoJavier', 'Jan', 'Jana', 'Javier', - 'Jazmín', 'Jesus', 'Jesús', 'Jimena', 'Joan', 'Joaquín', 'Joel', - 'Jon', 'Jordi', 'Jorge', 'Jose', 'Jose antonio', 'Jose manuel', 'Josué', - 'José', 'Juan', 'Judith', 'Julia', 'Juliana', 'Julio', 'Julián', - 'Laia', 'Lara', 'Laura', 'Leila', 'Leire', 'Leo', 'Leonardo', - 'Leyre', 'Lidia', 'Lila', 'Lilian', 'Liliana', 'Linda', 'Lola', - 'Lorenzo', 'Lucas', 'Lucia', 'Lucián', 'Lucía', 'Luis', 'Luna', - 'Lía', 'Malak', 'Manuel', 'Manuela', 'Mar', 'Mara', 'Marc', - 'Marco', 'Marcos', 'Maria', 'Mariana', 'Marina', 'Mario', 'Marisol', - 'Marta', 'Marti', 'Martin', 'Martina', 'Martín', 'María', 'Mateo', - 'Matías', 'Mauricio', 'Max', 'Maximiliano', 'Maya', 'Melina', 'Mercedes', - 'Miguel', 'Miguel angel', 'Mikel', 'Miranda', 'Mireia', 'Miriam', 'Mohamed', - 'Mónica', 'Nadia', 'Nahia', 'Naia', 'Naiara', 'Natalia', 'Nayara', - 'Nerea', 'Nicolas', 'Nicolás', 'Nil', 'Noa', 'Noelia', 'Nora', - 'Noé', 'Nuria', 'Oliver', 'Olivia', 'Omar', 'Ona', 'Oriol', - 'Orlando', 'Oscar', 'Pablo', 'Paola', 'Patricia', 'Pau', 'Paula', - 'Paúl', 'Pedro', 'Penélope', 'Perla', 'Pol', 'Rafael', 'Ramón', - 'Raquel', 'Raul', 'Rayan', 'Raúl', 'Regina', 'Ricardo', 'Roberto', - 'Rocio', 'Rodrigo', 'Román', 'Rosa', 'Ruben', 'Rubén', 'Salma', - 'Salvador', 'Samuel', 'Sandra', 'Santiago', 'Sara', 'Saul', 'Saúl', - 'Sebastián', 'Selena', 'Serena', 'Sergio', 'Silvia', 'Simón', 'Sofia', - 'Sofía', 'Talía', 'Tatiana', 'Tobías', 'Tomás', 'Unai', 'Valentina', - 'Valeria', 'Vega', 'Vera', 'Verónica', 'Victor', 'Victoria', 'Virginia', - 'Vivian', 'Viviana', 'Víctor', 'Xavier', 'Ximena', 'Yago', 'Yeray', + formats_female = ( + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{prefix}} {{last_name}}', + '{{first_name_female}} {{last_name}}-{{last_name}}', + '{{first_name_female}} {{first_name_female}} {{last_name}} {{last_name}}', ) + formats = formats_male + formats_female + + first_names_male = ( + 'Antonio', 'Jose', 'Manuel', 'Francisco', 'Juan', 'David', 'Jose Antonio', 'Jose Luis', + 'Javier', 'Jesús', 'Francisco Javier', 'Daniel', 'Carlos', 'Miguel', 'Rafael', 'Jose Manuel', + 'Alejandro', 'Pedro', 'Ángel', 'Miguel Ángel', 'Jose Maria', 'Fernando', 'Luís', 'Pablo', + 'Sergio', 'Jorge', 'Alberto', 'Juan Carlos', 'Juan José', 'Diego', 'Alvaro', 'Adrián', + 'Juan Antonio', 'Enrique', 'Raul', 'Ramon', 'Vicente', 'Ivan', 'Ruben', 'Andrés', + 'Joaquin', 'Óscar', 'Juan Manuel', 'Santiago', 'Eduardo', 'Victor', 'Roberto', 'Jaime', + 'Francisco Jose', 'Ignacio', 'Mario', 'Alfonso', 'Salvador', 'Ricardo', 'Jordi', 'Marcos', + 'Emilio', 'Julian', 'Julio', 'Guillermo', 'Tomás', 'Gabriel', 'Agustín', 'Jose Miguel', + 'Felix', 'Jose Ramon', 'Gonzalo', 'Marc', 'Mohamed', 'Joan', 'Hugo', 'Ismael', 'Cristian', + 'Nicolás', 'Mariano', 'Josep', 'Domingo', 'Samuel', 'Juan Francisco', 'Alfredo', 'Sebastian', + 'Aitor', 'Jose Carlos', 'Martin', 'Felipe', 'Cesar', 'Hector', 'Jose Angel', 'Jose Ignacio', + 'Victor Manuel', 'Gregorio', 'Luis Miguel', 'Iker', 'Jose Francisco', 'Juan Luis', 'Albert', + 'Lorenzo', 'Alex', 'Xavier', 'Rodrigo' + ) + + first_names_female = ( + 'María', 'Carmen', 'Ana', 'Isabel', 'Dolores', 'Pilar', 'Josefa', 'Teresa', 'Rosa', 'Cristina', + 'Ángeles', 'Antonia', 'Laura', 'Francisca', 'Elena', 'Mercedes', 'Luisa', 'Marta', 'Concepción', + 'Rosario', 'Lucía', 'Juana', 'Manuela', 'Sara', 'Paula', 'Raquel', 'Beatriz', 'Eva', 'Patricia', + 'Victoria', 'Rocio', 'Encarnacion', 'Julia', 'Belen', 'Silvia', 'Esther', 'Andrea', 'Montserrat', + 'Nuria', 'Angela', 'Irene', 'Inmaculada', 'Mónica', 'Sandra', 'Margarita', 'Yolanda', 'Alba', + 'Sonia', 'Alicia', 'Mar', 'Susana', 'Marina', 'Amparo', 'Natalia', 'Nieves', 'Gloria', 'Claudia', + 'Soledad', 'Ines', 'Lourdes', 'Verónica', 'Carolina', 'Luz', 'Consuelo', 'Noelia', 'Asunción', + 'Lorena', 'Sofia', 'Milagros', 'Catalina', 'Esperanza', 'Olga', 'Alejandra', 'Carla', 'Emilia', + 'Fátima', 'Aurora', 'Blanca', 'Magdalena', 'Miriam', 'Lidia', 'Nerea', 'Clara', 'Daniela', + 'Anna', 'Celia', 'Elisa', 'Eugenia', 'Josefina', 'Virginia', 'Purificación', 'Vanesa', + 'Remedios', 'Trinidad', 'Gema', 'Adriana', 'Vicenta', 'Mireia', 'Begoña' + ) + + first_names = first_names_male + first_names_female last_names = ( 'Abad', 'Abascal', 'Abella', 'Abellán', 'Abril', 'Acedo', 'Acero', @@ -226,7 +223,3 @@ class Provider(PersonProvider): ) prefixes = ('de', 'del') - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) \ No newline at end of file diff --git a/src/faker/providers/es_MX/person.py b/src/libs/faker/providers/person/es_MX/__init__.py similarity index 98% rename from src/faker/providers/es_MX/person.py rename to src/libs/faker/providers/person/es_MX/__init__.py index 21e6bb7..e499cd9 100644 --- a/src/faker/providers/es_MX/person.py +++ b/src/libs/faker/providers/person/es_MX/__init__.py @@ -1,6 +1,6 @@ # -*- encoding: utf-8 -*- from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -173,8 +173,3 @@ class Provider(PersonProvider): prefixes = ('Sr(a).', 'Dr.', 'Mtro.', 'Lic.' , 'Ing.') - - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) \ No newline at end of file diff --git a/src/libs/faker/providers/person/et_EE/__init__.py b/src/libs/faker/providers/person/et_EE/__init__.py new file mode 100644 index 0000000..8cdb5aa --- /dev/null +++ b/src/libs/faker/providers/person/et_EE/__init__.py @@ -0,0 +1,182 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + # https://en.wikipedia.org/wiki/Demographics_of_Estonia#Ethnic_groups + # Main population groups in Estonia are Estonians and ethnic Russians: + # About 70% of the population are Estonians and about 25% are Russians + est_rat = 0.7 + rus_rat = 1.0 - est_rat + formats = {'{{first_name_est}} {{last_name_est}}': est_rat, + '{{first_name_rus}} {{last_name_rus}}': rus_rat} + + formats_male = {'{{first_name_male_est}} {{last_name_est}}': est_rat, + '{{first_name_male_rus}} {{last_name_rus}}': rus_rat} + formats_female = {'{{first_name_female_est}} {{last_name_est}}': est_rat, + '{{first_name_female_rus}} {{last_name_rus}}': rus_rat} + + prefixes_neutral = ('doktor', 'dr', 'prof') + prefixes_male = ('härra', 'hr') + prefixes_neutral + prefixes_female = ('proua', 'pr') + prefixes_neutral + prefixes = set(prefixes_male + prefixes_female) + + suffixes = ('PhD', 'MSc', 'BSc') + + # source: http://www.stat.ee/public/apps/nimed/TOP + # TOP 50 male names in 2017 according to the Statistics Estonia + first_names_male_est = ('Aivar', 'Aleksander', 'Alexander', 'Andres', + 'Andrus', 'Ants', 'Indrek', 'Jaan', 'Jaanus', + 'Jüri', 'Kristjan', 'Marek', 'Margus', 'Marko', + 'Martin', 'Mati', 'Meelis', 'Mihkel', 'Peeter', + 'Priit', 'Raivo', 'Rein', 'Sander', 'Siim', 'Tarmo', + 'Tiit', 'Toomas', 'Tõnu', 'Urmas', 'Vello') + + first_names_female_est = ('Aino', 'Anna', 'Anne', 'Anneli', 'Anu', 'Diana', + 'Ene', 'Eve', 'Kadri', 'Katrin', 'Kristi', + 'Kristiina', 'Kristina', 'Laura', 'Linda', 'Maie', + 'Malle', 'Mare', 'Maria', 'Marika', 'Merike', + 'Niina', 'Piret', 'Reet', 'Riina', 'Sirje', + 'Tiina', 'Tiiu', 'Triin', 'Ülle') + + first_names_est = first_names_male_est + first_names_female_est + + first_names_male_rus = ('Aleksander', 'Aleksandr', 'Aleksei', 'Alexander', + 'Andrei', 'Artur', 'Dmitri', 'Igor', 'Ivan', + 'Jevgeni', 'Juri', 'Maksim', 'Mihhail', 'Nikolai', + 'Oleg', 'Pavel', 'Roman', 'Sergei', 'Sergey', + 'Valeri', 'Viktor', 'Vladimir') + + first_names_female_rus = ('Aleksandra', 'Anna', 'Diana', 'Elena', 'Galina', + 'Irina', 'Jekaterina', 'Jelena', 'Julia', + 'Kristina', 'Ljubov', 'Ljudmila', 'Maria', + 'Marina', 'Nadežda', 'Natalia', 'Natalja', 'Nina', + 'Olga', 'Svetlana', 'Tamara', 'Tatiana', + 'Tatjana', 'Valentina', 'Viktoria') + + first_names_rus = first_names_male_rus + first_names_female_rus + + first_names_male = set(first_names_male_est + first_names_male_rus) + first_names_female = set(first_names_female_est + first_names_female_rus) + first_names = first_names_male | first_names_female + + # http://ekspress.delfi.ee/kuum/\ + # top-500-eesti-koige-levinumad-perekonnanimed?id=27677149 + last_names_est = ('Aas', 'Aasa', 'Aasmäe', 'Aavik', 'Abel', 'Adamson', + 'Ader', 'Alas', 'Allas', 'Allik', 'Anderson', 'Annus', + 'Anton', 'Arro', 'Aru', 'Arula', 'Aun', 'Aus', 'Eller', + 'Erik', 'Erm', 'Ernits', 'Gross', 'Hallik', 'Hansen', + 'Hanson', 'Hein', 'Heinsalu', 'Heinsoo', 'Holm', 'Hunt', + 'Härm', 'Ilves', 'Ivask','Jaakson', 'Jaanson', 'Jaanus', + 'Jakobson', 'Jalakas', 'Johanson', 'Juhanson', 'Juhkam', + 'Jänes', 'Järv', 'Järve', 'Jõe', 'Jõesaar', 'Jõgi', + 'Jürgens', 'Jürgenson', 'Jürisson', 'Kaasik', 'Kadak', + 'Kala', 'Kalamees', 'Kalda', 'Kaljula', 'Kaljurand', + 'Kaljuste', 'Kaljuvee', 'Kallas', 'Kallaste', 'Kalm', + 'Kalmus', 'Kangro', 'Kangur', 'Kapp', 'Karro', 'Karu', + 'Kasak', 'Kase', 'Kasemaa', 'Kasemets', 'Kask', 'Kass', + 'Kattai', 'Kaur', 'Kelder', 'Kesküla', 'Kiik', 'Kiil', + 'Kiis', 'Kiisk', 'Kikas', 'Kikkas', 'Kilk', 'Kink', + 'Kirs', 'Kirsipuu', 'Kirss', 'Kivi', 'Kivilo', 'Kivimäe', + 'Kivistik', 'Klaas', 'Klein', 'Koger', 'Kohv', 'Koit', + 'Koitla', 'Kokk', 'Kolk', 'Kont', 'Kool', 'Koort', + 'Koppel', 'Korol', 'Kotkas', 'Kotov', 'Koval', 'Kozlov', + 'Kriisa', 'Kroon', 'Krõlov', 'Kudrjavtsev', 'Kulikov', + 'Kuningas', 'Kurg', 'Kurm', 'Kurvits', 'Kutsar', 'Kuus', + 'Kuuse', 'Kuusik', 'Kuusk', 'Kärner', 'Käsper', 'Käär', + 'Käärik', 'Kõiv', 'Kütt', 'Laan', 'Laane', 'Laanemets', + 'Laas', 'Laht', 'Laine', 'Laks', 'Lang', 'Lass', 'Laur', + 'Lauri', 'Lehiste', 'Leht', 'Lehtla', 'Lehtmets', 'Leis', + 'Lember', 'Lepik', 'Lepp', 'Leppik', 'Liblik', 'Liiv', + 'Liiva', 'Liivak', 'Liivamägi', 'Lill', 'Lillemets', + 'Lind', 'Link', 'Lipp', 'Lokk', 'Lomp', 'Loorits', 'Luht', + 'Luik', 'Lukin', 'Lukk', 'Lumi', 'Lumiste', 'Luts', + 'Lätt', 'Lääne', 'Lääts', 'Lõhmus', 'Maasik', 'Madisson', + 'Maidla', 'Mandel', 'Maripuu', 'Mark', 'Markus', 'Martin', + 'Martinson', 'Meier', 'Meister', 'Melnik', 'Merila', + 'Mets', 'Michelson', 'Mikk', 'Miller', 'Mitt', 'Moor', + 'Muru', 'Must', 'Mäe', 'Mäeots', 'Mäesalu', 'Mägi', + 'Mänd', 'Mändla', 'Männik', 'Männiste', 'Mõttus', + 'Mölder', 'Mürk', 'Müür', 'Müürsepp', 'Niit', 'Nurk', + 'Nurm', 'Nuut', 'Nõmm', 'Nõmme', 'Nõmmik', 'Oja', 'Ojala', + 'Ojaste', 'Oks', 'Olesk', 'Oras', 'Orav', 'Org', 'Ots', + 'Ott', 'Paal', 'Paap', 'Paas', 'Paju', 'Pajula', 'Palm', + 'Palu', 'Parts', 'Pent', 'Peterson', 'Pettai', 'Pihelgas', + 'Pihlak', 'Piho', 'Piir', 'Piirsalu', 'Pikk', 'Ploom', + 'Poom', 'Post', 'Pruul', 'Pukk', 'Pulk', 'Puusepp', + 'Pärn', 'Pärna', 'Pärnpuu', 'Pärtel', 'Põder', 'Põdra', + 'Põld', 'Põldma', 'Põldmaa', 'Põllu', 'Püvi', 'Raadik', + 'Raag', 'Raamat', 'Raid', 'Raidma', 'Raja', 'Rand', + 'Randmaa', 'Randoja', 'Raud', 'Raudsepp', 'Rebane', + 'Reimann', 'Reinsalu', 'Remmel', 'Rohtla', 'Roos', + 'Roosileht', 'Roots', 'Rosenberg', 'Rosin', 'Ruus', + 'Rätsep', 'Rüütel', 'Saar', 'Saare', 'Saks', 'Salu', + 'Salumets', 'Salumäe', 'Sander', 'Sarap', 'Sarapuu', + 'Sarv', 'Saul', 'Schmidt', 'Sepp', 'Sibul', 'Siim', + 'Sikk', 'Sild', 'Sillaots', 'Sillaste', 'Silm', 'Simson', + 'Sirel', 'Sisask', 'Sokk', 'Soo', 'Soon', 'Soosaar', + 'Soosalu', 'Soots', 'Suits', 'Sulg', 'Susi', 'Sutt', + 'Suur', 'Suvi', 'Säde', 'Sööt', 'Taal', 'Tali', 'Talts', + 'Tamberg', 'Tamm', 'Tamme', 'Tammik', 'Teder', 'Teearu', + 'Teesalu', 'Teras', 'Tiik', 'Tiits', 'Tilk', 'Tomingas', + 'Tomson', 'Toom', 'Toome', 'Tooming', 'Toomsalu', 'Toots', + 'Trei', 'Treial', 'Treier', 'Truu', 'Tuisk', 'Tuul', + 'Tuulik', 'Täht', 'Tõnisson', 'Uibo', 'Unt', 'Urb', 'Uus', + 'Uustalu', 'Vaher', 'Vaht', 'Vahter', 'Vahtra', 'Vain', + 'Vaino', 'Valge', 'Valk', 'Vares', 'Varik', 'Veski', + 'Viik', 'Viira', 'Viks', 'Vill', 'Villemson', 'Visnapuu', + 'Vähi', 'Väli', 'Võsu', 'Õispuu', 'Õun', 'Õunapuu') + + last_names_rus = ('Abramov', 'Afanasjev', 'Aleksandrov', 'Alekseev', + 'Andreev', 'Anissimov', 'Antonov', 'Baranov', 'Beljajev', + 'Belov', 'Bogdanov', 'Bondarenko', 'Borissov', 'Bõstrov', + 'Danilov', 'Davõdov', 'Denissov', 'Dmitriev', 'Drozdov', + 'Egorov', 'Fedorov', 'Fedotov', 'Filatov', 'Filippov', + 'Fjodorov', 'Fomin', 'Frolov', 'Gavrilov', 'Gerassimov', + 'Golubev', 'Gontšarov', 'Gorbunov', 'Grigoriev', 'Gromov', + 'Gusev', 'Ignatjev', 'Iljin', 'Ivanov', 'Jakovlev', + 'Jefimov', 'Jegorov', 'Jermakov', 'Jeršov', 'Kalinin', + 'Karpov', 'Karpov', 'Kazakov', 'Kirillov', 'Kisseljov', + 'Klimov', 'Kolesnik', 'Komarov', 'Kondratjev', + 'Konovalov', 'Konstantinov', 'Korol', 'Kostin', 'Kotov', + 'Koval', 'Kozlov', 'Kruglov', 'Krõlov', 'Kudrjavtsev', + 'Kulikov', 'Kuzmin', 'Kuznetsov', 'Lebedev', 'Loginov', + 'Lukin', 'Makarov', 'Maksimov', 'Malõšev', 'Maslov', + 'Matvejev', 'Medvedev', 'Melnik', 'Mihhailov', 'Miller', + 'Mironov', 'Moroz', 'Naumov', 'Nazarov', 'Nikiforov', + 'Nikitin', 'Nikolaev', 'Novikov', 'Orlov', 'Ossipov', + 'Panov', 'Pavlov', 'Petrov', 'Poljakov', 'Popov', + 'Romanov', 'Rosenberg', 'Rumjantsev', 'Safronov', + 'Saveljev', 'Semenov', 'Sergejev', 'Sidorov', 'Smirnov', + 'Sobolev', 'Sokolov', 'Solovjov', 'Sorokin', 'Stepanov', + 'Suvorov', 'Tarassov', 'Tihhomirov', 'Timofejev', 'Titov', + 'Trofimov', 'Tsvetkov', 'Vasiliev', 'Vinogradov', + 'Vlassov', 'Volkov', 'Vorobjov', 'Voronin', 'Zahharov', + 'Zaitsev', 'Zujev', 'Ševtšenko', 'Štšerbakov', + 'Štšerbakov', 'Žukov', 'Žuravljov') + last_names = set(last_names_est + last_names_rus) + + def first_name_male_est(self): + return self.random_element(self.first_names_male_est) + + def first_name_female_est(self): + return self.random_element(self.first_names_female_est) + + def first_name_male_rus(self): + return self.random_element(self.first_names_male_rus) + + def first_name_female_rus(self): + return self.random_element(self.first_names_female_rus) + + def first_name_est(self): + return self.random_element(self.first_names_est) + + def first_name_rus(self): + return self.random_element(self.first_names_rus) + + def last_name_est(self): + return self.random_element(self.last_names_est) + + def last_name_rus(self): + return self.random_element(self.last_names_rus) diff --git a/src/libs/faker/providers/person/fa_IR/__init__.py b/src/libs/faker/providers/person/fa_IR/__init__.py new file mode 100644 index 0000000..0a1bbeb --- /dev/null +++ b/src/libs/faker/providers/person/fa_IR/__init__.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{suffix}}', + '{{prefix_female}} {{first_name_female}} {{last_name}} {{suffix}}' + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{suffix}}', + '{{prefix_male}} {{first_name_male}} {{last_name}} {{suffix}}' + ) + + formats = formats_female + formats_male + + first_names_female = ( + # top 50 Female Names in Iran: + # http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/d1391.htm + 'فاطمه', 'اسما', 'زهرا', 'عسل', 'نازنین زهرا', 'النا', 'زینب', 'سارا', + 'یسنا', 'آتنا', 'ریحانه', 'آیناز', 'هستی', 'محیا', 'ستایش', 'باران', + 'ثنا', 'هلیا', 'مریم', 'یلدا', 'فاطمه زهرا', 'ملیكا', 'سارینا', + 'نازنین', 'مهسا', 'آیلین', 'نرگس', 'حنانه', 'رقیه', 'كیانا', 'كوثر', + 'هانیه', 'مبینا', 'مهدیس', 'رها', 'آوا', 'اسرا', 'یگانه', 'نیایش', + 'حدیث', 'الینا', 'سوگند', 'مائده', 'پریا', 'معصومه', 'مهدیه', + 'آیدا', 'الناز', 'محدثه', 'یاسمین', + # http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/d1393.htm + 'فاطمه', 'ستايش', 'زهرا', 'مائده', 'نازنين', 'مبينا', 'يسنا', 'عسل', + 'زينب', 'آيناز', 'ريحانه', 'هليا', 'فاطمه', 'سوگند', 'باران', 'سارا', 'رها','محدثه', + 'ثنا', 'الينا', 'کوثر', 'آتنا', 'مريم', 'فاطميا''سارينا', 'ياسمين', 'اسرا', + 'حسنا', 'رقيه', 'اسما', 'هستي', 'مهديس', 'محيا', 'هانيه', 'آيلين', 'حنانه', + 'مهسا', 'پرنيا', 'نرگس', 'آيدا', 'معصومه', 'کيانا', 'حلما', 'مليکا', 'آوا', + 'نازنين', 'النا', 'الناز', 'نيايش','بهار' + ) + + first_names_male = ( + # top 50 male Names in Iran: + # http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/p1391.htm + 'امیر علی', 'پرهام', 'ابوالفضل', 'كیان', 'امیرحسین', 'متین', + 'محمد طاها', 'عرفان', 'محمد', 'دانیال', 'علی', 'آرمین', 'امیرمحمد', + 'آرتین', 'حسین', 'سبحان', 'مهدی', 'سینا', 'محمد مهدی', 'آریا', + 'محمدرضا', 'محمدپارسا', 'طاها', 'سجاد', 'امیررضا', 'آرش', + 'امیرعباس', 'نیما', 'علیرضا', 'عرشیا', 'محمدامین', 'مبین', 'محمدحسین', + 'یوسف', 'رضا', 'احسان', 'علی اصغر', 'آرین', 'امیرمهدی', 'محمدیاسین', + 'ماهان', 'عباس', 'پارسا', 'حسام', 'یاسین', 'علی رضا', 'ایلیا', + 'علی اكبر', 'محمدجواد', 'بنیامین', + # http://www.sabteahval.ir/Upload/Modules/Contents/asset100/name/p1393.htm + 'اميرعلي', 'ايليا', 'محمد', 'محمدپارسا', 'محمد', 'پرهام', 'ابوالفضل', + 'سبحان', 'اميرحسين', 'آرتين', 'علي', 'آرمين', 'حسين', 'عرفان', 'اميرمحمد', + 'آريا', 'اميرعباس', 'محمدياسين', 'محمدمهدي', 'متين', 'محمدرضا', 'دانيال', + 'مهدي', 'ساميار', 'محمدحسين', 'احسان', 'اميررضا', 'آرين', 'عليرضا', 'سينا', + 'محمدامين', 'آراد', 'علي', 'سجاد', 'طاها', 'حسام', 'رضا', 'يوسف', 'ماهان', 'آرش', + 'مبين', 'ياسين', 'علي', 'اميرمهدي', 'عباس', 'پارسا', 'محمدعلي', 'کيان', + 'محمدجواد', 'بنيامين', + ) + + first_names = first_names_female + first_names_male + + last_names = ( + 'محمدی', 'محمد پور', 'اکبر پور', 'رضا زاده', 'مجتهدی', 'دایی', 'حمیدی', + 'کابلی', 'عبدالعلی', 'احمدی', 'اشرفی', 'علیجانی', 'ابوطالبی', + 'علی شاهی', 'الوندی', 'بهمنی', 'بهرامی', 'هنری', 'ایروانی', 'حریریان', + 'جعفر پور', 'جلالی', 'جلیلی', 'روحانی', 'خسروجردی', 'منصوری', + 'مهدیان', 'نوروزی', 'نوری', 'رسته', 'سماوات', 'سمسار', 'شادروان', + 'شاکری', 'سلطانی', 'شبیری', 'تحسینی', 'تنزیلی', 'طلوعی', 'ولاشجردی', + 'وثاق', 'ظفری', 'زمانی', 'زارع', 'زارعی', 'ربانی', 'شمشیری', 'صارمی', + 'صیادی', 'سرخوشیان', 'رستمی', 'رسولی', 'رفیعی', 'کریمی', 'کرمانی', + 'سعیدی', 'عباسی', 'پویان', 'ترکاشوند', 'زنجانی', 'تهرانی', 'جنتی', + 'صنایعی', 'جهانی', 'اشتری', 'چنگیزی', 'دادفر', 'سغیری', 'پارسا', + 'ضابطی', 'میردامادی', 'عقیلی', 'نامور', 'حسنی', 'لاهوتی', 'محجوب', + 'هاشمی', 'معروف', 'معین', 'هوشیار', 'هومن', 'هدایت', 'قاضی', 'ملکیان', + 'ضرغامی', 'یزدی', 'نوبختی', 'مجتبوی', 'نیلوفری', 'لاچینی', 'علی پور', + 'عبدالمالکی', 'فرجی', 'موسوی', 'همدانی', 'موحد', 'کمالی', 'گلپایگانی', + 'نعمتی', 'عزیزی', 'رودگر', + ) + + prefixes_male = ('جناب آقای', 'جناب آقای دکتر') + prefixes_female = ('سرکار خانم', 'سرکار خانم دکتر') + + def suffix(self): + return '' diff --git a/src/faker/providers/fi_FI/person.py b/src/libs/faker/providers/person/fi_FI/__init__.py similarity index 98% rename from src/faker/providers/fi_FI/person.py rename to src/libs/faker/providers/person/fi_FI/__init__.py index e382773..c15c3f5 100644 --- a/src/faker/providers/fi_FI/person.py +++ b/src/libs/faker/providers/person/fi_FI/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -199,10 +199,3 @@ class Provider(PersonProvider): 'Ylöstalo', 'Yrjälä', 'Yrjänä', 'Yrjänäinen', 'Yrjölä', 'Yrjönen' ) - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) - - @classmethod - def suffix(cls): - return cls.random_element(cls.suffixes) \ No newline at end of file diff --git a/src/libs/faker/providers/person/fr_CH/__init__.py b/src/libs/faker/providers/person/fr_CH/__init__.py new file mode 100644 index 0000000..ac6f0f8 --- /dev/null +++ b/src/libs/faker/providers/person/fr_CH/__init__.py @@ -0,0 +1,87 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}-{{last_name}}', + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}-{{last_name}}', + ) + + formats = formats_male + formats_female + + # source: http://www.bfs.admin.ch/bfs/portal/fr/index/news/publikationen.html?publicationID=6704 + first_names_male = ['Alain', 'Albert', 'Alexandre', 'André', 'Antonio', + 'Arthur', 'Bernard', 'Bruno', 'Charles', 'Christian', 'Christophe', + 'Claude', 'Daniel', 'David', 'Eric', 'Ethan', 'Florian', 'François', + 'Frédéric', 'Gabriel', 'Georges', 'Gilbert', 'Guillaume', 'Gérard', + 'Henri', 'Hugo', 'Jacques', 'Jean', 'Jean-Claude', 'Jean-Pierre', + 'Jonathan', 'José', 'Julien', 'Kevin', 'Laurent', 'Louis', 'Loïc', + 'Luca', 'Lucas', 'Léo', 'Manuel', 'Marcel', 'Mathieu', 'Matteo', + 'Maurice', 'Maxime', 'Michael', 'Michel', 'Nathan', 'Nicolas', 'Noah', + 'Nolan', 'Olivier', 'Pascal', 'Patrick', 'Paul', 'Philippe', 'Pierre', + 'Raymond', 'René', 'Robert', 'Roger', 'Roland', 'Romain', 'Samuel', + 'Stéphane', 'Sébastien', 'Thierry', 'Thomas', 'Théo', 'Vincent' + ] + + first_names_female = ['Alice', 'Alicia', 'Ana', 'Anna', 'Anne', 'Aurélie', + 'Camille', 'Caroline', 'Catherine', 'Chantal', 'Charlotte', 'Chloé', + 'Christiane', 'Christine', 'Clara', 'Claudine', 'Corinne', 'Céline', + 'Danielle', 'Denise', 'Eliane', 'Elisa', 'Elisabeth', 'Elodie', + 'Emilie', 'Emma', 'Eva', 'Fabienne', 'Françoise', 'Georgette', + 'Germaine', 'Hélène', 'Isabelle', 'Jacqueline', 'Jeanne', 'Jessica', + 'Josiane', 'Julie', 'Laetitia', 'Lara', 'Laura', 'Laurence', 'Liliane', + 'Lisa', 'Lucie', 'Léa', 'Madeleine', 'Manon', 'Marcelle', 'Marguerite', + 'Maria', 'Marianne', 'Marie', 'Mathilde', 'Monique', 'Mélanie', + 'Nathalie', 'Nelly', 'Nicole', 'Odette', 'Patricia', 'Sandra', + 'Sandrine', 'Sara', 'Sarah', 'Simone', 'Sophie', 'Stéphanie', 'Suzanne', + 'Sylvie', 'Thérèse', 'Valérie', 'Vanessa', 'Véronique', 'Yvette', + 'Yvonne', 'Zoé' + ] + + first_names = first_names_male + first_names_female + + # source = http://kunden.eye.ch/swissgen/rsr/index.html + last_names = ['Aebi', 'Aeby', 'Alber', 'Babey', 'Badan', 'Badel', 'Bahon', + 'Balmat', 'Barbey', 'Barillon', 'Barman', 'Bavaud', 'Beguin', + 'Berberat', 'Bernasconi', 'Besançon', 'Besençon', 'Besse', 'Beuchat', + 'Beuret', 'Beurret', 'Blanc', 'Bochud', 'Boechat', 'Boichat', 'Boillat', + 'Bonvin', 'Bonvini', 'Botteron', 'Bourquard', 'Bourquin', 'Bouvier', + 'Bovet', 'Brahier', 'Brandt', 'Broquet', 'Bugnon', 'Bujard', 'Béguelin', + 'Candaux', 'Carraud', 'Carraux', 'Carron', 'Cattin', 'Chappuis', + 'Chapuis', 'Charpié', 'Chatriand', 'Chatriant', 'Chaudet', 'Chenaux', + 'Chevalley', 'Chevrolet', 'Chopard', 'Coigny', 'Comman', 'Comment', + 'Comte', 'Conrad', 'Corbat', 'Corboz', 'Cornut', 'Cornuz', 'Corpataux', + 'Cosandey', 'Cosendey', 'Cossy', 'Courvoisier', 'Cousin', 'Cretton', + 'Crevoisier', 'Crivelli', 'Curdy', 'de Dardel', 'Deladoëy', 'Delèze', + 'Deshusses', 'Diesbach', 'Droz', 'Dubey', 'Duroux', 'Duvanel', 'Délèze', + 'Evéquoz', 'Fonjallaz', 'Francillon', 'Galland', 'Georges', 'Gillièron', + 'Gilliéron', 'Godet', 'Grand', 'Grojean', 'Grosjean', 'Gubéran', + 'Humbert', 'Isella', 'Jacot-Descombes', 'Jacot-Guillarmod', 'Joly', + 'Jomini', 'Joye', 'Julliard', 'Maire', 'Marti', 'Martin', 'Marty', + 'Masseron', 'Matile', 'Mayor', 'Menthonnex', 'Mercier', 'Meyer', + 'Monnard', 'Monnet', 'Monnet', 'Monney', 'Montandon', 'Morand', + 'Morard', 'Mottet', 'Mottiez', 'Muriset', 'Musy', 'Müller', 'Niquille', + 'Nusslé', 'Nüsslin', 'Paccot', 'Pachoud', 'Paschoud', 'Pasquier', + 'Peitrequin', 'Pellet', 'Piccand', 'Polla', 'Privet', 'Quartier', + 'Rapin', 'Rappaz', 'Rapraz', 'Rey', 'Robadey', 'Robert', 'Romanens', + 'Rosselat', 'Rosselet', 'Rossellat', 'Sandoz', 'Sansonnens', 'Saudan', + 'Thorens', 'Théraulaz', 'Tinguely', 'Treboux', 'Uldry', 'Vallélian', + 'Vermeil', 'Vienne', 'Vonlanthen', 'Vuille', 'Wicht' + ] diff --git a/src/faker/providers/fr_FR/person.py b/src/libs/faker/providers/person/fr_FR/__init__.py similarity index 83% rename from src/faker/providers/fr_FR/person.py rename to src/libs/faker/providers/person/fr_FR/__init__.py index 48dfe7d..fc9f52d 100644 --- a/src/faker/providers/fr_FR/person.py +++ b/src/libs/faker/providers/person/fr_FR/__init__.py @@ -1,23 +1,38 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): - formats = ( - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{last_name}}', - '{{first_name}} {{prefix}} {{last_name}}', - '{{first_name}} {{last_name}}-{{last_name}}', - '{{first_name}}-{{first_name}} {{last_name}}', + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{prefix}} {{last_name}}', + '{{first_name_female}} {{last_name}}-{{last_name}}', + '{{first_name_female}}-{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{prefix}} {{last_name}}', ) - first_names = ( + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{prefix}} {{last_name}}', + '{{first_name_male}} {{last_name}}-{{last_name}}', + '{{first_name_male}}-{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}} {{prefix}} {{last_name}}', + ) + + formats = formats_male + formats_female + + first_names_male = ( 'Adrien', 'Aimé', 'Alain', 'Alexandre', 'Alfred', 'Alphonse', 'André', 'Antoine', 'Arthur', 'Auguste', 'Augustin', 'Benjamin', 'Benoît', 'Bernard', 'Bertrand', 'Charles', 'Christophe', 'Daniel', 'David', 'Denis', 'Édouard', 'Émile', 'Emmanuel', 'Éric', 'Étienne', 'Eugène', 'François', 'Franck', 'Frédéric', 'Gabriel', @@ -26,7 +41,10 @@ class Provider(PersonProvider): 'Lucas', 'Marc', 'Marcel', 'Martin', 'Matthieu', 'Maurice', 'Michel', 'Nicolas', 'Noël', 'Olivier', 'Patrick', 'Paul', 'Philippe', 'Pierre', 'Raymond', 'Rémy', 'René', 'Richard', 'Robert', 'Roger', 'Roland', 'Sébastien', 'Stéphane', 'Théodore', 'Théophile', 'Thibaut', 'Thibault', 'Thierry', 'Thomas', 'Timothée', 'Tristan', - 'Victor', 'Vincent', 'Xavier', 'Yves', 'Zacharie', + 'Victor', 'Vincent', 'Xavier', 'Yves', 'Zacharie' + ) + + first_names_female = ( 'Adélaïde', 'Adèle', 'Adrienne', 'Agathe', 'Agnès', 'Aimée', 'Alexandrie', 'Alix', 'Alexandria', 'Alex', 'Alice', 'Amélie', 'Anaïs', 'Anastasie', 'Andrée', 'Anne', 'Anouk', 'Antoinette', 'Arnaude', 'Astrid', 'Audrey', 'Aurélie', 'Aurore', 'Bernadette', 'Brigitte', 'Capucine', 'Caroline', 'Catherine', 'Cécile', 'Céline', @@ -44,6 +62,8 @@ class Provider(PersonProvider): 'Camille', 'Claude', 'Dominique' ) + first_names = first_names_male + first_names_female + last_names = ( 'Martin', 'Bernard', 'Thomas', 'Robert', 'Petit', 'Dubois', 'Richard', 'Garcia', 'Durand', 'Moreau', 'Lefebvre', 'Simon', 'Laurent', 'Michel', 'Leroy', 'Martinez', 'David', 'Fontaine', 'Da Silva', 'Morel', 'Fournier', @@ -87,7 +107,3 @@ class Provider(PersonProvider): ) prefixes = ('de', 'de la', 'Le', 'du') - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) \ No newline at end of file diff --git a/src/libs/faker/providers/person/he_IL/__init__.py b/src/libs/faker/providers/person/he_IL/__init__.py new file mode 100644 index 0000000..d57a564 --- /dev/null +++ b/src/libs/faker/providers/person/he_IL/__init__.py @@ -0,0 +1,1278 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = OrderedDict(( + ('{{first_name_female}} {{last_name}}', 0.9), + ('{{first_name_female}} {{last_name}}-{{last_name}}', 0.06), + ('{{first_name_female}} {{first_name_female}} {{last_name}}', 0.04), + + )) + + formats_male = OrderedDict(( + ('{{first_name_male}} {{last_name}}', 0.95), + ('{{first_name_male}} {{last_name}}-{{last_name}}', 0.025), + ('{{first_name_male}} {{first_name_male}} {{last_name}}', 0.025), + )) + + # Using random_element's dictionary weighting means that the + # formats = formats_male + formats_female + # has to be replaced with something dict and python 2.x compatible + + formats = formats_male.copy() + formats.update(formats_female) + + # Top names given in Israel in 2015 + # http://www.cbs.gov.il/reader/newhodaot/tables_template.html?hodaa=201611401 + + first_names_female = OrderedDict(( + ("אביב", 0.002782860042127), + ("אביגיל", 0.017542780707554), + ("אביה", 0.00339785673652), + ("אביטל", 0.002644485785889), + ("אבישג", 0.005288971571778), + ("אגם", 0.0085330791347), + ("אדוה", 0.001030119463108), + ("אדל", 0.016512661244446), + ("אדר", 0.000968619793669), + ("אהובה", 0.000737996033271), + ("אודיה", 0.000799495702711), + ("אודל", 0.003059608554604), + ("אודליה", 0.000999369628388), + ("אווה", 0.00081487062007), + ("אופיר", 0.004535600621147), + ("אופל", 0.000568871942313), + ("אופק", 0.000476622438154), + ("אור", 0.004643225042665), + ("אוראל", 0.000538122107594), + ("אורה", 0.000784120785351), + ("אורטל", 0.000322873264556), + ("אורי", 0.004858473885703), + ("אוריאן", 0.002198613182454), + ("אוריה", 0.005688719423133), + ("אורין", 0.002890484463646), + ("אורן", 0.000461247520795), + ("אושר", 0.000737996033271), + ("אחינועם", 0.000999369628388), + ("איה", 0.001091619132547), + ("איה", 0.002936609215725), + ("איטה", 0.000538122107594), + ("איידל", 0.000307498347196), + ("איילה", 0.015959164219492), + ("איילת", 0.001506741901262), + ("איימי", 0.000676496363832), + ("אילין", 0.000153749173598), + ("אילין", 0.001921864669977), + ("אילת", 0.000461247520795), + ("אימאן", 0.001030119463108), + ("אלה", 0.009809197275565), + ("אלומה", 0.000445872603435), + ("אלונה", 0.002029489091496), + ("אלטע", 0.000415122768715), + ("אלי", 0.000799495702711), + ("אליאן", 0.0017219907443), + ("אליאנה", 0.000368998016636), + ("אליה", 0.004443351116988), + ("אלין", 0.000122999338879), + ("אלין", 0.000538122107594), + ("אלין", 0.003290232315001), + ("אלין", 0.003982103596193), + ("אלינור", 0.001030119463108), + ("אליס", 0.000430497686075), + ("אליסה", 0.000399747851355), + ("אליענה", 0.00081487062007), + ("אלישבע", 0.005319721406497), + ("אלכס", 0.00086099537215), + ("אלמא", 0.001106994049907), + ("אלמה", 0.0033671069018), + ("אלמוג", 0.00086099537215), + ("אמה", 0.007748958349349), + ("אמונה", 0.001199243554066), + ("אמור", 0.000322873264556), + ("אמי", 0.000538122107594), + ("אמילי", 0.000153749173598), + ("אמילי", 0.005873218431451), + ("אמיליה", 0.00084562045479), + ("אמל", 0.001967989422057), + ("אמלי", 0.000737996033271), + ("אן", 0.000661121446472), + ("אנאבל", 0.000522747190234), + ("אנאל", 0.00338248181916), + ("אנה", 0.001229993388786), + ("אסיל", 0.000169124090958), + ("אסיל", 0.002075613843576), + ("אסנת", 0.000322873264556), + ("אסתר", 0.010639442812995), + ("אפרת", 0.007041712150797), + ("ארבל", 0.002213988099814), + ("אריאל", 0.008287080456943), + ("בארי", 0.000322873264556), + ("ביאן", 0.001229993388786), + ("בילא", 0.000784120785351), + ("ביסאן", 0.002629110868529), + ("בלומה", 0.001030119463108), + ("בר", 0.002336987438693), + ("ברכה", 0.002613735951169), + ("בת", 0.001568241570702), + ("בתיה", 0.002290862686613), + ("בת שבע", 0.003259482480282), + ("גאיה", 0.006672714134162), + ("ג'ואל", 0.000138374256238), + ("ג'וד", 0.001076244215187), + ("ג'ויל", 0.000122999338879), + ("גולדה", 0.000707246198552), + ("ג'ולי", 0.000184499008318), + ("ג'ולין", 0.000138374256238), + ("גוני", 0.000368998016636), + ("ג'ורי", 0.000138374256238), + ("גורי", 0.00255223628173), + ("ג'ורי", 0.002598361033809), + ("גזל", 0.001752740579019), + ("גיטל", 0.001368367645024), + ("גיל", 0.000707246198552), + ("גילה", 0.000691871281192), + ("גילי", 0.003259482480282), + ("גל", 0.001537491735982), + ("גלי", 0.002967359050445), + ("גליה", 0.00084562045479), + ("ג'נא", 0.005688719423133), + ("גפן", 0.00424347719131), + ("דבורה", 0.00425885210867), + ("דור", 0.000430497686075), + ("דורון", 0.000722621115912), + ("דורין", 0.000384372933995), + ("דימא", 0.001337617810304), + ("דינה", 0.00084562045479), + ("דנה", 0.000753370950631), + ("דני", 0.000445872603435), + ("דניאל", 0.00427422702603), + ("דניאלה", 0.003213357728202), + ("דפנה", 0.000753370950631), + ("דרור", 0.000491997355514), + ("דריה", 0.001752740579019), + ("הדס", 0.004950723389862), + ("הדסה", 0.004643225042665), + ("הדר", 0.005596469918974), + ("הודיה", 0.009855322027644), + ("היילי", 0.000322873264556), + ("הילה", 0.007795083101428), + ("הילי", 0.002798234959487), + ("הינדא", 0.000584246859673), + ("הלל", 0.006349840869605), + ("הללי", 0.002029489091496), + ("הניה", 0.000338248181916), + ("הענא", 0.000384372933995), + ("זהבה", 0.000522747190234), + ("זואי", 0.001076244215187), + ("זוהר", 0.003028858719884), + ("זיו", 0.001645116157501), + ("זינב", 0.0017219907443), + ("זינה", 0.002998108885165), + ("חגית", 0.000322873264556), + ("חוה", 0.002090988760935), + ("חיה", 0.008948201903415), + ("חלא", 0.000261373595117), + ("חלא", 0.003305607232361), + ("חן", 0.001091619132547), + ("חנה", 0.011577312771944), + ("טובה", 0.001322242892944), + ("טוהר", 0.005473470580096), + ("טל", 0.001937239587337), + ("טלי", 0.000599621777033), + ("טליה", 0.016620285665965), + ("יארא", 0.000169124090958), + ("יהב", 0.001091619132547), + ("יהודית", 0.004966098307222), + ("יהל", 0.001337617810304), + ("יהלי", 0.005734844175213), + ("יובל", 0.009701572854046), + ("יוטא", 0.000538122107594), + ("יוכבד", 0.001276118140865), + ("יולי", 0.002429236942851), + ("ים", 0.000553497024953), + ("יסכה", 0.001491366983902), + ("יסמין", 0.000261373595117), + ("יסמין", 0.001076244215187), + ("יסמין", 0.003090358389324), + ("יעל", 0.015713165541735), + ("יעלה", 0.001291493058225), + ("יערה", 0.002890484463646), + ("יפה", 0.000691871281192), + ("ירדן", 0.004105102935072), + ("ירין", 0.000599621777033), + ("כליל", 0.000399747851355), + ("כנרת", 0.000368998016636), + ("כרמל", 0.002752110207408), + ("לאה", 0.005903968266171), + ("לארא", 0.000122999338879), + ("לוטם", 0.00084562045479), + ("לור", 0.000122999338879), + ("לורן", 0.001337617810304), + ("לי", 0.000691871281192), + ("ליאה", 0.000953244876309), + ("ליאור", 0.002921234298366), + ("ליאורה", 0.000538122107594), + ("ליאל", 0.004489475869067), + ("ליאם", 0.001475992066543), + ("ליאן", 0.000169124090958), + ("ליאן", 0.000384372933995), + ("ליאן", 0.004889223720423), + ("ליאן", 0.007010962316078), + ("ליב", 0.000322873264556), + ("ליבא", 0.00087637028951), + ("ליבי", 0.004520225703787), + ("ליה", 0.011285189342107), + ("ליהי", 0.00167586599222), + ("ליהיא", 0.001199243554066), + ("ליטל", 0.000445872603435), + ("לייה", 0.000907120124229), + ("לילי", 0.000983994711028), + ("לילך", 0.000476622438154), + ("לין", 0.000153749173598), + ("לין", 0.000384372933995), + ("לין", 0.000691871281192), + ("לין", 0.005427345828016), + ("לינוי", 0.002075613843576), + ("ליעד", 0.000368998016636), + ("לירון", 0.000799495702711), + ("לירז", 0.000553497024953), + ("לירי", 0.001076244215187), + ("למאר", 0.001491366983902), + ("לנא", 0.000138374256238), + ("לנא", 0.001245368306145), + ("לני", 0.001429867314463), + ("מאור", 0.00081487062007), + ("מאורי", 0.000353623099276), + ("מאי", 0.003459356405959), + ("מאיה", 0.000153749173598), + ("מאיה", 0.000245998677757), + ("מאיה", 0.017588905459633), + ("מור", 0.000522747190234), + ("מוריה", 0.00428960194339), + ("מיאל", 0.000599621777033), + ("מיאר", 0.001383742562384), + ("מיטל", 0.000430497686075), + ("מייה", 0.000676496363832), + ("מיכאלה", 0.0017219907443), + ("מיכל", 0.010870066573392), + ("מילא", 0.000169124090958), + ("מילא", 0.000322873264556), + ("מילה", 0.001245368306145), + ("מילי", 0.000522747190234), + ("מיקה", 0.004996848141941), + ("מירא", 0.000138374256238), + ("מירא", 0.00173736566166), + ("מיראל", 0.000184499008318), + ("מיראל", 0.000184499008318), + ("מיראל", 0.001506741901262), + ("מיריל", 0.000153749173598), + ("מישל", 0.000937869958949), + ("מיתר", 0.000676496363832), + ("מלאק", 0.000169124090958), + ("מלאק", 0.000169124090958), + ("מלאק", 0.003874479174674), + ("מלכה", 0.00513522239818), + ("מנוחה", 0.000415122768715), + ("מנור", 0.000645746529112), + ("מעיין", 0.006503590043204), + ("מרגלית", 0.000430497686075), + ("מריה", 0.000399747851355), + ("מריה", 0.001875739917898), + ("מרים", 0.000184499008318), + ("מרים", 0.007379960332713), + ("מרים", 0.009424824341569), + ("משי", 0.000707246198552), + ("נאוה", 0.000399747851355), + ("נאי", 0.000322873264556), + ("נאי", 0.001183868636706), + ("נאיא", 0.000184499008318), + ("נאיא", 0.001475992066543), + ("נאיה", 0.000169124090958), + ("נאיה", 0.000322873264556), + ("נגה", 0.007825832936148), + ("נוי", 0.001399117479744), + ("נויה", 0.010639442812995), + ("נועה", 0.022216755584939), + ("נועם", 0.005365846158577), + ("נופר", 0.000645746529112), + ("נור", 0.000153749173598), + ("נור", 0.000261373595117), + ("נור", 0.003720730001076), + ("נחמה", 0.003843729339955), + ("נטלי", 0.000276748512477), + ("נטלי", 0.000553497024953), + ("נטע", 0.005350471241217), + ("נילי", 0.000722621115912), + ("נינה", 0.001106994049907), + ("ניצן", 0.001445242231823), + ("ניקה", 0.000322873264556), + ("ניקול", 0.000753370950631), + ("נעמה", 0.005565720084255), + ("נעמי", 0.008333205209022), + ("סארה", 0.003905229009394), + ("סהר", 0.000753370950631), + ("סול", 0.00086099537215), + ("סופי", 0.000322873264556), + ("סופיה", 0.000907120124229), + ("סיון", 0.000599621777033), + ("סילא", 0.000169124090958), + ("סילין", 0.000169124090958), + ("סימה", 0.000430497686075), + ("סלמא", 0.001460617149183), + ("סמא", 0.000199873925678), + ("ספיר", 0.001091619132547), + ("סתיו", 0.00086099537215), + ("עדי", 0.007118586737596), + ("עדיה", 0.000553497024953), + ("עדינה", 0.000691871281192), + ("עדן", 0.001460617149183), + ("עדן", 0.003812979505235), + ("עומר", 0.0034439814886), + ("עופרי", 0.005642594671054), + ("עטרה", 0.000599621777033), + ("עטרת", 0.000338248181916), + ("עידן", 0.000384372933995), + ("עלמה", 0.00847157946526), + ("עמית", 0.004904598637782), + ("עמליה", 0.001183868636706), + ("עמנואל", 0.001552866653342), + ("ענאל", 0.000322873264556), + ("ענבל", 0.000384372933995), + ("ענבר", 0.001937239587337), + ("ענהאל", 0.002075613843576), + ("פאטמה", 0.003305607232361), + ("פאר", 0.000430497686075), + ("פיגא", 0.001967989422057), + ("פלג", 0.000445872603435), + ("פנינה", 0.001122368967267), + ("פערל", 0.000645746529112), + ("פרח", 0.001552866653342), + ("פריאל", 0.000691871281192), + ("פריידא", 0.000445872603435), + ("צביה", 0.00087637028951), + ("צופיה", 0.001183868636706), + ("צפורה", 0.002413862025492), + ("קארין", 0.000399747851355), + ("קורל", 0.000753370950631), + ("קים", 0.000614996694393), + ("קרן", 0.000507372272874), + ("קרני", 0.000599621777033), + ("ראשית", 0.000322873264556), + ("רבקה", 0.009824572192924), + ("רהף", 0.002828984794207), + ("רוחמה", 0.000507372272874), + ("רומי", 0.000722621115912), + ("רומי", 0.011669562276103), + ("רון", 0.000507372272874), + ("רונה", 0.001998739256777), + ("רוני", 0.012407558309374), + ("רות", 0.008102581448625), + ("רותם", 0.002475361694931), + ("רז", 0.000753370950631), + ("רחל", 0.009501698928368), + ("רייזל", 0.000507372272874), + ("רים", 0.001199243554066), + ("רימא", 0.001060869297828), + ("רימאס", 0.001629741240141), + ("רינה", 0.000491997355514), + ("ריתאג'", 0.001106994049907), + ("ריתאל", 0.003643855414277), + ("רני", 0.000968619793669), + ("רננה", 0.001260743223505), + ("רעות", 0.001368367645024), + ("רעיה", 0.000338248181916), + ("רפיף", 0.001537491735982), + ("שאם", 0.000153749173598), + ("שאם", 0.006196091696007), + ("שהד", 0.002490736612291), + ("שובל", 0.000645746529112), + ("שוהם", 0.001952614504697), + ("שולמית", 0.001829615165818), + ("שושנה", 0.002213988099814), + ("שחר", 0.004012853430913), + ("שטערנא", 0.000353623099276), + ("שי", 0.00338248181916), + ("שיינא", 0.001168493719346), + ("שיינדל", 0.000491997355514), + ("שי לי", 0.002044864008856), + ("שי-לי", 0.003244107562922), + ("שילת", 0.002367737273412), + ("שיר", 0.005534970249535), + ("שיראל", 0.001921864669977), + ("שירה", 0.016266662566689), + ("שירי", 0.00087637028951), + ("שלי", 0.00089174520687), + ("שני", 0.003474731323319), + ("שפרה", 0.00083024553743), + ("שקד", 0.005488845497455), + ("שרה", 0.000245998677757), + ("שרה", 0.002167863347735), + ("שרה", 0.014944419673744), + ("תאיר", 0.00169124090958), + ("תאלא", 0.000276748512477), + ("תאלא", 0.002705985455328), + ("תאלין", 0.002629110868529), + ("תבל", 0.000476622438154), + ("תהילה", 0.006303716117526), + ("תהל", 0.008041081779185), + ("תהלה", 0.000415122768715), + ("תולין", 0.000322873264556), + ("תולין", 0.001491366983902), + ("תום", 0.000630371611753), + ("תיא", 0.000199873925678), + ("תיא", 0.000230623760397), + ("תמר", 0.020341015667041), + ("תמרה", 0.001060869297828), + ("תפארת", 0.00083024553743), + + )) + + first_names_male = OrderedDict(( + ("אביאל", 0.004307179574083), + ("אביב", 0.003911766367282), + ("אביהו", 0.000395413206801), + ("אביחי", 0.000762582613116), + ("אבינועם", 0.00043777890753), + ("אביעד", 0.001256849121618), + ("אבישי", 0.002188894537649), + ("אביתר", 0.004603739479184), + ("אבראהים", 0.000155340902672), + ("אבראהים", 0.004759080381856), + ("אברהם", 0.012130712308648), + ("אדיר", 0.002400723041292), + ("אדם", 0.000225950403886), + ("אדם", 0.000607241710445), + ("אדם", 0.005846466700559), + ("אדם", 0.007569338530193), + ("אדר", 0.00107326441846), + ("אהרון", 0.006453708411004), + ("אוהד", 0.001454555725018), + ("אופיר", 0.003756425464611), + ("אופק", 0.003007964751737), + ("אור", 0.005959441902502), + ("אוראל", 0.003064452352709), + ("אורון", 0.000466022708016), + ("אורי", 0.018640908320624), + ("אוריאל", 0.003417499858781), + ("אוריה", 0.002598429644693), + ("אורין", 0.000522510308987), + ("אורן", 0.001143873919675), + ("אושר", 0.00238660114105), + ("אושרי", 0.001440433824775), + ("אחיה", 0.001256849121618), + ("אחמד", 0.011918883805005), + ("איאן", 0.000381291306558), + ("איהאם", 0.001553409026719), + ("אייל", 0.003671694063153), + ("אילון", 0.001059142518217), + ("איליי", 0.001708749929391), + ("אילן", 0.000607241710445), + ("אימרי", 0.002513698243236), + ("איתי", 0.016324916680789), + ("איתיאל", 0.00043777890753), + ("איתמר", 0.012413150313506), + ("איתן", 0.017610009602892), + ("אלדר", 0.00043777890753), + ("אלון", 0.008247189741852), + ("אלחנן", 0.002880867649551), + ("אליאב", 0.003149183754166), + ("אליאור", 0.00097441111676), + ("אליאל", 0.00043777890753), + ("אליאס", 0.000381291306558), + ("אליה", 0.008614359148167), + ("אליהו", 0.005973563802745), + ("אלימלך", 0.000960289216517), + ("אליעזר", 0.002541942043721), + ("אלירז", 0.000367169406315), + ("אלירן", 0.00063548551093), + ("אלישע", 0.000833192114331), + ("אלכס", 0.000649607411173), + ("אלכסנדר", 0.000395413206801), + ("אלמוג", 0.001779359430605), + ("אלעד", 0.001835847031577), + ("אלעזר", 0.002414844941535), + ("אלקנה", 0.000564876009716), + ("אלרואי", 0.003756425464611), + ("אלרועי", 0.000564876009716), + ("אמיר", 0.000183584703158), + ("אמיר", 0.000395413206801), + ("אמיר", 0.000946167316274), + ("אמיר", 0.004956786985257), + ("אמיתי", 0.002739648647122), + ("אמרי", 0.001256849121618), + ("אניל", 0.000240072304129), + ("אסף", 0.003276280856352), + ("אפק", 0.000508388408744), + ("אפרים", 0.001341580523075), + ("אראל", 0.000621363610687), + ("ארבל", 0.001398068124047), + ("ארד", 0.000790826413602), + ("ארז", 0.000367169406315), + ("ארז", 0.001299214822347), + ("ארי", 0.002330113540078), + ("אריאל", 0.01769474100435), + ("אריה", 0.002061797435463), + ("אשר", 0.00160989662769), + ("בארי", 0.003050330452466), + ("בועז", 0.001228605321132), + ("בן", 0.006637293114161), + ("בניה", 0.003488109359995), + ("בניהו", 0.000466022708016), + ("בנימין", 0.005931198102017), + ("בצלאל", 0.000381291306558), + ("בר", 0.001793481330848), + ("ברוך", 0.001496921425747), + ("ברק", 0.00063548551093), + ("גבע", 0.000960289216517), + ("גבריאל", 0.002118285036435), + ("ג'וד", 0.000593119810202), + ("ג'וד", 0.001087386318703), + ("גוד", 0.002767892447608), + ("ג'וד", 0.007004462520477), + ("ג'וזף", 0.000324803705587), + ("ג'וליאן", 0.000183584703158), + ("גור", 0.000691973111902), + ("ג'ורג'", 0.000395413206801), + ("גיא", 0.008120092639666), + ("גיל", 0.000790826413602), + ("גילי", 0.000423657007287), + ("גל", 0.001680506128905), + ("גלעד", 0.001835847031577), + ("גפן", 0.000748460712874), + ("דב", 0.00107326441846), + ("דביר", 0.00302208665198), + ("דוד", 0.019770660340055), + ("דולב", 0.000790826413602), + ("דור", 0.003346890357567), + ("דורון", 0.000578997909959), + ("דילן", 0.000395413206801), + ("דין", 0.000621363610687), + ("דן", 0.000155340902672), + ("דן", 0.002499576342993), + ("דניאל", 0.000296559905101), + ("דניאל", 0.01574591877083), + ("דרור", 0.00151104332599), + ("הדר", 0.001482799525504), + ("הילל", 0.001595774727447), + ("הלל", 0.005521662994973), + ("הראל", 0.009729989267356), + ("ורד", 0.000225950403886), + ("זאב", 0.000932045416031), + ("זוהר", 0.001285092922104), + ("זיו", 0.00214652883692), + ("זיין", 0.001270971021861), + ("ח'אלד", 0.00321979325538), + ("חגי", 0.000550754109473), + ("חוסין", 0.00141219002429), + ("חיים", 0.008713212449867), + ("חמזה", 0.001624018527933), + ("חנוך", 0.000494266508501), + ("חסן", 0.002160650737163), + ("טוביה", 0.000550754109473), + ("טוהר", 0.000706095012145), + ("טום", 0.001214483420889), + ("טומי", 0.000593119810202), + ("טל", 0.001779359430605), + ("יאיר", 0.010831497486302), + ("יאמן", 0.001680506128905), + ("יאן", 0.000480144608258), + ("יאסין", 0.001440433824775), + ("יגל", 0.002344235440321), + ("ידידיה", 0.002118285036435), + ("יהב", 0.003078574252951), + ("יהודה", 0.011226910693103), + ("יהונתן", 0.015915381573745), + ("יהושע", 0.002527820143479), + ("יהל", 0.001299214822347), + ("יהלי", 0.003233915155623), + ("יואב", 0.005620516296673), + ("יואל", 0.001680506128905), + ("יובל", 0.005027396486471), + ("יוגב", 0.00043777890753), + ("יוחאי", 0.000578997909959), + ("יוחנן", 0.00043777890753), + ("יונתן", 0.011198666892617), + ("יוסף", 0.000169462802915), + ("יוסף", 0.000240072304129), + ("יוסף", 0.008995650454725), + ("יוסף", 0.016861548890019), + ("יותם", 0.002527820143479), + ("יזן", 0.001934700333277), + ("יחזקאל", 0.00117211772016), + ("יחיא", 0.001849968931819), + ("יחיאל", 0.00151104332599), + ("ינאי", 0.004942665085014), + ("ינון", 0.002965599051008), + ("יניב", 0.000409535107044), + ("יעקב", 0.009532282663955), + ("יפתח", 0.000932045416031), + ("יצחק", 0.009292210359826), + ("יקיר", 0.000494266508501), + ("ירדן", 0.001807603231091), + ("ירין", 0.002697282946393), + ("ישי", 0.005549906795458), + ("ישכר", 0.000381291306558), + ("ישעיה", 0.000409535107044), + ("ישראל", 0.009913573970513), + ("יששכר", 0.000395413206801), + ("כפיר", 0.001835847031577), + ("כרים", 0.00248545444275), + ("כריסטיאן", 0.000169462802915), + ("כרם", 0.002259504038863), + ("כרמל", 0.000649607411173), + ("לאון", 0.000494266508501), + ("לביא", 0.008600237247924), + ("לוי", 0.001694628029148), + ("ליאב", 0.001991187934248), + ("ליאו", 0.00151104332599), + ("ליאור", 0.004264813873355), + ("ליאל", 0.001355702423318), + ("ליאם", 0.000183584703158), + ("ליאם", 0.005634638196916), + ("לידור", 0.000946167316274), + ("ליית", 0.000211828503643), + ("ליעד", 0.001751115630119), + ("ליעם", 0.000522510308987), + ("לירוי", 0.00312093995368), + ("לירון", 0.000593119810202), + ("לירן", 0.000578997909959), + ("לני", 0.000649607411173), + ("מאור", 0.004744958481613), + ("מאיר", 0.00570524769813), + ("מג'ד", 0.000268316104615), + ("מג'ד", 0.002033553634977), + ("מוחמד", 0.038552787663108), + ("מוסא", 0.001383946223804), + ("מוסטפא", 0.002287747839349), + ("מחמוד", 0.004688470880642), + ("מיכאל", 0.009376941761283), + ("מילאן", 0.000169462802915), + ("מלאכי", 0.002287747839349), + ("מנחם", 0.005210981189629), + ("מעיין", 0.002880867649551), + ("מרדכי", 0.00550754109473), + ("מרום", 0.000494266508501), + ("משה", 0.014305484946054), + ("מתן", 0.004024741569226), + ("מתנאל", 0.000649607411173), + ("מתניה", 0.000451900807773), + ("נאור", 0.001242727221375), + ("נבו", 0.003036208552223), + ("נדב", 0.006128904705417), + ("נהוראי", 0.00667965881489), + ("נוה", 0.003135061853923), + ("נועם", 0.019968366943456), + ("נח", 0.000466022708016), + ("נחמן", 0.002753770547365), + ("נטע", 0.001002654917246), + ("ניב", 0.00087555781506), + ("ניל", 0.000282438004858), + ("ניסים", 0.000423657007287), + ("ניצן", 0.00043777890753), + ("ניר", 0.000946167316274), + ("ניתאי", 0.005747613398859), + ("נפתלי", 0.001878212732305), + ("נריה", 0.002796136248094), + ("נתן", 0.004589617578941), + ("נתנאל", 0.006425464610518), + ("סאלח", 0.001186239620403), + ("סארי", 0.000169462802915), + ("סהר", 0.001934700333277), + ("סולימאן", 0.000282438004858), + ("סולימאן", 0.001779359430605), + ("סיני", 0.000508388408744), + ("סמיר", 0.000155340902672), + ("סער", 0.000621363610687), + ("סתיו", 0.000466022708016), + ("עבד", 0.006623171213919), + ("עבדאללה", 0.002005309834491), + ("עברי", 0.001369824323561), + ("עדי", 0.001426311924533), + ("עדיאל", 0.000917923515788), + ("עדן", 0.000691973111902), + ("עובדיה", 0.001496921425747), + ("עוז", 0.002753770547365), + ("עומר", 0.007922386036265), + ("עומר", 0.009984183471728), + ("עומרי", 0.000240072304129), + ("עומרי", 0.004857933683556), + ("עופר", 0.000663729311416), + ("עופרי", 0.00097441111676), + ("עידו", 0.01228605321132), + ("עידן", 0.004151838671412), + ("עילאי", 0.007781167033836), + ("עילי", 0.001468677625261), + ("עלי", 0.006001807603231), + ("עמיחי", 0.001143873919675), + ("עמית", 0.00809184883918), + ("עמנואל", 0.00097441111676), + ("ענבר", 0.000409535107044), + ("עקיבא", 0.001101508218946), + ("ערן", 0.000381291306558), + ("עתי", 0.001482799525504), + ("פאר", 0.000649607411173), + ("פלג", 0.00160989662769), + ("פנחס", 0.001722871829633), + ("צבי", 0.002598429644693), + ("צור", 0.000847314014574), + ("קדם", 0.000889679715302), + ("קוסאי", 0.001482799525504), + ("קורן", 0.000903801615545), + ("ראובן", 0.001242727221375), + ("ראם", 0.000225950403886), + ("ראם", 0.00151104332599), + ("רביד", 0.000395413206801), + ("רואי", 0.00117211772016), + ("רוי", 0.002203016437892), + ("רום", 0.002654917245665), + ("רון", 0.002626673445179), + ("רוני", 0.000494266508501), + ("רועי", 0.005055640286957), + ("רותם", 0.001991187934248), + ("רז", 0.001440433824775), + ("ריאן", 0.000296559905101), + ("ריאן", 0.001525165226233), + ("ריף", 0.000578997909959), + ("רם", 0.000183584703158), + ("רן", 0.000621363610687), + ("רני", 0.001157995819918), + ("רעי", 0.000381291306558), + ("רפאל", 0.007710557532622), + ("שאול", 0.000804948313845), + ("שגב", 0.000508388408744), + ("שגיא", 0.001285092922104), + ("שוהם", 0.000946167316274), + ("שון", 0.001525165226233), + ("שחר", 0.003855278766311), + ("שי", 0.002541942043721), + ("שילה", 0.002824380048579), + ("שיר", 0.000480144608258), + ("שלו", 0.001468677625261), + ("שלום", 0.002880867649551), + ("שליו", 0.001751115630119), + ("שלמה", 0.007526972829464), + ("שמואל", 0.010294865277072), + ("שמחה", 0.001299214822347), + ("שמעון", 0.007767045133593), + ("שניאור", 0.001383946223804), + ("שקד", 0.001736993729876), + ("שרבל", 0.000508388408744), + ("תבור", 0.000409535107044), + ("תום", 0.001962944133763), + ("תומר", 0.002669039145907), + ("תיים", 0.000211828503643), + ("תמיר", 0.000720216912388), + )) + + first_names = first_names_male.copy() + first_names.update(first_names_female) + + # Top 500 most common surenames in Israel + # http://www.ynet.co.il/articles/0,7340,L-4477619,00.html + last_names = OrderedDict(( + ("אבו אל היג'א", 0.0004185954), + ("אבוטבול", 0.0003645757), + ("אבו טיר", 0.0003470250), + ("אבו כף", 0.0005751840), + ("אבו ליל", 0.0005678902), + ("אבו מוך", 0.0003430362), + ("אבו סאלח", 0.0004113016), + ("אבו סנינה", 0.0003522675), + ("אבו עראר", 0.0005006506), + ("אבו ראס", 0.0003642338), + ("אבו ריא", 0.0002835462), + ("אבו רמילה", 0.0003918135), + ("אביב", 0.0003988794), + ("אביטבול", 0.0004328411), + ("אביטל", 0.0004519873), + ("אביטן", 0.0005171756), + ("אבני", 0.0003463412), + ("אבראהים", 0.0006235054), + ("אברגל", 0.0003034902), + ("אברהם", 0.0021808444), + ("אברהמי", 0.0004725011), + ("אברמוב", 0.0008053944), + ("אברמוביץ", 0.0004369438), + ("אגבאריה", 0.0020710956), + ("אדלר", 0.0005522770), + ("אדרי", 0.0013994967), + ("אהרון", 0.0005232157), + ("אהרוני", 0.0006942780), + ("אהרן", 0.0005895437), + ("אוזן", 0.0004632699), + ("אוחיון", 0.0016352914), + ("אוחנה", 0.0012190893), + ("אופיר", 0.0003285626), + ("אור", 0.0002745430), + ("אורן", 0.0006651028), + ("אזברגה", 0.0004979154), + ("אזולאי", 0.0019325135), + ("אחמד", 0.0003112399), + ("אטיאס", 0.0010128117), + ("אטרש", 0.0003216107), + ("איבגי", 0.0003057695), + ("איוב", 0.0003391614), + ("אילוז", 0.0004629280), + ("איסקוב", 0.0003056556), + ("איפרגן", 0.0003224085), + ("אלבז", 0.0010615889), + ("אלון", 0.0009669975), + ("אלוני", 0.0003267392), + ("אלוש", 0.0002914099), + ("אלטורי", 0.0002840021), + ("אליאס", 0.0005734745), + ("אליהו", 0.0010782279), + ("אלימלך", 0.0004399069), + ("אלמוג", 0.0003135192), + ("אלמלח", 0.0003681087), + ("אלנבארי", 0.0002708961), + ("אלסייד", 0.0003250297), + ("אלפסי", 0.0005746142), + ("אלקובי", 0.0004033240), + ("אלקיים", 0.0004139228), + ("אלקרינאוי", 0.0003684506), + ("אמארה", 0.0004154044), + ("אמיר", 0.0003546607), + ("אמסלם", 0.0008538297), + ("אמר", 0.0002875350), + ("אנגל", 0.0003220666), + ("אסדי", 0.0003464552), + ("אסולין", 0.0009318961), + ("אסעד", 0.0002932333), + ("אסרף", 0.0006086899), + ("אפשטיין", 0.0003689064), + ("ארביב", 0.0004209887), + ("ארז", 0.0003954604), + ("ארליך", 0.0002710100), + ("אשכנזי", 0.0012333350), + ("אשר", 0.0004242937), + ("בדארנה", 0.0004214445), + ("בדיר", 0.0002950568), + ("בדר", 0.0002760245), + ("בדראן", 0.0003989933), + ("בוזגלו", 0.0004477706), + ("בוחבוט", 0.0003604730), + ("בוסקילה", 0.0004288523), + ("ביטון", 0.0030260127), + ("בכר", 0.0010549789), + ("בלום", 0.0003422385), + ("בן דוד", 0.0014205803), + ("בן הרוש", 0.0003634361), + ("בן חיים", 0.0004988271), + ("בן חמו", 0.0009408994), + ("בן יוסף", 0.0003320956), + ("בן לולו", 0.0003196733), + ("בן משה", 0.0004303338), + ("בן סימון", 0.0004376276), + ("בן עזרא", 0.0003485066), + ("בן עמי", 0.0004467449), + ("בן שבת", 0.0002754547), + ("בן שושן", 0.0006107413), + ("בנימין", 0.0006523387), + ("בסול", 0.0002932333), + ("בצלאל", 0.0003156845), + ("בקר", 0.0003121516), + ("בר", 0.0011435301), + ("בראון", 0.0003769980), + ("ברגר", 0.0005738164), + ("ברדה", 0.0003977397), + ("ברוך", 0.0008745715), + ("ברזילי", 0.0003418966), + ("ברכה", 0.0004992830), + ("ברמן", 0.0003711857), + ("ברנס", 0.0002786457), + ("ברנשטיין", 0.0004130111), + ("ברק", 0.0006729665), + ("ברקוביץ", 0.0006409421), + ("בשארה", 0.0003734650), + ("בשיר", 0.0002883328), + ("גאבר", 0.0005383732), + ("גאנם", 0.0005768935), + ("גבאי", 0.0016158033), + ("גבארה", 0.0002936892), + ("ג'בארין", 0.0016596800), + ("גבע", 0.0002820647), + ("גדיר", 0.0004091363), + ("גואטה", 0.0005055511), + ("גוטליב", 0.0004181395), + ("גוטמן", 0.0005919370), + ("גולאני", 0.0002900423), + ("גולדברג", 0.0008165630), + ("גולדמן", 0.0005264068), + ("גולדנברג", 0.0004056033), + ("גולדשטיין", 0.0008946294), + ("גולן", 0.0011855834), + ("גור", 0.0003531792), + ("גורדון", 0.0002858255), + ("גורן", 0.0003817845), + ("גיל", 0.0002803552), + ("גל", 0.0006617978), + ("גליק", 0.0003310699), + ("גלעד", 0.0002821787), + ("גמליאל", 0.0003642338), + ("גנאים", 0.0005610523), + ("גרבאן", 0.0003214968), + ("גרוס", 0.0006403723), + ("גרוסמן", 0.0003800750), + ("גרין", 0.0003725533), + ("גרינברג", 0.0009478513), + ("דאוד", 0.0003074790), + ("דביר", 0.0004175697), + ("דבש", 0.0002795574), + ("דגן", 0.0005030438), + ("דדון", 0.0007198063), + ("דהאן", 0.0003006411), + ("דהן", 0.0022558337), + ("דהרי", 0.0002755687), + ("דוד", 0.0016551214), + ("דוידוב", 0.0007180968), + ("דויטש", 0.0003989933), + ("דורון", 0.0003173940), + ("דיאב", 0.0004985992), + ("דיין", 0.0010681989), + ("דמרי", 0.0003776818), + ("דניאל", 0.0007061304), + ("דנינו", 0.0004338668), + ("דקל", 0.0003405290), + ("דראושה", 0.0005869225), + ("דרור", 0.0004386533), + ("דרורי", 0.0003034902), + ("דרעי", 0.0005292559), + ("הדר", 0.0003775678), + ("הופמן", 0.0003833800), + ("הורביץ", 0.0002907261), + ("הורוביץ", 0.0003901040), + ("הייב", 0.0005921649), + ("הירש", 0.0003818985), + ("הלוי", 0.0005028159), + ("הלל", 0.0003923833), + ("הראל", 0.0007852225), + ("הרוש", 0.0006835652), + ("הררי", 0.0004925590), + ("הרשקוביץ", 0.0006489197), + ("וולף", 0.0003986514), + ("ווקנין", 0.0003724394), + ("וייס", 0.0008692151), + ("וינברג", 0.0003423525), + ("וינר", 0.0003119237), + ("ויס", 0.0003285626), + ("ויסמן", 0.0002757966), + ("ויצמן", 0.0005245833), + ("וקנין", 0.0009326939), + ("ותד", 0.0003587635), + ("זגורי", 0.0003629802), + ("זהבי", 0.0004176837), + ("זהר", 0.0003346028), + ("זוהר", 0.0005770075), + ("זועבי", 0.0012752743), + ("זידאן", 0.0005832756), + ("זיו", 0.0005641294), + ("זילברמן", 0.0004159742), + ("זינגר", 0.0003651456), + ("זכריה", 0.0003278788), + ("זמיר", 0.0003829242), + ("חאג'", 0.0003408709), + ("חאג' יחיא", 0.0003617266), + ("חאג יחיא", 0.0003882806), + ("חביב", 0.0004484544), + ("חביבאללה", 0.0004379695), + ("חג'אזי", 0.0005489720), + ("חדאד", 0.0005056651), + ("חדד", 0.0016215016), + ("חוג'יראת", 0.0005729047), + ("חוסין", 0.0003514697), + ("חורי", 0.0005095399), + ("ח'ורי", 0.0005477183), + ("חזן", 0.0012562420), + ("חטיב", 0.0003936369), + ("ח'טיב", 0.0015462843), + ("חי", 0.0003430362), + ("חיון", 0.0006327366), + ("חיים", 0.0007797522), + ("חיימוב", 0.0004451494), + ("ח'לאילה", 0.0004562040), + ("חלבי", 0.0007260744), + ("ח'ליל", 0.0003452016), + ("חלפון", 0.0003063393), + ("חמדאן", 0.0004278266), + ("חמו", 0.0004457192), + ("חמוד", 0.0003670830), + ("חן", 0.0013292939), + ("חסון", 0.0007411178), + ("חסן", 0.0008594141), + ("טאהא", 0.0008251104), + ("טוויל", 0.0003101002), + ("טויטו", 0.0004448075), + ("טולדנו", 0.0003334631), + ("טייב", 0.0002708961), + ("טל", 0.0013330548), + ("יאסין", 0.0006589487), + ("יהודה", 0.0006080061), + ("יונה", 0.0004435538), + ("יונס", 0.0004857211), + ("יוסופוב", 0.0004702218), + ("יוסף", 0.0018478371), + ("יחזקאל", 0.0006923406), + ("יחיא", 0.0003449737), + ("ימין", 0.0002870792), + ("יעקב", 0.0011190275), + ("יעקבי", 0.0004216725), + ("יעקובוב", 0.0005550121), + ("יעקובוביץ", 0.0002968802), + ("יעקובי", 0.0003576238), + ("יפה", 0.0003034902), + ("יפרח", 0.0008173608), + ("יפת", 0.0003267392), + ("יצחק", 0.0011618786), + ("יצחקי", 0.0007125125), + ("ירושלמי", 0.0002743150), + ("ישראל", 0.0007288096), + ("ישראלי", 0.0007002042), + ("כהן", 0.0193348220), + ("כהנא", 0.0003551166), + ("כחלון", 0.0004289663), + ("כספי", 0.0003211549), + ("כץ", 0.0018738212), + ("כרמי", 0.0003342609), + ("לב", 0.0007200342), + ("לביא", 0.0010139513), + ("להב", 0.0003570540), + ("לוגסי", 0.0005278883), + ("לוי", 0.0111999624), + ("לוין", 0.0013806924), + ("ליבוביץ", 0.0005249252), + ("ליברמן", 0.0005201387), + ("ליפשיץ", 0.0005541004), + ("לנדאו", 0.0003262833), + ("לרנר", 0.0003750606), + ("מאור", 0.0003620685), + ("מאיר", 0.0009089891), + ("מדר", 0.0003455435), + ("מוזס", 0.0003091885), + ("מויאל", 0.0005749561), + ("מוסא", 0.0004717033), + ("מוסקוביץ", 0.0003259414), + ("מועלם", 0.0005220761), + ("מור", 0.0011423905), + ("מוראד", 0.0002749988), + ("מושקוביץ", 0.0003134052), + ("מזור", 0.0003338050), + ("מזרחי", 0.0033303007), + ("מחאג'נה", 0.0012883803), + ("מחאמיד", 0.0018262976), + ("מחמוד", 0.0002998433), + ("מטר", 0.0003922694), + ("מיכאלי", 0.0005314213), + ("מילר", 0.0006881239), + ("מימון", 0.0009289330), + ("מכלוף", 0.0003361983), + ("מלול", 0.0006253289), + ("מלכה", 0.0019342230), + ("מלמד", 0.0004647514), + ("ממן", 0.0009764567), + ("מנדל", 0.0002873071), + ("מנחם", 0.0004933568), + ("מנסור", 0.0008198680), + ("מנצור", 0.0003814426), + ("מנשה", 0.0004680564), + ("מסארוה", 0.0008443706), + ("מסארווה", 0.0002802412), + ("מסיקה", 0.0003017807), + ("מסרי", 0.0005342704), + ("מרגלית", 0.0002824066), + ("מרדכי", 0.0004645235), + ("מרום", 0.0003129493), + ("מרעי", 0.0005625339), + ("מרציאנו", 0.0003146588), + ("מרקוביץ", 0.0004444656), + ("משה", 0.0012522532), + ("משולם", 0.0003482787), + ("משיח", 0.0003645757), + ("נאור", 0.0003116957), + ("נאסר", 0.0005325609), + ("נבון", 0.0002796714), + ("נגר", 0.0006358137), + ("נוימן", 0.0003699321), + ("נחום", 0.0010065436), + ("נחמיאס", 0.0003637780), + ("נחמני", 0.0004122133), + ("ניסן", 0.0002992735), + ("ניר", 0.0003601311), + ("נסאר", 0.0006750178), + ("נסים", 0.0005396268), + ("נעים", 0.0006975830), + ("נתן", 0.0003872549), + ("נתשה", 0.0003447457), + ("סאלח", 0.0005592289), + ("סאלם", 0.0002705542), + ("סבאג", 0.0002772781), + ("סבג", 0.0008170189), + ("סבח", 0.0002966523), + ("סבן", 0.0004323852), + ("סגל", 0.0012155563), + ("סואעד", 0.0012098581), + ("סויסה", 0.0010544091), + ("סולומון", 0.0006611140), + ("סופר", 0.0007159315), + ("סימן טוב", 0.0002800133), + ("סיני", 0.0002869652), + ("סלאמה", 0.0008069899), + ("סלומון", 0.0004725011), + ("סלימאן", 0.0006335344), + ("סלמאן", 0.0002842300), + ("סלע", 0.0006118809), + ("סעד", 0.0004322713), + ("סעדה", 0.0003199012), + ("סעדי", 0.0004304478), + ("סעיד", 0.0005107935), + ("ספיר", 0.0004119854), + ("סרוסי", 0.0003727812), + ("סרור", 0.0003260554), + ("סרחאן", 0.0004681704), + ("סרסור", 0.0002731754), + ("עאזם", 0.0003548887), + ("עאמר", 0.0005807683), + ("עאסלה", 0.0004797949), + ("עבאס", 0.0005121611), + ("עבאסי", 0.0003230923), + ("עבדאללה", 0.0004449214), + ("עבד אל קאדר", 0.0002770502), + ("עבוד", 0.0003461133), + ("עדוי", 0.0003625244), + ("עואד", 0.0005034997), + ("עואודה", 0.0003056556), + ("עובד", 0.0003107840), + ("עובדיה", 0.0009488770), + ("עודה", 0.0006648749), + ("עווד", 0.0002817228), + ("עוז", 0.0003095304), + ("עוזרי", 0.0003601311), + ("עומר", 0.0004549504), + ("עזאם", 0.0003739209), + ("עזר", 0.0002926635), + ("עזרא", 0.0008366210), + ("עזרן", 0.0003022366), + ("עטיה", 0.0005034997), + ("עיסא", 0.0006968992), + ("עלי", 0.0005897716), + ("עליאן", 0.0004195071), + ("עמאש", 0.0007673299), + ("עמירה", 0.0002892445), + ("עמית", 0.0002748849), + ("עמר", 0.0016504488), + ("עמרם", 0.0003889644), + ("עתאמנה", 0.0002793295), + ("פאר", 0.0003968280), + ("פדידה", 0.0003054276), + ("פוגל", 0.0002887887), + ("פולק", 0.0004996249), + ("פוקס", 0.0005276604), + ("פורמן", 0.0002810390), + ("פורת", 0.0004169999), + ("פז", 0.0004270288), + ("פחימה", 0.0003316397), + ("פינטו", 0.0004175697), + ("פינקלשטיין", 0.0002802412), + ("פישמן", 0.0003597892), + ("פישר", 0.0005738164), + ("פלג", 0.0005474904), + ("פלד", 0.0006111971), + ("פלדמן", 0.0009019232), + ("פנחס", 0.0004459471), + ("פרי", 0.0004665749), + ("פריד", 0.0004208747), + ("פרידמן", 0.0021022082), + ("פרנקל", 0.0005776913), + ("פרץ", 0.0032042548), + ("פרקש", 0.0002779619), + ("צברי", 0.0004600788), + ("צדוק", 0.0005442994), + ("צור", 0.0007644808), + ("צמח", 0.0003528373), + ("צרפתי", 0.0006094877), + ("קאופמן", 0.0004456052), + ("קאסם", 0.0004601928), + ("קדוש", 0.0008008358), + ("קוגן", 0.0005499976), + ("קורן", 0.0007404340), + ("קינן", 0.0003089606), + ("קליין", 0.0013318012), + ("קמחי", 0.0003147728), + ("קפלן", 0.0006849328), + ("קרמר", 0.0003504440), + ("קרן", 0.0004678285), + ("ראובן", 0.0005415642), + ("רביבו", 0.0004157463), + ("רבינוביץ", 0.0007378128), + ("רגב", 0.0003989933), + ("רובין", 0.0008423192), + ("רובינשטיין", 0.0004026402), + ("רוזן", 0.0006486918), + ("רוזנברג", 0.0010279691), + ("רוזנטל", 0.0004416164), + ("רוזנפלד", 0.0005364357), + ("רוט", 0.0005014483), + ("רוטמן", 0.0003188756), + ("רוטנברג", 0.0003187616), + ("רון", 0.0003961442), + ("רונן", 0.0003698181), + ("רז", 0.0007521725), + ("רזניק", 0.0003017807), + ("רחמים", 0.0006912009), + ("ריאן", 0.0003526093), + ("רפאל", 0.0002712380), + ("שאהין", 0.0004059452), + ("שאול", 0.0004735268), + ("שביט", 0.0003130633), + ("שבתאי", 0.0003979676), + ("שגב", 0.0004646375), + ("שגיא", 0.0003531792), + ("שדה", 0.0004417304), + ("שוויקי", 0.0005047533), + ("שוורץ", 0.0007591244), + ("שולמן", 0.0002952847), + ("שוקרון", 0.0005164918), + ("שור", 0.0003898761), + ("שורץ", 0.0009575384), + ("שושן", 0.0006843630), + ("שחאדה", 0.0007848806), + ("שחר", 0.0009679092), + ("שטיין", 0.0004781994), + ("שטיינברג", 0.0003252576), + ("שטרית", 0.0005996866), + ("שטרן", 0.0009997056), + ("שי", 0.0003206990), + ("שיבלי", 0.0003172800), + ("שיטרית", 0.0004501638), + ("שכטר", 0.0005425899), + ("שלבי", 0.0003711857), + ("שלו", 0.0005757539), + ("שלום", 0.0011007931), + ("שלמה", 0.0004264590), + ("שם טוב", 0.0004130111), + ("שמואל", 0.0006326227), + ("שמואלי", 0.0004719313), + ("שמיר", 0.0004115295), + ("שמעון", 0.0003597892), + ("שמעוני", 0.0005021321), + ("שמש", 0.0010336674), + ("שני", 0.0004502778), + ("שניידר", 0.0004392232), + ("שפירא", 0.0013031958), + ("שפר", 0.0003430362), + ("שקד", 0.0004860630), + ("שרביט", 0.0003365402), + ("שרון", 0.0007520585), + ("שריקי", 0.0003716416), + ("שרעבי", 0.0010047201), + ("שרף", 0.0003082768), + ("ששון", 0.0009562848), + ("תורג'מן", 0.0004513035), + ("תורגמן", 0.0005209364), + ("תמיר", 0.0002928914), + + )) diff --git a/src/faker/providers/hi_IN/person.py b/src/libs/faker/providers/person/hi_IN/__init__.py similarity index 98% rename from src/faker/providers/hi_IN/person.py rename to src/libs/faker/providers/person/hi_IN/__init__.py index 7a0894a..3ce7e89 100644 --- a/src/faker/providers/hi_IN/person.py +++ b/src/libs/faker/providers/person/hi_IN/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): diff --git a/src/libs/faker/providers/person/hr_HR/__init__.py b/src/libs/faker/providers/person/hr_HR/__init__.py new file mode 100644 index 0000000..1e60eac --- /dev/null +++ b/src/libs/faker/providers/person/hr_HR/__init__.py @@ -0,0 +1,180 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ['{{first_name}} {{last_name}}', ] + + first_names_male = [ + "Aldo", "Alen", "Andrija", "Ante", "Anto", "Anton", "Antonio", + "Antun", "Boris", "Božo", "Branko", "Bruno", "Dalibor", "Damir", + "Danijel", "Dario", "Darko", "David", "Davor", "Dejan", "Denis", + "Dino", "Domagoj", "Dominik", "Dragan", "Dragutin", "Dražen", + "Duje", "Dušan", "Elvis", "Erik", "Filip", "Fran", "Franjo", + "Goran", "Hrvoje", "Igor", "Ilija", "Ivan", "Ivica", "Ivo", + "Jakov", "Janko", "Josip", "Joso", "Jozo", "Joško", "Juraj", + "Jure", "Karlo", "Kristijan", "Leon", "Lovre", "Lovro", "Luka", + "Marijan", "Marin", "Mario", "Marko", "Martin", "Mate", "Matej", + "Mateo", "Matija", "Mato", "Mihael", "Mijo", "Milan", "Mile", + "Mirko", "Miroslav", "Mislav", "Mladen", "Nenad", "Niko", + "Nikola", "Nikša", "Patrik", "Pavao", "Pero", "Petar", "Robert", + "Roko", "Romano", "Rudolf", "Saša", "Siniša", "Slavko", "Stjepan", + "Tomislav", "Tomo", "Toni", "Valter", "Vedran", "Viktor", + "Vjekoslav", "Vladimir", "Vlado", "Zdravko", "Zlatko", "Zoran", + "Zvonko", "Đuro", "Šime", "Željko", + ] + + first_names_female = [ + "Albina", "Ana", "Andrea", "Ane", "Anica", "Anita", "Anka", + "Ankica", "Antonija", "Anđa", "Anđela", "Bara", "Barbara", + "Barica", "Biljana", "Biserka", "Božena", "Božica", "Branka", + "Danica", "Danijela", "Dora", "Draga", "Dragica", "Elizabeta", + "Ema", "Eva", "Franciska", "Fuma", "Gordana", "Hana", "Ika", + "Iva", "Ivana", "Ivanka", "Ivka", "Jadranka", "Jana", "Janja", + "Jasminka", "Jasna", "Jele", "Jelena", "Josipa", "Julijana", + "Karla", "Kata", "Katarina", "Kate", "Katica", "Kristina", "Lana", + "Lara", "Laura", "Lea", "Lidija", "Ljiljana", "Ljubica", "Lorena", + "Lucija", "Maja", "Manda", "Mara", "Mare", "Maria", "Marica", + "Marija", "Marijana", "Marina", "Marta", "Martina", "Matea", + "Mateja", "Matija", "Mia", "Milena", "Milica", "Milka", "Mira", + "Mirjana", "Nada", "Nataša", "Nevenka", "Nika", "Nikolina", + "Nina", "Petra", "Renata", "Rozalija", "Ruža", "Ružica", + "Sandra", "Sanja", "Sara", "Slavica", "Snježana", "Stana", + "Suzana", "Tatjana", "Tea", "Terezija", "Valentina", "Vera", + "Veronika", "Vesna", "Zdenka", "Zora", "Zorka", "Đurđica", + "Štefanija", "Štefica", "Željka", + ] + + first_names = first_names_female + first_names_male + last_names = [ + "Abičić", "Abramović", "Adžijević", "Akmačić", "Alković", + "Amanović", "Amidžić", "Andrašek", "Andrijašević", "Andrijević", + "Aničić", "Antić", "Antolković", "Antonić", "Babić", "Bajan", + "Baksa", "Balatinac", "Balinčić", "Balić", "Baljak", "Ban", + "Baničević", "Banko", "Banovac", "Barac", "Barać", "Barbieri", + "Barbir", "Barbić", "Barešić", "Barić", "Baričević", "Barišić", + "Barković", "Barnaba", "Barušić", "Batrac", "Batrnek", "Bazjak", + "Bačak", "Bačić", "Bašić", "Bašnec", "Bebić", "Begonja", "Beletić", + "Belošević", "Benić", "Benčić", "Beraković", "Bernardić", "Bertoša", + "Bezić", "Bijelić", "Bingula", "Birkić", "Birtić", "Bićanić", + "Bičak", "Bičanić", "Bjeliš", "Blagaić", "Blažek", "Blažević", + "Blažičko", "Boban", "Bobanović", "Bogadi", "Bogdan", "Bogović", + "Bojanić", "Boljkovac", "Bolčević", "Borak", "Borojević", "Borošak", + "Bosilj", "Botica", "Botić", "Bošnjak", "Bošnjaković", "Božanić", + "Božanović", "Božiković", "Božić", "Božičević", "Božičković", + "Bradić", "Brajković", "Bralić", "Brandić", "Branković", "Bračun", + "Brcko", "Brezjan", "Britvec", "Brlas", "Brlek", "Brletić", "Bukvić", + "Buljan", "Bungić", "Bunić", "Bunčić", "Burić", "Burčul", "Buršić", + "Butković", "Buzov", "Bučanac", "Bučar", "Bušljeta", "Cafuk", "Car", + "Carić", "Cestarić", "Ciganović", "Cik", "Cindrić", "Colić", "Crevar", + "Crneković", "Crnković", "Cukon", "Culi", "Cvenić", "Cvetković", + "Cvetnić", "Cvitan", "Cvrtila", "Dabo", "Damijanić", "Damjanović", + "Darojković", "Dautanec", "Dautović", "Debelić", "Derežić", "Deže", + "Didović", "Dizdar", "Dobrić", "Dolinar", "Dolić", "Dominiković", + "Dominković", "Dončević", "Dragičević", "Dragobratović", "Dragojević", + "Drakulić", "Drandić", "Dražić", "Dretvić", "Dubovečak", "Dujmović", + "Dukić", "Duvančić", "Dvojak", "Džapo", "Erceg", "Ercegović", + "Ergotić", "Eršek", "Eterović", "Fabijanić", "Ferenac", "Filar", + "Filipović", "Filipčić", "Flego", "Forjan", "Franić", "Franičević", + "Franjić", "Franušić", "Friščić", "Frketić", "Fuček", "Gabud", + "Galešić", "Galić", "Galović", "Gegić", "Gelemanović", "Glasnović", + "Glavan", "Glavor", "Gligora", "Godinić", "Golubić", "Gotić", + "Govorčinović", "Gracin", "Grba", "Grbac", "Gredičak", "Gregov", + "Grgić", "Grgurević", "Grgurić", "Grgurovac", "Grubišić", "Gržetić", + "Gržinčić", "Guberović", "Gudelj", "Gulan", "Guštin", "Hadrović", + "Hadžić", "Halambek", "Halapir", "Hanžek", "Harapin", "Hardi", + "Herceg", "Herout", "Hećimović", "Hinić", "Hodak", "Horak", "Horvat", + "Horvatek", "Horvatinec", "Horvatić", "Hrabar", "Hranić", "Hranj", + "Hrastinski", "Hren", "Hrvojić", "Hršak", "Hrženjak", "Huljev", + "Husnjak", "Ignac", "Ilijić", "Ilinović", "Ilić", "Ivandić", + "Ivanović", "Ivančan", "Ivšić", "Jagarinec", "Jagečić", "Jakopec", + "Jakopović", "Jakovac", "Jaković", "Jakovljević", "Jakupić", "Jakuš", + "Jasprica", "Jelavić", "Jelić", "Jemrić", "Jerković", "Jonjić", + "Josipović", "Jovanovac", "Jovanović", "Jović", "Jozić", "Jugovac", + "Jukić", "Juretić", "Jureško", "Jurić", "Jurišić", "Jurjević", + "Jurković", "Jurlina", "Jurčić", "Kadija", "Kahlina", "Kalanjoš", + "Kalazić", "Kaniški", "Karagić", "Karamarko", "Karlović", "Karmelić", + "Karuza", "Katić", "Kauzlarić", "Keleković", "Kelečić", "Kelić", + "Kereković", "Kevo", "Kinkela", "Kirinčić", "Klanac", "Klarin", + "Klarić", "Klasić", "Kligl", "Knezović", "Knežević", "Kocijančić", + "Kokanović", "Kokorić", "Kolarec", "Kolega", "Kolić", "Komar", + "Komljenović", "Kopjar", "Kos", "Kosanović", "Kosić", "Kostanić", + "Kostelac", "Kovač", "Kovaček", "Kovačević", "Kovačić", "Koški", + "Koščević", "Krajcar", "Kralj", "Kraljević", "Kraljić", "Kramarić", + "Kresonja", "Križan", "Krpan", "Krznarić", "Krčelić", "Kršanac", + "Krželj", "Kujundžić", "Kukučka", "Kunac", "Kupsjak", "Kurtoić", + "Kuveždić", "Kuzmić", "Kučić", "Kuščević", "Labaš", "Labinjan", + "Ladavac", "Lakošeljac", "Lasić", "Lazar", "Legović", "Lelas", + "Lenić", "Lešić", "Lešković", "Leščić", "Liber", "Licul", "Liović", + "Lisica", "Ljubetić", "Ljubić", "Ljubičić", "Lojen", "Lorencin", + "Lovrić", "Lucić", "Lukinić", "Lukić", "Lukša", "Lukšić", "Lučić", + "Macan", "Madunić", "Magić", "Mahnet", "Majdenić", "Majstorović", + "Makovac", "Maletić", "Malnar", "Maloča", "Mamić", "Mamula", "Maras", + "Marasović", "Maraš", "Mardešić", "Maretić", "Marijanović", "Marin", + "Marinković", "Marinović", "Marić", "Maričević", "Marjanović", + "Markanjević", "Markovac", "Marković", "Markuš", "Martinić", + "Martinović", "Martinčević", "Martić", "Marušić", "Maršić", "Maržić", + "Matahlija", "Matana", "Matas", "Mateša", "Matijaš", "Matijević", + "Matić", "Matko", "Matković", "Matokanović", "Matovina", "Matošević", + "Matulin", "Matulić", "Mavra", "Maćešić", "Medač", "Medić", "Medved", + "Meić", "Merkaš", "Mesarić", "Mesić", "Mihalić", "Mihaljević", + "Mihelčić", "Mihić", "Mikić", "Miklečić", "Mikulandra", "Mikulec", + "Mikulčić", "Milas", "Milatić", "Miletić", "Milevoj", "Milina", + "Miličić", "Miloslavić", "Milotić", "Milovac", "Mimica", "Miočić", + "Mirosavljević", "Mirt", "Mičetić", "Mišak", "Miše", "Mišković", + "Modrić", "Mofardin", "Morić", "Moscarda", "Moslavac", "Močibob", + "Mraović", "Mudri", "Mudronja", "Mustapić", "Mustač", "Mušćet", + "Mužina", "Mužić", "Nakić", "Načinović", "Nedić", "Nikolić", "Nimac", + "Nišević", "Nižetić", "Norac", "Novak", "Novosel", "Obradović", + "Obratov", "Odobašić", "Orbanić", "Orešković", "Orlić", "Orlović", + "Oršolić", "Oršoš", "Oršulić", "Ozimec", "Pajur", "Palić", "Pamić", + "Pandurić", "Papak", "Paparić", "Paradi", "Pavelić", "Pavin", "Pavić", + "Pavičić", "Pavković", "Pavlović", "Pecotić", "Pedišić", "Peharda", + "Penić", "Perak", "Perić", "Perišić", "Perkov", "Perković", "Peroš", + "Peruško", "Perčić", "Petek", "Peterlik", "Petrić", "Petričević", + "Petrović", "Pečur", "Peša", "Pešić", "Pikec", "Piljek", "Pintarić", + "Plantak", "Plantek", "Plažanin", "Pleše", "Pokas", "Pokos", "Polić", + "Poljak", "Polonijo", "Polović", "Pongrac", "Popović", "Poropat", + "Poslon", "Pozder", "Požega", "Predovan", "Prelec", "Preočanin", + "Pribanić", "Priselac", "Prpić", "Prskalo", "Prtenjača", "Puharić", + "Puljiz", "Putinja", "Puškarić", "Radelić", "Radin", "Radinović", + "Radić", "Radman", "Radojković", "Radolović", "Radović", "Radočaj", + "Radošević", "Raguž", "Rahija", "Rajn", "Rajčić", "Rakela", "Rakuljić", + "Raljević", "Raspor", "Rastija", "Rađenović", "Rašeta", "Rašić", + "Ražov", "Rebić", "Rendulić", "Resanović", "Ribarić", "Ribić", + "Ribičić", "Rijetković", "Risek", "Ritoša", "Ričko", "Roca", "Roce", + "Rogošić", "Rojnić", "Roso", "Rubeša", "Rubinić", "Rukavina", "Rumora", + "Sabljak", "Sabol", "Sakač", "Salopek", "Sardelić", "Sedlar", + "Semialjac", "Seničić", "Seršić", "Sever", "Sikirić", "Simić", + "Sinožić", "Sirotić", "Skupnjak", "Sladonja", "Slavica", "Smoković", + "Smolić", "Sobota", "Sokač", "Sokić", "Sokol", "Soldo", "Solomun", + "Sorić", "Sošić", "Sršen", "Stanić", "Staničić", "Stančin", + "Starčević", "Stipanović", "Stiperski", "Stojanov", "Stojnić", + "Stojčević", "Stolnik", "Stošić", "Stražičić", "Strinavić", "Stupalo", + "Surać", "Svetličić", "Tepeš", "Terlević", "Terzić", "Tešija", + "Tisaj", "Toić", "Tolj", "Tomić", "Tomičić", "Tomljanović", "Tonc", + "Topić", "Totić", "Trbović", "Trgovčić", "Triplat", "Trnski", + "Trutanić", "Tudić", "Tudor", "Tuksar", "Turina", "Turk", "Turudić", + "Turčinov", "Tuđa", "Tušek", "Tuškan", "Ugrinić", "Ukić", "Urlić", + "Ušić", "Vaci", "Valentić", "Valjetić", "Varga", "Veić", "Vela", + "Vidaković", "Vidas", "Vidov", "Vidović", "Viljevac", "Vincetić", + "Vitasović", "Vižintin", "Vladislavić", "Vlašić", "Vojković", + "Volarević", "Volarić", "Vorkapić", "Vozila", "Vrabelj", "Vranić", + "Vrban", "Vretenar", "Vrhovec", "Vugdelija", "Vugec", "Vuk", + "Vukman", "Vukobratović", "Vuković", "Vukušić", "Vuljak", "Vučetić", + "Vučin", "Vučković", "Zakinja", "Zanoški", "Zeba", "Zebec", "Zelić", + "Zgorelec", "Zmaić", "Zrilić", "Zrinski", "Zubčić", "Ćorić", "Ćosić", + "Ćurić", "Čagalj", "Čargonja", "Čizmić", "Čiš", "Čižmešija", "Čop", + "Čotić", "Čović", "Čubrić", "Čudić", "Čukman", "Čulina", "Čuljak", + "Čupić", "Čuček", "Đurašević", "Đurinić", "Šalić", "Šantić", "Šargač", + "Šarić", "Šarlija", "Šegović", "Šelendić", "Šeparović", "Šestak", + "Šestan", "Šibalić", "Šimara", "Šimić", "Šimičić", "Šimunić", + "Šimunović", "Šinković", "Šipek", "Šipić", "Šitum", "Škara", "Škoda", + "Škrlin", "Škrnički", "Škrtić", "Škugor", "Škunca", "Šokčević", + "Šošić", "Šoštarić", "Špika", "Špišić", "Špoljarić", "Špralja", + "Štefanec", "Štefović", "Štifanić", "Štimac", "Štrbac", "Štrljić", + "Šturlan", "Šunjić", "Šupraha", "Šuran", "Šurbek", "Šurina", "Šverko", + "Žabjačan", "Žagar", "Žerjav", "Žeželić", "Žic", "Žiković", "Živić", + "Živković", "Žufika", "Žugec", "Žunec", "Županić", "Žuvela", "Žužić", + ] diff --git a/src/libs/faker/providers/person/hu_HU/__init__.py b/src/libs/faker/providers/person/hu_HU/__init__.py new file mode 100644 index 0000000..540990f --- /dev/null +++ b/src/libs/faker/providers/person/hu_HU/__init__.py @@ -0,0 +1,158 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict +from .. import Provider as PersonProvider + + +# Data source +# +# Data for this provider comes from the following source: +# Ministry of Interior, Deputy Secretary of State for Records +# +# 100 most frequent family names on record, 2016: +# http://www.kekkh.gov.hu/letoltes/statisztikak/kozerdeku_csaladnev_2016.xls +# +# 100 most frequent first names on record, 2016: +# http://www.kekkh.gov.hu/letoltes/statisztikak/kozerdeku_utonevek_2016.xls +# +# This information is in the public domain by virtue of being an official +# report issued by a part of the Government of Hungary. + +# TODO: +# There is no accurate information about the frequency of differzent name +# schemata, so for that reason, equal frequency will be assumed in most cases, +# except for combinations that are widely known as headed for obsolescence. +# If such information could be obtained, the relative frequencies could be +# adjusted to yield a more realistic distribution of name patterns/schemata. + + +class Provider(PersonProvider): + formats_male = OrderedDict(( + ('{{last_name}} {{first_name_male}}', 0.1), ('{{last_name}} {{last_name}} {{first_name_male}}', 0.1), + ('{{last_name}} {{first_name_male}} {{first_name_male}}', 0.1), + ('{{first_name_male_abbreviated}} {{last_name}} {{first_name_male}}', 0.1), + ('{{last_name}} {{first_name_male_abbreviated}} {{first_name_male}}', 0.1), + ('{{prefix}} {{last_name}} {{first_name_male}}', 0.05), + ('{{prefix}} {{last_name}} {{last_name}} {{first_name_male}}', 0.05), + ('{{prefix}} {{last_name}} {{first_name_male}} {{first_name_male}}', 0.05), + ('{{prefix}} {{first_name_male_abbreviated}} {{last_name}} {{first_name_male}}', 0.05), + ('{{prefix}} {{last_name}} {{first_name_male_abbreviated}} {{first_name_male}}', 0.05),)) + + formats_female = OrderedDict(( + ('{{last_name}} {{first_name_female}}', 0.1), + ('{{last_name}} {{last_name}} {{first_name_female}}', 0.1), + ('{{last_name}} {{first_name_female}} {{first_name_female}}', 0.1), + ('{{first_name_female_abbreviated}} {{last_name}} {{first_name_female}}', 0.1), + ('{{last_name}} {{first_name_female_abbreviated}} {{first_name_female}}', 0.1), + ('{{prefix}} {{last_name}} {{first_name_female}}', 0.05), + ('{{prefix}} {{last_name}} {{last_name}} {{first_name_female}}', 0.05), + ('{{prefix}} {{last_name}} {{first_name_female}} {{first_name_female}}', 0.05), + ('{{prefix}} {{first_name_female_abbreviated}} {{last_name}} {{first_name_female}}', 0.05), + ('{{prefix}} {{last_name}} {{first_name_female_abbreviated}} {{first_name_female}}', 0.05), + ('{{last_name}}né {{last_name}} {{first_name_female}}', 0.1), + ('{{last_name}}né {{last_name}} {{first_name_female}} {{first_name_female}}', 0.1), + ('{{last_name}}né {{last_name}} {{first_name_female}} {{first_name_female}}', 0.05), + ('{{last_name}} {{first_name_male}}né', 0.05), + ('{{last_name}} {{first_name_male}}né {{last_name}} {{first_name_female}}', 0.1), + ('{{prefix}} {{last_name}}né {{last_name}} {{first_name_female}}', 0.1), + ('{{prefix}} {{last_name}}né {{last_name}} {{first_name_female}} {{first_name_female}}', 0.05), + ('{{prefix}} {{last_name}}né {{last_name}} {{first_name_female}} {{first_name_female}}', 0.05), + ('{{prefix}} {{last_name}} {{first_name_male}}né', 0.1), + ('{{prefix}} {{last_name}} {{first_name_male}}né {{last_name}} {{first_name_female}}', 0.05), + ('{{last_name}}né {{prefix}} {{last_name}} {{first_name_female}}', 0.1), + ('{{last_name}}né {{prefix}} {{last_name}} {{first_name_female}} {{first_name_female}}', 0.05), + )) + + formats = formats_male.copy() + formats.update(formats_female) + + last_names = OrderedDict(( + ("Nagy", 0.06992), ("Kovács", 0.06457), ("Tóth", 0.06316), ("Szabó", 0.06234), ("Horváth", 0.05995), + ("Varga", 0.041), ("Kiss", 0.03891), ("Molnár", 0.03189), ("Németh", 0.02715), ("Farkas", 0.02499), + ("Balogh", 0.02468), ("Papp", 0.01567), ("Takács", 0.01535), ("Juhász", 0.01516), ("Lakatos", 0.01486), + ("Mészáros", 0.01183), ("Oláh", 0.01161), ("Simon", 0.01129), ("Rácz", 0.01063), ("Fekete", 0.01021), + ("Szilágyi", 0.00959), ("Török", 0.0079), ("Fehér", 0.00786), ("Balázs", 0.00771), ("Gál", 0.00756), + ("Kis", 0.00730), ("Szűcs", 0.00709), ("Kocsis", 0.00700), ("Orsós", 0.00692), ("Pintér", 0.006), + ("Fodor", 0.00686), ("Szalai", 0.00628), ("Sipos", 0.00620), ("Magyar", 0.0061), ("Lukács", 0.00611), + ("Gulyás", 0.00591), ("Biró", 0.00576), ("Király", 0.00560), ("László", 0.00548), ("Katona", 0.00548), + ("Jakab", 0.00541), ("Bogdán", 0.00536), ("Balog", 0.0053), ("Sándor", 0.0052), ("Boros", 0.00515), + ("Fazekas", 0.005), ("Kelemen", 0.00500), ("Váradi", 0.00500), ("Antal", 0.00490), ("Somogyi", 0.00487), + ("Orosz", 0.00484), ("Fülöp", 0.00480), ("Veres", 0.00470), ("Vincze", 0.00468), ("Hegedűs", 0.00458), + ("Budai", 0.00453), ("Deák", 0.00449), ("Pap", 0.00442), ("Bálint", 0.00435), ("Pál", 0.00427), + ("Illés", 0.0042), ("Vass", 0.00420), ("Szőke", 0.00419), ("Vörös", 0.00418), ("Bognár", 0.00416), + ("Fábián", 0.00415), ("Lengyel", 0.00414), ("Bodnár", 0.00409), ("Szücs", 0.00403), ("Hajdu", 0.00391), + ("Halász", 0.00390), ("Jónás", 0.00388), ("Máté", 0.00371), ("Székely", 0.00367), ("Kozma", 0.00366), + ("Gáspár", 0.00364), ("Pásztor", 0.00356), ("Bakos", 0.00354), ("Dudás", 0.00348), ("Major", 0.00347), + ("Orbán", 0.00343), ("Hegedüs", 0.00342), ("Virág", 0.00341), ("Barna", 0.00335), ("Novák", 0.00334), + ("Soós", 0.00331), ("Tamás", 0.00326), ("Nemes", 0.00326), ("Pataki", 0.0032), ("Balla", 0.00313), + ("Faragó", 0.00312), ("Kerekes", 0.0031), ("Borbély", 0.00311), ("Barta", 0.00308), ("Péter", 0.0030), + ("Szekeres", 0.00306), ("Csonka", 0.00305), ("Mezei", 0.00302), ("Márton", 0.00300), ("Sárközi", 0.00298))) + + first_names_male = OrderedDict(( + ("László", 0.06640477), ("István", 0.060906051), ("József", 0.054476881), ("János", 0.047506017), + ("Zoltán", 0.045579697), ("Sándor", 0.037170944), ("Gábor", 0.035546303), ("Ferenc", 0.034065759), + ("Attila", 0.032146512), ("Péter", 0.03083703), ("Tamás", 0.030257321), ("Zsolt", 0.025204158), + ("Tibor", 0.023296182), ("András", 0.021678391), ("Csaba", 0.020367141), ("Imre", 0.019339667), + ("Lajos", 0.017901558), ("György", 0.01695188), ("Balázs", 0.015569685), ("Gyula", 0.014295123), + ("Mihály", 0.013628337), ("Róbert", 0.013385668), ("Károly", 0.013181456), ("Dávid", 0.01315184), + ("Dániel", 0.012373665), ("Ádám", 0.012290124), ("Béla", 0.012279294), ("Krisztián", 0.011589081), + ("Miklós", 0.010985283), ("Norbert", 0.010746593), ("Bence", 0.010403586), ("Máté", 0.009479986), + ("Pál", 0.007890264), ("Gergő", 0.007554993), ("Roland", 0.007535765), ("Szabolcs", 0.007522062), + ("Bálint", 0.007021254), ("Levente", 0.006948763), ("Márk", 0.006873178), ("Richárd", 0.006811074), + ("Antal", 0.006583213), ("Gergely", 0.006408174), ("Ákos", 0.006278662), ("Viktor", 0.005872447), + ("Árpád", 0.005217153), ("Márton", 0.005061783), ("Géza", 0.005036367), ("Kristóf", 0.004518984), + ("Milán", 0.003956735), ("Dominik", 0.003924247), ("Patrik", 0.003911428), ("Martin", 0.003747439), + ("Barnabás", 0.003645333), ("Jenő", 0.003619917), ("Kálmán", 0.003613728), ("Marcell", 0.003571515), + ("Áron", 0.003219668), ("Mátyás", 0.003028495), ("Ernő", 0.002998879), ("Endre", 0.002830912), + ("Botond", 0.00282605), ("Zsombor", 0.002768366), ("Dezső", 0.002557523), ("Olivér", 0.002524814), + ("Nándor", 0.002520394), ("Szilárd", 0.002422044), ("Erik", 0.002421381), ("Alex", 0.0023248), + ("Benedek", 0.002119924), ("Vilmos", 0.002113515), ("Kornél", 0.002018481), ("Zalán", 0.001970964), + ("Dénes", 0.001921458), ("Ottó", 0.001901788), ("Benjámin", 0.001738241), ("Bertalan", 0.001700227), + ("Kevin", 0.001668623), ("Adrián", 0.001550603), ("Rudolf", 0.001386172), ("Noel", 0.001381973), + ("Albert", 0.001355673), ("Vince", 0.001353463), ("Ervin", 0.001182622), ("Győző", 0.001125823), + ("Zsigmond", 0.001120519), ("Andor", 0.001057531), ("Iván", 0.001016202), ("Szilveszter", 0.001010014), + ("Gusztáv", 0.000994985), ("Barna", 0.000986808), ("Ábel", 0.000969569), ("Hunor", 0.000940396), + ("Arnold", 0.000931777), ("Csongor", 0.00092824), ("Elemér", 0.000894868), ("Krisztofer", 0.000891111), + ("Bendegúz", 0.000868347), ("Emil", 0.000791656), ("Tivadar", 0.000786573), ("Henrik", 0.000758063))) + + first_names_female = OrderedDict(( + ("Mária", 0.076200074), ("Erzsébet", 0.058002384), ("Katalin", 0.0429636), ("Éva", 0.039004017), + ("Ilona", 0.038027669), ("Anna", 0.030819538), ("Zsuzsanna", 0.029737292), ("Margit", 0.024148354), + ("Judit", 0.020956031), ("Ágnes", 0.020891678), ("Andrea", 0.020768845), ("Ildikó", 0.019861817), + ("Julianna", 0.019458091), ("Erika", 0.018991368), ("Krisztina", 0.017491847), ("Irén", 0.015454477), + ("Eszter", 0.014382165), ("Mónika", 0.014128821), ("Magdolna", 0.013536554), ("Edit", 0.013129441), + ("Gabriella", 0.012887838), ("Szilvia", 0.012663621), ("Anita", 0.011554053), ("Viktória", 0.011388318), + ("Anikó", 0.011180584), ("Márta", 0.010886596), ("Tímea", 0.010327747), ("Rozália", 0.009782898), + ("Piroska", 0.009699353), ("Ibolya", 0.00922134), ("Klára", 0.008981769), ("Tünde", 0.008838839), + ("Dóra", 0.008803841), ("Zsófia", 0.008600397), ("Alexandra", 0.007886652), ("Veronika", 0.00777443), + ("Gizella", 0.007579567), ("Csilla", 0.007395768), ("Nikolett", 0.006972849), ("Melinda", 0.006857693), + ("Réka", 0.0068385), ("Nóra", 0.006794469), ("Terézia", 0.006777535), ("Adrienn", 0.006753826), + ("Beáta", 0.006526674), ("Marianna", 0.006462547), ("Vivien", 0.006299747), ("Renáta", 0.00626091), + ("Barbara", 0.006076434), ("Enikő", 0.006052499), ("Bernadett", 0.005964438), ("Rita", 0.005917472), + ("Brigitta", 0.005875926), ("Edina", 0.005745866), ("Hajnalka", 0.005696191), ("Gyöngyi", 0.005616484), + ("Petra", 0.005609033), ("Boglárka", 0.005329496), ("Orsolya", 0.005328141), ("Jolán", 0.005184534), + ("Noémi", 0.005078861), ("Etelka", 0.004833419), ("Valéria", 0.00472594), ("Fanni", 0.004716682), + ("Borbála", 0.004701553), ("Annamária", 0.004528367), ("Kitti", 0.00439334), ("Teréz", 0.004384985), + ("Nikoletta", 0.004310021), ("Laura", 0.004266893), ("Emese", 0.004212702), ("Lilla", 0.004193961), + ("Hanna", 0.003921198), ("Aranka", 0.003884844), ("Kinga", 0.003755914), ("Klaudia", 0.003710077), + ("Anett", 0.003661305), ("Róza", 0.003621339), ("Lili", 0.003436636), ("Zita", 0.00343212), + ("Dorina", 0.003412476), ("Emma", 0.003374994), ("Beatrix", 0.003364381), ("Zsanett", 0.003276772), + ("Sára", 0.003156873), ("Bianka", 0.003061135), ("Rózsa", 0.003006041), ("Jázmin", 0.002952527), + ("Luca", 0.002949817), ("Júlia", 0.002917754), ("Diána", 0.002841434), ("Henrietta", 0.002798759), + ("Györgyi", 0.002731471), ("Irma", 0.00272131), ("Dorottya", 0.002585154), ("Bettina", 0.002574316), + ("Mariann", 0.002569349), ("Virág", 0.002557156), ("Gréta", 0.002515835), ("Rebeka", 0.002513351))) + + first_names = first_names_male.copy() + first_names.update(first_names_female) + + prefixes = OrderedDict((('Dr.', 0.95), ('Prof. Dr.', 0.05))) + + def first_name_male_abbreviated(self): + if hasattr(self, 'first_names_male'): + return self.random_element(self.first_names_male)[0] + "." + return self.first_name()[0] + + def first_name_female_abbreviated(self): + if hasattr(self, 'first_names_female'): + return self.random_element(self.first_names_female)[0] + "." + return self.first_name()[0] diff --git a/src/libs/faker/providers/person/id_ID/__init__.py b/src/libs/faker/providers/person/id_ID/__init__.py new file mode 100644 index 0000000..7077648 --- /dev/null +++ b/src/libs/faker/providers/person/id_ID/__init__.py @@ -0,0 +1,203 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + '{{first_name_male}} {{last_name}}, {{suffix}}', + '{{first_name_female}} {{last_name}}, {{suffix}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}, {{suffix}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}, {{suffix}}', + ) + + # From http://www.nama.web.id/search.php?gender=male&origin=Indonesia+-+Jawa&letter=&submit=Search + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php + first_names_male = ( + 'Abyasa', 'Ade', 'Adhiarja', 'Adiarja', 'Adika', 'Adikara', 'Adinata', + 'Aditya', 'Agus', 'Ajiman', 'Ajimat', 'Ajimin', 'Ajiono', 'Akarsana', + 'Alambana', 'Among', 'Anggabaya', 'Anom', 'Argono', 'Aris', 'Arta', + 'Artanto', 'Artawan', 'Arsipatra', 'Asirwada', 'Asirwanda', 'Aslijan', + 'Asmadi', 'Asman', 'Asmianto', 'Asmuni', 'Aswani', 'Atma', 'Atmaja', + 'Bagas', 'Bagiya', 'Bagus', 'Bagya', 'Bahuraksa', 'Bahuwarna', + 'Bahuwirya', 'Bajragin', 'Bakda', 'Bakiadi', 'Bakianto', 'Bakidin', + 'Bakijan', 'Bakiman', 'Bakiono', 'Bakti', 'Baktiadi', 'Baktianto', + 'Baktiono', 'Bala', 'Balamantri', 'Balangga', 'Balapati', 'Balidin', + 'Balijan', 'Bambang', 'Banara', 'Banawa', 'Banawi', 'Bancar', 'Budi', + 'Cagak', 'Cager', 'Cahyadi', 'Cahyanto', 'Cahya', 'Cahyo', 'Cahyono', + 'Caket', 'Cakrabirawa', 'Cakrabuana', 'Cakrajiya', 'Cakrawala', + 'Cakrawangsa', 'Candra', 'Chandra', 'Candrakanta', 'Capa', 'Caraka', + 'Carub', 'Catur', 'Caturangga', 'Cawisadi', 'Cawisono', 'Cawuk', + 'Cayadi', 'Cecep', 'Cemani', 'Cemeti', 'Cemplunk', 'Cengkal', 'Cengkir', + 'Dacin', 'Dadap', 'Dadi', 'Dagel', 'Daliman', 'Dalimin', 'Daliono', + 'Damar', 'Damu', 'Danang', 'Daniswara', 'Danu', 'Danuja', 'Dariati', + 'Darijan', 'Darimin', 'Darmaji', 'Darman', 'Darmana', 'Darmanto', + 'Darsirah', 'Dartono', 'Daru', 'Daruna', 'Daryani', 'Dasa', 'Digdaya', + 'Dimas', 'Dimaz', 'Dipa', 'Dirja', 'Drajat', 'Dwi', 'Dono', 'Dodo', + 'Edi', 'Eka', 'Elon', 'Eluh', 'Eman', 'Emas', 'Embuh', 'Emong', + 'Empluk', 'Endra', 'Enteng', 'Estiawan', 'Estiono', 'Eko', 'Edi', + 'Edison', 'Edward', 'Elvin', 'Erik', 'Emil', 'Ega', 'Emin', 'Eja', + 'Gada', 'Gadang', 'Gaduh', 'Gaiman', 'Galak', 'Galang', 'Galar', + 'Galih', 'Galiono', 'Galuh', 'Galur', 'Gaman', 'Gamani', 'Gamanto', + 'Gambira', 'Gamblang', 'Ganda', 'Gandewa', 'Gandi', 'Gandi', 'Ganep', + 'Gangsa', 'Gangsar', 'Ganjaran', 'Gantar', 'Gara', 'Garan', 'Garang', + 'Garda', 'Gatot', 'Gatra', 'Gilang', 'Galih', 'Ghani', 'Gading', + 'Hairyanto', 'Hardana', 'Hardi', 'Harimurti', 'Harja', 'Harjasa', + 'Harjaya', 'Harjo', 'Harsana', 'Harsanto', 'Harsaya', 'Hartaka', + 'Hartana', 'Harto', 'Hasta', 'Heru', 'Himawan', 'Hadi', 'Halim', + 'Hasim', 'Hasan', 'Hendra', 'Hendri', 'Heryanto', 'Hamzah', 'Hari', + 'Imam', 'Indra', 'Irwan', 'Irsad', 'Ikhsan', 'Irfan', 'Ian', 'Ibrahim', + 'Ibrani', 'Ismail', 'Irnanto', 'Ilyas', 'Ibun', 'Ivan', 'Ikin', 'Ihsan', + 'Jabal', 'Jaeman', 'Jaga', 'Jagapati', 'Jagaraga', 'Jail', 'Jaiman', + 'Jaka', 'Jarwa', 'Jarwadi', 'Jarwi', 'Jasmani', 'Jaswadi', 'Jati', + 'Jatmiko', 'Jaya', 'Jayadi', 'Jayeng', 'Jinawi', 'Jindra', 'Joko', + 'Jumadi', 'Jumari', 'Jamal', 'Jamil', 'Jais', 'Jefri', 'Johan', 'Jono', + 'Kacung', 'Kajen', 'Kambali', 'Kamidin', 'Kariman', 'Karja', 'Karma', + 'Karman', 'Karna', 'Karsa', 'Karsana', 'Karta', 'Kasiran', 'Kasusra', + 'Kawaca', 'Kawaya', 'Kayun', 'Kemba', 'Kenari', 'Kenes', 'Kuncara', + 'Kunthara', 'Kusuma', 'Kadir', 'Kala', 'Kalim', 'Kurnia', 'Kanda', + 'Kardi', 'Karya', 'Kasim', 'Kairav', 'Kenzie', 'Kemal', 'Kamal', 'Koko', + 'Labuh', 'Laksana', 'Lamar', 'Lanang', 'Langgeng', 'Lanjar', 'Lantar', + 'Lega', 'Legawa', 'Lembah', 'Liman', 'Limar', 'Luhung', 'Lukita', + 'Luluh', 'Lulut', 'Lurhur', 'Luwar', 'Luwes', 'Latif', 'Lasmanto', + 'Lukman', 'Luthfi', 'Leo', 'Luis', 'Lutfan', 'Lasmono', 'Laswi', + 'Mahesa', 'Makara', 'Makuta', 'Manah', 'Maras', 'Margana', 'Mariadi', + 'Marsudi', 'Martaka', 'Martana', 'Martani', 'Marwata', 'Maryadi', + 'Maryanto', 'Mitra', 'Mujur', 'Mulya', 'Mulyanto', 'Mulyono', 'Mumpuni', + 'Muni', 'Mursita', 'Murti', 'Mustika', 'Maman', 'Mahmud', 'Mahdi', + 'Mahfud', 'Malik', 'Muhammad', 'Mustofa', 'Marsito', 'Mursinin', + 'Nalar', 'Naradi', 'Nardi', 'Niyaga', 'Nrima', 'Nugraha', 'Nyana', + 'Narji', 'Nasab', 'Nasrullah', 'Nasim', 'Najib', 'Najam', 'Nyoman', + 'Olga', 'Ozy', 'Omar', 'Opan', 'Oskar', 'Oman', 'Okto', 'Okta', 'Opung', + 'Paiman', 'Panca', 'Pangeran', 'Pangestu', 'Pardi', 'Parman', 'Perkasa', + 'Praba', 'Prabu', 'Prabawa', 'Prabowo', 'Prakosa', 'Pranata', 'Pranawa', + 'Prasetya', 'Prasetyo', 'Prayitna', 'Prayoga', 'Prayogo', 'Purwadi', + 'Purwa', 'Purwanto', 'Panji', 'Pandu', 'Paiman', 'Prima', 'Putu', + 'Raden', 'Raditya', 'Raharja', 'Rama', 'Rangga', 'Reksa', 'Respati', + 'Rusman', 'Rosman', 'Rahmat', 'Rahman', 'Rendy', 'Reza', 'Rizki', + 'Ridwan', 'Rudi', 'Raden', 'Radit', 'Radika', 'Rafi', 'Rafid', 'Raihan', + 'Salman', 'Saadat', 'Saiful', 'Surya', 'Slamet', 'Samsul', 'Soleh', + 'Simon', 'Sabar', 'Sabri', 'Sidiq', 'Satya', 'Setya', 'Saka', 'Sakti', + 'Taswir', 'Tedi', 'Teddy', 'Taufan', 'Taufik', 'Tomi', 'Tasnim', + 'Teguh', 'Tasdik', 'Timbul', 'Tirta', 'Tirtayasa', 'Tri', 'Tugiman', + 'Umar', 'Usman', 'Uda', 'Umay', 'Unggul', 'Utama', 'Umaya', 'Upik', + 'Viktor', 'Vino', 'Vinsen', 'Vero', 'Vega', 'Viman', 'Virman', + 'Wahyu', 'Wira', 'Wisnu', 'Wadi', 'Wardi', 'Warji', 'Waluyo', 'Wakiman', + 'Wage', 'Wardaya', 'Warsa', 'Warsita', 'Warta', 'Wasis', 'Wawan', + 'Xanana', 'Yahya', 'Yusuf', 'Yosef', 'Yono', 'Yoga', + ) + + # From http://namafb.com/2010/08/12/top-1000-nama-populer-indonesia/ + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php + first_names_female = ( + 'Ade', 'Agnes', 'Ajeng', 'Amalia', 'Anita', 'Ayu', 'Aisyah', 'Ana', + 'Ami', 'Ani', 'Azalea', 'Aurora', 'Alika', 'Anastasia', 'Amelia', + 'Almira', 'Bella', 'Betania', 'Belinda', 'Citra', 'Cindy', 'Chelsea', + 'Clara', 'Cornelia', 'Cinta', 'Cinthia', 'Ciaobella', 'Cici', 'Carla', + 'Calista', 'Devi', 'Dewi', 'Dian', 'Diah', 'Diana', 'Dina', 'Dinda', + 'Dalima', 'Eka', 'Eva', 'Endah', 'Elisa', 'Eli', 'Ella', 'Ellis', + 'Elma', 'Elvina', 'Fitria', 'Fitriani', 'Febi', 'Faizah', 'Farah', + 'Farhunnisa', 'Fathonah', 'Gabriella', 'Gasti', 'Gawati', 'Genta', + 'Ghaliyati', 'Gina', 'Gilda', 'Halima', 'Hesti', 'Hilda', 'Hafshah', + 'Hamima', 'Hana', 'Hani', 'Hasna', 'Humaira', 'Ika', 'Indah', 'Intan', + 'Irma', 'Icha', 'Ida', 'Ifa', 'Ilsa', 'Ina', 'Ira', 'Iriana', 'Jamalia', + 'Janet', 'Jane', 'Julia', 'Juli', 'Jessica', 'Jasmin', 'Jelita', + 'Kamaria', 'Kamila', 'Kani', 'Karen', 'Karimah', 'Kartika', 'Kasiyah', + 'Keisha', 'Kezia', 'Kiandra', 'Kayla', 'Kania', 'Lala', 'Lalita', + 'Latika', 'Laila', 'Laras', 'Lidya', 'Lili', 'Lintang', 'Maria', 'Mala', + 'Maya', 'Maida', 'Maimunah', 'Melinda', 'Mila', 'Mutia', 'Michelle', + 'Malika', 'Nadia', 'Nadine', 'Nabila', 'Natalia', 'Novi', 'Nova', + 'Nurul', 'Nilam', 'Najwa', 'Olivia', 'Ophelia', 'Oni', 'Oliva', 'Padma', + 'Putri', 'Paramita', 'Paris', 'Patricia', 'Paulin', 'Puput', 'Puji', + 'Pia', 'Puspa', 'Puti', 'Putri', 'Padmi', 'Qori', 'Queen', 'Ratih', + 'Ratna', 'Restu', 'Rini', 'Rika', 'Rina', 'Rahayu', 'Rahmi', 'Rachel', + 'Rahmi', 'Raisa', 'Raina', 'Sarah', 'Sari', 'Siti', 'Siska', 'Suci', + 'Syahrini', 'Septi', 'Sadina', 'Safina', 'Sakura', 'Salimah', 'Salwa', + 'Salsabila', 'Samiah', 'Shania', 'Sabrina', 'Silvia', 'Shakila', + 'Talia', 'Tami', 'Tira', 'Tiara', 'Titin', 'Tania', 'Tina', 'Tantri', + 'Tari', 'Titi', 'Uchita', 'Unjani', 'Ulya', 'Uli', 'Ulva', 'Umi', + 'Usyi', 'Vanya', 'Vanesa', 'Vivi', 'Vera', 'Vicky', 'Victoria', + 'Violet', 'Winda', 'Widya', 'Wulan', 'Wirda', 'Wani', 'Yani', 'Yessi', + 'Yulia', 'Yuliana', 'Yuni', 'Yunita', 'Yance', 'Zahra', 'Zalindra', + 'Zaenab', 'Zulfa', 'Zizi', 'Zulaikha', 'Zamira', 'Zelda', 'Zelaya', + ) + + first_names = first_names_male + first_names_female + + # From http://namafb.com/2010/08/12/top-1000-nama-populer-indonesia/ + # From http://id.wikipedia.org/wiki/Daftar_marga_suku_Batak_di_Toba + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php + last_names_male = ( + 'Adriansyah', 'Ardianto', 'Anggriawan', 'Budiman', 'Budiyanto', + 'Damanik', 'Dongoran', 'Dabukke', 'Firmansyah', 'Firgantoro', + 'Gunarto', 'Gunawan', 'Hardiansyah', 'Habibi', 'Hakim', 'Halim', + 'Haryanto', 'Hidayat', 'Hidayanto', 'Hutagalung', 'Hutapea', 'Hutasoit', + 'Irawan', 'Iswahyudi', 'Kuswoyo', 'Januar', 'Jailani', 'Kurniawan', + 'Kusumo', 'Latupono', 'Lazuardi', 'Maheswara', 'Mahendra', 'Mustofa', + 'Mansur', 'Mandala', 'Megantara', 'Maulana', 'Maryadi', 'Mangunsong', + 'Manullang', 'Marpaung', 'Marbun', 'Narpati', 'Natsir', 'Nugroho', + 'Najmudin', 'Nashiruddin', 'Nainggolan', 'Nababan', 'Napitupulu', + 'Pangestu', 'Putra', 'Pranowo', 'Prabowo', 'Pratama', 'Prasetya', + 'Prasetyo', 'Pradana', 'Pradipta', 'Prakasa', 'Permadi', 'Prasasta', + 'Prayoga', 'Ramadan', 'Rajasa', 'Rajata', 'Saptono', 'Santoso', + 'Saputra', 'Saefullah', 'Setiawan', 'Suryono', 'Suwarno', 'Siregar', + 'Sihombing', 'Salahudin', 'Sihombing', 'Samosir', 'Saragih', 'Sihotang', + 'Simanjuntak', 'Sinaga', 'Simbolon', 'Sitompul', 'Sitorus', 'Sirait', + 'Siregar', 'Situmorang', 'Tampubolon', 'Thamrin', 'Tamba', 'Tarihoran', + 'Utama', 'Uwais', 'Wahyudin', 'Waluyo', 'Wibowo', 'Winarno', 'Wibisono', + 'Wijaya', 'Widodo', 'Wacana', 'Waskita', 'Wasita', 'Zulkarnain', + ) + + # From http://namafb.com/2010/08/12/top-1000-nama-populer-indonesia/ + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php + last_names_female = ( + 'Agustina', 'Andriani', 'Anggraini', 'Aryani', 'Astuti', + 'Fujiati', 'Farida', 'Handayani', 'Hassanah', 'Hartati', 'Hasanah', + 'Haryanti', 'Hariyah', 'Hastuti', 'Halimah', 'Kusmawati', 'Kuswandari', + 'Laksmiwati', 'Laksita', 'Lestari', 'Lailasari', 'Mandasari', + 'Mardhiyah', 'Mayasari', 'Melani', 'Mulyani', 'Maryati', 'Nurdiyanti', + 'Novitasari', 'Nuraini', 'Nasyidah', 'Nasyiah', 'Namaga', 'Palastri', + 'Pudjiastuti', 'Puspasari', 'Puspita', 'Purwanti', 'Pratiwi', + 'Purnawati', 'Pertiwi', 'Permata', 'Prastuti', 'Padmasari', 'Rahmawati', + 'Rahayu', 'Riyanti', 'Rahimah', 'Suartini', 'Sudiati', 'Suryatmi', + 'Susanti', 'Safitri', 'Oktaviani', 'Utami', 'Usamah', 'Usada', + 'Uyainah', 'Yuniar', 'Yuliarti', 'Yulianti', 'Yolanda', 'Wahyuni', + 'Wijayanti', 'Widiastuti', 'Winarsih', 'Wulandari', 'Wastuti', 'Zulaika', + ) + + last_names = last_names_male + last_names_female + + prefixes_male = ( + 'Dt.', 'R.', 'R.M.', 'Sutan', 'T.', 'Tgk.', + + # From http://id.wikipedia.org/wiki/Gelar_akademik + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php plus noble titles + 'dr.', 'drg.', 'Dr.', 'Drs.', 'Ir.', 'H.', 'KH.', + ) + + prefixes_female = ( + 'Cut', 'Puti', 'R.', 'R.A.', 'Tgk.', + + # From http://id.wikipedia.org/wiki/Gelar_akademik + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php plus noble titles + 'dr.', 'drg.', 'Dr.', 'Drs.', 'Ir.' 'Hj.', + ) + + # From http://id.wikipedia.org/wiki/Gelar_akademik + # via https://github.com/fzaninotto/faker/blob/master/src/Faker/Provider/id_ID/Person.php + suffixes = ( + 'S.Ked', 'S.Gz', 'S.Pt', 'S.IP', 'S.E.I', 'S.E.', 'S.Kom', 'S.H.', + 'S.T.', 'S.Pd', 'S.Psi', 'S.I.Kom', 'S.Sos', 'S.Farm', 'M.M.', 'M.Kom.', + 'M.TI.', 'M.Pd', 'M.Farm', 'M.Ak', + ) diff --git a/src/faker/providers/it_IT/person.py b/src/libs/faker/providers/person/it_IT/__init__.py similarity index 97% rename from src/faker/providers/it_IT/person.py rename to src/libs/faker/providers/person/it_IT/__init__.py index cfb51b4..9a42bae 100644 --- a/src/faker/providers/it_IT/person.py +++ b/src/libs/faker/providers/person/it_IT/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -93,9 +93,9 @@ class Provider(PersonProvider): 'Costantini', 'Milani', 'Pagano', 'Ruggiero', 'Sorrentino', 'D\'amico', 'Orlando', 'Damico', 'Negri' ) + + prefixes_female = ('Dott.', 'Sig.ra') + prefixes_male = ('Dott.', 'Sig.') - prefixes = ('Sig.', 'Dott.', 'Sig.ra') + prefixes = ('Dott.', 'Sig.', 'Sig.ra') - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) diff --git a/src/libs/faker/providers/person/ja_JP/__init__.py b/src/libs/faker/providers/person/ja_JP/__init__.py new file mode 100644 index 0000000..fc4ac68 --- /dev/null +++ b/src/libs/faker/providers/person/ja_JP/__init__.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{last_name}} {{first_name_female}}', + ) + + formats_male = ( + '{{last_name}} {{first_name_male}}', + ) + + formats = formats_male + formats_female + + first_names_female = ( + '明美', 'あすか', '香織', '加奈', 'くみ子', 'さゆり', '知実', '千代', + '直子', '七夏', '花子', '春香', '真綾', '舞', '美加子', '幹', '桃子', '結衣', '裕美子', '陽子', '里佳', + ) + + first_names_male = ( + '晃', '篤司', '治', '和也', '京助', '健一', '修平', '翔太', '淳', '聡太郎', '太一', '太郎', '拓真', '翼', '智也', + '直樹', '直人', '英樹', '浩', '学', '充', '稔', '裕樹', '裕太', '康弘', '陽一', '洋介', '亮介', '涼平', '零', + ) + + first_names = first_names_male + first_names_female + + last_names = ( + '青田', '青山', '石田', '井高', '伊藤', '井上', '宇野', '江古田', '大垣', + '加藤', '加納', '喜嶋', '木村', '桐山', '工藤', '小泉', '小林', '近藤', + '斉藤', '坂本', '佐々木', '佐藤', '笹田', '鈴木', '杉山', + '高橋', '田中', '田辺', '津田', + '中島', '中村', '渚', '中津川', '西之園', '野村', + '原田', '浜田', '廣川', '藤本', + '松本', '三宅', '宮沢', '村山', + '山岸', '山口', '山田', '山本', '吉田', '吉本', + '若松', '渡辺', + ) + + kana_formats = ( + '{{last_kana_name}} {{first_kana_name_female}}', + '{{last_kana_name}} {{first_kana_name_male}}', + ) + + first_kana_names_female = ( + 'アキラ', 'アケミ', 'アスカ', + 'カオリ', 'カナ', 'クミコ', + 'サユリ', + 'チヨ', 'ツバサ', 'トモミ', + 'ナオコ', 'ナナカ', + 'ハナコ', 'ハルカ', + 'マアヤ', 'マイ', 'ミキ', 'モモコ', + 'ユイ', 'ヨウコ', 'ユミコ', + 'レイ', 'リカ', + ) + + first_kana_names_male = ( + 'アキラ', 'アツシ', 'オサム', + 'キョウスケ', 'ケンイチ', + 'ジュン', 'ソウタロウ', + 'タイチ', 'タクマ', 'タロウ', 'ツバサ', 'トモヤ', + 'ナオキ', 'ナオト', + 'ヒデキ', 'ヒロシ', + 'マナブ', 'ミツル', 'ミノル', 'ヒロキ', + 'ユウタ', 'ヤスヒロ', 'ヨウイチ', 'ヨウスケ', + 'リョウスケ', 'リョウヘイ', + ) + + first_kana_names = first_kana_names_male + first_kana_names_female + + last_kana_names = ( + 'アオタ', 'アオヤマ', 'イシダ', 'イダカ', 'イトウ', 'ウノ', 'エコダ', 'オオガキ', + 'カノウ', 'カノウ', 'キジマ', 'キムラ', 'キリヤマ', 'クドウ', 'コイズミ', 'コバヤシ', 'コンドウ', + 'サイトウ', 'サカモト', 'ササキ', 'サトウ', 'ササダ', 'スズキ', 'スギヤマ', + 'タカハシ', 'タナカ', 'タナベ', 'ツダ', 'ツチヤ', + 'ナカジマ', 'ナカムラ', 'ナギサ', 'ナカツガワ', 'ニシノソノ', 'ノムラ', + 'ハラダ', 'ハマダ', 'ヒロカワ', 'フジモト', + 'マツモト', 'ミヤケ', 'ミヤザワ', 'ムラヤマ', + 'ヤマギシ', 'ヤマグチ', 'ヤマダ', 'ヤマモト', 'ヨシダ', 'ヨシモト', + 'ワカマツ', 'ワタナベ', + ) + + romanized_formats = ( + '{{first_romanized_name_female}} {{last_romanized_name}}', + '{{first_romanized_name_male}} {{last_romanized_name}}', + ) + + first_romanized_names_female = ( + 'Akira', 'Akemi', 'Asuka', + 'Kaori', 'Kana', 'Kumiko', + 'Sayuri', + 'Chiyo', 'Tsubasa', 'Tomomi', + 'Naoko', 'Nanaka', + 'Hanako', 'Haruka', + 'Maaya', 'Mai', 'Miki', 'Momoko', + 'Yui', 'Yoko', 'Yumiko', + 'Rei', 'Rika', + ) + + first_romanized_names_male = ( + 'Akira', 'Atsushi', 'Osamu', + 'Kyosuke', 'Kenichi', + 'Jun', 'Sotaro', + 'Taichi', 'Takuma', 'Taro', 'Tsubasa', 'Tomoya', + 'Naoki', 'Naoto' + 'Hideki', 'Hiroshi', + 'Manabu', 'Mituru', 'Minoru', 'Hiroki', + 'Yuta', 'Yasuhiro', 'Yoichi', 'Yosuke', + 'Ryosuke', 'Ryohei', + ) + + first_romanized_names = first_romanized_names_male + first_romanized_names_female + + last_romanized_names = ( + 'Aota', 'Aoyama', 'Ishida', 'Idaka', 'Ito', 'Uno', 'Ekoda', 'Ogaki', + 'Kato', 'Kano', 'Kijima', 'Kimura', 'Kiriyama', 'Kudo', 'Koizumi', 'Kobayashi', 'Kondo', + 'Saito', 'Sakamoto', 'Sasaki', 'Sato', 'Sasada', 'Suzuki', 'Sugiyama', + 'Takahashi', 'Tanaka', 'Tanabe', 'Tsuda', 'Tsuchiya', + 'Nakajima', 'Nakamura', 'Nagisa', 'Nakatsugawa', 'Nishinosono', 'Nomura', + 'Harada', 'Hamada', 'Hirokawa', 'Fujimoto', + 'Matsumoto', 'Miyake', 'Miyagawa', 'Murayama', + 'Yamagishi', 'Yamaguchi', 'Yamada', 'Yamamoto', 'Yoshida', 'Yoshimoto', + 'Wakamatsu', 'Watanabe', + ) + + def kana_name(self): + ''' + @example 'アオタ アキラ' + ''' + pattern = self.random_element(self.kana_formats) + return self.generator.parse(pattern) + + def first_kana_name(self): + ''' + @example 'アキラ' + ''' + return self.random_element(self.first_kana_names) + + def first_kana_name_female(self): + return self.random_element(self.first_kana_names_female) + + def first_kana_name_male(self): + return self.random_element(self.first_kana_names_male) + + def last_kana_name(self): + ''' + @example 'アオタ' + ''' + return self.random_element(self.last_kana_names) + + def romanized_name(self): + ''' + @example 'Akira Aota' + ''' + pattern = self.random_element(self.romanized_formats) + return self.generator.parse(pattern) + + def first_romanized_name(self): + ''' + @example 'Akira' + ''' + return self.random_element(self.first_romanized_names) + + def first_romanized_name_female(self): + return self.random_element(self.first_romanized_names_female) + + def first_romanized_name_male(self): + return self.random_element(self.first_romanized_names_male) + + def last_romanized_name(self): + ''' + @example 'Aota' + ''' + return self.random_element(self.last_romanized_names) diff --git a/src/libs/faker/providers/person/ka_GE/__init__.py b/src/libs/faker/providers/person/ka_GE/__init__.py new file mode 100644 index 0000000..7c89bd1 --- /dev/null +++ b/src/libs/faker/providers/person/ka_GE/__init__.py @@ -0,0 +1,159 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_male = ( + '{{first_name_male}} {{last_name}}', + ) + formats_female = ( + '{{first_name_female}} {{last_name}}', + ) + + formats = formats_male + formats_female + + # Source: 2012 Voters List. + # Obtained from http://mashasada.me/en/chamotvirtva + first_names_male = ( + 'ავთანდილ', 'აკაკი', 'ალექს', 'ალექსანდრე', 'ამირან', 'ანზორ', 'არმენ', + 'არტურ', 'არჩილ', 'ასლან', 'ბადრი', 'ბესარიონ', 'ბესიკ', 'ბექა', + 'ბიძინა', 'ბონდო', 'ბორის', 'გელა', 'გენადი', 'გია', 'გიგა', 'გიგლა', + 'გივი', 'გიორგი', 'გოგა', 'გოგი', 'გოგიტა', 'გოდერძი', 'გოჩა', 'გრიგოლ', + 'გურამ', 'დავით', 'დათო', 'დემურ', 'დიმიტრი', 'ედუარდ', 'ელგუჯა', + 'ემზარ', 'ვალერი', 'ვალერიან', 'ვანო', 'ვაჟა', 'ვასილ', 'ვახტანგ', + 'ვახტანგ', 'ვეფხვია', 'ვიქტორ', 'ვლადიმერ', 'ზაზა', 'ზაურ', 'ზაქარია', + 'ზვიად', 'ზურაბ', 'თამაზ', 'თეიმურაზ', 'თემურ', 'თენგიზ', 'თორნიკე', + 'იაგო', 'ივანე', 'ილია', 'იოსებ', 'ირაკლი', 'იური', 'კარლო', 'კახა', + 'კახაბერ', 'კობა', 'კონსტანტინე', 'ლაშა', 'ლევან', 'მალხაზ', 'მამუკა', + 'მერაბ', 'მინდია', 'მირიან', 'მიხეილ', 'მიხეილ', 'მურთაზ', 'მურმან', + 'ნიკა', 'ნიკოლოზ', 'ნოდარ', 'ნუგზარ', 'ნუკრი', 'ოთარ', 'ომარ', 'პაატა', + 'პავლე', 'პეტრე', 'რამაზ', 'რატი', 'რევაზ', 'რეზო', 'რობერტ', 'როინ', + 'როლანდ', 'რომან', 'სერგო', 'სიმონ', 'სოსო', 'ტარიელ', 'უშანგი', 'უჩა', + 'შალვა', 'შაქრო', 'შოთა', 'ხვიჩა', 'ჯაბა', 'ჯემალ', 'ჯონი', 'ჯუმბერ' + ) + + # Source: 2012 Voters List. + # Obtained from http://mashasada.me/en/chamotvirtva + first_names_female = ( + 'აზა', 'აიდა', 'ალა', 'ანა', 'ანი', 'ანიკო', 'ანნა', 'ანჟელა', 'ასმათ', + 'ბელა', 'გალინა', 'გვანცა', 'გიული', 'გუგული', 'გულიკო', 'გულნარა', + 'დალი', 'დარეჯან', 'დიანა', 'დოდო', 'ევგენია', 'ეთერ', 'ეკა', + 'ეკატერინე', 'ელენა', 'ელენე', 'ელზა', 'ელიზა', 'ელისო', 'ელმირა', + 'ემა', 'ვალენტინა', 'ვარდო', 'ვენერა', 'ვერა', 'ვერიკო', 'ვიოლეტა', + 'ზაირა', 'ზინა', 'ზოია', 'თათია', 'თამარ', 'თამარა', 'თამარი', 'თამთა', + 'თამილა', 'თამუნა', 'თეა', 'თეონა', 'თინა', 'თინათინ', 'ია', 'იამზე', + 'იზა', 'იზოლდა', 'ინგა', 'ინეზა', 'ირინა', 'ირინე', 'ირმა', 'კარინე', + 'კლარა', 'ლალი', 'ლამარა', 'ლამზირა', 'ლანა', 'ლარისა', 'ლეილა', 'ლელა', + 'ლენა', 'ლია', 'ლიანა', 'ლიდა', 'ლიზა', 'ლიკა', 'ლილი', 'ლუბა', + 'ლუდმილა', 'ლუიზა', 'მაგდა', 'მადონა', 'მაია', 'მაკა', 'მანანა', + 'მარგალიტა', 'მარი', 'მარია', 'მარიამ', 'მარიკა', 'მარინა', 'მარინე', + 'მარო', 'მაყვალა', 'მეგი', 'მედეა', 'მედიკო', 'მერი', 'მზია', + 'მთვარისა', 'მირანდა', 'ნადეჯდა', 'ნადია', 'ნაზი', 'ნაზიბროლა', + 'ნაზიკო', 'ნათელა', 'ნათია', 'ნაირა', 'ნანა', 'ნანი', 'ნანული', + 'ნარგიზა', 'ნატალია', 'ნატო', 'ნელი', 'ნესტან', 'ნინელი', 'ნინო', + 'ნონა', 'ნორა', 'ნუნუ', 'ნუცა', 'ოლია', 'ოლღა', 'ჟანა', 'ჟენია', + 'ჟუჟუნა', 'რიმა', 'რიტა', 'როზა', 'რუსუდან', 'რუსუდან', 'სალომე', + 'სვეტლანა', 'სონია', 'სოფია', 'სოფიკო', 'სოფიო', 'სულიკო', 'სუსანა', + 'ტატიანა', 'ფატი', 'ფატიმა', 'ფიქრია', 'ქეთევან', 'ქეთინო', 'ქეთო', + 'ქრისტინე', 'შორენა', 'ციალა', 'ცირა', 'ცისანა', 'ციური', 'ციცინო', + 'ხათუნა', 'ხატია', 'ჯულიეტა' + ) + + first_names = first_names_male + first_names_female + + # Source: 2012 Voters List. + # Obtained from http://mashasada.me/en/chamotvirtva + last_names = ( + 'აბაშიძე', 'აბდულაევი', 'აბესაძე', 'აბრამიშვილი', 'აბულაძე', 'ადამია', + 'ადეიშვილი', 'ადუაშვილი', 'ავალიანი', 'ალადაშვილი', 'ალანია', 'ალიევა', + 'ალიევი', 'ანდღულაძე', 'ანთაძე', 'არაბიძე', 'არაბული', 'არველაძე', + 'არჩვაძე', 'ასათიანი', 'ასანიძე', 'აფციაური', 'ახალაია', 'ახალაძე', + 'ახვლედიანი', 'ახობაძე', 'ბაკურაძე', 'ბალიაშვილი', 'ბარამიძე', + 'ბარბაქაძე', 'ბასილაშვილი', 'ბასილაძე', 'ბაქრაძე', 'ბახტაძე', + 'ბეგიაშვილი', 'ბენდელიანი', 'ბენიძე', 'ბეჟანიშვილი', 'ბეჟანიძე', + 'ბერაია', 'ბერაძე', 'ბერიანიძე', 'ბერიაშვილი', 'ბერიშვილი', 'ბერიძე', + 'ბერუაშვილი', 'ბერულავა', 'ბერძენიშვილი', 'ბექაური', 'ბიბილაშვილი', + 'ბიგვავა', 'ბიწაძე', 'ბლიაძე', 'ბოკუჩავა', 'ბოლქვაძე', 'ბოჭორიშვილი', + 'ბრეგაძე', 'ბრეგვაძე', 'ბუკია', 'ბურდული', 'ბურჯანაძე', 'ბუჩუკური', + 'ბუცხრიკიძე', 'გაბაიძე', 'გაბედავა', 'გაბელია', 'გაბრიჭიძე', 'გაბუნია', + 'გაგნიძე', 'გაგუა', 'გაფრინდაშვილი', 'გაჩეჩილაძე', 'გაჯიევა', 'გაჯიევი', + 'გეგეშიძე', 'გელაშვილი', 'გელაძე', 'გვაზავა', 'გვასალია', 'გველესიანი', + 'გვენეტაძე', 'გიგაური', 'გიორგაძე', 'გიორგობიანი', 'გობეჯიშვილი', + 'გოგალაძე', 'გოგია', 'გოგიაშვილი', 'გოგინაშვილი', 'გოგიტიძე', + 'გოგიშვილი', 'გოგიჩაიშვილი', 'გოგიჩაშვილი', 'გოგიძე', 'გოგოლაძე', + 'გოგოხია', 'გოგსაძე', 'გოგუა', 'გოგუაძე', 'გორგაძე', 'გორგილაძე', + 'გორგოძე', 'გოცირიძე', 'გრიგალაშვილი', 'გრიგორიანი', 'გრძელიშვილი', + 'გულიაშვილი', 'გულუა', 'გუმბერიძე', 'გურგენიძე', 'გურეშიძე', 'გურული', + 'გუჯაბიძე', 'დავითაშვილი', 'დავითაძე', 'დალაქიშვილი', 'დანელია', + 'დარბაიძე', 'დევაძე', 'დევიძე', 'დემეტრაშვილი', 'დვალი', 'დვალიშვილი', + 'დიასამიძე', 'დოლიძე', 'დუმბაძე', 'ელბაქიძე', 'ელიზბარაშვილი', + 'ენუქიძე', 'ვალიევა', 'ვალიევი', 'ვარდოსანიძე', 'ვარშანიძე', 'ვასაძე', + 'ვაშაკიძე', 'ვაშაყმაძე', 'ვეკუა', 'ზარანდია', 'ზარიძე', 'ზარქუა', + 'ზედგინიძე', 'ზოიძე', 'ზურაბაშვილი', 'თაბაგარი', 'თავართქილაძე', + 'თავაძე', 'თედორაძე', 'თევზაძე', 'თოდუა', 'თოლორდავა', 'თოფურია', + 'თურმანიძე', 'იაშვილი', 'ილურიძე', 'იმერლიშვილი', 'იმნაძე', 'ინასარიძე', + 'იობიძე', 'ირემაშვილი', 'ირემაძე', 'ისაევი', 'კაზარიანი', 'კაკაბაძე', + 'კაკაურიძე', 'კაკულია', 'კალანდაძე', 'კალანდია', 'კანდელაკი', + 'კაპანაძე', 'კარაპეტიანი', 'კაცაძე', 'კაციტაძე', 'კაჭარავა', 'კახაძე', + 'კახიძე', 'კევლიშვილი', 'კეკელიძე', 'კერესელიძე', 'კვანტალიანი', + 'კვარაცხელია', 'კვაჭაძე', 'კვერნაძე', 'კვინიკაძე', 'კვირიკაშვილი', + 'კვირკველია', 'კიკვაძე', 'კიკნაძე', 'კილასონია', 'კილაძე', + 'კინწურაშვილი', 'კირვალიძე', 'კირთაძე', 'კირკიტაძე', 'კობაიძე', + 'კობახიძე', 'კობერიძე', 'კობიაშვილი', 'კონცელიძე', 'კოპალიანი', + 'კოპაძე', 'კოხრეიძე', 'კუბლაშვილი', 'კუპატაძე', 'კუპრაშვილი', + 'კუპრეიშვილი', 'კურტანიძე', 'კუჭავა', 'კუჭუხიძე', 'კუხიანიძე', 'ლაბაძე', + 'ლაგვილავა', 'ლატარია', 'ლაცაბიძე', 'ლეჟავა', 'ლიპარტელიანი', + 'ლობჟანიძე', 'ლობჯანიძე', 'ლოლაძე', 'ლომაძე', 'ლომთაძე', 'ლომიძე', + 'ლომსაძე', 'ლორთქიფანიძე', 'ლურსმანაშვილი', 'მაზმიშვილი', 'მათიაშვილი', + 'მაისურაძე', 'მამალაძე', 'მამულაშვილი', 'მამულაძე', 'მანაგაძე', + 'მარგველაშვილი', 'მაღლაკელიძე', 'მაღრაძე', 'მაჩიტიძე', 'მაჭავარიანი', + 'მაჭარაშვილი', 'მახათაძე', 'მახარაშვილი', 'მახარაძე', 'მგალობლიშვილი', + 'მგელაძე', 'მეგრელიშვილი', 'მელაძე', 'მელიქიშვილი', 'მელიქიძე', + 'მელქაძე', 'მერაბიშვილი', 'მერებაშვილი', 'მესხი', 'მეტრეველი', + 'მეფარიშვილი', 'მიმინოშვილი', 'მინდიაშვილი', 'მიქაბერიძე', 'მიქავა', + 'მიქაძე', 'მიქელაძე', 'მოდებაძე', 'მოსიაშვილი', 'მჟავანაძე', 'მუმლაძე', + 'მუსაევა', 'მუსაევი', 'მუსტაფაევა', 'მუსტაფაევი', 'მუშკუდიანი', + 'მღებრიშვილი', 'მჭედლიშვილი', 'მჭედლიძე', 'ნაბიევი', 'ნადირაშვილი', + 'ნადირაძე', 'ნაკაშიძე', 'ნარიმანიძე', 'ნასყიდაშვილი', 'ნატროშვილი', + 'ნაცვლიშვილი', 'ნაჭყებია', 'ნებიერიძე', 'ნემსაძე', 'ნეფარიძე', + 'ნიკოლაიშვილი', 'ნიკოლეიშვილი', 'ნიჟარაძე', 'ნიქაბაძე', 'ნოზაძე', + 'ნუცუბიძე', 'ოთარაშვილი', 'ონიანი', 'ოქროპირიძე', 'ოქრუაშვილი', + 'პავლიაშვილი', 'პაპავა', 'პაპაშვილი', 'პაპიაშვილი', 'პაპიძე', + 'პაპუაშვილი', 'პატარაია', 'პეტრიაშვილი', 'პეტროსიანი', 'ჟვანია', + 'ჟორჟოლიანი', 'ჟღენტი', 'რაზმაძე', 'რამიშვილი', 'რევაზიშვილი', + 'რეხვიაშვილი', 'რობაქიძე', 'როგავა', 'როსტიაშვილი', 'რუხაძე', + 'სალუქვაძე', 'სამუშია', 'სამხარაძე', 'სანიკიძე', 'სარალიძე', + 'სარქისიანი', 'საჯაია', 'სეხნიაშვილი', 'სვანიძე', 'სილაგაძე', + 'სიმონიშვილი', 'სირაძე', 'სირბილაძე', 'სიჭინავა', 'სიხარულიძე', + 'სოფრომაძე', 'სულაბერიძე', 'სურმანიძე', 'სხირტლაძე', 'ტაბატაძე', + 'ტაკიძე', 'ტალახაძე', 'ტურაშვილი', 'ტუღუში', 'ტყებუჩავა', 'ტყემალაძე', + 'ტყეშელაშვილი', 'უგრეხელიძე', 'ურუშაძე', 'ფანცულაია', 'ფარტენაძე', + 'ფარცვანია', 'ფეიქრიშვილი', 'ფერაძე', 'ფირცხალავა', 'ფიფია', + 'ფიცხელაური', 'ფოფხაძე', 'ფუტკარაძე', 'ფხაკაძე', 'ფხალაძე', 'ქავთარაძე', + 'ქათამაძე', 'ქამადაძე', 'ქანთარია', 'ქარდავა', 'ქართველიშვილი', + 'ქარჩავა', 'ქარცივაძე', 'ქაჯაია', 'ქევხიშვილი', 'ქირია', 'ქობალია', + 'ქობულაძე', 'ქორიძე', 'ქუთათელაძე', 'ქურდაძე', 'ღამბაშიძე', + 'ღარიბაშვილი', 'ღვინიაშვილი', 'ღვინჯილია', 'ღლონტი', 'ღონღაძე', + 'ღურწკაია', 'ყაველაშვილი', 'ყიფიანი', 'ყიფშიძე', 'ყოლბაია', 'ყურაშვილი', + 'შავაძე', 'შათირიშვილი', 'შაინიძე', 'შალამბერიძე', 'შამათავა', + 'შამუგია', 'შანიძე', 'შარაშიძე', 'შარიქაძე', 'შელია', 'შენგელია', + 'შეყილაძე', 'შველიძე', 'შონია', 'შუბითიძე', 'შუკაკიძე', 'ჩადუნელი', + 'ჩაკვეტაძე', 'ჩაფიძე', 'ჩაჩანიძე', 'ჩაჩუა', 'ჩინჩალაძე', 'ჩიქოვანი', + 'ჩიხლაძე', 'ჩოხელი', 'ჩუბინიძე', 'ჩხაიძე', 'ჩხარტიშვილი', 'ჩხეიძე', + 'ჩხიკვაძე', 'ცაავა', 'ცანავა', 'ცარციძე', 'ცერცვაძე', 'ცეცხლაძე', + 'ცინცაძე', 'ცირეკიძე', 'ცომაია', 'ცუცქირიძე', 'ცხადაძე', 'ძიძიგური', + 'ძნელაძე', 'წერეთელი', 'წიკლაური', 'წიქარიშვილი', 'წულაია', 'წულუკიძე', + 'წურწუმია', 'ჭანტურია', 'ჭანტურიძე', 'ჭაღალიძე', 'ჭეიშვილი', 'ჭელიძე', + 'ჭითანავა', 'ჭინჭარაული', 'ჭიღლაძე', 'ჭიჭინაძე', 'ჭკადუა', 'ჭუმბურიძე', + 'ხალვაში', 'ხარაბაძე', 'ხარაზიშვილი', 'ხარაიშვილი', 'ხარატიშვილი', + 'ხარებავა', 'ხარშილაძე', 'ხარჩილავა', 'ხატიაშვილი', 'ხაჩატურიანი', + 'ხაჩიძე', 'ხაჭაპურიძე', 'ხელაძე', 'ხეცურიანი', 'ხვედელიძე', 'ხვიჩია', + 'ხიზანიშვილი', 'ხიმშიაშვილი', 'ხმალაძე', 'ხოზრევანიძე', 'ხორავა', + 'ხურცილავა', 'ხურციძე', 'ხუციშვილი', 'ჯავახიშვილი', 'ჯაიანი', + 'ჯალაღონია', 'ჯანაშია', 'ჯანელიძე', 'ჯანიაშვილი', 'ჯანჯღავა', + 'ჯაფარიძე', 'ჯიბლაძე', 'ჯინჭარაძე', 'ჯიქია', 'ჯიშკარიანი', 'ჯოხაძე', + 'ჯოჯუა', 'ჯღარკავა', + ) + diff --git a/src/faker/providers/ko_KR/person.py b/src/libs/faker/providers/person/ko_KR/__init__.py similarity index 89% rename from src/faker/providers/ko_KR/person.py rename to src/libs/faker/providers/person/ko_KR/__init__.py index 5f282a1..b6c7476 100644 --- a/src/faker/providers/ko_KR/person.py +++ b/src/libs/faker/providers/person/ko_KR/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): formats = ( @@ -13,8 +13,8 @@ class Provider(PersonProvider): '김', '이', '최', '박', '정', '강', '조', '윤', '장', '임', '오', '한', '신', '서', '권', '황', '안', '송', '류', '홍', '전', '고', '문', '손', '양', '배', '조', '백', '허', '남', '심', '유', '노', '하', '전', '정', '곽', '성', '차', '유', '구', '우', '주', '임', '나', '신', '민', '진', '지', '엄', '원', - '채', '천', '양', '공', '현', '방', '함', '염', '여', '추', '변', '도',' 석', '소', '선', '설', '방', - '마', '길', '위', '연', '명', '기', '금', '왕',' 반', '옥', '육', '진', '인', '맹', '제', '탁', '모', + '채', '천', '양', '공', '현', '방', '함', '염', '여', '추', '변', '도', '석', '소', '선', '설', '방', + '마', '길', '위', '연', '명', '기', '금', '왕', '반', '옥', '육', '진', '인', '맹', '제', '탁', '모', '남궁', '어', '용', '편', '봉', '구', '예', '경', '사', '부', '황보', '가', '복', '계', '제갈', '사공', '선우', '팽', '견', '종', '승', '독고', '옹', '빙', '장', '추', '편', '아', '점', '흥', '낭', '해', '판', '초', '필', '궉', '근', '매', '동방', '호', '두', '미', '요', '야', '묵', '자', '만', '운', @@ -30,4 +30,4 @@ class Provider(PersonProvider): '규', '안', '강', '산', '명', '세', '효', '무', '협', '기', '억', '동', '완', '윤', '창', '도', '위', '엽', '온', '권', '병', '욱', '비', '화', '슬', '송', '광', '남', '인', '해', '양', '림', '란', '건', '솔', '금' - ) \ No newline at end of file + ) diff --git a/src/faker/providers/lt_LT/person.py b/src/libs/faker/providers/person/lt_LT/__init__.py similarity index 98% rename from src/faker/providers/lt_LT/person.py rename to src/libs/faker/providers/person/lt_LT/__init__.py index 2ae594e..382945a 100644 --- a/src/faker/providers/lt_LT/person.py +++ b/src/libs/faker/providers/person/lt_LT/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): formats = ( diff --git a/src/faker/providers/lv_LV/person.py b/src/libs/faker/providers/person/lv_LV/__init__.py similarity index 98% rename from src/faker/providers/lv_LV/person.py rename to src/libs/faker/providers/person/lv_LV/__init__.py index 5d8f2aa..980e345 100644 --- a/src/faker/providers/lv_LV/person.py +++ b/src/libs/faker/providers/person/lv_LV/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): formats = ( diff --git a/src/libs/faker/providers/person/ne_NP/__init__.py b/src/libs/faker/providers/person/ne_NP/__init__.py new file mode 100644 index 0000000..3d4ce25 --- /dev/null +++ b/src/libs/faker/providers/person/ne_NP/__init__.py @@ -0,0 +1,254 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}', + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + ) + + formats = formats_male + formats_female + + first_names_female = ( + 'अंगुर', 'अजिता', 'अञ्जना', 'अदिती', 'अनधा', 'अनिता', 'अनिता', + 'अनिता', 'अनिता', 'अनु', 'अनुपमा', 'अनुरा', 'अनुशुया', 'अन्जली', + 'अन्‍नपूर्ण', 'अपर्णा', 'अमरावती', 'अमिका', 'अमृत', 'अमृता', 'अम्विका', + 'अम्विका', 'अम्वीका', 'अरुणा', 'अर्चना', 'अर्चना', 'अर्चना', 'अर्चना', + 'अस्‍मिता', 'आज्ञा', 'आभा', 'आयुषा', 'आयुष्‍मा', 'आवृता', 'आशा', + 'इच्छा', 'इन्दिरा', 'इन्दिरा', 'इन्दिरा', 'इन्दिरा', 'इन्दीरा', + 'इन्दु', 'इन्दु', 'इन्द्र', 'इन्द्र', 'इन्‍द्र', 'इभन', 'इभा', 'इशु', + 'ईतासा', 'ईन्दु', 'ईला', 'ईशा', 'ईशा', 'ईश्‍वरी', 'ईश्‍वरी', 'ईश्‍वरी', + 'उत्तरा', 'उपासना', 'उमा', 'उमा', 'उमा', 'उमा', 'उर्मिला', 'उर्मिला', + 'उर्मिला', 'उषा', 'उषा', 'उषा', 'उषा', 'उषा', 'उषा', 'एलिशा', 'एलिसा', + 'एलिसा', 'ऐरिका', 'कमला', 'कमला', 'कमला', 'कमला', 'कमला', 'कर्साङ', + 'कल्पना', 'कविता', 'कविता', 'कान्ती', 'कान्‍ता', 'कामना', 'कालसाङ्ग', + 'किरण', 'किरण', 'किरण', 'कुसुम', 'कृतिका', 'कृष्टिना', 'कृष्ण', + 'कृष्ण', 'कृष्ण', 'कृष्ण', 'कृष्‍ण', 'कृष्‍ण', 'केमा', 'केशरी', + 'कोमल', 'गंगा', 'गंगा', 'गंगा', 'गणेश', 'गरीमा', 'गायत्री', 'गीता', + 'गीता', 'गीता', 'गीता', 'गौरी', 'चण्डिका', 'चन्दा', 'चन्दा', 'चन्दा', + 'चन्दा', 'चन्द्रमाया', 'चन्द्रलक्ष्मी', 'चन्द्रा', 'चम्पा', 'चाँदनी', + 'चिनी', 'चिनी', 'चुनु', 'चुरीनानी', 'छिरिङ', 'छिरिङ', 'छिरिङ', + 'छुङड्याक', 'छेतन', 'छोक्पा', 'जतन', 'जनक', 'जमुना', 'जमुना', 'जयश्री', + 'जुना', 'जुनु', 'जुलुम', 'ज्ञानहेरा', 'ज्ञानी', 'ज्ञानु', 'ज्यास्मीन', + 'झिनाला', 'टासी', 'टिना', 'डिलु', 'डोमा', 'डोली', 'डोल्मा', 'तानिया', + 'तारा', 'तारा', 'तुलसी', 'तेजस्वी', 'तोया', 'तोरण', 'थिन्ले', + 'दमयन्ति', 'दिप', 'दिपा', 'दिपाञ्‍जली', 'दिपिसा', 'दिल', 'दीक्षा', + 'दुर्गा', 'देचेन', 'देबकी', 'देवकी', 'देवी', 'धनमाया', 'धन्जु', + 'धन्श्‍वरी', 'धर्म', 'नगिना', 'नम्रता', 'नाती', 'नानु', 'नारन', + 'नारायण', 'निकिता', 'निक्षा', 'निधी', 'निभा', 'निमा', 'निम्मी', + 'निम्मी', 'निरजा', 'निरा', 'निरा', 'निरु', 'निरु', 'निर्मल', + 'निर्मला', 'निर्मला', 'निलु', 'निशरत', 'नीरा', 'पदम', 'पद्‍मा', + 'परला', 'पलिसा', 'पवित्रा', 'पार्वती', 'पार्वती', 'पिनु', 'पुजन', + 'पुजा', 'पुजा', 'पुजा', 'पुन', 'पुष्पा', 'पुष्‍षा', 'पूजा', 'पूर्ण', + 'पूर्ण', 'पूर्णमाया', 'पेन्जीला', 'प्रतिति', 'प्रतिभा', 'प्रतिभा', + 'प्रतिसरा', 'प्रमिला', 'प्रमिला', 'प्रविना', 'प्रिती', 'प्रिया', + 'प्रिया', 'प्रिया', 'प्रिया', 'प्रिया', 'प्रेमा', 'प्रेरणा', + 'प्रेरणा', 'फुमिनी', 'फुलावती', 'फौजिया', 'बनिता', 'बन्दना', 'बबिता', + 'बविता', 'बिणा', 'बिनिता', 'बिमला', 'बीणा', 'बुद्ध', 'बैष्णवी', + 'भगवती', 'भगवती', 'भगवती', 'भगवती', 'भगवती', 'भवानी', 'भारती', + 'भावना', 'भुवन', 'भोजकला', 'मंगली', 'मञ्जु', 'मणि', 'मधु', 'मन', 'मन', + 'मनिला', 'मनिषा', 'मनिषा', 'मनीषा', 'मन्जु', 'मन्जु', 'मन्जु', + 'मन्दीरा', 'ममता', 'ममता', 'मयङ्खु', 'मल्लीका', 'मल्लीका', + 'महावती', 'माधुरी', 'मानसी', 'मिङमर', 'मिठु', 'मिना', 'मिना', + 'मिना', 'मिना', 'मिनु', 'मिरा', 'मिरा', 'मिश्री', 'मीना', 'मीना', + 'मीरा', 'मीरा', 'मुनमुन', 'मून', 'मेना', 'मेन्‍खु', 'मेरिना', + 'मेरिना', 'मैया', 'मोहिनी', 'योङमी', 'रंजीता', 'रकीला', 'रचिता', + 'रजनी', 'रजनी', 'रजिता', 'रन्जना', 'रबिना', 'रबीना', 'रमा', 'रमा', + 'रमा', 'रमिता', 'रमिता', 'रमिला', 'रविना', 'रविश्री', 'रश्मि', 'रश्मि', + 'रश्‍मी', 'राजलक्ष्मी', 'राज्यलक्ष्मी', 'राधा', 'राधिका', 'राम', 'राम', + 'राम', 'रिता', 'रिता', 'रिता', 'रितु', 'रिमा', 'रीता', 'रीता', 'रीता', + 'रीना', 'रुजा', 'रुद्र', 'रुपा', 'रुपा', 'रुपा', 'रुपा', 'रुपा', + 'रुपा', 'रुपा', 'रुविना', 'रेखा', 'रेणु', 'रेवती', 'रोजिना', 'लक्ष्मी', + 'लक्ष्मी', 'लक्ष्मी', 'लक्ष्मी', 'लक्ष्‍मी', 'लक्ष्‍मी', 'ललिता', + 'लिलालक्ष्मी', 'लीला', 'ल्हाजी', 'वन्दिनी', 'वर्षा', 'ववी', + 'विजया', 'विजया', 'विद्या', 'विध्या', 'विना', 'विना', 'विनिता', + 'विनिता', 'विभा', 'विमला', 'विमला', 'विमला', 'विमला', 'विष्‍णु', + 'विष्‍णु', 'शर्मिला', 'शर्मिला', 'शर्मिला', 'शर्मिला', 'शशी', + 'शशी', 'शशी', 'शशी', 'शान्ता', 'शान्ति', 'शान्ती', 'शान्ती', + 'शान्ती', 'शान्ती', 'शान्ती', 'शिखा', 'शिखा', 'शिला', 'शिलु', + 'शीला', 'शुभेच्छा', 'शुशिला', 'शुशिला', 'शुसिला', 'शोभा', 'शोभा', + 'शोभा', 'श्रद्धा', 'श्रद्धा', 'श्रीप्राप्‍ती', 'श्रीमती', 'श्रीया', + 'श्रृष्‍टि', 'श्रेयशी', 'श्‍यामा', 'श्‍वेता', 'संगिता', 'संगिता', + 'संगीता', 'सचिता', 'सजना', 'सत्य', 'सत्यव्रता', 'सपना', 'सफलता', + 'सबनम', 'समानता', 'समीना', 'सम्पदा', 'सरला', 'सरस्वती', 'सरस्वती', + 'सरस्वती', 'सरस्वती', 'सरस्वती', 'सरिता', 'सरिता', 'सरिता', 'सरिता', + 'सरिता', 'सरीता', 'सरीता', 'सरोज', 'सरोज', 'सरोजा', 'सर्मिला', + 'सलिना', 'सलिमा', 'सल्भिया', 'सविता', 'सविता', 'सविता', 'सविता', + 'सविता', 'सविना', 'साइमु', 'सागर', 'सानु', 'सानु', 'सानु', 'सान्नानी', + 'सान्नानी', 'सावित्री', 'सावित्री', 'सावित्री', 'सिता', 'सिता', + 'सिरु', 'सीता', 'सुकृती', 'सुधा', 'सुधा', 'सुधा', 'सुधा', 'सुन', + 'सुनाम', 'सुनिता', 'सुनिता', 'सुनिता', 'सुप्रभा', 'सुभद्रा', 'सुमन', + 'सुमित्रा', 'सुमित्रा', 'सुमित्रा', 'सुमैया', 'सुरुची', 'सुरेन्‍द्रा', + 'सुवर्णा', 'सुशिला', 'सुशिला', 'सुशिला', 'सुशिला', 'सुषमा', 'सुष्‍मा', + 'सुष्‍मा', 'सुसिला', 'सृजना', 'सृजना', 'सृजना', 'सोनी', 'सोनु', + 'स्मृती', 'स्मृती', 'स्वति', 'स्वेच्‍छा', 'स्‍वीकृती', 'हनी', 'हरि', + 'हिमा', 'हिरा', 'हिरा', + ) + + first_names_male = ( + 'अक्षय', 'अच्युत', 'अजय', 'अजय', 'अनक', 'अनिर', 'अनिल', 'अनिल', 'अनिल', + 'अनिल', 'अनिष', 'अनुप', 'अनुप', 'अनोज', 'अभिषेक', 'अभिषेक', 'अभिषेक', + 'अमित', 'अमित', 'अमित', 'अमिन', 'अमृत', 'अमृत', 'अरुण', 'अरुण', + 'अर्जुन', 'अलंकार', 'अवलोक', 'अविनाश', 'अविशेक', 'अशोक', 'अशोक', + 'अशोक', 'अशोक', 'अशोक', 'अशोब', 'असिन', 'असोक', 'आकाश', 'आत्मेश', + 'आलोक', 'आलोक', 'आशय', 'आशिष', 'आशिष', 'आशिष', 'आशिष', 'आशिष', 'आशीष', + 'ईब्राहीम', 'ईसी', 'उज्ज्वल', 'उत्तम', 'उत्तम', 'उद्धव', 'उद्धव', + 'उमेश', 'उम्मेद', 'ऋकु', 'ऋशु', 'ऋषि', 'ऋषिकेस', 'एक', 'ओम', 'कपिल', + 'कमल', 'कमल', 'करन', 'करन', 'कर्मा', 'कल्याण', 'काजि', 'काजी', 'किरण', + 'किरण', 'किरण', 'किरण', 'किशन', 'किशोर', 'किशोर', 'किशोर', 'कीर्ति', + 'कुमार', 'कुमार', 'कुवेर', 'कुशल', 'कृजल', 'कृष्ण', 'कृष्ण', + 'कृष्णमान', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', + 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'कृष्‍ण', 'केशर', 'केशव', + 'केशव', 'केशव', 'केशवलाल', 'केसर', 'कौशल', 'खगेन्द्र', 'खड्ग', + 'गणेश', 'गोपाल', 'गोपाल', 'गोपी', 'गोविन्द', 'गोविन्द', 'गोविन्द', + 'गौतम', 'चन्द', 'चन्द्र', 'चन्द्रेश', 'चिरञ्जीबि', 'चिरनजीवी', 'चैत्य', + 'छवि', 'छेवाङ', 'जगनाथ', 'जगन्नाथ', 'जगन्नाथ', 'जगविर', 'जयन्त', + 'जयन्द्र', 'जयराम', 'जितेन्द्र', 'जीबन', 'जुगल', 'ज्ञान', 'ज्ञानु', + 'ज्ञानेश्‍वर', 'ज्योती', 'ज्योती', 'ज्‍योभान', 'टसी', 'टासी', 'टिका', + 'टेक', 'डा.', 'डा.', 'डा.', 'डेनिस', 'तिर्थ', 'तेजश्‍वी', 'तोप्ला', + 'तोलाराम', 'त्रिरत्‍न', 'थोकेल', 'दमोदर', 'दर्शन', 'दवा', 'दावा', + 'दिगविजया', 'दिनेश', 'दिनेस', 'दिपक', 'दिपक', 'दिपक', 'दिपक', 'दिपक', + 'दिपक', 'दिपक', 'दिपक', 'दिपक', 'दिपकस्वर', 'दिपीन', 'दिपेन्द्र', + 'दिपेन्द्र', 'दिपेन्द्र', 'दिपेश', 'दिपेश', 'दिलिप', 'दिवाकर', 'दीपक', + 'दीपेश', 'दुर्गा', 'देव', 'देवेन्द्र', 'देवेन्द्र', 'देवेन्द्र', + 'देवेन्‍द्र', 'द्वारीका', 'धर्मेन्द्र', 'धिरज', 'ध्रुव', 'नबिन', + 'नबिन्द्र', 'नरपल', 'नरभूपाल', 'नरेन्द्र', 'नरेन्द्र', 'नवराज', 'नविन', + 'नविन', 'नारायण', 'नारायण', 'निमेश', 'निरज', 'निरज', 'निरोज', 'निर्भय', + 'निर्मल', 'निर्मेश', 'पंकज', 'पंच', 'पवन', 'पवन', 'पारस', 'पासाङ्ग', + 'पुरुषोत्तम', 'पुर्णभक्‍त', 'पुलकित', 'पुष्‍प', 'प्रकाश', 'प्रकाश', + 'प्रकाश', 'प्रकाश', 'प्रकास', 'प्रजीत', 'प्रज्ञान', 'प्रज्वल', + 'प्रदिप', 'प्रद्मुम्न', 'प्रफुल्ल', 'प्रभु', 'प्रमेश्‍वर', 'प्रमोद', + 'प्रल्‍हाद', 'प्रविण', 'प्रवेश', 'प्रशान्त', 'प्रशान्न', 'प्रसङ्ग', + 'प्रेम', 'फणिन्द्र', 'बद्रि', 'बद्री', 'बद्री', 'बनवारी', 'बबि', 'बबि', + 'बलकिसन', 'बलराम', 'बल्लु', 'बसन्त', 'बासु', 'बासु', 'बिकाश', 'बिकास', + 'बिराट', 'बुद्धि', 'बुध्द', 'भरत', 'भरत', 'भरत', 'भविन्‍द्र', 'भाइ', + 'भुमा', 'भैया', 'भैरवलाल', 'भोला', 'मंजिल', 'मणी', 'मणीराज', 'मदन', + 'मदन', 'मदन', 'मनिष', 'मनीष', 'मनोज', 'मनोज', 'मनोज', 'मनोज', 'मनोज', + 'मनोहर', 'मनोहर', 'मन्ना', 'मयुश', 'महेन्द्र', 'महेश', 'महेश', 'महेश', + 'महेश', 'महेश', 'माधव', 'माधव', 'मालचन्द', 'मित्र', 'मिनराज', + 'मुकुन्द', 'मुकुन्‍द', 'मुकेश', 'मुख्या', 'मुरारीलाल', 'मेघ', 'मैत्री', + 'मोती', 'मोती', 'मोहन', 'मोहन', 'मोहन', 'यश', 'याम', 'युवराज', + 'योगेन्द्र', 'रजत', 'रतन', 'रत्‍न', 'रमण', 'रमेश', 'रमेश', 'रवि', + 'रवि', 'रवि', 'रविन', 'रविन्द्र', 'रविन्द्र', 'रविन्द्र', 'रविन्द्र', + 'राघव', 'राज', 'राजकुमार', 'राजन', 'राजन', 'राजिव', 'राजीव', 'राजु', + 'राजु', 'राजु', 'राजु', 'राजु', 'राजु', 'राजेन्द्र', 'राजेन्द्र', + 'राजेन्द्र', 'राजेन्द्र', 'राजेश', 'राजेश', 'राजेश', 'राजेश', 'राजेश', + 'राजेश', 'राम', 'राम', 'राम', 'राम', 'राम', 'राम', 'राम', 'राम', 'राम', + 'रामचन्द्र', 'रामजान', 'रामशरण', 'राहुल', 'राहुल', 'रा्जेन्द्र', + 'रुपेश', 'रोजिन', 'रोजीन', 'रोमेन्‍द्र', 'रोहन', 'रौनक', 'लक्ष्मण', + 'लक्ष्मी', 'लक्ष्‍मण', 'लव', 'लाल', 'लिटन', 'वसन्त', 'विकास', 'विक्रम', + 'विजय', 'विजेश', 'विध्यामान', 'विनिल', 'विनोद', 'विनोद', 'विरभद्र', + 'विरेन्द्र', 'विवेक', 'विवेक', 'विवेक', 'विश्‍व', 'विष्णु', 'विष्‍णु', + 'वुष्‍कर', 'शंकर', 'शंकर', 'शंकर', 'शंकर', 'शक्ति', 'शचिन्द्र', 'शरद', + 'शरद', 'शरद', 'शशी', 'शान्त', 'शाहिद', 'शिव', 'शिव', 'शुक्र', + 'शुशान्त', 'शुशिल', 'शेलेन्‍द्र', 'शैलेन्द्र', 'शैलेन्द्र', 'शैलेस', + 'श्याम', 'श्रीजङ्ग', 'श्रीवत्स', 'श्रेयस', 'श्‍याम', 'श्‍यामराज', + 'संकर', 'संजय', 'संजय', 'संजिव', 'संजिव', 'संजीब', 'संजीव', 'संदिप', + 'सगुन', 'सजन', 'सजेन्‍द्र', 'सन्जय', 'सन्जय', 'सन्जीब', 'सन्तोष', + 'सफराज', 'समुन्‍द्र', 'सम्पुर्ण', 'सरोज', 'सरोज', 'सरोज', 'सर्वेश', + 'सागर', 'सानु', 'सिद्धि', 'सीताराम', 'सुजन', 'सुजन', 'सुदन', + 'सुदर्शन', 'सुधिर', 'सुनिल', 'सुनिल', 'सुनिल', 'सुनिल', 'सुन्दर', + 'सुमन', 'सुमन', 'सुरज', 'सुरज', 'सुरज', 'सुरेन', 'सुरेन्द्र', + 'सुरेन्‍द्र', 'सुरेश', 'सुरेश', 'सुरेश', 'सुरेश', 'सुवर्ण', 'सुवर्ण', + 'सुवोध', 'सुशान्त', 'सुशिल', 'सुशिल', 'सृजन', 'सेखर', 'सैबी', 'सोम', + 'सौरब', 'सौरभ', 'स्वागत', 'स‌ंजय', 'हरि', 'हरि', 'हरि', 'हरिहर', + 'हर्क', 'हिरा', 'हिरा', 'हिरा', 'हिरेन्द्र', 'हेमन', 'हेमराज', + ) + + first_names = first_names_male + first_names_female + + last_names = ( + 'अग्रवाल', 'नेपाल', 'न्यौपाने', 'महर्जन', 'श्रेष्‍ठ', 'थापा', + 'लामा', 'खड्गी', 'शाह', 'मानन्धर', 'मानन्‍धर', 'अग्रवाल', 'थापा', + 'रिमाल', 'अग्रवाल', 'सरीया', 'थापा', 'दुगल', 'महर्जन', 'बेगामी', + 'सिंह', 'गुरुङ्ग', 'पन्‍त', 'श्रेष्‍ठ', 'पाण्डे', 'महर्जन', 'जैन', + 'शाक्य', 'अग्रवाल', 'थापा', 'पाण्‍डे', 'मानन्धर', 'राजकर्णिकार', + 'रेग्मी', 'सरिया', 'पोखरेल', 'कार्की', 'अग्रवाल', 'भट्टराई', 'पौड्याल', + 'अग्रवाल', 'पाण्डे', 'उपाध्याय', 'र‌जितकार', 'अधिकारी', 'पाण्डे', + 'मानन्धर', 'पाण्‍डे', 'अग्रवाल', 'मुस्‍लीम', 'गुरुङ्ग', 'कक्षपती', + 'मानन्धर', 'मास्के', '(क्षेत्री)', 'थापा', 'सापकोटा', 'बोथरा', + 'श्रेष्‍ठ', 'श्रेष्‍ठ', 'भुसाल', 'पन्त', '(पाण्डे)', 'टिब्रेवाल', + 'श्रेष्‍ठ', 'बेगानी', 'पनेरु', 'श्रेष्ठ', 'राठौर', 'गुरुङ', 'पाण्डे', + 'महर्जन', 'मानन्धर', 'लामा', 'श्रेष्‍ठ', 'थापा', 'राणा', 'दुगड', + 'प्‍याकुरेल', 'अग्रवाल', 'अधिकारी', 'जोशी', 'गुरुङ्ग', 'सिलवाल', + 'सिल्वाल', 'पाण्डे', 'पौड्याल', 'घिमिरे', 'क्षेत्री', 'कर्माचार्य', + 'के.सी.', 'थापा', 'महर्जन', 'घिमिरे', 'डंगोल', 'श्रेष्‍ठ', 'श्रेष्‍ठ', + 'श्रेष्‍ठ', 'खत्री', 'साही', 'थापा', 'मल्ल', 'राजकर्णिकार', 'तिवारी', + 'मल्ल', 'श्रेष्‍ठ', 'श्रेष्ठ', 'प्रजापति', 'सिटौला', 'गिरी', '(धेके)', + 'के.सी.', 'शर्मा', 'दवाडी', 'श्रेष्‍ठ', 'मल्ल', 'सिल्वाल', 'शाक्य', + 'प्रधानाङ्ग', 'सुवाल', 'जैन', 'रिमाल', 'पौडेल', 'मानन्धर', 'जोशी', + 'गुरुङ्ग', 'पौडेल', 'आचार्य', 'तिवारी', 'महर्जन', 'दुगड', 'के.सी', + 'के.सी', 'मानन्धर', 'राणा', 'धनावत', 'मानन्धर', 'वज्राचार्य', + 'कक्षपति', 'बेगानी', 'भट्टराई', 'भुजू', 'घले', 'गुरुङ्ग', 'बगाले', + 'पोखरेल', 'थापा', 'थापा', 'महतो', 'लोहनी', 'श्रेष्‍ठ', 'शाही', + 'उक्याव', 'दुगड', 'राजकर्णिकार', 'गुरुङ्ग', 'शर्मा', 'जैन', 'गुरुङ', + 'बस्नेत', 'वज्राचार्य', 'मानन्‍धर', 'मैनाली', 'चौलागाई', 'न्यौपाने', + 'महर्जन', 'मानन्धर', 'राजकर्णिकार', 'सिंह', 'तुलाधर', 'अधिकारी', + 'श्रेष्‍ठ', 'अमात्य', 'महर्जन', 'अग्रवाल', 'के.सी', 'अग्रवाल', + 'अधिकारी', 'न्यौपाने', 'लामा', 'पौडेल', 'शाह', 'श्रेष्‍ठ', 'शर्मा', + 'शाक्य', 'पराजुली', 'शाही', 'श्रेष्‍ठ', 'पौडेल', 'न्यौपाने', 'मानन्धर', + 'सिंह', 'भट्टराई', 'सुनुवार', 'श्रेष्‍ठ', 'जैन', 'शाह', 'लोहनी', + 'तुलाधर', 'सिं‌खडा', 'प्रजापति', 'पोद्वार', 'के.सी', 'शर्मा', 'शर्मा', + 'श्रेष्ठ', 'सिंघल', 'के.सी.', 'देउजा', 'दाहाल', 'खनाल', 'पनेरु', + 'मानन्धर', 'गोयल', 'जोशी', 'अमात्‍य', 'शेर्पा', 'श्रेष्ठ', 'प्रधानाङ', + 'भिमसरिया', 'सुवाल', 'तण्डुकार', 'तुलाधर', 'गुरागाई', 'मानन्धर', + 'च्यामे', 'सी', 'गौतम', 'जोशी', 'शाह', 'श्रेष्‍ठ', 'श्रेष्ठ', 'गौतम', + 'साह', 'जोशी', 'गुरुङ', 'मोक्तान', 'राजकर्णिकार', 'सुवाल', 'श्रेष्‍ठ', + 'पन्त', 'डंगोल', 'उपाध्‍याय', 'प्रधान', 'खनाल', '(न्यौपाने)', 'मित्तल', + 'शर्मा', 'गडतौला', 'गोयल', 'रेग्मी', 'खड्गी', 'लोहनी', 'पाण्डेय', + 'लोहनी', 'पाण्डे', 'लिम्बु', 'शाही', 'राजकर्णिकार', 'डंगोल', 'सि‌ह', + 'मानन्धर', 'श्रेष्‍ठ', 'खत्री', 'हायाजु', 'पाण्डे', 'खनाल', + 'राजकर्णिकार', 'थापा', 'श्रेष्‍ठ', 'शाक्य', 'प्रजापती', 'खड्गी', + 'श्रेष्‍ठ', 'श्रेष्‍ठ', 'श्रेष्‍ठ', 'जैन', 'अग्रवाल', 'गौतम', 'रसायली', + 'खड्गी', 'सिलवाल', 'शाही', 'श्रेष्‍ठ', 'शाही', 'राजकर्णिकार', 'जैन', + 'मानन्धर', 'ज्ञवाली', 'भिमसरीया', 'ढङ्गेल', 'बस्नेत', 'प्याकुरेल', + 'पाण्डे', 'दुगड', 'राजकर्णिकार', 'पाण्डे', 'राजकर्णिकार', 'कुइकेल', + 'अग्रवाल', 'गुरुङ्ग', 'अग्रवाल', 'पौडेल', 'कंसाकार', 'दुगड', + 'श्रेष्‍ठ', 'भट्टराई', 'क्षेत्री', 'श्रेष्‍ठ', 'नाहटा', 'बस्नेत', + 'राजकर्णिकार', 'के.सी.', 'के.सी.', 'गुप्‍ता', 'बज्राचार्य', 'जोशी', + 'ज्ञवाली', 'पन्त', 'सिहं', 'गुप्‍ता', 'जोशी', 'शर्मा', 'के.सी', + 'देउजा', 'श्रेष्‍ठ', 'लोहनी', 'रेग्‍मी', 'क्षेत्री', 'श्रेष्‍ठ', + 'चालिसे', 'हायजु', 'मनन्धर', 'श्रेष्ठ', 'के.सी.', 'गुरुङ', 'मानन्धर', + 'राणा', 'श्रेष्‍ठ', 'मानन्धर', 'मानन्धर', 'काबरा', 'शाही', 'राठौर', + 'उपाध्याय', 'खनाल', 'चालिसे', 'तुलाधर', 'मगर', 'जैन', 'मल्‍ल', 'जैन', + 'राठी', 'अधिकारी', 'पन्‍त', 'गुरुङ्ग', 'थापा', 'पौडेल', 'सुवेदी', + 'अधिकारी', 'मुसलमान', 'किल्ला', 'मोक्तान', 'बस्न्यात', 'अधिकारी', + 'श्रेष्ठ', 'तुलाधर', 'बज्राचार्य', 'देउजा', 'शाक्य', 'श्रेष्‍ठ', + 'गुरुङ्ग', 'लेखक', 'खड्का', 'महर्जन', 'कार्की', 'थापा', 'श्रेष्‍ठ', + 'पन्त', 'राई', 'पाण्डे', 'लामा', 'डंगोल', 'मानन्धर', 'पन्‍त', + 'श्रेष्‍ठ', 'शाह', 'लोहनी', 'दुगड', 'लामा', 'श्रेष्‍ठ', 'शाह', + 'मानन्धर', 'अधिकारी', 'पाण्डे', 'शाह', 'उपाध्याय', 'देउजा', 'श्रेष्‍ठ', + 'बेगानी', 'शर्मा', 'गिरी', 'गुरुङ्ग', 'श्रेष्‍ठ', 'थापा', + 'राजकर्णिकार', 'आलम', 'अधिकारी', 'मानन्‍धर', 'श्रेष्ठ', 'श्रेष्‍ठ', + 'पाण्डे', 'रसायली', 'के.सी', 'राजकर्णिकार', 'श्रेष्‍ठ', 'ढकाल', + 'ठुकरी', 'ढुङ्गेल', 'राजकर्णिकार', 'भट्टराई', 'राजकर्णिकार', + 'श्रेष्ठ', 'नेपाल', 'महर्जन', 'गुरुङ्ग', 'शाह', 'श्रेष्‍ठ', 'सत्याल', + 'सिंह', 'मानन‍धर', 'श्रेष्‍ठ', 'श्रेष्‍ठ', 'नेपाली', 'शाह', 'शंकर', + 'सुनुवार', 'आलम', 'श्रेष्‍ठ', 'राजकर्णिकार', 'तुलाधर', 'देउजा', + '(श्रेष्‍ठ)', 'ज्ञवाली', 'तुलाधर', 'खड्गी', 'बज्राचार्य', 'पन्त', + 'हायजु', 'श्रेष्ठ', 'सिंह', 'गौतम', 'मित्तल', 'ठकुरी', 'थापा', + 'मानन्धर', 'न्यौपाने', '(अमात्य)', 'लामा', 'सिंह', 'थापा', 'मानन्धर', + 'ड‌ंगोल', 'मानन्धर', 'तुलाधर', 'रसाइली', 'अग्रवाल', 'जैन', 'श्रेष्‍ठ', + 'श्रेष्‍ठ', 'तिवारी', 'श्रेष्‍ठ', 'न्यौपाने', 'तिवारी', 'जैन', + 'ढुङ्गेल', 'मल्ल', 'गिरी', 'राजकर्णिकार', 'थापा', 'अग्रवाल', 'सिटौला', + 'थापा', 'कर्माचार्य', 'किराँत', 'सिंह', 'सिंह', 'जोशी', 'शाही', + 'दाहाल', 'महर्जन', 'महर्जन', 'जोशी', 'सिंह', 'जोशी', + ) + + prefixes_female = ('श्रीमती', 'सुश्री', ) + prefixes_male = ('श्री', 'श्रीमान',) diff --git a/src/faker/providers/nl_NL/person.py b/src/libs/faker/providers/person/nl_NL/__init__.py similarity index 98% rename from src/faker/providers/nl_NL/person.py rename to src/libs/faker/providers/person/nl_NL/__init__.py index 9cecb05..c62d778 100644 --- a/src/faker/providers/nl_NL/person.py +++ b/src/libs/faker/providers/person/nl_NL/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -93,6 +93,8 @@ class Provider(PersonProvider): 'Yfke', 'Yinthe', 'Zara', 'Zeynep', 'Zoey', 'Zoë', ) + first_names = first_names_male + first_names_female + last_names = ( "'s Gravensande", 'Aalts', 'Aarden', 'Aarts', 'Adelaar', 'Adriaansen', 'Adriaensdr', 'Adriaense', 'Adryaens', 'Aeije', 'Aelftrud van Wessex', @@ -312,16 +314,3 @@ class Provider(PersonProvider): 'van der Veen', 'van der Veiver', 'van der Velde', 'van der Velden', 'van der Ven', 'van der Wal', 'van der Zijl', 'van het Heerenveen', ) - - @classmethod - def first_name(cls): - return cls.random_element( - (cls.first_name_male(), cls.first_name_female())) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) diff --git a/src/faker/providers/no_NO/person.py b/src/libs/faker/providers/person/no_NO/__init__.py similarity index 91% rename from src/faker/providers/no_NO/person.py rename to src/libs/faker/providers/person/no_NO/__init__.py index b1513b6..31ea2fd 100644 --- a/src/faker/providers/no_NO/person.py +++ b/src/libs/faker/providers/person/no_NO/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): formats = ( @@ -351,27 +351,4 @@ class Provider(PersonProvider): 'Dr.', 'Prof.', ) - @classmethod - def first_name(cls): - return cls.random_element(cls.first_names) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) - - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) - - @classmethod - def prefix_male(cls): - return cls.random_element(cls.prefixes) - - @classmethod - def prefix_female(cls): - return cls.random_element(cls.prefixes) diff --git a/src/faker/providers/pl_PL/person.py b/src/libs/faker/providers/person/pl_PL/__init__.py similarity index 96% rename from src/faker/providers/pl_PL/person.py rename to src/libs/faker/providers/person/pl_PL/__init__.py index cd119a7..9e87d64 100644 --- a/src/faker/providers/pl_PL/person.py +++ b/src/libs/faker/providers/person/pl_PL/__init__.py @@ -1,7 +1,24 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider -import random +from .. import Provider as PersonProvider + + +def checksum_identity_card_number(characters): + """ + Calculates and returns a control digit for given list of characters basing on Identity Card Number standards. + """ + weights_for_check_digit = [7, 3, 1, 0, 7, 3, 1, 7, 3] + check_digit = 0 + + for i in range(3): + check_digit += weights_for_check_digit[i] * (ord(characters[i]) - 55) + + for i in range(4, 9): + check_digit += weights_for_check_digit[i] * characters[i] + + check_digit %= 10 + + return check_digit class Provider(PersonProvider): @@ -11,12 +28,12 @@ class Provider(PersonProvider): '{{first_name}} {{last_name}}', '{{first_name}} {{last_name}}', '{{first_name}} {{last_name}}', - '{{prefix}} {{first_name}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name_female}}', '{{first_name}} {{last_name}}', - '{{prefix}} {{first_name}} {{last_name}}' + '{{prefix_male}} {{first_name_male}} {{last_name_male}}' ) - male_first_names = ( + first_names_male = ( 'Jakub', 'Jan', 'Mateusz', 'Bartek', 'Kacper', 'Michał', 'Szymon', 'Antoni', 'Filip', 'Piotr', 'Maciej', 'Aleksander', 'Franciszek', 'Mikołaj', 'Adam', 'Stanisław', 'Wiktor', 'Krzysztof', 'Wojciech', 'Igor', 'Maksymilian', 'Karol', 'Dawid', 'Tomasz', 'Patryk', @@ -31,7 +48,7 @@ class Provider(PersonProvider): 'Mariusz', 'Albert', 'Fryderyk', 'Ernest', 'Tobiasz' ) - female_first_names = ( + first_names_female = ( 'Kamila', 'Ewa', 'Blanka', 'Olga', 'Kalina', 'Klara', 'Urszula', 'Sandra', 'Kaja', 'Marianna', 'Kornelia', 'Justyna', 'Monika', 'Sara', 'Adrianna', 'Aniela', 'Agnieszka', 'Róża', 'Marcelina', 'Roksana', 'Natasza', 'Lidia', 'Malwina', 'Karina', 'Ada', 'Marika', @@ -520,15 +537,35 @@ class Provider(PersonProvider): 'Bukowski', 'Leśniak', ) - prefixes = ('pan', 'pani') + prefixes_male = ('pan',) + prefixes_female = ('pani',) - first_names = (female_first_names[:20] + male_first_names[:20]) + \ - (female_first_names + male_first_names) + first_names = first_names_male + first_names_female - @classmethod - def last_name(cls): - return cls.random_element(cls.unisex_last_names) + def last_name(self): + return self.random_element(self.unisex_last_names) - @classmethod - def prefix(cls): - return cls.random_element(cls.prefixes) \ No newline at end of file + def identity_card_number(self): + """ + Returns 9 character Polish Identity Card Number, + Polish: Numer Dowodu Osobistego. + + The card number consists of 3 letters followed by 6 digits (for example, ABA300000), + of which the first digit (at position 3) is the check digit. + + https://en.wikipedia.org/wiki/Polish_identity_card + """ + identity = [] + + for _ in range(3): + identity.append(self.random_letter().upper()) + + # it will be overwritten by a checksum + identity.append(0) + + for _ in range(5): + identity.append(self.random_digit()) + + identity[3] = checksum_identity_card_number(identity) + + return ''.join(str(character) for character in identity) diff --git a/src/libs/faker/providers/person/pt_BR/__init__.py b/src/libs/faker/providers/person/pt_BR/__init__.py new file mode 100644 index 0000000..bb5e7cb --- /dev/null +++ b/src/libs/faker/providers/person/pt_BR/__init__.py @@ -0,0 +1,104 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}}' + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}' + + ) + + formats = formats_male + formats_female + + """ + To a previous (undocumented?) list of female given names was added the 100 + most popular names in Brazil in 2014 and 2015 according to Exame magazine: + * http://exame.abril.com.br/brasil/noticias/os-100-nomes-mais-comuns-no-brasil-em-2014 + * http://exame.abril.com.br/brasil/noticias/os-100-nomes-mais-comuns-no-brasil-em-2015 + """ + first_names_female = ( + 'Agatha', 'Alana', 'Alexia', 'Alice', 'Alícia', 'Amanda', + 'Ana Beatriz', 'Ana Carolina', 'Ana Clara', 'Ana Julia', 'Ana Júlia', + 'Ana Laura', 'Ana Luiza', 'Ana Lívia', 'Ana Sophia', 'Ana Vitória', + 'Ana', 'Beatriz', 'Bianca', 'Brenda', 'Bruna', 'Bárbara', 'Camila', + 'Carolina', 'Caroline', 'Catarina', 'Cecília', 'Clara', 'Clarice', + 'Daniela', 'Eduarda', 'Elisa', 'Eloah', 'Emanuella', 'Emanuelly', + 'Emilly', 'Esther', 'Evelyn', 'Fernanda', 'Gabriela', 'Gabrielly', + 'Giovanna', 'Helena', 'Heloísa', 'Isabel', 'Isabella', 'Isabelly', + 'Isadora', 'Isis', 'Joana', 'Julia', 'Juliana', 'Júlia', 'Kamilly', + 'Lara', 'Larissa', 'Laura', 'Lavínia', 'Laís', 'Letícia', 'Lorena', + 'Luana', 'Luiza', 'Luna', 'Lívia', 'Maitê', 'Manuela', 'Marcela', + 'Maria Alice', 'Maria Cecília', 'Maria Clara', 'Maria Eduarda', + 'Maria Fernanda', 'Maria Julia', 'Maria Luiza', 'Maria Sophia', + 'Maria Vitória', 'Maria', 'Mariana', 'Mariane', 'Marina', 'Maysa', + 'Melissa', 'Milena', 'Mirella', 'Natália', 'Nicole', 'Nina', 'Olivia', + 'Pietra', 'Rafaela', 'Raquel', 'Rebeca', 'Sabrina', 'Sarah', 'Sofia', + 'Sophia', 'Sophie', 'Stella', 'Stephany', 'Valentina', 'Vitória', + 'Yasmin' + ) + + """ + To a previous (undocumented?) list of male given names was added the 100 + most popular names in Brazil in 2014 and 2015 according to this blog post: + * http://exame.abril.com.br/brasil/noticias/os-100-nomes-mais-comuns-no-brasil-em-2014 + * http://exame.abril.com.br/brasil/noticias/os-100-nomes-mais-comuns-no-brasil-em-2015 + """ + first_names_male = ( + 'Alexandre', 'André', 'Anthony', 'Antônio', 'Arthur', 'Augusto', + 'Benjamin', 'Benício', 'Bernardo', 'Breno', 'Bruno', 'Bryan', 'Caio', + 'Calebe', 'Carlos Eduardo', 'Cauã', 'Cauê', 'Daniel', 'Danilo', + 'Davi Lucas', 'Davi Lucca', 'Davi Luiz', 'Davi', 'Diego', 'Diogo', + 'Eduardo', 'Emanuel', 'Enrico', 'Enzo Gabriel', 'Enzo', 'Erick', + 'Felipe', 'Fernando', 'Francisco', 'Gabriel', 'Guilherme', + 'Gustavo Henrique', 'Gustavo', 'Heitor', 'Henrique', 'Ian', 'Igor', + 'Isaac', 'Joaquim', 'João Felipe', 'João Gabriel', 'João Guilherme', + 'João Lucas', 'João Miguel', 'João Pedro', 'João Vitor', 'João', + 'Juan', 'Kaique', 'Kevin', 'Leandro', 'Leonardo', 'Levi', 'Lorenzo', + 'Lucas Gabriel', 'Lucas', 'Lucca', 'Luigi', 'Luiz Felipe', + 'Luiz Fernando', 'Luiz Gustavo', 'Luiz Henrique', 'Luiz Miguel', + 'Luiz Otávio', 'Marcelo', 'Marcos Vinicius', 'Matheus', 'Miguel', + 'Murilo', 'Nathan', 'Nicolas', 'Noah', 'Otávio', 'Paulo', + 'Pedro Henrique', 'Pedro Lucas', 'Pedro Miguel', 'Pedro', 'Pietro', + 'Rafael', 'Raul', 'Renan', 'Rodrigo', 'Ryan', 'Samuel', 'Thales', + 'Theo', 'Thiago', 'Thomas', 'Vicente', 'Vinicius', 'Vitor Gabriel', + 'Vitor Hugo', 'Vitor', 'Yago', 'Yuri' + ) + + first_names = first_names_male + first_names_female + + """ + To a previous (undocumented?) list of family names was added the 70 + most popular family names in Brazil according to this blog post: + * http://nomeschiques.com/os-70-sobrenomes-mais-comuns-e-famosos-do-brasil/ + """ + last_names = ( + 'Almeida', 'Alves', 'Aragão', 'Araújo', 'Azevedo', 'Barbosa', 'Barros', + 'Caldeira', 'Campos', 'Cardoso', 'Cardoso,', 'Carvalho', 'Castro', + 'Cavalcanti', 'Correia', 'Costa', 'Costela', 'Cunha', 'da Conceição', + 'da Costa', 'da Cruz', 'da Cunha', 'da Luz', 'da Mata', 'da Mota', + 'da Paz', 'da Rocha', 'da Rosa', 'das Neves', 'Dias', 'Duarte', + 'Farias' 'Fernandes', 'Ferreira', 'Fogaça', 'Freitas', 'Gomes', + 'Gonçalves', 'Jesus', 'Lima', 'Lopes', 'Martins', 'Melo', 'Mendes', + 'Monteiro', 'Moraes', 'Moreira', 'Moura', 'Nascimento', 'Nogueira', + 'Novaes', 'Nunes', 'Oliveira', 'Peixoto', 'Pereira', 'Pinto', 'Pires', + 'Porto', 'Ramos', 'Rezende', 'Ribeiro', 'Rocha', 'Rodrigues', 'Sales', + 'Santos', 'Silva', 'Silveira', 'Souza', 'Teixeira', 'Viana', 'Vieira' + ) + + prefixes_female = ('Srta.', 'Sra.', 'Dra.') + prefixes_male = ('Sr.', 'Dr.') diff --git a/src/libs/faker/providers/person/pt_PT/__init__.py b/src/libs/faker/providers/person/pt_PT/__init__.py new file mode 100644 index 0000000..558764c --- /dev/null +++ b/src/libs/faker/providers/person/pt_PT/__init__.py @@ -0,0 +1,74 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{prefix}} {{last_name}}', + '{{first_name}} {{last_name}}-{{last_name}}', + '{{first_name}}-{{first_name}} {{last_name}}', + ) + + first_names = ( + 'Adriana', 'Afonso', 'Alex', 'Alexandra', 'Alexandre', 'Alice', + 'Alícia', 'Amélia', 'Ana', 'Andreia', 'André', 'Anita', 'António', + 'Ariana', 'Artur', 'Beatriz', 'Benedita', 'Benjamim', 'Bernardo', + 'Bianca', 'Brian', 'Bruna', 'Bruno', 'Bryan', 'Bárbara', 'Caetana', + 'Camila', 'Carlos', 'Carlota', 'Carminho', 'Carolina', 'Catarina', + 'Clara', 'Cláudio', 'Constança', 'Cristiano', 'César', 'Daniel', + 'Daniela', 'David', 'Denis', 'Diana', 'Diego', 'Dinis', 'Diogo', + 'Duarte', 'Débora', 'Edgar', 'Eduarda', 'Eduardo', 'Ema', 'Emanuel', + 'Emma', 'Emília', 'Enzo', 'Erica', 'Erika', 'Eva', 'Fabiana', + 'Fernando', 'Filipa', 'Filipe', 'Flor', 'Francisca', 'Francisco', + 'Frederico', 'Fábio', 'Gabriel', 'Gabriela', 'Gaspar', 'Gil', 'Gonçalo', + 'Guilherme', 'Gustavo', 'Helena', 'Henrique', 'Hugo', 'Iara', 'Igor', + 'Inês', 'Irina', 'Isaac', 'Isabel', 'Isabela', 'Ivan', 'Ivo', 'Jaime', + 'Joana', 'Joaquim', 'Joel', 'Jorge', 'José', 'João', 'Juliana', + 'Jéssica', 'Júlia', 'Kelly', 'Kevin', 'Kyara', 'Kévim', 'Lara', + 'Larissa', 'Laura', 'Leandro', 'Leonardo', 'Leonor', 'Letícia', 'Lia', + 'Lisandro', 'Lorena', 'Lourenço', 'Luana', 'Luca', 'Lucas', 'Luciana', + 'Luna', 'Luís', 'Luísa', 'Lúcia', 'Madalena', 'Mafalda', 'Manuel', + 'Mara', 'Marco', 'Marcos', 'Margarida', 'Maria', 'Mariana', 'Marta', + 'Martim', 'Mateus', 'Matias', 'Matilde', 'Mauro', 'Melissa', 'Mia', + 'Micael', 'Miguel', 'Miriam', 'Márcio', 'Mário', 'Mélanie', 'Naiara', + 'Nair', 'Nelson', 'Nicole', 'Noa', 'Noah', 'Nuno', 'Nádia', 'Núria', + 'Patrícia', 'Paulo', 'Pedro', 'Petra', 'Pilar', 'Rafael', 'Rafaela', + 'Raquel', 'Renata', 'Renato', 'Ricardo', 'Rita', 'Rodrigo', 'Rui', + 'Rúben', 'Salomé', 'Salvador', 'Samuel', 'Sandro', 'Santiago', 'Sara', + 'Sebastião', 'Simão', 'Sofia', 'Soraia', 'Sérgio', 'Tatiana', 'Teresa', + 'Tiago', 'Tomás', 'Tomé', 'Valentim', 'Valentina', 'Vasco', 'Vera', + 'Vicente', 'Victória', 'Violeta', 'Vitória', 'Vítor', 'William', + 'Wilson', 'Xavier', 'Yara', 'Yasmin', 'Álvaro', 'Ângela', 'Ângelo', + 'Érica', 'Íris', + ) + + last_names = ( + 'Abreu', 'Almeida', 'Alves', 'Amaral', 'Amorim', 'Andrade', 'Anjos', + 'Antunes', 'Araújo', 'Assunção', 'Azevedo', 'Baptista', 'Barbosa', + 'Barros', 'Batista', 'Borges', 'Branco', 'Brito', 'Campos', 'Cardoso', + 'Carneiro', 'Carvalho', 'Castro', 'Coelho', 'Correia', 'Costa', 'Cruz', + 'Cunha', 'Domingues', 'Esteves', 'Faria', 'Fernandes', 'Ferreira', + 'Figueiredo', 'Fonseca', 'Freitas', 'Garcia', 'Gaspar', 'Gomes', + 'Gonçalves', 'Guerreiro', 'Henriques', 'Jesus', 'Leal', 'Leite', 'Lima', + 'Lopes', 'Loureiro', 'Lourenço', 'Macedo', 'Machado', 'Magalhães', + 'Maia', 'Marques', 'Martins', 'Matias', 'Matos', 'Melo', 'Mendes', + 'Miranda', 'Monteiro', 'Morais', 'Moreira', 'Mota', 'Moura', + 'Nascimento', 'Neto', 'Neves', 'Nogueira', 'Nunes', 'Oliveira', + 'Pacheco', 'Paiva', 'Pereira', 'Pinheiro', 'Pinho', 'Pinto', 'Pires', + 'Ramos', 'Reis', 'Ribeiro', 'Rocha', 'Rodrigues', 'Santos', 'Silva', + 'Simões', 'Soares', 'Sousa', 'Sá', 'Tavares', 'Teixeira', 'Torres', + 'Valente', 'Vaz', 'Vicente', 'Vieira', + ) + + prefixes = ('de', 'da', 'do') + + def prefix(self): + return self.random_element(self.prefixes) diff --git a/src/libs/faker/providers/person/ru_RU/__init__.py b/src/libs/faker/providers/person/ru_RU/__init__.py new file mode 100644 index 0000000..62844c2 --- /dev/null +++ b/src/libs/faker/providers/person/ru_RU/__init__.py @@ -0,0 +1,273 @@ +# coding=utf-8 +from __future__ import unicode_literals +from collections import OrderedDict + +from .. import Provider as PersonProvider + +class Provider(PersonProvider): + formats_male = OrderedDict(( + ('{{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.97), + ('{{prefix_male}} {{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.03), + )) + + formats_female = OrderedDict(( + ('{{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.97), + ('{{prefix_female}} {{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.03), + )) + + # Using random_element's dictionary weighting means that the + # formats = formats_male + formats_female + # has to be replaced with something dict and python 2.x compatible + + formats = formats_male.copy() + formats.update(formats_female) + + first_names_male = ( + 'Август', 'Авдей', 'Аверкий', 'Аверьян', 'Авксентий', 'Автоном', + 'Агап', 'Агафон', 'Аггей', 'Адам', 'Адриан', 'Азарий', + 'Аким', 'Александр', 'Алексей', 'Амвросий', 'Амос', 'Ананий', + 'Анатолий', 'Андрей', 'Андрон', 'Андроник', 'Аникей', 'Аникита', + 'Анисим', 'Антип', 'Антонин', 'Аполлинарий', 'Аполлон', 'Арефий', + 'Аристарх', 'Аркадий', 'Арсений', 'Артемий', 'Артем', 'Архип', + 'Аскольд', 'Афанасий', 'Афиноген', 'Бажен', 'Богдан', 'Болеслав', + 'Борис', 'Борислав', 'Боян', 'Бронислав', 'Будимир', 'Вадим', + 'Валентин', 'Валерий', 'Валерьян', 'Варлаам', 'Варфоломей', 'Василий', + 'Вацлав', 'Велимир', 'Венедикт', 'Вениамин', 'Викентий', 'Виктор', + 'Викторин', 'Виссарион', 'Виталий', 'Владилен', 'Владлен', 'Владимир', + 'Владислав', 'Влас', 'Всеволод', 'Всемил', 'Всеслав', 'Вышеслав', + 'Вячеслав', 'Гаврила', 'Галактион', 'Гедеон', 'Геннадий', 'Георгий', + 'Герасим', 'Герман', 'Глеб', 'Гордей', 'Гостомысл', 'Гремислав', + 'Григорий', 'Гурий', 'Давыд', 'Данила', 'Дементий', 'Демид', + 'Демьян', 'Денис', 'Дмитрий', 'Добромысл', 'Доброслав', 'Дорофей', + 'Евгений', 'Евграф', 'Евдоким', 'Евлампий', 'Евсей', 'Евстафий', + 'Евстигней', 'Егор', 'Елизар', 'Елисей', 'Емельян', 'Епифан', + 'Еремей', 'Ермил', 'Ермолай', 'Ерофей', 'Ефим', 'Ефрем', + 'Захар', 'Зиновий', 'Зосима', 'Иван', 'Игнатий', 'Игорь', + 'Измаил', 'Изот', 'Изяслав', 'Иларион', 'Илья', 'Иннокентий', + 'Иосиф', 'Ипат', 'Ипатий', 'Ипполит', 'Ираклий', 'Исай', + 'Исидор', 'Казимир', 'Каллистрат', 'Капитон', 'Карл', 'Карп', + 'Касьян', 'Ким', 'Кир', 'Кирилл', 'Клавдий', 'Климент', + 'Кондрат', 'Кондратий', 'Конон', 'Константин', 'Корнил', 'Кузьма', + 'Куприян', 'Лавр', 'Лаврентий', 'Ладимир', 'Ладислав', 'Лазарь', + 'Лев', 'Леон', 'Леонид', 'Леонтий', 'Лонгин', 'Лука', + 'Лукьян', 'Лучезар', 'Любим', 'Любомир', 'Любосмысл', 'Макар', + 'Максим', 'Максимильян', 'Мариан', 'Марк', 'Мартын', 'Мартьян', + 'Матвей', 'Мефодий', 'Мечислав', 'Милан', 'Милен', 'Милий', + 'Милован', 'Мина', 'Мир', 'Мирон', 'Мирослав', 'Митофан', + 'Михаил', 'Михей', 'Модест', 'Моисей', 'Мокей', 'Мстислав', + 'Назар', 'Наркис', 'Натан', 'Наум', 'Нестор', 'Никандр', + 'Никанор', 'Никита', 'Никифор', 'Никодим', 'Николай', 'Никон', + 'Нифонт', 'Олег', 'Олимпий', 'Онуфрий', 'Орест', 'Осип', + 'Остап', 'Остромир', 'Павел', 'Панкратий', 'Панкрат', 'Пантелеймон', + 'Панфил', 'Парамон', 'Парфен', 'Пахом', 'Петр', 'Пимен', + 'Платон', 'Поликарп', 'Порфирий', 'Потап', 'Пров', 'Прокл', + 'Прокофий', 'Прохор', 'Радим', 'Радислав', 'Радован', 'Ратибор', + 'Ратмир', 'Родион', 'Роман', 'Ростислав', 'Рубен', 'Руслан', + 'Рюрик', 'Савва', 'Савватий', 'Савелий', 'Самсон', 'Самуил', + 'Светозар', 'Святополк', 'Святослав', 'Севастьян', 'Селиван', 'Селиверст', + 'Семен', 'Серафим', 'Сергей', 'Сигизмунд', 'Сидор', 'Сила', + 'Силантий', 'Сильвестр', 'Симон', 'Сократ', 'Соломон', 'Софон', + 'Софрон', 'Спартак', 'Спиридон', 'Станимир', 'Станислав', 'Степан', + 'Стоян', 'Тарас', 'Твердислав', 'Творимир', 'Терентий', 'Тимофей', + 'Тимур', 'Тит', 'Тихон', 'Трифон', 'Трофим', 'Ульян', + 'Устин', 'Фадей', 'Федор', 'Федосий', 'Федот', 'Феликс', + 'Феоктист', 'Феофан', 'Ферапонт', 'Филарет', 'Филимон', 'Филипп', + 'Фирс', 'Флорентин', 'Фока', 'Фома', 'Фортунат', 'Фотий', + 'Фрол', 'Харитон', 'Харлампий', 'Христофор', 'Чеслав', 'Эдуард', + 'Эммануил', 'Эмиль', 'Эраст', 'Эрнест', 'Эрнст', 'Ювеналий', + 'Юлиан', 'Юлий', 'Юрий', 'Яков', 'Ян', 'Якуб', + 'Януарий', 'Ярополк', 'Ярослав' + ) + + first_names_female = ( + 'Агата', 'Агафья', 'Акулина', 'Алевтина', 'Александра', 'Алина', + 'Алла', 'Анастасия', 'Ангелина', 'Анжела', 'Анжелика', 'Анна', + 'Антонина', 'Валентина', 'Валерия', 'Варвара', 'Василиса', 'Вера', + 'Вероника', 'Виктория', 'Галина', 'Глафира', 'Дарья', 'Евгения', + 'Евдокия', 'Евпраксия', 'Евфросиния', 'Екатерина', 'Елена', 'Елизавета', + 'Жанна', 'Зинаида', 'Зоя', 'Иванна', 'Ираида', 'Ирина', + 'Ия', 'Кира', 'Клавдия', 'Ксения', 'Лариса', 'Лидия', + 'Лора', 'Лукия', 'Любовь', 'Людмила', 'Майя', 'Маргарита', + 'Марина', 'Мария', 'Марфа', 'Милица', 'Надежда', 'Наина', + 'Наталья', 'Нина', 'Нинель', 'Нонна', 'Оксана', 'Октябрина', + 'Олимпиада', 'Ольга', 'Пелагея', 'Полина', 'Прасковья', 'Раиса', + 'Регина', 'Светлана', 'Синклитикия', 'София', 'Таисия', 'Тамара', + 'Татьяна', 'Ульяна', 'Фаина', 'Феврония', 'Фёкла', 'Элеонора', 'Эмилия', 'Юлия' + ) + + first_names = first_names_male + first_names_female + + last_names_male = ( + 'Смирнов', 'Иванов', 'Кузнецов', 'Попов', 'Соколов', + 'Лебедев', 'Козлов', 'Новиков', 'Морозов', 'Петров', + 'Волков', 'Соловьев', 'Васильев', 'Зайцев', 'Павлов', + 'Семенов', 'Голубев', 'Виноградов', 'Богданов', 'Воробьев', + 'Федоров', 'Михайлов', 'Беляев', 'Тарасов', 'Белов', + 'Комаров', 'Орлов', 'Киселев', 'Макаров', 'Андреев', + 'Ковалев', 'Ильин', 'Гусев', 'Титов', 'Кузьмин', + 'Кудрявцев', 'Баранов', 'Куликов', 'Алексеев', 'Степанов', + 'Яковлев', 'Сорокин', 'Сергеев', 'Романов', 'Захаров', + 'Борисов', 'Королев', 'Герасимов', 'Пономарев', 'Григорьев', + 'Лазарев', 'Медведев', 'Ершов', 'Никитин', 'Соболев', + 'Рябов', 'Поляков', 'Цветков', 'Данилов', 'Жуков', + 'Фролов', 'Журавлев', 'Николаев', 'Крылов', 'Максимов', + 'Сидоров', 'Осипов', 'Белоусов', 'Федотов', 'Дорофеев', + 'Егоров', 'Матвеев', 'Бобров', 'Дмитриев', 'Калинин', + 'Анисимов', 'Петухов', 'Антонов', 'Тимофеев', 'Никифоров', + 'Веселов', 'Филиппов', 'Марков', 'Большаков', 'Суханов', + 'Миронов', 'Ширяев', 'Александров', 'Коновалов', 'Шестаков', + 'Казаков', 'Ефимов', 'Денисов', 'Громов', 'Фомин', + 'Давыдов', 'Мельников', 'Щербаков', 'Блинов', 'Колесников', + 'Карпов', 'Афанасьев', 'Власов', 'Маслов', 'Исаков', + 'Тихонов', 'Аксенов', 'Гаврилов', 'Родионов', 'Котов', + 'Горбунов', 'Кудряшов', 'Быков', 'Зуев', 'Третьяков', + 'Савельев', 'Панов', 'Рыбаков', 'Суворов', 'Абрамов', + 'Воронов', 'Мухин', 'Архипов', 'Трофимов', 'Мартынов', + 'Емельянов', 'Горшков', 'Чернов', 'Овчинников', 'Селезнев', + 'Панфилов', 'Копылов', 'Михеев', 'Галкин', 'Назаров', + 'Лобанов', 'Лукин', 'Беляков', 'Потапов', 'Некрасов', + 'Хохлов', 'Жданов', 'Наумов', 'Шилов', 'Воронцов', + 'Ермаков', 'Дроздов', 'Игнатьев', 'Савин', 'Логинов', + 'Сафонов', 'Капустин', 'Кириллов', 'Моисеев', 'Елисеев', + 'Кошелев', 'Костин', 'Горбачев', 'Орехов', 'Ефремов', + 'Исаев', 'Евдокимов', 'Калашников', 'Кабанов', 'Носков', + 'Юдин', 'Кулагин', 'Лапин', 'Прохоров', 'Нестеров', + 'Харитонов', 'Агафонов', 'Муравьев', 'Ларионов', 'Федосеев', + 'Зимин', 'Пахомов', 'Шубин', 'Игнатов', 'Филатов', + 'Крюков', 'Рогов', 'Кулаков', 'Терентьев', 'Молчанов', + 'Владимиров', 'Артемьев', 'Гурьев', 'Зиновьев', 'Гришин', + 'Кононов', 'Дементьев', 'Ситников', 'Симонов', 'Мишин', + 'Фадеев', 'Комиссаров', 'Мамонтов', 'Носов', 'Гуляев', + 'Шаров', 'Устинов', 'Вишняков', 'Евсеев', 'Лаврентьев', + 'Брагин', 'Константинов', 'Корнилов', 'Авдеев', 'Зыков', + 'Бирюков', 'Шарапов', 'Никонов', 'Щукин', 'Дьячков', + 'Одинцов', 'Сазонов', 'Якушев', 'Красильников', 'Гордеев', + 'Самойлов', 'Князев', 'Беспалов', 'Уваров', 'Шашков', + 'Бобылев', 'Доронин', 'Белозеров', 'Рожков', 'Самсонов', + 'Мясников', 'Лихачев', 'Буров', 'Сысоев', 'Фомичев', + 'Русаков', 'Стрелков', 'Гущин', 'Тетерин', 'Колобов', + 'Субботин', 'Фокин', 'Блохин', 'Селиверстов', 'Пестов', + 'Кондратьев', 'Силин', 'Меркушев', 'Лыткин', 'Туров' + ) + + last_names_female = ( + 'Смирнова', 'Иванова', 'Кузнецова', 'Попова', 'Соколова', + 'Лебедева', 'Козлова', 'Новикова', 'Морозова', 'Петрова', 'Волкова', + 'Соловьева', 'Васильева', 'Зайцева', 'Павлова', 'Семенова', + 'Голубева', 'Виноградова', 'Богданова', 'Воробьева', 'Федорова', + 'Михайлова', 'Беляева', 'Тарасова', 'Белова', 'Комарова', 'Орлова', + 'Киселева', 'Макарова', 'Андреева', 'Ковалева', 'Ильина', 'Гусева', + 'Титова', 'Кузьмина', 'Кудрявцева', 'Баранова', 'Куликова', + 'Алексеева', 'Степанова', 'Яковлева', 'Сорокина', 'Сергеева', + 'Романова', 'Захарова', 'Борисова', 'Королева', 'Герасимова', + 'Пономарева', 'Григорьева', 'Лазарева', 'Медведева', 'Ершова', + 'Никитина', 'Соболева', 'Рябова', 'Полякова', 'Цветкова', 'Данилова', + 'Жукова', 'Фролова', 'Журавлева', 'Николаева', 'Крылова', 'Максимова', + 'Сидорова', 'Осипова', 'Белоусова', 'Федотова', 'Дорофеева', + 'Егорова', 'Матвеева', 'Боброва', 'Дмитриева', 'Калинина', + 'Анисимова', 'Петухова', 'Антонова', 'Тимофеева', 'Никифорова', + 'Веселова', 'Филиппова', 'Маркова', 'Большакова', 'Суханова', + 'Миронова', 'Ширяева', 'Александрова', 'Коновалова', 'Шестакова', + 'Казакова', 'Ефимова', 'Денисова', 'Громова', 'Фомина', 'Давыдова', + 'Мельникова', 'Щербакова', 'Блинова', 'Колесникова', 'Карпова', + 'Афанасьева', 'Власова', 'Маслова', 'Исакова', 'Тихонова', 'Аксенова', + 'Гаврилова', 'Родионова', 'Котова', 'Горбунова', 'Кудряшова', + 'Быкова', 'Зуева', 'Третьякова', 'Савельева', 'Панова', 'Рыбакова', + 'Суворова', 'Абрамова', 'Воронова', 'Мухина', 'Архипова', 'Трофимова', + 'Мартынова', 'Емельянова', 'Горшкова', 'Чернова', 'Овчинникова', + 'Селезнева', 'Панфилова', 'Копылова', 'Михеева', 'Галкина', + 'Назарова', 'Лобанова', 'Лукина', 'Белякова', 'Потапова', 'Некрасова', + 'Хохлова', 'Жданова', 'Наумова', 'Шилова', 'Воронцова', 'Ермакова', + 'Дроздова', 'Игнатьева', 'Савина', 'Логинова', 'Сафонова', + 'Капустина', 'Кириллова', 'Моисеева', 'Елисеева', 'Кошелева', + 'Костина', 'Горбачева', 'Орехова', 'Ефремова', 'Исаева', 'Евдокимова', + 'Калашникова', 'Кабанова', 'Носкова', 'Юдина', 'Кулагина', 'Лапина', + 'Прохорова', 'Нестерова', 'Харитонова', 'Агафонова', 'Муравьева', + 'Ларионова', 'Федосеева', 'Зимина', 'Пахомова', 'Шубина', 'Игнатова', + 'Филатова', 'Крюкова', 'Рогова', 'Кулакова', 'Терентьева', + 'Молчанова', 'Владимирова', 'Артемьева', 'Гурьева', 'Зиновьева', + 'Гришина', 'Кононова', 'Дементьева', 'Ситникова', 'Симонова', + 'Мишина', 'Фадеева', 'Комиссарова', 'Мамонтова', 'Носова', 'Гуляева', + 'Шарова', 'Устинова', 'Вишнякова', 'Евсеева', 'Лаврентьева', + 'Брагина', 'Константинова', 'Корнилова', 'Авдеева', 'Зыкова', + 'Бирюкова', 'Шарапова', 'Никонова', 'Щукина', 'Дьячкова', 'Одинцова', + 'Сазонова', 'Якушева', 'Красильникова', 'Гордеева', 'Самойлова', + 'Князева', 'Беспалова', 'Уварова', 'Шашкова', 'Бобылева', 'Доронина', + 'Белозерова', 'Рожкова', 'Самсонова', 'Мясникова', 'Лихачева', + 'Бурова', 'Сысоева', 'Фомичева', 'Русакова', 'Стрелкова', 'Гущина', + 'Тетерина', 'Колобова', 'Субботина', 'Фокина', 'Блохина', + 'Селиверстова', 'Пестова', 'Кондратьева', 'Силина', 'Меркушева', + 'Лыткина', 'Турова' + ) + + last_names = last_names_male + last_names_female + + middle_names_male = ( + 'Ааронович', 'Абрамович', 'Августович', 'Авдеевич', 'Аверьянович', + 'Адамович', 'Адрианович', 'Аксёнович', 'Александрович', 'Алексеевич', + 'Анатольевич', 'Андреевич', 'Анисимович', 'Антипович', 'Антонович', + 'Ануфриевич', 'Арсенович', 'Арсеньевич', 'Артёмович', 'Артемьевич', + 'Артурович', 'Архипович', 'Афанасьевич', 'Бенедиктович', 'Богданович', + 'Бориславич', 'Бориславович', 'Борисович', 'Брониславович', + 'Валентинович', 'Валерианович', 'Валерьевич', 'Валерьянович', + 'Васильевич', 'Венедиктович', 'Викентьевич', 'Викторович', 'Виленович', + 'Вилорович', 'Витальевич', 'Владиленович', 'Владиславович', + 'Владленович', 'Власович', 'Всеволодович', 'Вячеславович', + 'Гавриилович', 'Гаврилович', 'Геннадиевич', 'Георгиевич', 'Герасимович', + 'Германович', 'Гертрудович', 'Глебович', 'Гордеевич', 'Григорьевич', + 'Гурьевич', 'Давидович', 'Давыдович', 'Даниилович', 'Данилович', + 'Демидович', 'Демьянович', 'Денисович', 'Димитриевич', 'Дмитриевич', + 'Дорофеевич', 'Евсеевич', 'Евстигнеевич', 'Егорович', 'Елизарович', + 'Елисеевич', 'Еремеевич', 'Ермилович', 'Ермолаевич', 'Ерофеевич', + 'Ефимович', 'Ефимьевич', 'Ефремович', 'Ефстафьевич', 'Жанович', + 'Жоресович', 'Захарьевич', 'Зиновьевич', 'Игнатович', 'Игнатьевич', + 'Игоревич', 'Измаилович', 'Изотович', 'Иларионовичх', 'Ильич', + 'Ильясович', 'Иосипович', 'Иосифович', 'Исидорович', 'Марсович', + 'Матвеевич', 'Тарасович', 'Теймуразович', 'Терентьевич', 'Тимурович', + 'Тихонович', 'Трифонович', 'Трофимович', 'Устинович', 'Фадеевич', + 'Фёдорович', 'Федосеевич', 'Федосьевич', 'Федотович', 'Феликсович', + 'Феодосьевич', 'Феоктистович', 'Феофанович', 'Филатович', 'Филимонович', + 'Филиппович', 'Фокич', 'Фомич', 'Фролович', 'Харитонович', 'Харламович', + 'Харлампович', 'Харлампьевич', 'Чеславович', 'Эдгардович', 'Эдгарович', + 'Эдуардович', 'Юлианович', 'Юльевич', 'Яковлевич', 'Якубович', + 'Ярославович' + ) + + middle_names_female = ( + 'Александровна', 'Андреевна', 'Архиповна', 'Алексеевна', 'Антоновна', + 'Аскольдовна', 'Альбертовна', 'Аркадьевна', 'Афанасьевна', + 'Анатольевна', 'Артемовна', 'Богдановна', 'Болеславовна', 'Борисовна', + 'Вадимовна', 'Васильевна', 'Владимировна', 'Валентиновна', + 'Вениаминовна', 'Владиславовна', 'Валериевна', 'Викторовна', + 'Вячеславовна', 'Геннадиевна', 'Георгиевна', 'Геннадьевна', + 'Григорьевна', 'Даниловна', 'Дмитриевна', 'Евгеньевна', 'Егоровны', + 'Егоровна', 'Ефимовна', 'Ждановна', 'Захаровна', 'Ивановна', 'Игоревна', + 'Ильинична', 'Кирилловна', 'Кузминична', 'Константиновна', + 'Кузьминична', 'Леонидовна', 'Леоновна', 'Львовна', 'Макаровна', + 'Матвеевна', 'Михайловна', 'Максимовна', 'Мироновна', 'Натановна', + 'Никифоровна', 'Ниловна', 'Наумовна', 'Николаевна', 'Олеговна', + 'Оскаровна', 'Павловна', 'Петровна', 'Робертовна', 'Рубеновна', + 'Руслановна', 'Романовна', 'Рудольфовна', 'Святославовна', 'Сергеевна', + 'Степановна', 'Семеновна', 'Станиславовна', 'Тарасовна', 'Тимофеевна', + 'Тимуровна', 'Федоровна', 'Феликсовна', 'Филипповна', 'Харитоновна', + 'Эдуардовна', 'Эльдаровна', 'Юльевна', 'Юрьевна', 'Яковлевна' + ) + + middle_names = middle_names_male + middle_names_female + + prefixes_male = ('г-н.', 'тов.') + + prefixes_female = ('г-жа', 'тов.') + + def middle_name(self): + return self.random_element(self.middle_names) + + def middle_name_male(self): + if hasattr(self, 'middle_names_male'): + return self.random_element(self.middle_names_male) + return self.middle_name() + + def middle_name_female(self): + if hasattr(self, 'middle_names_female'): + return self.random_element(self.middle_names_female) + return self.middle_name() diff --git a/src/faker/providers/sl_SI/person.py b/src/libs/faker/providers/person/sl_SI/__init__.py similarity index 93% rename from src/faker/providers/sl_SI/person.py rename to src/libs/faker/providers/person/sl_SI/__init__.py index 66ff187..01ab261 100644 --- a/src/faker/providers/sl_SI/person.py +++ b/src/libs/faker/providers/person/sl_SI/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -61,6 +61,7 @@ class Provider(PersonProvider): "Magda", "Daniela", "Jerica", "Taja", "Iris", "Adrijana", "Jadranka", ] + first_names = first_names_female + first_names_male last_names = [ "Novak", "Horvat", "Krajnc", "Kovačič", "Zupančič", "Kovač", "Potočnik", "Mlakar", "Vidmar", "Kos", "Golob", "Turk", "Božič", @@ -90,18 +91,3 @@ class Provider(PersonProvider): "Jerič", "Kalan", "Markovič", "Šuštar", "Bajc", "Kaučič", "Dolinšek", "Zalokar", "Pirnat", "Zorman", "Zakrajšek", "Štrukelj", ] - - @classmethod - def first_name(cls): - return cls.random_element(( - cls.first_name_male(), - cls.first_name_female()) - ) - - @classmethod - def first_name_male(cls): - return cls.random_element(cls.first_names_male) - - @classmethod - def first_name_female(cls): - return cls.random_element(cls.first_names_female) diff --git a/src/libs/faker/providers/person/sv_SE/__init__.py b/src/libs/faker/providers/person/sv_SE/__init__.py new file mode 100644 index 0000000..e6244ca --- /dev/null +++ b/src/libs/faker/providers/person/sv_SE/__init__.py @@ -0,0 +1,640 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from collections import OrderedDict +from .. import Provider as PersonProvider + +# Data source +# +# Data for this provider comes from the following source: +# Statistiska centralbyråns - Statistics Sweden +# https://www.scb.se/en/About-us/official-statistics-of-sweden/ +# +# Data was collected via queries on the SCB API to obtain to the +# top 200 most common last names, male first names and female first names +# from 1999. + + +class Provider(PersonProvider): + + formats_female = ( + '{{first_name_female}} {{last_name}}', + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + ) + + formats = formats_female + formats_male + + first_names_female = OrderedDict(( + ('Agnes', 0.001745), + ('Agneta', 0.004777), + ('Aina', 0.002274), + ('Alexandra', 0.002762), + ('Alice', 0.003714), + ('Amanda', 0.003099), + ('Anette', 0.004177), + ('Angelica', 0.001462), + ('Anita', 0.008407), + ('Ann', 0.004749), + ('Ann-Charlotte', 0.001562), + ('Ann-Christin', 0.001383), + ('Ann-Mari', 0.001194), + ('Ann-Marie', 0.001974), + ('Anna', 0.042584), + ('Anna-Karin', 0.001175), + ('Anna-Lena', 0.001167), + ('Anne', 0.002491), + ('Anne-Marie', 0.001349), + ('Anneli', 0.003702), + ('Annelie', 0.001470), + ('Annette', 0.001469), + ('Annie', 0.001357), + ('Annika', 0.005399), + ('Asta', 0.001437), + ('Astrid', 0.006047), + ('Barbro', 0.006869), + ('Berit', 0.004732), + ('Birgit', 0.005225), + ('Birgitta', 0.024532), + ('Brita', 0.002495), + ('Britt', 0.006330), + ('Britt-Marie', 0.002430), + ('Britta', 0.002882), + ('Camilla', 0.004547), + ('Carin', 0.001447), + ('Carina', 0.006187), + ('Carolina', 0.001716), + ('Caroline', 0.004014), + ('Catarina', 0.001216), + ('Catharina', 0.001196), + ('Cecilia', 0.008249), + ('Charlotta', 0.004212), + ('Charlotte', 0.003875), + ('Christina', 0.013235), + ('Christine', 0.001515), + ('Dagmar', 0.001687), + ('Dagny', 0.001481), + ('Doris', 0.001518), + ('Ebba', 0.002230), + ('Edit', 0.001620), + ('Eivor', 0.002205), + ('Eleonora', 0.001731), + ('Elin', 0.006729), + ('Elisabet', 0.024570), + ('Elisabeth', 0.025370), + ('Elise', 0.001198), + ('Ella', 0.001269), + ('Ellen', 0.002524), + ('Ellinor', 0.001304), + ('Elsa', 0.006168), + ('Elsie', 0.001302), + ('Elvira', 0.001736), + ('Emelie', 0.003036), + ('Emilia', 0.002176), + ('Emma', 0.007459), + ('Erika', 0.003543), + ('Ester', 0.002201), + ('Eva', 0.026496), + ('Evelina', 0.001930), + ('Evy', 0.001609), + ('Felicia', 0.001269), + ('Frida', 0.003423), + ('Gabriella', 0.001245), + ('Gerd', 0.003404), + ('Gertrud', 0.002159), + ('Greta', 0.002604), + ('Gudrun', 0.002700), + ('Gun', 0.004988), + ('Gunborg', 0.003021), + ('Gunhild', 0.003072), + ('Gunilla', 0.007540), + ('Gunnel', 0.003826), + ('Gunvor', 0.003507), + ('Hanna', 0.005512), + ('Harriet', 0.001441), + ('Helen', 0.002647), + ('Helena', 0.011208), + ('Helene', 0.002163), + ('Helén', 0.001202), + ('Hillevi', 0.001214), + ('Ida', 0.004826), + ('Inga', 0.005928), + ('Inga-Lill', 0.001723), + ('Ingeborg', 0.007051), + ('Ingegerd', 0.006428), + ('Ingegärd', 0.004587), + ('Ingela', 0.002701), + ('Inger', 0.010945), + ('Ingrid', 0.018110), + ('Irene', 0.007176), + ('Iris', 0.001497), + ('Irma', 0.001313), + ('Iréne', 0.001696), + ('Jeanette', 0.002204), + ('Jennie', 0.001404), + ('Jenny', 0.006327), + ('Jessica', 0.003248), + ('Johanna', 0.008736), + ('Josefin', 0.002350), + ('Josefina', 0.001294), + ('Josefine', 0.001891), + ('Julia', 0.002653), + ('Kajsa', 0.001214), + ('Karin', 0.023977), + ('Karolina', 0.003098), + ('Katarina', 0.006660), + ('Kerstin', 0.013320), + ('Kristin', 0.001999), + ('Kristina', 0.024482), + ('Laila', 0.001753), + ('Lena', 0.011317), + ('Lilian', 0.002505), + ('Lillemor', 0.001571), + ('Lilly', 0.001785), + ('Lina', 0.002062), + ('Linda', 0.006682), + ('Linn', 0.001229), + ('Linnea', 0.007713), + ('Linnéa', 0.013337), + ('Lisa', 0.004293), + ('Lisbeth', 0.002580), + ('Louise', 0.006398), + ('Lovisa', 0.003016), + ('Madeleine', 0.002603), + ('Magdalena', 0.002318), + ('Maj', 0.003649), + ('Maj-Britt', 0.002919), + ('Maja', 0.001462), + ('Malin', 0.006314), + ('Margareta', 0.037908), + ('Margaretha', 0.003602), + ('Margit', 0.004690), + ('Mari', 0.002098), + ('Maria', 0.061211), + ('Marianne', 0.013455), + ('Marie', 0.016343), + ('Marie-Louise', 0.001508), + ('Marina', 0.001195), + ('Marita', 0.002490), + ('Martina', 0.001657), + ('Mary', 0.001719), + ('Matilda', 0.004324), + ('Maud', 0.001868), + ('Mikaela', 0.001418), + ('Mona', 0.003072), + ('Monica', 0.005729), + ('Monika', 0.002778), + ('Märta', 0.004609), + ('Nina', 0.001820), + ('Olivia', 0.001516), + ('Pernilla', 0.002416), + ('Petra', 0.001964), + ('Pia', 0.003138), + ('Ragnhild', 0.001655), + ('Rebecca', 0.001585), + ('Rebecka', 0.001631), + ('Rose-Marie', 0.001345), + ('Rut', 0.004635), + ('Ruth', 0.002177), + ('Sandra', 0.003674), + ('Sara', 0.007473), + ('Signe', 0.002761), + ('Sigrid', 0.002130), + ('Siv', 0.005860), + ('Sofia', 0.011263), + ('Sofie', 0.003466), + ('Solveig', 0.002937), + ('Sonja', 0.004030), + ('Stina', 0.002603), + ('Susanna', 0.001707), + ('Susanne', 0.006845), + ('Svea', 0.002225), + ('Sylvia', 0.001630), + ('Teresia', 0.001703), + ('Therese', 0.004420), + ('Therése', 0.001215), + ('Ulla', 0.009528), + ('Ulla-Britt', 0.001683), + ('Ulrika', 0.005582), + ('Valborg', 0.001616), + ('Vera', 0.001495), + ('Veronica', 0.001985), + ('Victoria', 0.002490), + ('Viktoria', 0.006375), + ('Vilhelmina', 0.001311), + ('Viola', 0.009669), + ('Ylva', 0.001296), + ('Yvonne', 0.004993), + ('Åsa', 0.005076), + )) + + first_names_male = OrderedDict(( + ('Adam', 0.001770), + ('Albert', 0.001419), + ('Albin', 0.001392), + ('Alexander', 0.006474), + ('Alf', 0.003571), + ('Alfred', 0.001069), + ('Allan', 0.003591), + ('Alvar', 0.001072), + ('Anders', 0.025312), + ('Andreas', 0.008399), + ('André', 0.001357), + ('Anton', 0.002930), + ('Arne', 0.010637), + ('Arnold', 0.001027), + ('Artur', 0.001269), + ('Arvid', 0.002169), + ('Axel', 0.006910), + ('Bengt', 0.014569), + ('Benny', 0.001397), + ('Bernt', 0.002951), + ('Bert', 0.001153), + ('Bertil', 0.010902), + ('Birger', 0.003109), + ('Björn', 0.007803), + ('Bo', 0.011988), + ('Bror', 0.003281), + ('Börje', 0.003853), + ('Carl', 0.013483), + ('Christer', 0.007964), + ('Christian', 0.004359), + ('Christoffer', 0.002267), + ('Claes', 0.002743), + ('Conny', 0.001928), + ('Dan', 0.002910), + ('Daniel', 0.009526), + ('David', 0.005483), + ('Dennis', 0.001779), + ('Edvard', 0.001253), + ('Edvin', 0.001559), + ('Egon', 0.001019), + ('Einar', 0.002486), + ('Elias', 0.001085), + ('Emanuel', 0.003777), + ('Emil', 0.004770), + ('Eric', 0.003387), + ('Erik', 0.041018), + ('Erland', 0.001450), + ('Erling', 0.001173), + ('Ernst', 0.002205), + ('Evert', 0.003313), + ('Filip', 0.001959), + ('Folke', 0.002876), + ('Fredrik', 0.011770), + ('Georg', 0.003446), + ('Gerhard', 0.001174), + ('Gert', 0.001548), + ('Gunnar', 0.017957), + ('Gustaf', 0.007420), + ('Gustav', 0.009406), + ('Göran', 0.012287), + ('Gösta', 0.005590), + ('Göte', 0.002297), + ('Hans', 0.016636), + ('Harald', 0.002359), + ('Harry', 0.002872), + ('Helge', 0.002005), + ('Henning', 0.001194), + ('Henrik', 0.007644), + ('Henry', 0.003134), + ('Herbert', 0.001257), + ('Hjalmar', 0.001179), + ('Holger', 0.001641), + ('Hugo', 0.001976), + ('Håkan', 0.006974), + ('Inge', 0.002880), + ('Ingemar', 0.009024), + ('Ingmar', 0.001138), + ('Ingvar', 0.006758), + ('Ivan', 0.001668), + ('Ivar', 0.002943), + ('Jacob', 0.001023), + ('Jakob', 0.001299), + ('Jan', 0.017300), + ('Jan-Erik', 0.001094), + ('Jens', 0.002221), + ('Jesper', 0.002177), + ('Jimmy', 0.002120), + ('Joakim', 0.004606), + ('Joel', 0.001778), + ('Johan', 0.021986), + ('Johannes', 0.003538), + ('John', 0.008741), + ('Johnny', 0.001499), + ('Jonas', 0.007433), + ('Jonathan', 0.001616), + ('Jonny', 0.001420), + ('Josef', 0.001131), + ('Juhani', 0.001368), + ('Jörgen', 0.003869), + ('Karl', 0.030342), + ('Kenneth', 0.003540), + ('Kent', 0.004156), + ('Kim', 0.001298), + ('Kjell', 0.007932), + ('Klas', 0.001989), + ('Knut', 0.002668), + ('Krister', 0.002433), + ('Kristian', 0.001849), + ('Kristoffer', 0.001548), + ('Kurt', 0.004453), + ('Lars', 0.031620), + ('Lars-erik', 0.001056), + ('Leif', 0.009180), + ('Lennart', 0.019721), + ('Linus', 0.001817), + ('Ludvig', 0.001014), + ('Magnus', 0.009301), + ('Marcus', 0.004065), + ('Markus', 0.002075), + ('Martin', 0.008861), + ('Mathias', 0.001551), + ('Mats', 0.008403), + ('Mattias', 0.005657), + ('Max', 0.001234), + ('Michael', 0.004456), + ('Mikael', 0.015583), + ('Morgan', 0.001377), + ('Nicklas', 0.001201), + ('Niclas', 0.001643), + ('Niklas', 0.003704), + ('Nils', 0.018831), + ('Ola', 0.002691), + ('Olle', 0.001666), + ('Olof', 0.017132), + ('Olov', 0.005457), + ('Oscar', 0.002606), + ('Oskar', 0.005198), + ('Otto', 0.001361), + ('Ove', 0.004994), + ('Patrik', 0.005091), + ('Paul', 0.002455), + ('Per', 0.022690), + ('Peter', 0.014015), + ('Petter', 0.001150), + ('Philip', 0.001340), + ('Pierre', 0.001014), + ('Pontus', 0.001652), + ('Pär', 0.002043), + ('Ragnar', 0.002983), + ('Rasmus', 0.001323), + ('Reinhold', 0.001075), + ('Richard', 0.002053), + ('Rickard', 0.002830), + ('Rikard', 0.001272), + ('Robert', 0.006959), + ('Robin', 0.003012), + ('Roger', 0.005033), + ('Roland', 0.006879), + ('Rolf', 0.007914), + ('Ronny', 0.001561), + ('Rune', 0.005600), + ('Samuel', 0.001473), + ('Sebastian', 0.003275), + ('Sigurd', 0.001099), + ('Sigvard', 0.002438), + ('Simon', 0.003338), + ('Sixten', 0.001299), + ('Staffan', 0.001627), + ('Stefan', 0.009034), + ('Sten', 0.003911), + ('Stig', 0.009343), + ('Sture', 0.002518), + ('Sune', 0.002173), + ('Sven', 0.017897), + ('Sören', 0.002376), + ('Tage', 0.002198), + ('Thomas', 0.007380), + ('Tobias', 0.003623), + ('Tom', 0.000977), + ('Tomas', 0.004168), + ('Tommy', 0.005526), + ('Tony', 0.001814), + ('Torbjörn', 0.002984), + ('Tord', 0.001449), + ('Tore', 0.002630), + ('Torsten', 0.002915), + ('Ture', 0.001212), + ('Ulf', 0.008541), + ('Uno', 0.001812), + ('Urban', 0.001584), + ('Valdemar', 0.002204), + ('Valter', 0.001371), + ('Verner', 0.001196), + ('Victor', 0.001543), + ('Viktor', 0.003080), + ('Vilhelm', 0.003785), + ('Wilhelm', 0.002195), + ('William', 0.002332), + ('Yngve', 0.002698), + ('Åke', 0.013837), + )) + + first_names = first_names_male.copy() + first_names.update(first_names_female) + + last_names = OrderedDict(( + ('Abrahamsson', 0.002440), + ('Adolfsson', 0.002012), + ('Alm', 0.001448), + ('Andersson', 0.074993), + ('Andreasson', 0.002450), + ('Aronsson', 0.001722), + ('Arvidsson', 0.003474), + ('Augustsson', 0.001306), + ('Axelsson', 0.006128), + ('Bengtsson', 0.009764), + ('Berg', 0.005072), + ('Berggren', 0.002914), + ('Berglund', 0.005115), + ('Bergman', 0.003560), + ('Bergqvist', 0.002172), + ('Bergström', 0.005561), + ('Berntsson', 0.001280), + ('Björk', 0.003265), + ('Björklund', 0.002883), + ('Björkman', 0.001760), + ('Blom', 0.002326), + ('Blomberg', 0.001464), + ('Blomqvist', 0.002349), + ('Boman', 0.001365), + ('Borg', 0.001954), + ('Boström', 0.001985), + ('Bäckström', 0.001865), + ('Börjesson', 0.002036), + ('Carlsson', 0.007727), + ('Claesson', 0.001600), + ('Dahl', 0.002064), + ('Dahlberg', 0.002382), + ('Dahlgren', 0.001578), + ('Dahlström', 0.001538), + ('Danielsson', 0.004208), + ('Davidsson', 0.002035), + ('Edlund', 0.001649), + ('Ek', 0.002187), + ('Ekberg', 0.001201), + ('Eklund', 0.003919), + ('Ekman', 0.001847), + ('Ekström', 0.002670), + ('Eliasson', 0.003127), + ('Englund', 0.001958), + ('Engström', 0.004079), + ('Ericsson', 0.001221), + ('Eriksson', 0.039871), + ('Erlandsson', 0.001768), + ('Falk', 0.002035), + ('Forsberg', 0.004265), + ('Forslund', 0.001137), + ('Fransson', 0.003937), + ('Franzén', 0.001491), + ('Fredriksson', 0.004959), + ('Friberg', 0.001828), + ('Gunnarsson', 0.003764), + ('Gustafsson', 0.020795), + ('Gustavsson', 0.007363), + ('Göransson', 0.002330), + ('Haglund', 0.001575), + ('Hagström', 0.001315), + ('Hallberg', 0.002017), + ('Hansen', 0.001804), + ('Hansson', 0.012512), + ('Hedberg', 0.001824), + ('Hedlund', 0.002617), + ('Hedman', 0.001419), + ('Hedström', 0.001406), + ('Hellberg', 0.001212), + ('Hellström', 0.002385), + ('Henriksson', 0.004586), + ('Hermansson', 0.002866), + ('Hjalmarsson', 0.001191), + ('Holm', 0.003700), + ('Holmberg', 0.003521), + ('Holmgren', 0.002689), + ('Holmqvist', 0.001561), + ('Holmström', 0.001904), + ('Hägglund', 0.001134), + ('Håkansson', 0.004300), + ('Högberg', 0.001492), + ('Höglund', 0.001861), + ('Isaksson', 0.003349), + ('Ivarsson', 0.002209), + ('Jakobsson', 0.005863), + ('Jansson', 0.014518), + ('Jensen', 0.001898), + ('Johannesson', 0.001813), + ('Johansson', 0.076124), + ('Johnsson', 0.003881), + ('Jonasson', 0.002439), + ('Jonsson', 0.016550), + ('Josefsson', 0.002104), + ('Jönsson', 0.009781), + ('Karlsson', 0.058698), + ('Klasson', 0.001235), + ('Knutsson', 0.001627), + ('Kristiansson', 0.001226), + ('Larsson', 0.036191), + ('Lilja', 0.001410), + ('Lind', 0.003910), + ('Lindahl', 0.001815), + ('Lindberg', 0.007056), + ('Lindblad', 0.001253), + ('Lindblom', 0.001864), + ('Lindell', 0.001351), + ('Linder', 0.001210), + ('Lindgren', 0.006080), + ('Lindholm', 0.002166), + ('Lindkvist', 0.001233), + ('Lindqvist', 0.004209), + ('Lindström', 0.006642), + ('Lindén', 0.001551), + ('Ljung', 0.001232), + ('Ljungberg', 0.001274), + ('Lund', 0.002142), + ('Lundberg', 0.005680), + ('Lundgren', 0.005495), + ('Lundin', 0.003970), + ('Lundkvist', 0.001252), + ('Lundmark', 0.001410), + ('Lundqvist', 0.003493), + ('Lundström', 0.003173), + ('Löfgren', 0.002211), + ('Magnusson', 0.007333), + ('Malm', 0.001580), + ('Malmberg', 0.001224), + ('Martinsson', 0.002500), + ('Mattsson', 0.004904), + ('Melin', 0.001487), + ('Moberg', 0.001532), + ('Molin', 0.001312), + ('Månsson', 0.002563), + ('Mårtensson', 0.003432), + ('Möller', 0.002013), + ('Nielsen', 0.001623), + ('Nilsson', 0.050327), + ('Norberg', 0.002325), + ('Nord', 0.001346), + ('Nordin', 0.002799), + ('Nordström', 0.003207), + ('Norman', 0.001228), + ('Norén', 0.001524), + ('Nyberg', 0.003291), + ('Nygren', 0.001880), + ('Nyman', 0.002117), + ('Nyström', 0.003538), + ('Näslund', 0.001331), + ('Ohlsson', 0.001141), + ('Olausson', 0.001503), + ('Olofsson', 0.006893), + ('Olsson', 0.032427), + ('Oskarsson', 0.001576), + ('Ottosson', 0.002066), + ('Palm', 0.001957), + ('Paulsson', 0.001382), + ('Pedersen', 0.001201), + ('Persson', 0.031475), + ('Petersson', 0.008913), + ('Pettersson', 0.019276), + ('Pålsson', 0.001626), + ('Roos', 0.001447), + ('Rosén', 0.001810), + ('Samuelsson', 0.003855), + ('Sandberg', 0.004613), + ('Sandström', 0.002761), + ('Sjöberg', 0.004282), + ('Sjödin', 0.001399), + ('Sjögren', 0.002585), + ('Sjöström', 0.001921), + ('Skoglund', 0.001788), + ('Sköld', 0.001266), + ('Stenberg', 0.001784), + ('Strand', 0.001771), + ('Strandberg', 0.001755), + ('Ström', 0.002872), + ('Strömberg', 0.002357), + ('Ståhl', 0.001260), + ('Sundberg', 0.002691), + ('Sundin', 0.001434), + ('Sundqvist', 0.001526), + ('Sundström', 0.002302), + ('Svensson', 0.030624), + ('Svärd', 0.001284), + ('Söderberg', 0.003305), + ('Söderlund', 0.001970), + ('Söderström', 0.002226), + ('Törnqvist', 0.001176), + ('Viklund', 0.001833), + ('Vikström', 0.001757), + ('Wahlström', 0.001139), + ('Wallin', 0.003077), + ('Wikström', 0.001522), + ('Åberg', 0.002664), + ('Ågren', 0.001320), + ('Åkesson', 0.002344), + ('Åström', 0.002272), + ('Öberg', 0.002448), + ('Öhman', 0.001415), + ('Östlund', 0.001623) + )) diff --git a/src/libs/faker/providers/person/th_TH/__init__.py b/src/libs/faker/providers/person/th_TH/__init__.py new file mode 100644 index 0000000..8dcccae --- /dev/null +++ b/src/libs/faker/providers/person/th_TH/__init__.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name}} {{last_name}}', '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{first_name}} {{last_name}}', + '{{prefix}} {{first_name}} {{last_name}}', + '{{prefix}} {{first_name}} {{last_name}} {{suffix}}', + '{{first_name}} {{last_name}} {{suffix}}') + + # Thai prefix + # http://www.stou.ac.th/thai/grad_stdy/Apply/prefix.asp + prefixes_female = ( + "พลเอก", "พลโท", "พลตรี", "พันเอก", "พันโท", "พันตรี", "ร้อยเอก", "ร้อยโท", + "ร้อยตรี", + "จ่าสิบเอก", "จ่าสิบโท", "จ่าสิบตรี", "สิบเอก", "สิบโท", "สิบตรี", "พลทหาร", + "พลเรือเอก", "พลเรือโท", "พลเรือตรี", "นาวาเอก", "นาวาโท", "นาวาตรี", "เรือเอก", + "เรือโท", "เรือตรี", "พันจ่าเอก", "พันจ่าโท", "พันจ่าตรี", "จ่าเอก", "จ่าโท", + "จ่าตรี", "พลทหาร", "พลอากาศเอก", "พลอากาศโท", "พลอากาศตรี", "นาวาอากาศเอก", + "นาวาอากาศโท", "นาวาอากาศตรี", "เรืออากาศเอก", "เรืออากาศโท", "เรืออากาศตรี", + "พันจ่าอากาศเอก", "พันจ่าอากาศโท", "พันจ่าอากาศตรี", "จ่าอากาศเอก", "จ่าอากาศโท", + "จ่าอากาศตรี", "พลทหาร", "พลตำรวจเอก", "พลตำรวจโท", "พลตำรวจตรี", "พันตำรวจเอก", + "พันตำรวจโท", "พันตำรวจตรี", "ร้อยตำรวจเอก", "ร้อยตำรวจโท", "ร้อยตำรวจตรี", + "นายดาบตำรวจ", "จ่าสิบตำรวจ", "สิบตำรวจเอก", "สิบตำรวจโท", "สิบตำรวจตรี", + "พลตำรวจ", "นาง", "นางสาว", "หม่อมหลวง", "หม่อมราชวงศ์", "พล.อ.", + "พล.ท.", "พล.ต.", "พ.อ.", "พ.ท.", "พ.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "จ.ส.อ.", + "จ.ส.ท.", + "จ.ส.ต.", "ส.อ.", "ส.ท.", "ส.ต.", "พลฯ", "พล.ร.อ.", "พล.ร.ท.", "พล.ร.ต.", "น.อ.", + "น.ท.", "น.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "พ.จ.อ.", "พ.จ.ท.", "พ.จ.ต.", "จ.อ.", + "จ.ท.", + "จ.ต.", "พลฯ", "พล.อ.อ.", "พล.อ.ท.", "พล.อ.ต.", "น.อ.", "น.ท.", "น.ต.", "ร.อ.", + "ร.ท.", "ร.ต.", "พ.อ.อ.", "พ.อ.ท.", "พ.อ.ต.", "จ.อ.", "จ.ท.", "จ.ต.", "พลฯ", + "พล.ต.อ.", "พล.ต.ท.", "พล.ต.ต.", "พ.ต.อ.", "พ.ต.ท.", "พ.ต.ต.", "ร.ต.อ.", "ร.ต.ท.", + "ร.ต.ต.", "ด.ต.", "จ.ส.ต.", "ส.ต.อ.", "ส.ต.ท.", "ส.ต.ต.", "พลฯ", "ม.ล.", "ม.ร.ว.") + + prefixes_male = ( + "พลเอก", "พลโท", "พลตรี", "พันเอก", "พันโท", "พันตรี", "ร้อยเอก", "ร้อยโท", + "ร้อยตรี", + "จ่าสิบเอก", "จ่าสิบโท", "จ่าสิบตรี", "สิบเอก", "สิบโท", "สิบตรี", "พลทหาร", + "พลเรือเอก", "พลเรือโท", "พลเรือตรี", "นาวาเอก", "นาวาโท", "นาวาตรี", "เรือเอก", + "เรือโท", "เรือตรี", "พันจ่าเอก", "พันจ่าโท", "พันจ่าตรี", "จ่าเอก", "จ่าโท", + "จ่าตรี", "พลทหาร", "พลอากาศเอก", "พลอากาศโท", "พลอากาศตรี", "นาวาอากาศเอก", + "นาวาอากาศโท", "นาวาอากาศตรี", "เรืออากาศเอก", "เรืออากาศโท", "เรืออากาศตรี", + "พันจ่าอากาศเอก", "พันจ่าอากาศโท", "พันจ่าอากาศตรี", "จ่าอากาศเอก", "จ่าอากาศโท", + "จ่าอากาศตรี", "พลทหาร", "พลตำรวจเอก", "พลตำรวจโท", "พลตำรวจตรี", "พันตำรวจเอก", + "พันตำรวจโท", "พันตำรวจตรี", "ร้อยตำรวจเอก", "ร้อยตำรวจโท", "ร้อยตำรวจตรี", + "นายดาบตำรวจ", "จ่าสิบตำรวจ", "สิบตำรวจเอก", "สิบตำรวจโท", "สิบตำรวจตรี", + "พลตำรวจ", + "นาย", "บาทหลวง", "หม่อมหลวง", "หม่อมราชวงศ์", "สามเณร", "พระ", + "พระอธิการ", "เจ้าอธิการ", "พระปลัด", "พระสมุห์", "พระใบฎีกา", "พระครูปลัด", + "พระครูสมุห์", "พระครูใบฎีกา", "พระมหา", "พระครูธรรมธร", "พระครูวินัยธร", "พล.อ.", + "พล.ท.", "พล.ต.", "พ.อ.", "พ.ท.", "พ.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "จ.ส.อ.", + "จ.ส.ท.", + "จ.ส.ต.", "ส.อ.", "ส.ท.", "ส.ต.", "พลฯ", "พล.ร.อ.", "พล.ร.ท.", "พล.ร.ต.", "น.อ.", + "น.ท.", "น.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "พ.จ.อ.", "พ.จ.ท.", "พ.จ.ต.", "จ.อ.", + "จ.ท.", + "จ.ต.", "พลฯ", "พล.อ.อ.", "พล.อ.ท.", "พล.อ.ต.", "น.อ.", "น.ท.", "น.ต.", "ร.อ.", + "ร.ท.", "ร.ต.", "พ.อ.อ.", "พ.อ.ท.", "พ.อ.ต.", "จ.อ.", "จ.ท.", "จ.ต.", "พลฯ", + "พล.ต.อ.", "พล.ต.ท.", "พล.ต.ต.", "พ.ต.อ.", "พ.ต.ท.", "พ.ต.ต.", "ร.ต.อ.", "ร.ต.ท.", + "ร.ต.ต.", "ด.ต.", "จ.ส.ต.", "ส.ต.อ.", "ส.ต.ท.", "ส.ต.ต.", "พลฯ", "ม.ล.", "ม.ร.ว.") + + prefixes = prefixes_female + prefixes_male + + # Chulalongkorn University famous teacher&student first name + # https://th.wikipedia.org/wiki/%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%99%E0%B8%B2%E0%B8%A1%E0%B8%9A%E0%B8%B8%E0%B8%84%E0%B8%84%E0%B8%A5%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%88%E0%B8%B8%E0%B8%AC%E0%B8%B2%E0%B8%A5%E0%B8%87%E0%B8%81%E0%B8%A3%E0%B8%93%E0%B9%8C%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%A7%E0%B8%B4%E0%B8%97%E0%B8%A2%E0%B8%B2%E0%B8%A5%E0%B8%B1%E0%B8%A2 + first_names = ( + "ขวัญข้าว", "จักรพงศ์", "วัลลภ", "ธนชัย", "ธนพร", "หม่อมหลวงปิยาภัสร์", + "นันทวัฒน์", "ภัทร", "ศิริพิชยา", "สุนิดา", "สุรางค์", "หม่อมหลวงสราลี", "อรพรรณ", + "อัษฎาวุธ", "อิทธิพงศ์", "อดิสรณ์", "เกริก", "กุศล", "กรรณิการ์", "กฤษฎา", + "กอบชัย", "ชยาวุธ", "ชลอ", "ชนิสาร์", "ชาญชัย", "ชูเกียรติ", "ถาวร", "ณัฐจักร", + "ณรงค์", "นันทศักดิ์", "ประดิษฐ์", "ปิยะพันธ์", "ยรรยง", "บุญส่ง", "ปรีชา", + "มิ่งขวัญ", "เลิศศักดิ์", "วัฒนา", "วีระศักดิ์", "สดศรี", "ภูริกูลกฤษฎ์", + "สุวิชา", "สุธรรม", "อาทิวราห์", "กริช", "กฤชภร", "กฤษดา", "กิจมาโนชญ์", + "กุลนัดดา", "คมกฤษ", "คีรติ", "จันทรา", "ชนม์ทิดา", "จิระ", "ชลิตา", "ชูเกียรติ", + "ทรงยศ", "ฉันทวิชช์", "ฉัตรปวีณ์", "ฐิติมา", "ณภศศิ", "ฟองสนาน", "ทรงยศ", + "ทักษอร", "ธีรัตถ์", "ธิติมา", "ณภศศิ", "นิธิวัฒน์", "นิรมล", "บุญยอด", "บรรจง", + "ประภัทร์", "ประสงค์", "ประวีณมัย", "ปราโมช", "ปวีณ์สุดา", "ปวีณ์นุช", "ปาณิสรา", + "ปิยณี", "พัชรศรี", "พันธุ์เลิศ", "พุทธชาด", "ไพบูลย์", "ภัทรวี", "ยงยุทธ", + "ยุทธนา", "รัชวิน", "วิชชพัชร์", "วันชัย", "หม่อมหลวงวราภา", "วิทยา", "วรรษพร", + "ศศิวรรณ์", "สุทธิชัย", "สมพล", "สันติ", "สู่ขวัญ", "สายทิพย์", "สายัณห์", + "สิริยากร", "สุภิญญา", "เสริมคุณ", "สวรรยา", "หฤหรรษ์", "อดิสรณ์", "มาดามมด", + "ไอยวริญท์", "อรุโณชา", "อ่อนอุษา", "อาภาภัทร", "อเล็กซ์", "อภิชาต", "ปวีณ", + "เมษ", "ปิยะชาติ", "จารุณี", "ธีมะ", "จักรพันธ์", "ธนพล", "คณาธิป", "กิจมาโนชญ์", + "ธัญชนก", "พัฒนะชัย", "สุทัตตา", "ภัทร", "รสสุคนธ์", "นิพนธ์", "ธัญญา", + "ปรัชญานันท์", "กรกันต์", "ปาจรีย์", "พิสิทธิ์", "กฤตยา", "กันต์", "กอบศักดิ์", + "กานธนิกา", "ขัตติยา", "ชฎาทิพ", "ดวงใจ", "จุฑาวุฒิ", "จันทิมา", "งามนิตย์", + "เมตตา", "ปริศนา", "ธนะชัย", "ธนันต์ธรญ์", "นวลพรรณ", "นภารัตน์", "เมธินี", "บดี", + "บุษกร", "ประเวช", "พชร", "พลอย", "ภัทรียา", "ยิ่งพันธ์", "ลักษณา", "เลอศักดิ์", + "สรสิทธิ์", "สาลินี", "ทองอุไร", "วรุธ", "วิสิฐ", "วศิน", "วรพิศ", "สันติ", + "สุกัญญา", "สุวิชญ", "เสาวณี", "สุวรรณ", "สามารถ", "สาคร", "สุชาดา", "หิรัญญา", + "ศุภเดช", "ศรัณย์ทร", "อโนทัย", "อนันต์", "บุญยงค์", "พรรณประภา", "วิชัย", + "สุรพล", "สมัย", "สำลี", "รอดคล้าย", "สอนตระกูล", "ธรณินทร์", "ศรีหล้า", + "สิทธิหล่อ", "วัฒนางกูร", "บุหงา", "สมหมาย", "ขัตติยะ", "บุญทอง", "โสภา", + "ธวัชชัย", "ดารณี", "ศิริพร", "อมรวิชช์", "แขมมณี", "สุนีย์", "ชนิตา", "สมพงษ์", + "สุนพงษ์ศรี", "ไพฑูรย์", "นงลักษณ์", "ปทีป", "สมหวัง", "วิจิตร", "ธนู", "ธำรง", + "นายแพทย์", "พิศาล", "คงสง", "เอี่ยมวรวุฒิกุล", "ชินโสภณทรัพย์", "เพ็ชรา", + "ทองประสม", "พสุธา", "ยุกตะนันทน์", "มธุราสัย", "ชาติสุทธิพันธุ์", + "หม่อมราชวงศ์อ๊อด", "ประสิทธิ์", "ไตรรัตน์วรกุล", "จีรศักดิ์", "จันศิษย์ยานนท์", + "สมพร", "ศิริจิตร", "คันธวงศ์", "พาลุสุข", "พหิทธานุกร", "วลัยเสถียร", "จุลพงศธร", + "ภูมิ", "จุฑานนท์", "เดชรักษา", "ดิสสะมาน", "เชื้อบุญชัย", "สรุโฆษิต", "ชลอ", + "ปกป้อง", "เหมะรัชตะ", "มันตราภรณ์", "ประยูร", "ไพโรจน์", "ดร.", "ชุติวงศ์", + "ภักดีธนากุล", "วสันตสิงห์", "นิติสิริ", "จันทรางศุ", "วิชิตชลชัย", "มหาคุณ", + "อริยะนันทกะ", "ธรรมาพิทักษ์กุล", "มงคลนาวิน", "สุรเกียรติ์", "ติงสมิตร", "ฤทัย", + "เมฆเกรียงไกร", "เกรียงไกร", "สุนีย์", "วีระพงษ์", "นันทวัฒน์", "ศักดา", + "บวรศักดิ์", "วิษณุ", "อุรพีพัฒนพงศ์", "เขมะจารุ", "สุชีวะ", "ลัดพลี", + "โฆวิไลกูล", "ดิษฐอำนาจ", "สัจจวานิช", "พานิชวงศ์", "ไตรประสิทธิ์", "ฉ่ำเฉลิม", + "ภัทราคม", "ไพศิษฐ์", "คณิต", "สุนทร", "หยุด", "อมร", "โกเมน", "ฦาไชย", + "กิตติพงษ์", "มาศดิตถ์", "มาลีนนท์", "ตั้งพูลสินธนา", "รัตนนาคินทร์", + "หม่อมหลวงวิฏราธร", "ประกอบผล", "เตชานันท์", "วิรุฬห์รักษ์", "ประเสริฐสกุล", + "สุดบรรทัด", "สถาปิตานนท์", "เบ็ญจรงค์กิจ", "ปั้นเหน่งเพ็ชร์", "รอดคำดี", + "ทองมีอาคม", "ศิริยุวศักดิ์", "ชลวิไล", "ปราสาททองโอสถ", "เกยุราพันธุ์", "เมณฑกา", + "วีระเมธีกุล", "สมะลาภา", "ทองปาน", "แสงสนิท", "คุณพนิชกิจ", "ปานะนนท์", + "สามโกเศศ", "บุนนาค", "วีรวรรณ", "สุทธิวาทนฤพุฒิ", "ธัญลักษณ์ภาคย์", "วรรธนะสิน", + "รุนสำราญ", "กรัยวิเชียร", "บัญชี", "เมาลานนท์", "อภิเมธีธำรง", "สุชาดา", + "จันทร์ฉาย", "ตันละมัย", "กรพรหม", "จันทรลาวัณย์", "ดวงเนตร", "เจริญเศรษฐศิลป์", + "ลี่สถาพรวงศา", "เจียมบุญศรี", "อัถโถปกรณ์", "เมฆธน", "วลีอิทธิกุล", + "ศรีประพันธ์", "พระครูปลัดสุวัฒนโพธิคุณ", "มโน", "นลินี", "บุรพรัตน์", + "ตัณฑ์ไพโรจน์", "มานพ", "เสาวภาพ", "ณรงค์", "ตันตยาภรณ์", "ชีวะเกตุ", + "สัณฑ์พิทักษ์", "โปษยะจินดา", "อัมพร", "ชัยชน", "มหาทุมะรัตน์", "ประภัสสราทร", + "เหมะจุฑา", "ตัณฑวิเชียร", "ลิ้มสุวรรณ", "เทียนบุญ", "ปิยะรัตน์", "ภู่วรวรรณ", + "ศุภจัตุรัส", "โชติเลอศักดิ์", "บุณยะโหตระ", "กสานติกุล", "ลิ้มพงศานุรักษ์", + "อนุราษฎร์", "จิตต์มิตรภาพ", "สุวรรณเวลา", "สิทธีอมร", "อ่องจริต", "ดุสิตสิน", + "ภานุภาค", "ฟูตระกูล", "โปษยะจินดา", "สิตปรีชา", "ช่วงโชติ", "ศรีจิตรา", "ประมวล", + "บุญเชียร", "หงศ์ลดารมภ์", "รามสูต", "อึ้งถาวร", "วาทีสาธกกิจ", "สันติไชยกุล",) + + # last name that has given by senior officer + # http://www.reurnthai.com/index.php?topic=5273.45 + last_names = ( + "ดำริห์ชอบ", "ดวงทับทิม", "ดิศดใน", "ดัตพันธุ์", "ดุษฎีวนิช", "ดาบเพ็ชร์", + "ดิสกะประกาย", "เดชคุ้ม", "ดาวกระจาย", "ดาบเงิน", "ดีตพันธุ์", "ดุริยพันธุ์", + "ดาวอร่าม", "เดชวา", "ติระคมน์", "ไตรบรรพ", "ตระกูลบุญ", "เตมิยะเดช", "ตวงทอง", + "แต้กุล", "ตรีครุธพันธุ์", "ตัณฑนุช", "ตั้งกุลงาม", "ตระกูลไม้เรียง", "ตะละภัฏ", + "ตั้งเผ่า", "ตันเผ่า", "เตชะกำพุ", "ตัณสถิตย์", "ตราชู", "ตวันเยี่ยม", + "ตรีเภรินทร์", + "ตันตราจิณ", "ตั้งรบ", "ถนัดกลึง", "ถนอมมนุษย์", "ถนัดอักษร", "ถนัดการยนต์", + "ถนัดหัดถกรรม", "ถาวรายุศม์", "ถนัดการเขียน", "ถาวรรัตน", "ถนัดพิมพการ", + "ถ้วนศรี", + "ถนอมพล", "ถาวระวรณ์", "ถนัดรบ", "ถนอมกุลบุตร", "ถมปัด", "ถนัดภาษา", + "ถนัดเดินข่าว", + "ถนัดรักษา", "ถนิมมาศ", "ถมังรักษสัตว์", "แถมธน", "ถะเกิงชศ", "ถิรสวัสดิ์", + "ถนัดอาวุธ", "ถุงเงิน", "ทุมะบุตร์", "ทองประดิฐ", "ทรงโกมล", "ทัศนสุทธิ", + "ทหารแท้", + "ทองอยู่", "ทำประดู่", "ทรัพย์สาร", "ทีฆะ", "ทวนทอง", "ไทยสุชาต", "ทันยุค", + "ไทนิยม", + "ทองลาภ", "ทองเนื้อดี", "ทองแท้", "ทวีเดช", "ทับทิมไทย", "ทองสินธุ์", "ไทไชโย", + "ทวนไชย์", "ทองสุกเลิศ", "ไทยแท้", "ทองสีไพล", "ธรรมนิยม", "ธนประทีป", "ธรรมเมธา", + "ธุวะนุติ์", "ธาราธร", "ธีวร", "ธัญเสถียร", "ธนูปกรณ์", "เธียรายัน", "ธรรมฤดี", + "ธัญาโภชน์", "ธนรักษ์", "ธูปะวิโรจน์", "ธูปหอม", "แนวพนิช", "นักสำหรวจ", + "นฤทุกข์", + "นาฏคายี", "เนื่องนนท์", "น้ำทิพย์", "เนื้อนุ่ม", "นวลฉวี", "นาคพันธุ์", "นำธวัช", + "แน่นดุจป้อม", "เณรานุสนธิ์", "นามเสวตร", "นิษประปัญจ์", "นิระหานี", "นิลสุวรรณ์", + "นักรบ", "นิติสาขา", "นิยมธรรม", "นิลเสนา", "หนุนสุข", "นิลวิมล", "นฤภัย", + "นาถะเดชะ", + "นพตระกูล", "นิยมเซียม", "หนักแน่น", "นามขำ", "นานายน", "นับเนื่องนอ", "แนวพญา", + "นาถะพินธุ", "นิลสลัว", "นะวะมันดร", "นิลวรรณ", "เนตร์มณี", "นุตตาร", + "นิยมสำหรวจ", + "นกทอง", "นุชแนวนุ่ม", "นาคสุทิน", "นพคเชนทร์", "นาคะนคร", "นิละทัต", "นาควงษ์", + "นากกนก", "บุนยาภิสนท์", "บุญญาภิรมย์", "บุณยะภาชน์", "บินดี", "บุนยะศัพท์", + "บุนยะตีรณะ", "บุญญาไลย์", "บุญบำรุง",) + + # thai suffix that has given by the king + # https://th.wikipedia.org/wiki/%E0%B8%99%E0%B8%B2%E0%B8%A1%E0%B8%AA%E0%B8%81%E0%B8%B8%E0%B8%A5%E0%B8%9E%E0%B8%A3%E0%B8%B0%E0%B8%A3%E0%B8%B2%E0%B8%8A%E0%B8%97%E0%B8%B2%E0%B8%99 + suffixes = ( + "ณ กาฬสินธุ์", "ณ จัมปาศักดิ์", "ณ เชียงใหม่", "ณ ตะกั่วทุ่ง", "ณ ถลาง", "ณ นคร", + "ณ น่าน", "ณ บางช้าง", "ณ ป้อมเพชร์", "ณ พัทลุง", "ณ พิศณุโลก", "ณ มโนรม", + "ณ มหาไชย", + "ณ ร้อยเอ็จ", "ณ ระนอง", "ณ ลำปาง", "ณ ลำพูน", "ณ วิเชียร", "ณ สงขลา", + "ณ หนองคาย", + "ณ อุบล") diff --git a/src/libs/faker/providers/person/tr_TR/__init__.py b/src/libs/faker/providers/person/tr_TR/__init__.py new file mode 100644 index 0000000..2da2e58 --- /dev/null +++ b/src/libs/faker/providers/person/tr_TR/__init__.py @@ -0,0 +1,278 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = ( + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{first_name_female}} {{last_name}}', + '{{first_name_female}} {{last_name}}', + '{{first_name_female}} {{first_name_female}} {{last_name}} {{last_name}}', + '{{first_name_female}} {{last_name}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{first_name_female}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{first_name_female}} {{last_name}} {{last_name}}', + '{{prefix_female}} {{first_name_female}} {{last_name}} {{last_name}}' + ) + + formats_male = ( + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{first_name_male}} {{first_name_male}} {{last_name}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{last_name}}', + '{{first_name_male}} {{last_name}}', + '{{prefix_male}} {{first_name_male}} {{first_name_male}} {{last_name}}' + ) + + formats = formats_male + formats_female + + first_names_female = ('Abiye', 'Acarkan', 'Adal', 'Adila', 'Adviye', + 'Afife', 'Ahter', 'Akay', 'Akgüneş', 'Akise', 'Akmaral', 'Aksoy', + 'Akyıldız', 'Alabezek', 'Alaz', 'Algış', 'Alize', 'Almast', 'Alsoy', + 'Altınbike', 'Altınçiçek', 'Alışık', 'Amre', 'Anargül', 'Anka', 'Aral', + 'Armahan', 'Arziye', 'Arıpınar', 'Asiman', 'Asliye', 'Asu', 'Atanur', + 'Atiyye', 'Avunç', 'Ayasun', 'Aybet', 'Aycagül', 'Aydar', 'Ayduru', + 'Aygönenç', 'Ayhan', 'Aykut', 'Aylil', 'Aynilhayat', 'Aynımah', + 'Aysema', 'Aysevim', 'Aysuna', 'Ayten', 'Aytöz', 'Ayyaruk', 'Ayçan', + 'Ayülker', 'Ayşeana', 'Ayşenur', 'Azade', 'Azize', 'Açılay', 'Ağbegim', + 'Aşhan', 'Badegül', 'Bahtinur', 'Balca', 'Ballı', 'Banü', 'Basriye', + 'Bağdat', 'Bediriye', 'Begim', 'Behiza', 'Belgizar', 'Belkize', 'Benek', + 'Benice', 'Beray', 'Bergen', 'Beriye', 'Berrin', 'Besey', 'Beste', + 'Beyhatun', 'Bezek', 'Bidayet', 'Bilay', 'Bilginur', 'Bilkay', 'Binay', + 'Birben', 'Birgül', 'Birsan', 'Bitül', 'Burcuhan', 'Buşra', 'Büreyre', + 'Büşranur', 'Canan', 'Canfeza', 'Cannur', 'Canseven', 'Canur', 'Cedide', + 'Cemiyle', 'Cevale', 'Ceyhun', 'Cihan', 'Cuheyna', 'Damlanur', 'Deha', + 'Deniz', 'Deryanur', 'Değer', 'Dilara', 'Dilcan', 'Dilfeza', 'Dilhuş', + 'Dilsitan', 'Dilşat', 'Divan', 'Doğannur', 'Duha', 'Durgadin', + 'Dursadiye', 'Duyguhan', 'Döner', 'Dürrüşehvar', 'Ecegül', 'Edaviye', + 'Efil', 'Egenur', 'Elamiye', 'Elgin', 'Elifnur', 'Elvan', 'Emal', + 'Emine.', 'Emiş', 'Enfes', 'Erbay', 'Erem', 'Ergül', 'Eriş', 'Ervaniye', + 'Esengün', 'Esmanperi', 'Esna', 'Evde', 'Evrim', 'Ezgin', 'Eşim', + 'Fadile', 'Fadıla', 'Faize', 'Fatigül', 'Fatinur', 'Fatmanur', 'Fayize', + 'Feden', 'Fehmiye', 'Ferahdiba', 'Feraye', 'Ferhan', 'Ferinaz', + 'Fermuta', 'Feryas', 'Feyha', 'Feyzin', 'Fidaye', 'Fildan', 'Firdevis', + 'Fitnat', 'Fügen', 'Gabel', 'Ganiye', 'Gelengül', 'Gilman', 'Goncafer', + 'Gök', 'Gökperi', 'Gökçe', 'Göli', 'Görsev', 'Gözem', 'Gül', 'Gülay', + 'Gülbani', 'Gülbeyan', 'Gülbiye', 'Gülcegün', 'Güldam', 'Gülder', + 'Güldünya', 'Gülenay', 'Güler', 'Gülev', 'Gülfari', 'Gülfeza', 'Gülgen', + 'Gülgüzel', 'Gülhisar', 'Gülinaz', 'Gülkadın', 'Güllühan', 'Gülmisal', + 'Gülnaziye', 'Gülper', 'Gülsalın', 'Gülselin', 'Gülseren', 'Gülsevil', + 'Gülsiye', 'Gülsü', 'Gülter', 'Gülzadiye', 'Gülçe', 'Gülözge', 'Gülüs', + 'Gülşa', 'Gülşeref', 'Günar', 'Günebakan', 'Güngören', 'Günsel', + 'Günver', 'Gürcüye', 'Gürten', 'Güverçin', 'Güzey', 'Habibe', 'Hacile', + 'Hadrey', 'Hafıza', 'Halenur', 'Haliye', 'Hamiyet', 'Hanbiken', 'Hanim', + 'Hansultan', 'Harbinaz', 'Hasgül', 'Hasret', 'Hatin', 'Havali', 'Havse', + 'Hayel', 'Hayrünnisa', 'Hazine', 'Hekime', 'Henife', 'Heva', 'Hezniye', + 'Hilayda', 'Hinet', 'Hoşkadem', 'Huban', 'Hurican', 'Hurşide', 'Hüda', + 'Hümeyra', 'Hürmet', 'Hürüyet', 'Hüsnühâl', 'Ildız', 'Irıs', 'Işin', + 'Işın', 'Jaruthip', 'Kader', 'Kadınana', 'Kandef', 'Kardelen', 'Kaver', + 'Kefser', 'Kerime', 'Kezban', 'Kifaye', 'Kitan', 'Koncagül', 'Kumral', + 'Kutgün', 'Kutun', 'Kâzime', 'Kübran', 'Kısmet', 'Laika', 'Laze', + 'Lerze', 'Leyli', 'Lezize', 'Limon', 'Lâle', 'Lüfen', 'Macide', + 'Mahigül', 'Mahnaz', 'Mahter', 'Maksüde', 'Masume', 'Maynur', 'Maşide', + 'Mecide', 'Mefharet', 'Mehdiye', 'Mehrigül', 'Melaha', 'Meleknur', + 'Melikkan', 'Melûl', 'Menfeat', 'Menişan', 'Merba', 'Merim', 'Merva', + 'Meryeme', 'Mesude', 'Meveddet', 'Mevlüdiye', 'Meyhanim', 'Mezide', + 'Mihrab', 'Mihriye', 'Minibe', 'Miray', 'Misra', 'Miyesser', 'Muarra', + 'Mufide', 'Muhiye', 'Mujde', 'Mukbile', 'Musaffa', 'Muvahhide', + 'Mübetcel', 'Mücevher', 'Müferrih', 'Müjde', 'Mükrüme', 'Mümtaze', + 'Münezzer', 'Müret', 'Müsemma', 'Müveddet', 'Müğber', 'Müşüre', 'Nades', + 'Nafile', 'Naide', 'Nalân', 'Narhanim', 'Nasiba', 'Natalia', 'Naz', + 'Nazende', 'Nazi', 'Nazimet', 'Nazlihan', 'Nazıdil', 'Nebiha', + 'Necilal', 'Necva', 'Nefaret', 'Nefiye', 'Nejdet', 'Neptün', 'Neriban', + 'Nesfe', 'Neslinur', 'Neval', 'Nevgin', 'Nevise', 'Nevsale', 'Neyran', + 'Nezengül', 'Nezize', 'Neşrin', 'Nihan', 'Nilcan', 'Nili', 'Nirgül', + 'Niğmet', 'Nura', 'Nurbanu', 'Nurda', 'Nurdeniz', 'Nurey', 'Nurgil', + 'Nurhayet', 'Nuriyet', 'Nurmelek', 'Nurseda', 'Nurser', 'Nursim', + 'Nurtaç', 'Nurveren', 'Nurşan', 'Nüdret', 'Nürice', 'Oguş', 'Oluş', + 'Orçin', 'Paksu', 'Paye', 'Pekkan', 'Pembesin', 'Peren', 'Perinur', + 'Permun', 'Pesent', 'Piran', 'Pürçek', 'Rabbiye', 'Rafia', 'Rahiye', + 'Rakide', 'Rana', 'Rayla', 'Rebihat', 'Refet', 'Rehime', 'Rengül', + 'Revza', 'Rezin', 'Risalet', 'Rojnu', 'Ruhide', 'Ruhugül', 'Rumeysa', + 'Rümeysa', 'Rıfkıye', 'Sabihe', 'Sabır', 'Sadeti', 'Sadiye', 'Safinaz', + 'Safura', 'Sahil', 'Saire', 'Salimet', 'Samahat', 'Sanavber', 'Sanur', + 'Sarya', 'Satıa', 'Saygın', 'Saçı', 'Sebigül', 'Seblâ', 'Sedife', + 'Sefer', 'Sehel', 'Sejda', 'Selcen', 'Selime', 'Selmin', 'Selvi', + 'Selçuk', 'Semat', 'Semine', 'Semrin', 'Seniha', 'Serda', 'Serfinaz', + 'Serma', 'Sernur', 'Servinaz', 'Sevcan', 'Sevdinar', 'Sevgen', + 'Sevginur', 'Sevican', 'Sevim', 'Sevla', 'Sevsevil', 'Seyhan', + 'Seyyide', 'Sezen', 'Seçgül', 'Sidar', 'Silanur', 'Simber', 'Simten', + 'Sirap', 'Siti', 'Solma', 'Sonnur', 'Soykan', 'Subutiye', 'Sultane', + 'Sunay', 'Susam', 'Söyler', 'Süheyda', 'Süleyla', 'Sümerya', 'Süner', + 'Süsen', 'Süzer', 'Sırriye', 'Tagangül', 'Talibe', 'Tan', 'Tangül', + 'Tanses', 'Tanyu', 'Tasvir', 'Tayyibe', 'Taçnur', 'Teknaz', 'Temime', + 'Tercan', 'Teybet', 'Ticen', 'Tomurcuk', 'Tule', 'Turcein', 'Tutkucan', + 'Tuğçe', 'Tülin', 'Türcan', 'Türknur', 'Tüzenur', 'Ufukay', 'Ummahani', + 'Umuşan', 'Uyanser', 'Uğur', 'Vacibe', 'Varlık', 'Vecide', 'Vefia', + 'Verde', 'Vezrife', 'Vildane', 'Yahşi', 'Yalın', 'Yasemen', 'Yazgül', + 'Yaşar', 'Yekbun', 'Yepelek', 'Yeşil', 'Yosma', 'Yurdaser', 'Yurtseven', + 'Yücel', 'Yıldız', 'Zahfer', 'Zaliha', 'Zebirce', 'Zehranur', 'Zelha', + 'Zemzem', 'Zerafet', 'Zeride', 'Zevlüde', 'Zeyno', 'Zilfa', 'Zinnure', + 'Zubeyde', 'Zöhrehan', 'Züheyla', 'Zülbiye', 'Zülfüye', 'Zümre', + 'Âlemşah', 'Çalım', 'Çağlar', 'Çevregül', 'Çilga', 'Çisem', 'Çolpan', + 'Ömriye', 'Öncel', 'Örfiye', 'Övün', 'Özay', 'Özbilge', 'Özdeş', 'Özge', + 'Özgün', 'Özlem', 'Özpetek', 'Özyurt', 'Üge', 'Ülke', 'Ülküm', + 'Ümmahan', 'Ümmühan', 'Ümray', 'Ünal', 'Ünsever', 'Ürper', 'Üçgül', + 'İde', 'İhsan', 'İklim', 'İldeş', 'İlkbahar', 'İlklima', 'İlper', + 'İmge', 'İmrihan', 'İncifir', 'İnsaf', 'İrfan', 'İslime', 'İsra', + 'İzel', 'İçimbike', 'Şadıman', 'Şahdiye', 'Şahinder', 'Şahnuray', + 'Şahıgül', 'Şamiha', 'Şayan', 'Şazime', 'Şefiye', 'Şehreban', 'Şehza', + 'Şelâle', 'Şemsinisa', 'Şendoğan', 'Şennur', 'Şeref', 'Şerman', + 'Şevketfeza', 'Şeyda', 'Şilan', 'Şirivan', 'Şöhret', 'Şüküfe' + + ) + + first_names_male = ('Abdiş', 'Abdulbekir', 'Abdulgazi', 'Abdulkadir', + 'Abdulmenaf', 'Abdulsemet', 'Abdurrahman', 'Abdülahat', 'Abdülcemal', + 'Abdülhadi', 'Abdülkerim', 'Abdülsamed', 'Abdürreşit', 'Abid', 'Abuzar', + 'Acar', 'Aclan', 'Adak', 'Adasal', 'Adlan', 'Adıgün', 'Afer', 'Ahat', + 'Ahsen', 'Akalan', 'Akar', 'Akatay', 'Akbaş', 'Akboğa', 'Akcivan', + 'Akdora', 'Akdurmuş', 'Akgöl', 'Akif', 'Akkerman', 'Akmaner', 'Aksay', + 'Aksöğüt', 'Aktemür', 'Akver', 'Akçabay', 'Akçasu', 'Aköz', 'Akınal', + 'Alaaddin', 'Alaeddin', 'Alanalp', 'Alattin', 'Alcan', 'Alexandru', + 'Aliabbas', 'Aliihsan', 'Aliseydi', 'Alkor', 'Almus', 'Alparslan', + 'Alpcan', 'Alpin', 'Alpsü', 'Alsoy', 'Altoğan', 'Altuğ', 'Altınkaya', + 'Altınışın', 'Amaç', 'Andiç', 'Annak', 'Apaydın', 'Aran', 'Arcan', + 'Argu', 'Arifcan', 'Arkut', 'Arpağ', 'Artan', 'Aru', 'Arıel', 'Arıkol', + 'Arısoy', 'Asalet', 'Aslanhan', 'Asım', 'Atagün', 'Atalay', 'Atasagun', + 'Atatöre', 'Atgun', 'Atilhan', 'Atnan', 'Atılgan', 'Avşin', 'Ayaydın', + 'Aybora', 'Aydinç', 'Aydınbey', 'Aygutalp', 'Aykutalp', 'Aypar', + 'Aysoy', 'Aytek', 'Aytuna', 'Ayvas', 'Ayşan', 'Azettin', 'Açıkel', + 'Ağakişi', 'Ağmur', 'Aşir', 'Baba', 'Bahaddin', 'Bahittin', 'Baki', + 'Balatekin', 'Bali', 'Baltaş', 'Barak', 'Bariş', 'Barsen', 'Barışcan', + 'Basım', 'Baturay', 'Batırhan', 'Baydu', 'Baykan', 'Bayman', 'Bayruhan', + 'Baytal', 'Bayzettin', 'Bağdaş', 'Başay', 'Başhan', 'Başok', 'Bedi', + 'Bedri', 'Behrem', 'Bekbay', 'Bektaşi', 'Bellisan', 'Bengibay', 'Benol', + 'Beren', 'Berkal', 'Berki', 'Berksay', 'Berran', 'Besin', 'Beyda', + 'Beyler', 'Beyzade', 'Bican', 'Bilender', 'Bilgen', 'Bilgütay', + 'Biltaş', 'Binbaşar', 'Binışık', 'Birgit', 'Birsen', 'Bişar', 'Borahan', + 'Borataş', 'Boynak', 'Bozbağ', 'Bozerk', 'Boztaş', 'Boğatimur', + 'Buhari', 'Bulunç', 'Burakhan', 'Burç', 'Buyrukhan', 'Börteçin', + 'Büget', 'Bünyamün', 'Cabir', 'Canal', 'Canberk', 'Candeniz', 'Cangür', + 'Cannur', 'Cansin', 'Cantez', 'Cavit', 'Cebesoy', 'Celilay', + 'Cemalettin', 'Cenan', 'Cercis', 'Cevheri', 'Cezayir', 'Cihandide', + 'Cindoruk', 'Coşkun', 'Cuman', 'Cüneyit', 'Dalan', 'Dalkılıç', 'Danış', + 'Dayar', 'Dağistan', 'Delil', 'Demirbüken', 'Demiriz', 'Demirok', + 'Demiryürek', 'Denizalp', 'Denkel', 'Derkay', 'Deviner', 'Değmeer', + 'Diken', 'Dilder', 'Dincer', 'Dinçkol', 'Dinçsü', 'Dirican', 'Dirlik', + 'Dolun', 'Dorukhan', 'Doğanalp', 'Doğanşah', 'Doğuhan', 'Duracan', + 'Durdali', 'Durmuşali', 'Duruk', 'Duruöz', 'Dölensoy', 'Dündaralp', + 'Eba', 'Ebuakil', 'Ecemiş', 'Edgübay', 'Efe', 'Eflâtun', 'Efser', + 'Ekber', 'Ekmel', 'Elhan', 'Elnur', 'Elöve', 'Emin', 'Emirşan', + 'Emrullah', 'Enes', 'Enginiz', 'Ensari', 'Eral', 'Eraycan', 'Erbil', + 'Ercihan', 'Erdemer', 'Erdibay', 'Erdogan', 'Erdursun', 'Erenalp', + 'Erensoy', 'Ergener', 'Erginel', 'Ergönül', 'Ergün', 'Erik', 'Erinçer', + 'Erkan', 'Erkinel', 'Erksoy', 'Erkılıç', 'Ermutlu', 'Eroğul', 'Ersel', + 'Erseç', 'Ertan', 'Erten', 'Ertuncay', 'Ertün', 'Eryıldız', 'Eröz', + 'Erşat', 'Esenbay', 'Esentürk', 'Eskinalp', 'Evcimen', 'Evrimer', + 'Eyyüp', 'Ezgütekin', 'Eşref', 'Fahrullah', 'Fami', 'Fatih', 'Fazul', + 'Fehim', 'Fenni', 'Ferat', 'Feremez', 'Ferihan', 'Fersan', 'Ferzi', + 'Fetullah', 'Feyruz', 'Feza', 'Filit', 'Fuzuli', 'Galip', 'Gazel', + 'Gencaslan', 'Gençay', 'Geray', 'Ginyas', 'Giz', 'Gökay', 'Gökbudun', + 'Göken', 'Göknur', 'Göksev', 'Gökten', 'Gökçebalan', 'Gökçil', 'Gönen', + 'Görgünay', 'Görklü', 'Gözel', 'Gücal', 'Gülağa', 'Gülel', 'Güleğen', + 'Gülşahin', 'Gümüştekin', 'Günaydin', 'Günden', 'Gündüzalp', 'Güneri', + 'Güngördü', 'Günkurt', 'Günser', 'Günver', 'Günşen', 'Gürarda', + 'Gürelcem', 'Gürsal', 'Güçal', 'Güçlüer', 'Güçyeter', 'Haciali', + 'Hakikat', 'Halidun', 'Haluk', 'Hami', 'Hanedan', 'Hariz', 'Hasbek', + 'Hatem', 'Hayali', 'Hayret', 'Hazrat', 'Hekmet', 'Heyvetullah', 'Hidir', + 'Hindal', 'Hiçsönmez', 'Hudavent', 'Hunalp', 'Huzuri', 'Hükümdar', + 'Hürdoğan', 'Hüryaşar', 'Hüsmen', 'Hıfzullah', 'Idık', 'Ilgı', 'Ismık', + 'Işıkay', 'Işıman', 'Jankat', 'Kader', 'Kahir', 'Kalgay', 'Kamar', + 'Kanak', 'Kanpulat', 'Kapagan', 'Karabaş', 'Karaca', 'Karaer', + 'Karakucak', 'Karanbay', 'Karataş', 'Karcan', 'Karlukhan', 'Kasim', + 'Kavurt', 'Kayagün', 'Kaygusuz', 'Kayrabay', 'Kayıt', 'Kaşif', 'Kelâmi', + 'Kenter', 'Kerman', 'Kete', 'Kibar', 'Kiramettin', 'Kiyasi', 'Kocabaş', + 'Koldan', 'Konguralp', 'Kopan', 'Koray', 'Korkmazalp', 'Korugan', + 'Kotuz', 'Koçak', 'Koçkan', 'Koşukhan', 'Kuddusi', 'Kutay', 'Kâmil', + 'Köker', 'Köktaş', 'Kösemen', 'Kürşad', 'Kılıçbay', 'Kınel', 'Kırat', + 'Kırgız', 'Kıvılcım', 'Kızıl', 'Kızıltunç', 'Ledün', 'Lutfi', 'Lütfi', + 'Mahir', 'Mahsun', 'Maksur', 'Mansurali', 'Masar', 'Mazlum', 'Mecit', + 'Mefarettin', 'Mehmed', 'Mehmetzahir', 'Melihcan', 'Memili', 'Mengi', + 'Mengüç', 'Merdi', 'Mertel', 'Merzuk', 'Mestur', 'Metinkaya', 'Mevlüt', + 'Meşhur', 'Mihin', 'Milay', 'Mirbadin', 'Mishat', 'Monis', 'Mucahit', + 'Muhammet', 'Muhip', 'Muhyettin', 'Muktedir', 'Muratcan', 'Musafet', + 'Mutasım', 'Mutluhan', 'Muvaffak', 'Möhsim', 'Mücellib', 'Müfit', + 'Mükramin', 'Mülâyim', 'Münif', 'Mürit', 'Müslum', 'Müzekker', 'Nabil', + 'Nafii', 'Nakip', 'Nas', 'Nasuf', 'Nayil', 'Nazlim', 'Nebih', 'Necdat', + 'Necmettin', 'Nehip', 'Nerim', 'Nesip', 'Nevsal', 'Nezihi', 'Nihai', + 'Niyazi', 'Noman', 'Nural', 'Nurcan', 'Nuretdin', 'Nurkan', 'Nurullah', + 'Nuyan', 'N˜zamett˜n', 'Odkanlı', 'Oganer', 'Okanay', 'Okbay', + 'Okgüçlü', 'Okseven', 'Oktüremiş', 'Okyalaz', 'Olca', 'Oldağ', 'Oliver', + 'Omaca', 'Onat', 'Ongay', 'Onuker', 'Onurcan', 'Onursu', 'Oranlı', + 'Orgün', 'Ortak', 'Oruç', 'Otay', 'Oymak', 'Ozansü', 'Oğulbaş', + 'Oğurata', 'Oğuzman', 'Paker', 'Pehlil', 'Pirahmet', 'Rabih', 'Rafih', + 'Rahmet', 'Ramadan', 'Rasul', 'Razı', 'Recepali', 'Refik', 'Remazan', + 'Resulcan', 'Rezzak', 'Risalet', 'Rohat', 'Ruhsat', 'Rüknettin', + 'Rüşen', 'Saba', 'Sabih', 'Sadat', 'Sadittin', 'Safet', 'Sahir', + 'Sakip', 'Salami', 'Salkın', 'Salurbay', 'Sami', 'Samurtay', 'Sancak', + 'Sançar', 'Sargın', 'Sarpkın', 'Sarıcabay', 'Satrettin', 'Savak', + 'Savni', 'Saydam', 'Sayin', 'Sayrak', 'Sayın', 'Sağcan', 'Sağıt', + 'Sebattin', 'Seda', 'Seha', 'Selaheddin', 'Selatin', 'Seler', 'Selvi', + 'Selâtin', 'Semender', 'Sencar', 'Seracettin', 'Serda', 'Serezli', + 'Serhatmehmet', 'Serol', 'Server', 'Sevdi', 'Sevindik', 'Seydo', + 'Seyfullah', 'Seyithan', 'Sezal', 'Sezginbaş', 'Seçme', 'Sidki', + 'Siper', 'Sittik', 'Sonad', 'Songurkan', 'Soydaner', 'Soykut', + 'Soyselçuk', 'Suat', 'Sudi', 'Sulhi', 'Sunel', 'Suphi', 'Sökmen', + 'Sözer', 'Sücaettin', 'Süha', 'Sümeyye', 'Süvari', 'Sıla', 'Sıylıhan', + 'Taciddin', 'Tahir', 'Talayer', 'Tali', 'Tamaydın', 'Tanak', 'Tanbay', + 'Tandoğdu', 'Tanhan', 'Tanpınar', 'Tansev', 'Tansığ', 'Tanyolaç', + 'Tanır', 'Tarancı', 'Tartış', 'Tatu', 'Tayaydın', 'Taygan', 'Taylak', + 'Tayyip', 'Taşar', 'Taşkan', 'Teber', 'Tecimer', 'Tekbay', 'Tekecan', + 'Tekiner', 'Teksoy', 'Telim', 'Temirhan', 'Temizkal', 'Temuçin', + 'Tenvir', 'Terlan', 'Tevs', 'Tezcan', 'Tezol', 'Timurtaş', 'Tiğin', + 'Toker', 'Toktuğ', 'Toköz', 'Tolonbay', 'Tonguç', 'Topuz', 'Torhan', + 'Toy', 'Toğan', 'Tulun', 'Tunahan', 'Tunguç', 'Tunçboğa', 'Tunçkılıç', + 'Turabi', 'Turgut', 'Tutkun', 'Tuyuğ', 'Tuğcan', 'Tuğrulhan', 'Tuğtaş', + 'Törel', 'Tükelalp', 'Tümer', 'Tümkurt', 'Türabi', 'Türkalp', 'Türkmen', + 'Tüzeer', 'Tınal', 'Ufukay', 'Ulakbey', 'Ulu', 'Uludağ', 'Uluman', + 'Ulutay', 'Uluğbey', 'Umman', 'Umutcan', 'Uraltay', 'Urhan', 'Us', + 'Ushan', 'Utkucan', 'Uygun', 'Uzbay', 'Uzsoy', 'Uçan', 'Uçbeyi', 'Uğan', + 'Uğurkan', 'Uğurtan', 'Vafir', 'Vahittin', 'Vargın', 'Vaysal', 'Vedat', + 'Veis', 'Velitdin', 'Verim', 'Vezat', 'Vâlâ', 'Yadigar', 'Yahşikan', + 'Yalazabay', 'Yalgın', 'Yaltırak', 'Yalın', 'Yamin', 'Yankı', 'Yargı', + 'Yasan', 'Yavuz', 'Yayak', 'Yazganalp', 'Yağın', 'Yağızkurt', + 'Yaşattin', 'Yekda', 'Yelesen', 'Yeneral', 'Yertan', 'Yetişal', 'Yigit', + 'Yilmaz', 'Yolal', 'Yoruç', 'Yunt', 'Yurdanur', 'Yurtgüven', 'Yurttaş', + 'Yönetmen', 'Yücelen', 'Yümun', 'Yıldır', 'Yılma', 'Zahid', 'Zamir', + 'Zekayi', 'Zennun', 'Zeynelabidin', 'Zihni', 'Ziyaettin', 'Zoral', + 'Züfer', 'Zülgarni', 'Âdem', 'Çakar', 'Çakırca', 'Çaltı', 'Çamok', + 'Çapkan', 'Çavuldur', 'Çağa', 'Çağdan', 'Çağlasın', 'Çağveren', 'Çelem', + 'Çelikkan', 'Çelikyürek', 'Çerçi', 'Çetinsu', 'Çeviköz', 'Çinerk', + 'Çokan', 'Çopur', 'Çoğay', 'Çıdal', 'Çıvgın', 'Öge', 'Ökkaş', 'Öktürk', + 'Ömür', 'Öncel', 'Önel', 'Öngen', 'Önsal', 'Örik', 'Öryürek', 'Över', + 'Özakan', 'Özalpsan', 'Özaslan', 'Özbay', 'Özbilek', 'Özdal', 'Özdil', + 'Özdoğdu', 'Özel', 'Özerdinç', 'Özertem', 'Özger', 'Özgür', 'Özinal', + 'Özkent', 'Özkutlu', 'Özlü', 'Özokçu', 'Özpınar', 'Özsözlü', 'Öztek', + 'Öztürk', 'Özçam', 'Özüdoğru', 'Öğet', 'Übeydullah', 'Ülfet', 'Ülküdeş', + 'Ümmet', 'Ünek', 'Ünlen', 'Ünsever', 'Ünübol', 'Ürfettin', 'Üsame', + 'Üstün', 'Üzer', 'Ğanim', 'İbrahim', 'İdiris', 'İkiz', 'İlalmış', + 'İlbek', 'İldem', 'İlgi', 'İlim', 'İlkim', 'İlmafer', 'İlsu', 'İlteriş', + 'İmam', 'İmren', 'İnançlı', 'İntihap', 'İsak', 'İsmet', 'İvecen', + 'İyiyürek', 'İzgü', 'İşcan', 'Şabettin', 'Şafii', 'Şahat', 'Şahinbey', + 'Şahmettin', 'Şali', 'Şanlı', 'Şavki', 'Şefi', 'Şehamet', 'Şekim', + 'Şemsettin', 'Şendoğan', 'Şenkal', 'Şerafeddin', 'Şevket', 'Şide', + 'Şinasi', 'Şuayp', 'Şükri' + + ) + + first_names = first_names_male + first_names_female + + last_names = ( + 'Yılmaz', 'Yıldırım', 'Türk', 'Yorulmaz', 'Erdoğan', 'Çorlu', 'Sakarya', + 'Demir', 'Yaman', 'Manço', 'Aksu', 'Akçay', 'Akar', 'Bilir', 'Bilgin', + 'Yüksel', 'Eraslan', 'Aslan', 'Arslan', 'Hançer', 'Hayrioğlu', 'Şama', + 'Ergül', 'Arsoy', 'Kısakürek', 'Gülen', 'Seven', 'Şafak', 'Dumanlı', + 'Ertaş', 'Güçlü', 'Soylu', 'Zorlu', 'Fırat', 'Duran', 'Durmuş', 'Durdu', + 'Zengin', 'Tevetoğlu', 'Mansız', 'Şener', 'Şensoy', 'Ülker', 'Tarhan', + 'Sezer', 'Demirel', 'Gül', 'Korutürk', 'İnönü', 'Öcalan', 'Çetin', + 'Sezgin', 'Alemdar', 'Karadeniz', 'Akdeniz', 'Bilge', 'Akgündüz', + 'Akçay', 'Çamurcuoğlu', 'İhsanoğlu', 'Akça' + ) + + prefixes_female = ('Bayan', 'Dr.') + prefixes_male = ('Bay', 'Dr.') + + prefixes = prefixes_female + prefixes_male diff --git a/src/libs/faker/providers/person/tw_GH/__init__.py b/src/libs/faker/providers/person/tw_GH/__init__.py new file mode 100644 index 0000000..876f7e7 --- /dev/null +++ b/src/libs/faker/providers/person/tw_GH/__init__.py @@ -0,0 +1,594 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ( + '{{first_name_male}} {{last_name_male}}', + '{{first_name_male}} {{last_name_male}}', + '{{first_name_male}} {{last_name_male}}', + '{{first_name_male}} {{last_name_male}}', + '{{first_name_male}} {{last_name_male}}-{{last_name_male}}', + '{{first_name_female}} {{last_name_female}}', + '{{first_name_female}} {{last_name_female}}', + '{{first_name_female}} {{last_name_female}}', + '{{first_name_female}} {{last_name_female}}', + '{{first_name_female}} {{last_name_female}}-{{last_name_female}}', + '{{prefix_male}} {{first_name_male}} {{last_name_male}}', + '{{prefix_female}} {{first_name_female}} {{last_name_female}}', + '{{prefix_male}} {{first_name_male}} {{last_name_male}}', + '{{prefix_female}} {{first_name_female}} {{last_name_female}}' + ) + + # names from https://en.wikipedia.org/wiki/Ghanaian_name, https://buzzghana.com/ghanaian-names/, https://en.wikipedia.org/wiki/Akan_names, + + first_names_male = ( + 'Aaron', + 'Abeiku', + 'Adam', + 'Adrian', + 'Akwesi', + 'Albert', + 'Alex', + 'Alexander', + 'Andrew', + 'Anthony', + 'Antony', + 'Arthur', + 'Ben', + 'Benjamin', + 'Bernard', + 'Bruce', + 'Carl', + 'Charles', + 'Christian', + 'Clifford', + 'Colins', + 'Daniel', + 'Danny', + 'David', + 'Denis', + 'Dennis', + 'Derrick', + 'Dominic', + 'Donald', + 'Douglas', + 'Duncan', + 'Edward', + 'Ekow', + 'Elliot', + 'Elliott', + 'Eric', + 'Fiifi', + 'Francis', + 'Frank', + 'Frederick', + 'George', + 'Gerald', + 'Gordon', + 'Graham', + 'Gregory', + 'Harry', + 'Henry', + 'Howard', + 'Isaac', + 'Akwasi', + 'Jack', + 'Jacob', + 'Jake', + 'James', + 'Jason', + 'Jeffrey', + 'Jeremy', + 'Joe', + 'Joel', + 'John', + 'Jonathan', + 'Joojo', + 'Joseph', + 'Josh', + 'Joshua', + 'Josiah', + 'Julian', + 'Justin', + 'Karl', + 'Kenneth', + 'Kevin', + 'Kofi', + 'Kojo', + 'Kujoe', + 'Kwabena', + 'Kwadwo', + 'Kwaku', + 'Kwame', + 'Kwamena', + 'Kwasi', + 'Kweku', + 'Kwesi', + 'Kyle', + 'Lawrence', + 'Leslie', + 'Louis', + 'Luke', + 'Malcolm', + 'Marcus', + 'Mark', + 'Martin', + 'Mathew', + 'Matthew', + 'Max', + 'Michael', + 'Nathan', + 'Nicholas', + 'Nigel', + 'Oliver', + 'Patrick', + 'Paul', + 'Peter', + 'Philip', + 'Phillip', + 'Raymond', + 'Richard', + 'Robert', + 'Roger', + 'Ronald', + 'Russell', + 'Sam', + 'Samuel', + 'Shaun', + 'Simon', + 'Stanley', + 'Stephen', + 'Steven', + 'Terence', + 'Thomas', + 'Timothy', + 'Tom', + 'Tony', + 'Victor', + 'Vincent', + 'William', + 'Yaw' + ) + + first_names_female = ( + 'Aba', + 'Abena', + 'Abigail', + 'Adwoa', + 'Afia', + 'Afua', + 'Akos', + 'Akosua', + 'Akua', + 'Akumaa', + 'Alice', + 'Ama', + 'Amanda', + 'Amber', + 'Amelia', + 'Angela', + 'Ann', + 'Annette', + 'Awesi', + 'Baaba', + 'Barbara', + 'Beatrice', + 'COmfort', + 'Caroline', + 'Catherine', + 'Charlotte', + 'Christina', + 'Comfort', + 'Constance', + 'Danielle', + 'Deborah', + 'Debra', + 'Denise', + 'Dora', + 'Dorcas', + 'Dorothy', + 'Eliabeth', + 'Elizabeth', + 'Emily', + 'Emma', + 'Ernestina', + 'Esi', + 'Eunice', + 'Felicia', + 'Francesca', + 'Gemma', + 'Georgia', + 'Georgina', + 'Gifty', + 'Grace', + 'Grace', + 'Hannabel', + 'Hannah', + 'Harriet', + 'Helen', + 'Irene', + 'Janet', + 'Janet', + 'Janice', + 'Jasmine', + 'Jennifer', + 'Jessica', + 'Jill', + 'Joanna', + 'Josephine', + 'Joyce', + 'Joyce', + 'Judith', + 'Julia', + 'Juliana', + 'Julie', + 'Karen', + 'Kate', + 'Katherine', + 'Katy', + 'Lawrencia', + 'Linda', + 'Lisa', + 'Lorraine', + 'Lucy', + 'Lucy', + 'Lydia', + 'Lydia', + 'Mandy', + 'Margaret', + 'Margaret', + 'Maria', + 'Marian', + 'Marilyn', + 'Mary', + 'Mary', + 'Maureen', + 'Michelle', + 'Millicent', + 'Nana Ama', + 'Naomi', + 'Natalie', + 'Natasha', + 'Nicola', + 'Nimakoah', + 'Olivia', + 'Pamela', + 'Patricia', + 'Paula', + 'Priscilla', + 'Rachael', + 'Rachel', + 'Rebecca', + 'Rebecca', + 'Regina', + 'Rita', + 'Roselyn', + 'Rosemary', + 'Rosemary', + 'Ruth', + 'Salomey', + 'Samantha', + 'Sandra', + 'Sarah', + 'Sarah', + 'Sarah', + 'Sharon', + 'Sheila', + 'Shirley', + 'Stephanie', + 'Susan', + 'Susan', + 'Sylvia', + 'Teresa', + 'Tina', + 'Tracy', + 'Vanessa', + 'Veronica', + 'Victoria', + 'Vida', + 'Wendy', + 'Yaa', + 'Yvonne' + ) + + first_names = first_names_male + first_names_female + + last_names_male = ( + 'Acheampong', + 'Adomah', + 'Adomako', + 'Adu', + 'Adusei', + 'Adutwum', + 'Afirifa', + 'Afoakwa', + 'Agyapong', + 'Agyapong', + 'Agyare', + 'Agyei', + 'Agyemang', + 'Ahortor', + 'Akoto', + 'Akowua', + 'Akyeamfuɔ', + 'Akyeampong', + 'Akyena', + 'Akyerεko', + 'Amo', + 'Amoa', + 'Amoako', + 'Amoasi', + 'Ampadu', + 'Ampofo', + 'Amponsah', + 'Andorful', + 'Ankra', + 'Anokye', + 'Ansa', + 'Antwi', + 'Antwi', + 'Appia', + 'Appiah', + 'Asamoa', + 'Asamoah', + 'Asante', + 'Asare', + 'Asenso', + 'Asiama', + 'Asiedu', + 'Ata', + 'Awuah', + 'Baa', + 'Baafi', + 'Baah', + 'Baawia', + 'Badu', + 'Boadi', + 'Boadu', + 'Boahen', + 'Boakye', + 'Boaten', + 'Boateng', + 'Bona', + 'Bonsra', + 'Bonsu', + 'Daako', + 'Danso', + 'Darko', + 'Donkor', + 'Duah', + 'Dwamena', + 'Fofie', + 'Fosu', + 'Gyamfi', + 'Gyasi', + 'Karikari', + 'Koomson', + 'Kumi', + 'Kusi', + 'Kwaakye', + 'Kwarteng', + 'Kyei', + 'Mensa', + 'Mensah', + 'Nkansa', + 'Nkansah', + 'Nkrumah', + 'Nsia', + 'Nti', + 'Ntiamoa', + 'Ntim', + 'Nyaako', + 'Nyame', + 'Nyantakyi', + 'Obeng', + 'Ofori', + 'Ofosu', + 'Okyere', + 'Omani', + 'Opoku', + 'Oppong', + 'Opuku', + 'Osei', + 'Oti', + 'Otiwa', + 'Otuo', + 'Owusu', + 'Prempeh', + 'Quartey', + 'Safo', + 'Sarpong', + 'Takyi', + 'Tawia', + 'Tutu', + 'Tweneboa', + 'Twumasi', + 'Wiafe', + 'Yaamoa', + 'Yawson', + 'Yeboa', + 'Yeboah', + 'Yirenkyi' + ) + + last_names_female = ( + 'Aboraa', + 'Abrafi', + 'Acheampong', + 'Adoma', + 'Adomah', + 'Adomako', + 'Adu', + 'Adusei', + 'Adutwum', + 'Adutwumwaa', + 'Adwubi', + 'Afirifa', + 'Afoakwa', + 'Afrakomaa', + 'Agyapomaa', + 'Agyapong', + 'Agyapong', + 'Agyare', + 'Agyei', + 'Agyeiwaa', + 'Agyemang', + 'Ahortor', + 'Akoaa', + 'Akoto', + 'Akowua', + 'Akyaa', + 'Akyeamfuɔ', + 'Akyeampomaa', + 'Akyeampong', + 'Akyena', + 'Akyerε', + 'Akyerεko', + 'Akɔmaa', + 'Amo', + 'Amoa', + 'Amoako', + 'Amoakowaa', + 'Amoanimaa', + 'Amoasi', + 'Ampadu', + 'Ampofo', + 'Ampofowaa', + 'Ampoma', + 'Amponsa', + 'Amponsa', + 'Andorful', + 'Anima', + 'Ankra', + 'Anokye', + 'Ansa', + 'Ansomaa', + 'Ansomah', + 'Antwi', + 'Antwi', + 'Antwiwaa', + 'Appia', + 'Appiah', + 'Asamoa', + 'Asamoah', + 'Asante', + 'Asantewaa', + 'Asare', + 'Asenso', + 'Asiama', + 'Asiedu', + 'Asieduwaa', + 'Ata', + 'Ataa', + 'Awuah', + 'Baa', + 'Baafi', + 'Baah', + 'Baawia', + 'Badu', + 'Boadi', + 'Boadu', + 'Boahen', + 'Boakye', + 'Boakye', + 'Boakyewaa', + 'Boatemaa', + 'Boatemaah', + 'Boaten', + 'Boateng', + 'Bona', + 'Bonsra', + 'Bonsu', + 'Daako', + 'Daakoaa', + 'Danso', + 'Darko', + 'Donkor', + 'Duah', + 'Dufie', + 'Dwamena', + 'Fofie', + 'Foriwaa', + 'Fosu', + 'Fosua', + 'Frema', + 'Frimpomaa', + 'Gyamfi', + 'Gyamfi', + 'Gyamfiaa', + 'Gyasi', + 'Gyasiwaa', + 'Karikari', + 'Koomson', + 'Kumi', + 'Kusi', + 'Kusiwaa', + 'Kwaakye', + 'Kwaakyewaa', + 'Kwartemaa', + 'Kwarteng', + 'Kyei', + 'Kyeiwaa', + 'Kyerewaa', + 'Mansa', + 'Mensa', + 'Mensah', + 'Nkansa', + 'Nkansah', + 'Nkrumah', + 'Nsia', + 'Nti', + 'Ntiamoa', + 'Ntim', + 'Nyaako', + 'Nyaakoaa', + 'Nyame', + 'Nyantakyi', + 'Obeng', + 'Ofori', + 'Ofosu', + 'Okyere', + 'Okyere', + 'Omani', + 'Opoku', + 'Oppong', + 'Opuku', + 'Osei', + 'Oti', + 'Otiwa', + 'Otuo', + 'Owusu', + 'Owusuwaa', + 'Pokuaa', + 'Pomaa', + 'Prempeh', + 'Quartey', + 'Safo', + 'Safo', + 'Safoaa', + 'Sarpong', + 'Serwaa', + 'Takyi', + 'Tawia', + 'Tiwaa', + 'Tutu', + 'Tweneboa', + 'Twumasi', + 'Wiafe', + 'Yaamoa', + 'Yawson', + 'Yeboa', + 'Yeboah', + 'Yirenkyi' + ) + + last_names = last_names_male + last_names_female + + prefixes_female = ('Mrs.', 'Ms.', 'Miss', 'Dr.', + 'Mama', 'Maame', 'Awura', 'Sista' + 'Osofo Maame') + + prefixes_male = ('Mr.', 'Dr.', 'Agya', 'Owura', 'Osofo') diff --git a/src/libs/faker/providers/person/uk_UA/__init__.py b/src/libs/faker/providers/person/uk_UA/__init__.py new file mode 100644 index 0000000..2384c5f --- /dev/null +++ b/src/libs/faker/providers/person/uk_UA/__init__.py @@ -0,0 +1,156 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from collections import OrderedDict + +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats_female = OrderedDict(( + ('{{first_name_female}} {{last_name}}', 0.9), + ('{{prefix_female}} {{first_name_female}} {{last_name}}', 0.1), + )) + + formats_male = OrderedDict(( + ('{{first_name_male}} {{last_name}}', 0.9), + ('{{prefix_male}} {{first_name_male}} {{last_name}}', 0.1), + )) + + formats = formats_female.copy() + formats.update(formats_male) + + # Source: uk.wikipedia.org/wiki/Українські_імена + first_names_male = ( + 'Аарон', 'Августин', 'Аврелій', 'Адам', 'Азар', 'Алевтин', 'Альберт', + 'Амвросій', 'Андрій', 'Антон', 'Аркадій', 'Арсен', 'Артем', 'Орхип', + 'Богдан', 'Богодар', 'Богуслав', 'Болеслав', 'Борис', 'Борислав', + 'Вадим', 'Валентин', 'Валерій', 'Варфоломій', 'Василь', 'Венедикт', + 'Веніямин', 'Віктор', 'Віталій', 'Владислав', 'Володимир', + 'Вʼячеслав', 'Гаврило', 'Геннадій', 'Георгій', 'Герман ', 'Гордій', + 'Григорій', 'Гліб', 'Данило', 'Давид', 'Дан', 'Демид', 'Демʼян', + 'Дмитро', 'Захар', 'Зиновій', 'Зорян', 'Іван', 'Ігнат', 'Ігор', 'Ілля', + 'Едуард', 'Євген', 'Єлисей', 'Єфрем', 'Йосип', 'Климент', 'Костянтин', + 'Левко', 'Лесь', 'Леон', 'Леонід', 'Леонтій', 'Леопольд', 'Лукʼян', + 'Кирило', 'Макар', 'Максим', 'Марко', 'Мартин', 'Микита', 'Миколай', + 'Мирон', 'Мирослав', 'Михайло', 'Назар', 'Нестор', 'Олег', 'Олекса', + 'Олександр', 'Олесь', 'Омелян', 'Онисим', 'Опанас', 'Орест', 'Остап', + 'Охрім', 'Петро', 'Павло', 'Панас', 'Пантелеймон', 'Пармен', 'Пилип', + 'Прохір', 'Роман', 'Ростислав', 'Руслан', 'Святослав', 'Семен', + 'Сергій', 'Симон', 'Соломон', 'Спас', 'Станіслав', 'Степан', 'Стефан', + 'Тарас', 'Теодор', 'Тимофій', 'Трохим', 'Устим', 'Федір', 'Феофан', + 'Франц', 'Хома', 'Юстим', 'Юхим', 'Яків', 'Ярема', 'Ярослав' + ) + + first_names_female = ( + 'Ада', 'Аліна', 'Алла', 'Альбіна', 'Амалія', 'Анастасія', 'Аніта', + 'Анжела', 'Ганна', 'Богуслава', 'Богданна', 'Валентина', 'Варвара', + 'Василина', 'Вікторія', 'Віолетта', 'Віра', 'Володимира', 'Галина', + 'Данна', 'Дарина', 'Едита', 'Єва', 'Єлисавета', 'Емілія', 'Еріка', + 'Ірина', 'Ірена', 'Златослава', 'Камілла', 'Клавдія', 'Лариса', 'Ліза', + 'Лілія', 'Людмила', 'Любов', 'Марія', 'Марина', 'Марта', 'Марʼяна', + 'Маруся', 'Михайлина', 'Мілена', 'Надія', 'Наталія', 'Пріска', + 'Розалія', 'Святослава', 'Сніжана', 'Соломія', 'Софія', 'Одарка', + 'Оксана', 'Оксенія', 'Олена', 'Ольга', 'Орина', 'Орися', 'Роксолана', + 'Світлана', 'Тереза', 'Тетяна', 'Юстина', 'Христина', 'Ярина', + 'Ярослава' + ) + + first_names = first_names_male + first_names_female + + # Source: uk.wikipedia.org/wiki/Категорія:Українські_прізвища + last_names = ( + 'Абрагамовський', 'Абраменко', 'Абрамчук', 'Авдєєнко', 'Аверченко', + 'Авраменко', 'Аврамчук', 'Адаменко', 'Адамчук', 'Ажажа', 'Акименко', + 'Акуленко', 'Александренко', 'Алексеєнко', 'Алексійчук', 'Алексюк', + 'Андрейко', 'Андрієвич', 'Андрієнко', 'Андріїшин', 'Андрійович', + 'Андрійчук', 'Андрощук', 'Андрусенко', 'Аронець', 'Арсенич', + 'Артеменко', 'Артим', 'Артимишин', 'Артимович', 'Артюх', 'Артюшенко', + 'Архимович', 'Архипенко', 'Асаула', 'Атаманчук', 'Атаманюк', + 'Атрощенко', 'Бабʼюк', 'Бабʼяк', 'Бабак', 'Бабариченко', 'Бабенко', + 'Бабич', 'Бабиченко', 'Бабій', 'Бабійчук', 'Бабко', 'Базавлученко', + 'Базилевич', 'Базилевський', 'Байда', 'Байдак', 'Байрак', 'Баклан', + 'Бакуменко', 'Балабан', 'Бандера', 'Бандура', 'Бандурка', 'Барабаш', + 'Баран', 'Баранець', 'Бараник', 'Баранник', 'Батіг', 'Батуринець', + 'Батюк', 'Башполченко', 'Баштан', 'Бгиденко', 'Бебешко', 'Бевз', + 'Бевзенко', 'Безбородьки', 'Безбородько', 'Бездітко', 'Вакарчук', + 'Вакуленко', 'Валенко', 'Ванченко', 'Василашко', 'Василевич', + 'Василенко', 'Василечко', 'Ватаманюк', 'Вахній', 'Ващенко', + 'Ващенко-Захарченко', 'Ващук', 'Вдовенко', 'Вдовиченко', 'Величко', + 'Венгринович', 'Вергун', 'Верес', 'Верменич', 'Вернигора', 'Вернидуб', + 'Вертипорох', 'Верховинець', 'Верхола', 'Височан', 'Вишиваний', + 'Вишняк', 'Вівчаренко', 'Вітер', 'Вітрук', 'Власенко', 'Власюк', + 'Влох', 'Воблий', 'Вовк', 'Габелко', 'Гавриленко', 'Гаврилець', + 'Гаврилишин', 'Гаврилів', 'Гаврилюк', 'Гавриш', 'Гавришкевич', + 'Гаврюшенко', 'Гаєвський', 'Гайворонський', 'Гайда', 'Гайдабура', + 'Гайдай', 'Гайдамака', 'Гайденко', 'Гоголь', 'Гоголь-Яновський', + 'Годунок', 'Голик', 'Голобородько', 'Гресь', 'Гречаник', 'Гречко', + 'Гриценко', 'Гузенко', 'Гузій', 'Гузь', 'Гук', 'Гунько', 'Гупало', + 'Гуцуляк', 'Ґалаґан', 'Ґереґа', 'Ґерета', 'Ґерус', 'Ґжицький', 'Ґоляш', + 'Давиденко', 'Давимука', 'Даниленко', 'Данилюк', 'Данильчук', + 'Данченко', 'Данчук', 'Данькевич', 'Даньків', 'Данько', 'Дараган', + 'Дахно', 'Даценко', 'Дацюк', 'Дашенко', 'Дашкевич', 'Девдюк', + 'Дейнека', 'Дейнеко', 'Дейсун', 'Демʼяненко', 'Демʼянчук', 'Демʼянюк', + 'Демиденко', 'Дергач', 'Деревʼянко', 'Дерегус', 'Деркач', 'Деряжний', + 'Джунь', 'Джус', 'Дробʼязко', 'Дробаха', 'Дрозд', 'Дрозденко', + 'Дубас', 'Дубенко', 'Дубина', 'Дзиндра', 'Дзюба', 'Доценко', 'Дуплій', + 'Дурдинець', 'Дутка', 'Ейбоженко', 'Євдокименко', 'Євтушенко', + 'Євтушок', 'Ємельяненко', 'Ємець', 'Єременко', 'Єресько', 'Єрмоленко', + 'Єрошенко', 'Єрченко', 'Єрьоменко', 'Єсипенко', 'Єфименко', 'Єщенко', + 'Жадан', 'Жайворон', 'Жаліло', 'Жарко', 'Жук', 'Журавель', 'Журба', + 'Жученко', 'Забара', 'Забарний', 'Забашта', 'Забіла', 'Заєць', 'Заїка', + 'Зайченко', 'Закусило', 'Запорожець', 'Заруба', 'Зарудний', 'Засенко', + 'Засуха', 'Засядько', 'Затовканюк', 'Затула', 'Захаренко', + 'Захарченко', 'Зінкевич', 'Зінченко', 'Зінчук', 'Зубко', 'Іваненко', + 'Іваничук', 'Іванченко', 'Івасюк', 'Іващенко', 'Ільєнко', 'Ільченко', + 'Ірванець', 'Ісаєвич', 'Ісаєнко', 'Іщак', 'Іщенко', 'Їжак', 'Їжакевич', + 'Кабалюк', 'Кабаненко', 'Каденюк', 'Калениченко', 'Кальченко', + 'Канівець', 'Карась', 'Кармалюк', 'Карпа', 'Карпенко', 'Кащенко', + 'Кибкало', 'Килимник', 'Кириленко', 'Коваленко', 'Ковалюк', 'Ковпак', + 'Козак', 'Козаченко', 'Колесниченко', 'Колісниченко', 'Колодуб', + 'Комар', 'Конопленко', 'Конопля', 'Копитко', 'Корбут', 'Корж', + 'Короленко', 'Корпанюк', 'Корсун', 'Лаба', 'Лавренко', 'Лагода', + 'Лазаренко', 'Левченко', 'Лемешко', 'Лесик', 'Лисенко', 'Литвин', + 'Литвиненко', 'Лубенець', 'Лукаш', 'Лупій', 'Луценко', 'Ляшко', + 'Мазепа', 'Мазур', 'Макаренко', 'Макогон', 'Малик', 'Малишко', + 'Мамчур', 'Масляк', 'Масоха', 'Матвієнко', 'Матяш', 'Медведенко', + 'Микитюк', 'Михайличенко', 'Михайлюк', 'Михалюк', 'Мірошниченко', + 'Міщенко', 'Москаль', 'Назаренко', 'Наливайко', 'Негода', 'Непорожній', + 'Нестайко', 'Нестеренко', 'Ніколюк', 'Носаченко', 'Носенко', + 'Оберемко', 'Овсієнко', 'Овчаренко', 'Олійник', 'Оліфіренко', + 'Онищенко', 'Оніщук', 'Онуфрієнко', 'Опанасенко', 'Орлик', 'Оробець', + 'Остапчук', 'Охримович', 'Охріменко', 'Пʼятаченко', 'Павленко', + 'Павлик', 'Павличенко', 'Палій', 'Панчук', 'Парасюк', 'Пелех', + 'Перебийніс', 'Перепелиця', 'Петлюра', 'Петренко', 'Петрик', + 'Пилипенко', 'Піддубний', 'Полтавець', 'Приймак', 'Примаченко', + 'Притула', 'Приходько', 'Прокопович', 'Проценко', 'Пустовіт', 'Пушкар', + 'Радченко', 'Рак', 'Ребрик', 'Рева', 'Редько', 'Романенко', 'Романець', + 'Романчук', 'Рубан', 'Рубець', 'Рудик', 'Рудько', 'Рябець', 'Рябовіл', + 'Рябошапка', 'Рябченко', 'Савенко', 'Сагаль', 'Саєнко', 'Салій', + 'Самойленко', 'Сацюк', 'Саченко', 'Свириденко', 'Свистун', + 'Семенченко', 'Симоненко', 'Сиротенко', 'Сич', 'Сімашкевич', 'Сірко', + 'Сіробаба', 'Сірченко', 'Скиба', 'Скирда', 'Скопенко', 'Скорик', + 'Скоробогатько', 'Смик', 'Слюсар', 'Сомко', 'Стельмах', 'Стець', + 'Стус', 'Супруненко', 'Талан', 'Таран', 'Тарасенко', 'Твердохліб', + 'Теличенко', 'Теліженко', 'Терещенко', 'Терещук', 'Тесленко', 'Тесля', + 'Тимченко', 'Тимчук', 'Титаренко', 'Тихий', 'Тичина', 'Ткач', + 'Ткаченко', 'Товстоліс', 'Товстуха', 'Токар', 'Тригуб', 'Туркало', + 'Тягнибок', 'Удовенко', 'Удовиченко', 'Уманець', 'Усик', 'Устенко', + 'Фаренюк', 'Фартушняк', 'Фастенко', 'Фесенко', 'Філіпенко', 'Фоменко', + 'Франко', 'Франчук', 'Фурс', 'Харченко', 'Хмара', 'Хоменко', 'Хомик', + 'Хорішко', 'Христенко', 'Христич', 'Худобʼяк', 'Худяк', 'Царенко', + 'Цибуленко', 'Цимбал', 'Цимбалюк', 'Цісик', 'Цушко', 'Цюпа', 'Цюцюра', + 'Чабан', 'Чайка', 'Чаленко', 'Чалий', 'Чарниш', 'Чекалюк', + 'Червоненко', 'Чередник', 'Черінько', 'Черненко', 'Чміль', 'Чорновіл', + 'Чубай', 'Чуйко', 'Чумак', 'Чумаченко', 'Чуприна', 'Шаблій', 'Шамрай', + 'Шаповал', 'Шахрай', 'Швайка', 'Швачка', 'Швачко', 'Шведченко', + 'Шеремета', 'Шевченко', 'Шелест', 'Шеремет', 'Шило', 'Шинкаренко', + 'Шиян', 'Шморгун', 'Шовкопляс', 'Штепа', 'Штокало', 'Шутько', + 'Шухевич', 'Щербак', 'Щербань', 'Щириця', 'Щорс', 'Юрченко', 'Юрчишин', + 'Юрчук', 'Юхименко', 'Ющенко', 'Якименко', 'Якимчук', 'Яковенко', + 'Ярема', 'Яременко', 'Яремків', 'Яремко', 'Яремчук', 'Ярош', 'Яценко', + 'Яценюк', 'Ященко', 'Ящук', + ) + + prefixes_male = ('пан',) + prefixes_female = ('пані',) diff --git a/src/libs/faker/providers/person/zh_CN/__init__.py b/src/libs/faker/providers/person/zh_CN/__init__.py new file mode 100644 index 0000000..1185ac6 --- /dev/null +++ b/src/libs/faker/providers/person/zh_CN/__init__.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as PersonProvider + + +class Provider(PersonProvider): + formats = ["{{last_name}}{{first_name}}", ] + first_names = [ + "伟", "芳", "娜", "敏", "静", "秀英", "丽", "强", "磊", "洋", "艳", "勇", "军", "杰", "娟", + "涛", "超", "明", "霞", "秀兰", "刚", "平", "燕", "辉", "玲", "桂英", "丹", "萍", "鹏", "华", + "红", "玉兰", "飞", "桂兰", "英", "梅", "鑫", "波", "斌", "莉", "宇", "浩", "凯", "秀珍", "健", + "俊", "帆", "雪", "帅", "慧", "旭", "宁", "婷", "玉梅", "龙", "林", "玉珍", "凤英", "晶", "欢", + "玉英", "颖", "红梅", "佳", "倩", "阳", "建华", "亮", "成", "琴", "兰英", "畅", "建", "云", "洁", + "峰", "建国", "建军", "柳", "淑珍", "春梅", "海燕", "晨", "冬梅", "秀荣", "瑞", "桂珍", "莹", "秀云", + "桂荣", "志强", "秀梅", "丽娟", "婷婷", "玉华", "兵", "雷", "东", "琳", "雪梅", "淑兰", "丽丽", "玉", + "秀芳", "欣", "淑英", "桂芳", "博", "丽华", "丹丹", "彬", "桂香", "坤", "想", "淑华", "荣", "秀华", + "桂芝", "岩", "杨", "小红", "金凤", "文", "利", "楠", "红霞", "建平", "瑜", "桂花", "璐", "凤兰", + ] + + last_names = [ + "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "诸", "卫", "蒋", "沈", "韩", "杨", + "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", + "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", + "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", + "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", + "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", + "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", + "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "粱", + "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", + "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", + "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", + "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", + "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "魏", "家", "封", + "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", + "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", + "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", + "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", + "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", + "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", + "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", + "温", "别", "庄", "晏", "柴", "翟", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", + "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", + "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆", + "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", + "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", + "游", "竺", "权", "逯", "盖", "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧", "阳", + "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫", "连", "皇", "甫", "尉", "迟", "公", "羊", + "澹", "台", "公", "冶", "宗", "政", "濮", "阳", "淳", "于", "单", "于", "太", "叔", "申", "屠", + "公", "孙", "仲", "孙", "轩", "辕", "令", "狐", "钟", "离", "宇", "文", "长", "孙", "慕", "容", + "鲜", "于", "闾", "丘", "司", "徒", "司", "空", "亓", "官", "司", "寇", "仉", "督", "子", "车", + "颛", "孙", "端", "木", "巫", "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公", "良", + "拓", "跋", "夹", "谷", "宰", "父", "谷", "粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", + "段", "干", "百", "里", "东", "郭", "南", "门", "呼", "延", "归", "海", "羊", "舌", "微", "生", + "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门", + "商", "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟", + ] + + romanized_formats = ( + '{{first_romanized_name}} {{last_romanized_name}}', + ) + + # From https://en.wikipedia.org/wiki/Chinese_given_name#Common_Chinese_names, + # with accents stripped + first_romanized_names = ( + 'Chao', 'Fang', 'Gang', 'Guiying', 'Jie', 'Jing', 'Juan', 'Jun', 'Lei', + 'Li', 'Min', 'Ming', 'Na', 'Ping', 'Qiang', 'Tao', 'Wei', 'Xia', 'Xiulan', + 'Xiuying', 'Yang', 'Yong', 'Yan', + ) + + # From https://en.wikipedia.org/wiki/List_of_common_Chinese_surnames + # with accents stripped + last_romanized_names = ( + 'Bai', 'Cai', 'Cao', 'Chang', 'Chen', 'Cheng', 'Cui', 'Dai', 'Deng', + 'Ding', 'Dong', 'Du', 'Duan', 'Fan', 'Fang', 'Feng', 'Fu', 'Gao', 'Gong', + 'Gu', 'Guo', 'Han', 'Hao', 'He', 'Hou', 'Hu', 'Huang', 'Jia', 'Jiang', + 'Jin', 'Kang', 'Kong', 'Lai', 'Lei', 'Li', 'Liang', 'Liao', 'Lin', 'Liu', + 'Long', 'Lu', 'Luo', 'Ma', 'Mao', 'Meng', 'Mo', 'Pan', 'Peng', 'Qian', + 'Qiao', 'Qin', 'Qiu', 'Ren', 'Shao', 'Shen', 'Shi', 'Song', 'Su', 'Sun', + 'Tan', 'Tang', 'Tao', 'Tian', 'Wan', 'Wang', 'Wei', 'Wen', 'Wu', 'Xia', + 'Xiang', 'Xiao', 'Xie', 'Xiong', 'Xu', 'Xue', 'Yan', 'Yang', 'Yao', 'Ye', + 'Yi', 'Yin', 'Yu', 'Yuan', 'Zeng', 'Zhang', 'Zhao', 'Zheng', 'Zhong', + 'Zhou', 'Zhu', 'Zou', + ) + + def romanized_name(self): + ''' + @example 'Chao Bai' + ''' + pattern = self.random_element(self.romanized_formats) + return self.generator.parse(pattern) + + def first_romanized_name(self): + ''' + @example 'Chao' + ''' + return self.random_element(self.first_romanized_names) + + def last_romanized_name(self): + ''' + @example 'Chao' + ''' + return self.random_element(self.last_romanized_names) diff --git a/src/faker/providers/zh_TW/person.py b/src/libs/faker/providers/person/zh_TW/__init__.py similarity index 73% rename from src/faker/providers/zh_TW/person.py rename to src/libs/faker/providers/person/zh_TW/__init__.py index c7c15b1..2ac1167 100644 --- a/src/faker/providers/zh_TW/person.py +++ b/src/libs/faker/providers/person/zh_TW/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..person import Provider as PersonProvider +from .. import Provider as PersonProvider class Provider(PersonProvider): @@ -70,3 +70,49 @@ class Provider(PersonProvider): "游", "竺", "權", "逮", "盍", "益", "桓", "公", "司馬", "上官", "歐陽", "東方", "公羊", "公冶", "淳于", "公孫", "慕容", "司徒", "司空",) + + romanized_formats = ( + '{{first_romanized_name}} {{last_romanized_name}}', + ) + + # From https://en.wikipedia.org/wiki/Chinese_given_name#Common_Chinese_names, + # with accents stripped + first_romanized_names = ( + 'Chao', 'Fang', 'Gang', 'Guiying', 'Jie', 'Jing', 'Juan', 'Jun', 'Lei', + 'Li', 'Min', 'Ming', 'Na', 'Ping', 'Qiang', 'Tao', 'Wei', 'Xia', 'Xiulan', + 'Xiuying', 'Yang', 'Yong', 'Yan', + ) + + # From https://en.wikipedia.org/wiki/List_of_common_Chinese_surnames + # with accents stripped + last_romanized_names = ( + 'Bai', 'Cai', 'Cao', 'Chang', 'Chen', 'Cheng', 'Cui', 'Dai', 'Deng', + 'Ding', 'Dong', 'Du', 'Duan', 'Fan', 'Fang', 'Feng', 'Fu', 'Gao', 'Gong', + 'Gu', 'Guo', 'Han', 'Hao', 'He', 'Hou', 'Hu', 'Huang', 'Jia', 'Jiang', + 'Jin', 'Kang', 'Kong', 'Lai', 'Lei', 'Li', 'Liang', 'Liao', 'Lin', 'Liu', + 'Long', 'Lu', 'Luo', 'Ma', 'Mao', 'Meng', 'Mo', 'Pan', 'Peng', 'Qian', + 'Qiao', 'Qin', 'Qiu', 'Ren', 'Shao', 'Shen', 'Shi', 'Song', 'Su', 'Sun', + 'Tan', 'Tang', 'Tao', 'Tian', 'Wan', 'Wang', 'Wei', 'Wen', 'Wu', 'Xia', + 'Xiang', 'Xiao', 'Xie', 'Xiong', 'Xu', 'Xue', 'Yan', 'Yang', 'Yao', 'Ye', + 'Yi', 'Yin', 'Yu', 'Yuan', 'Zeng', 'Zhang', 'Zhao', 'Zheng', 'Zhong', + 'Zhou', 'Zhu', 'Zou', + ) + + def romanized_name(self): + ''' + @example 'Chao Bai' + ''' + pattern = self.random_element(self.romanized_formats) + return self.generator.parse(pattern) + + def first_romanized_name(self): + ''' + @example 'Chao' + ''' + return self.random_element(self.first_romanized_names) + + def last_romanized_name(self): + ''' + @example 'Chao' + ''' + return self.random_element(self.last_romanized_names) diff --git a/src/libs/faker/providers/phone_number/__init__.py b/src/libs/faker/providers/phone_number/__init__.py new file mode 100644 index 0000000..7dfafdf --- /dev/null +++ b/src/libs/faker/providers/phone_number/__init__.py @@ -0,0 +1,18 @@ +localized = True + +from .. import BaseProvider + + +class Provider(BaseProvider): + formats = ('###-###-###',) + + msisdn_formats = ( + '#############', + ) + + def phone_number(self): + return self.numerify(self.random_element(self.formats)) + + def msisdn(self): + """ https://en.wikipedia.org/wiki/MSISDN """ + return self.numerify(self.random_element(self.msisdn_formats)) diff --git a/src/libs/faker/providers/phone_number/ar_JO/__init__.py b/src/libs/faker/providers/phone_number/ar_JO/__init__.py new file mode 100644 index 0000000..e6447cf --- /dev/null +++ b/src/libs/faker/providers/phone_number/ar_JO/__init__.py @@ -0,0 +1,64 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + # Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_Jordan + + cellphone_formats = ( + '+9627{{operator_id}}#######', + '+962 7 {{operator_id}}### ####', + '07{{operator_id}}#######', + '07{{operator_id}} ### ####', + ) + + telephone_formats = ( + '+962{{area_code}}#######', + '+962 {{area_code}} ### ####', + '0{{area_code}}#######', + '0{{area_code}} ### ####', + ) + + services_phones_formats = ( + '9##', + '12##', + '13##', + '14##', + ) + + formats = cellphone_formats + \ + telephone_formats + \ + services_phones_formats + + def operator_id(self): + return self.random_element([ + '4', + '7', + '8', + '9', + ]) + + def area_code(self): + return self.random_element([ + '2', + '3', + '5', + '6', + '7', + ]) + + def cellphone_number(self): + pattern = self.random_element(self.cellphone_formats) + return self.numerify(self.generator.parse(pattern)) + + def telephone_number(self): + pattern = self.random_element(self.telephone_formats) + return self.numerify(self.generator.parse(pattern)) + + def service_phone_number(self): + pattern = self.random_element(self.services_phones_formats) + return self.numerify(self.generator.parse(pattern)) + + def phone_number(self): + pattern = self.random_element(self.formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/libs/faker/providers/phone_number/ar_PS/__init__.py b/src/libs/faker/providers/phone_number/ar_PS/__init__.py new file mode 100644 index 0000000..506ea1c --- /dev/null +++ b/src/libs/faker/providers/phone_number/ar_PS/__init__.py @@ -0,0 +1,143 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + # Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_the_State_of_Palestine + + cellphone_formats = ( + '{{country_code}} {{provider_code}} ### ####', + '{{country_code}}{{provider_code}}#######', + '0{{provider_code}} ### ####', + '0{{provider_code}}#######', + ) + + telephone_formats = ( + '{{country_code}} 4 24# ####', + '{{country_code}}424#####', + '04 24# ####', + '0424#####', + + '{{country_code}} 9 25# ####', + '{{country_code}}925#####', + '09 25# ####', + '0925#####', + + '{{country_code}} 4 26# ####', + '{{country_code}}426#####', + '04 26# ####', + '0426#####', + + '{{country_code}} 4 23# ####', + '{{country_code}}423#####', + '04 23# ####', + '0423#####', + + '{{country_code}} 4 29# ####', + '{{country_code}}429#####', + '04 29# ####', + '0429#####', + + '{{country_code}} 2 29# ####', + '{{country_code}}229#####', + '02 29# ####', + '0229#####', + + '{{country_code}} 2 23# ####', + '{{country_code}}223#####', + '02 23# ####', + '0223#####', + + '{{country_code}} 2 22# ####', + '{{country_code}}222#####', + '02 22# ####', + '0222#####', + + '{{country_code}} 2 27# ####', + '{{country_code}}227#####', + '02 27# ####', + '0227#####', + + '{{country_code}} 8 20# ####', + '{{country_code}}820#####', + '08 20# ####', + '0820#####', + + '{{country_code}} 8 21# ####', + '{{country_code}}821#####', + '08 21# ####', + '0821#####', + + '{{country_code}} 8 24# ####', + '{{country_code}}824#####', + '08 24# ####', + '0824#####', + + '{{country_code}} 8 25# ####', + '{{country_code}}825#####', + '08 25# ####', + '0825#####', + + '{{country_code}} 8 26# ####', + '{{country_code}}826#####', + '08 26# ####', + '0826#####', + + '{{country_code}} 8 28# ####', + '{{country_code}}828#####', + '08 28# ####', + '0828#####', + + ) + + toll_foramts = ( + '1 700 ### ###', + '1-700-###-###', + '1 800 ### ###', + '1-800-###-###', + ) + + services_phones_formats = ( + '100', + '101', + '102', + ) + + formats = cellphone_formats + \ + telephone_formats + \ + services_phones_formats + \ + toll_foramts + + def provider_code(self): + return self.random_element([ + '59', + '56', + ]) + + def country_code(self): + return self.random_element([ + '00972', + '+972', + '00970', + '+970', + ]) + + def cellphone_number(self): + pattern = self.random_element(self.cellphone_formats) + return self.numerify(self.generator.parse(pattern)) + + def telephone_number(self): + pattern = self.random_element(self.telephone_formats) + return self.numerify(self.generator.parse(pattern)) + + def service_phone_number(self): + pattern = self.random_element(self.services_phones_formats) + return self.numerify(self.generator.parse(pattern)) + + def toll_number(self): + pattern = self.random_element(self.toll_foramts) + return self.numerify(self.generator.parse(pattern)) + + def phone_number(self): + pattern = self.random_element(self.formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/faker/providers/bg_BG/phone_number.py b/src/libs/faker/providers/phone_number/bg_BG/__init__.py similarity index 87% rename from src/faker/providers/bg_BG/phone_number.py rename to src/libs/faker/providers/phone_number/bg_BG/__init__.py index 409f4e8..5ab3f93 100644 --- a/src/faker/providers/bg_BG/phone_number.py +++ b/src/libs/faker/providers/phone_number/bg_BG/__init__.py @@ -1,6 +1,6 @@ # coding=utf-8 from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/bs_BA/__init__.py b/src/libs/faker/providers/phone_number/bs_BA/__init__.py new file mode 100644 index 0000000..5220235 --- /dev/null +++ b/src/libs/faker/providers/phone_number/bs_BA/__init__.py @@ -0,0 +1,40 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '030 ### ###', + '031 ### ###', + '032 ### ###', + '033 ### ###', + '034 ### ###', + '035 ### ###', + '036 ### ###', + '037 ### ###', + '038 ### ###', + '039 ### ###', + '049 ### ###', + '050 ### ###', + '051 ### ###', + '052 ### ###', + '053 ### ###', + '054 ### ###', + '055 ### ###', + '056 ### ###', + '057 ### ###', + '058 ### ###', + '059 ### ###', + '060 ### ###', + '060 #### ###', + '061 ### ###', + '062 ### ###', + '063 ### ###', + '064 ### ###', + '065 ### ###', + '066 ### ###', + '067 ### ###', + '070 20# ###', + '+387 61 ### ###', + '+387 (0)61 ### ###' + ) diff --git a/src/faker/providers/cs_CZ/phone_number.py b/src/libs/faker/providers/phone_number/cs_CZ/__init__.py similarity index 93% rename from src/faker/providers/cs_CZ/phone_number.py rename to src/libs/faker/providers/phone_number/cs_CZ/__init__.py index abecc95..7c1c26c 100644 --- a/src/faker/providers/cs_CZ/phone_number.py +++ b/src/libs/faker/providers/phone_number/cs_CZ/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/de_DE/phone_number.py b/src/libs/faker/providers/phone_number/de_DE/__init__.py similarity index 87% rename from src/faker/providers/de_DE/phone_number.py rename to src/libs/faker/providers/phone_number/de_DE/__init__.py index 3d53995..bee0975 100644 --- a/src/faker/providers/de_DE/phone_number.py +++ b/src/libs/faker/providers/phone_number/de_DE/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/en_GB/phone_number.py b/src/libs/faker/providers/phone_number/dk_DK/__init__.py similarity index 54% rename from src/faker/providers/en_GB/phone_number.py rename to src/libs/faker/providers/phone_number/dk_DK/__init__.py index f4da2bf..d9b2ae7 100644 --- a/src/faker/providers/en_GB/phone_number.py +++ b/src/libs/faker/providers/phone_number/dk_DK/__init__.py @@ -1,13 +1,15 @@ -from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): formats = ( - '+44(0)##########', - '+44(0)#### ######', - '+44(0)#########', - '+44(0)#### #####', + '+45(0)##########', + '+45(0)#### ######', + '+45 (0) #### ######', + '+45(0) #########', + '+45(0)#### #####', '0##########', '0#########', '0#### ######', diff --git a/src/faker/providers/el_GR/phone_number.py b/src/libs/faker/providers/phone_number/el_GR/__init__.py similarity index 89% rename from src/faker/providers/el_GR/phone_number.py rename to src/libs/faker/providers/phone_number/el_GR/__init__.py index 7a9626e..f1dd632 100644 --- a/src/faker/providers/el_GR/phone_number.py +++ b/src/libs/faker/providers/phone_number/el_GR/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/en_AU/__init__.py b/src/libs/faker/providers/phone_number/en_AU/__init__.py new file mode 100644 index 0000000..4796b32 --- /dev/null +++ b/src/libs/faker/providers/phone_number/en_AU/__init__.py @@ -0,0 +1,45 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + # Local calls + '#### ####', + '####-####', + '####.####', # domain registrars apparently use this + '########', + # National dialing + '0{{area_code}} #### ####', + '0{{area_code}}-####-####', + '0{{area_code}}.####.####', + '0{{area_code}}########', + # Optional parenthesis + '(0{{area_code}}) #### ####', + '(0{{area_code}})-####-####', + '(0{{area_code}}).####.####', + '(0{{area_code}})########', + # International drops the 0 + '+61 {{area_code}} #### ####', + '+61-{{area_code}}-####-####', + '+61.{{area_code}}.####.####', + '+61{{area_code}}########', + # 04 Mobile telephones (Australia-wide) mostly commonly written 4 - 3 - 3 instead of 2 - 4 - 4 + '04## ### ###', + '04##-###-###', + '04##.###.###', + '+61 4## ### ###', + '+61-4##-###-###', + '+61.4##.###.###', + ) + + def area_code(self): + return self.numerify(self.random_element( + ['2', + '3', + '7', + '8'])) + + def phone_number(self): + pattern = self.random_element(self.formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/faker/providers/en_CA/phone_number.py b/src/libs/faker/providers/phone_number/en_CA/__init__.py similarity index 85% rename from src/faker/providers/en_CA/phone_number.py rename to src/libs/faker/providers/phone_number/en_CA/__init__.py index 80fa9bb..e674a9d 100644 --- a/src/faker/providers/en_CA/phone_number.py +++ b/src/libs/faker/providers/phone_number/en_CA/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/en_GB/__init__.py b/src/libs/faker/providers/phone_number/en_GB/__init__.py new file mode 100644 index 0000000..2a43d3a --- /dev/null +++ b/src/libs/faker/providers/phone_number/en_GB/__init__.py @@ -0,0 +1,30 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + # Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom + + cellphone_formats = ( + '+44 7### ######', + '+44 7#########', + '07### ######', + '07#########', + ) + + formats = ( + '+44(0)##########', + '+44(0)#### ######', + '+44(0)#########', + '+44(0)#### #####', + '0##########', + '0#########', + '0#### ######', + '0#### #####', + '(0####) ######', + '(0####) #####', + ) + + def cellphone_number(self): + pattern = self.random_element(self.cellphone_formats) + return self.numerify(self.generator.parse(pattern)) diff --git a/src/faker/providers/es_MX/phone_number.py b/src/libs/faker/providers/phone_number/en_US/__init__.py similarity index 92% rename from src/faker/providers/es_MX/phone_number.py rename to src/libs/faker/providers/phone_number/en_US/__init__.py index 99a5897..f18f187 100644 --- a/src/faker/providers/es_MX/phone_number.py +++ b/src/libs/faker/providers/phone_number/en_US/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/es_ES/phone_number.py b/src/libs/faker/providers/phone_number/es_ES/__init__.py similarity index 81% rename from src/faker/providers/es_ES/phone_number.py rename to src/libs/faker/providers/phone_number/es_ES/__init__.py index fca7aa0..a867ac7 100644 --- a/src/faker/providers/es_ES/phone_number.py +++ b/src/libs/faker/providers/phone_number/es_ES/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/en_US/phone_number.py b/src/libs/faker/providers/phone_number/es_MX/__init__.py similarity index 92% rename from src/faker/providers/en_US/phone_number.py rename to src/libs/faker/providers/phone_number/es_MX/__init__.py index 35fe5b9..f18f187 100644 --- a/src/faker/providers/en_US/phone_number.py +++ b/src/libs/faker/providers/phone_number/es_MX/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): @@ -28,4 +28,4 @@ class Provider(PhoneNumberProvider): '(###)###-####x#####', '1-###-###-####x#####', '###.###.####x#####' - ) \ No newline at end of file + ) diff --git a/src/libs/faker/providers/phone_number/fa_IR/__init__.py b/src/libs/faker/providers/phone_number/fa_IR/__init__.py new file mode 100644 index 0000000..6a528ca --- /dev/null +++ b/src/libs/faker/providers/phone_number/fa_IR/__init__.py @@ -0,0 +1,81 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + # Mobile + '+98 91# ### ####', + '091# ### ####', + '+98 920 ### ####', + '0920 ### ####', + '+98 921 ### ####', + '0921 ### ####', + '+98 93# ### ####', + '093# ### ####', + # Land lines, https://en.wikipedia.org/wiki/List_of_dialling_codes_in_Iran + '+98 21 #### ####', + '021 #### ####', + '+98 26 #### ####', + '026 #### ####', + '+98 25 #### ####', + '025 #### ####', + '+98 86 #### ####', + '086 #### ####', + '+98 24 #### ####', + '024 #### ####', + '+98 23 #### ####', + '023 #### ####', + '+98 81 #### ####', + '081 #### ####', + '+98 28 #### ####', + '028 #### ####', + '+98 31 #### ####', + '031 #### ####', + '+98 44 #### ####', + '044 #### ####', + '+98 11 #### ####', + '011 #### ####', + '+98 74 #### ####', + '074 #### ####', + '+98 83 #### ####', + '083 #### ####', + '+98 51 #### ####', + '051 #### ####', + '+98 45 #### ####', + '045 #### ####', + '+98 17 #### ####', + '017 #### ####', + '+98 41 #### ####', + '041 #### ####', + '+98 54 #### ####', + '054 #### ####', + '+98 87 #### ####', + '087 #### ####', + '+98 71 #### ####', + '071 #### ####', + '+98 66 #### ####', + '066 #### ####', + '+98 34 #### ####', + '034 #### ####', + '+98 56 #### ####', + '056 #### ####', + '+98 13 #### ####', + '013 #### ####', + '+98 77 #### ####', + '077 #### ####', + '+98 76 #### ####', + '076 #### ####', + '+98 61 #### ####', + '061 #### ####', + '+98 38 #### ####', + '038 #### ####', + '+98 58 #### ####', + '058 #### ####', + '+98 35 #### ####', + '035 #### ####', + '+98 84 #### ####', + '084 #### ####', + '+98 ### #### ####', + '0### #### ####' + ) \ No newline at end of file diff --git a/src/faker/providers/fi_FI/phone_number.py b/src/libs/faker/providers/phone_number/fi_FI/__init__.py similarity index 81% rename from src/faker/providers/fi_FI/phone_number.py rename to src/libs/faker/providers/phone_number/fi_FI/__init__.py index 579d8bc..fc30bbb 100644 --- a/src/faker/providers/fi_FI/phone_number.py +++ b/src/libs/faker/providers/phone_number/fi_FI/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/fr_CH/__init__.py b/src/libs/faker/providers/phone_number/fr_CH/__init__.py new file mode 100644 index 0000000..bb8cdcc --- /dev/null +++ b/src/libs/faker/providers/phone_number/fr_CH/__init__.py @@ -0,0 +1,37 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+41 2# ### ## ##', + '+41 3# ### ## ##', + '+41 4# ### ## ##', + '+41 5# ### ## ##', + '+41 6# ### ## ##', + '+41 7# ### ## ##', + '+41 8# ### ## ##', + '+41 9# ### ## ##', + '+41 (0)2# ### ## ##', + '+41 (0)3# ### ## ##', + '+41 (0)4# ### ## ##', + '+41 (0)5# ### ## ##', + '+41 (0)6# ### ## ##', + '+41 (0)7# ### ## ##', + '+41 (0)8# ### ## ##', + '+41 (0)9# ### ## ##', + '02# ### ## ##', + '03# ### ## ##', + '04# ### ## ##', + '05# ### ## ##', + '06# ### ## ##', + '07# ### ## ##', + '08# ### ## ##', + '09# ### ## ##', + #see: http://www.bakom.admin.ch/themen/telekom/00479/00607/index.html + '084# ### ###', + '0878 ### ###', + '0900 ### ###', + '0901 ### ###', + '0906 ### ###', + ) \ No newline at end of file diff --git a/src/faker/providers/fr_FR/phone_number.py b/src/libs/faker/providers/phone_number/fr_FR/__init__.py similarity index 94% rename from src/faker/providers/fr_FR/phone_number.py rename to src/libs/faker/providers/phone_number/fr_FR/__init__.py index be43290..89c222a 100644 --- a/src/faker/providers/fr_FR/phone_number.py +++ b/src/libs/faker/providers/phone_number/fr_FR/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/he_IL/__init__.py b/src/libs/faker/providers/phone_number/he_IL/__init__.py new file mode 100644 index 0000000..ce1f7a5 --- /dev/null +++ b/src/libs/faker/providers/phone_number/he_IL/__init__.py @@ -0,0 +1,23 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '02#######', + '02-####-###', + '03#######', + '03-####-###', + '04#######', + '04-####-###', + '08#######', + '08-####-###', + '09#######', + '09-####-###', + '05#-###-####', + '05# ###-####', + '05# ### ####', + '05#-#######', + '05# #######', + '05########', + ) diff --git a/src/faker/providers/hi_IN/phone_number.py b/src/libs/faker/providers/phone_number/hi_IN/__init__.py similarity index 79% rename from src/faker/providers/hi_IN/phone_number.py rename to src/libs/faker/providers/phone_number/hi_IN/__init__.py index 9e6a1b9..c696b98 100644 --- a/src/faker/providers/hi_IN/phone_number.py +++ b/src/libs/faker/providers/phone_number/hi_IN/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/hr_HR/__init__.py b/src/libs/faker/providers/phone_number/hr_HR/__init__.py new file mode 100644 index 0000000..3e0a103 --- /dev/null +++ b/src/libs/faker/providers/phone_number/hr_HR/__init__.py @@ -0,0 +1,37 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '01 #### ###', + '020 ### ###', + '021 ### ###', + '022 ### ###', + '023 ### ###', + '031 ### ###', + '032 ### ###', + '033 ### ###', + '034 ### ###', + '035 ### ###', + '040 ### ###', + '042 ### ###', + '043 ### ###', + '044 ### ###', + '047 ### ###', + '048 ### ###', + '049 ### ###', + '051 ### ###', + '052 ### ###', + '053 ### ###', + '060 ### ###', + '072 ### ###', + '074 ### ###', + '091 #### ###', + '092 #### ###', + '095 #### ###', + '097 #### ###', + '098 #### ###', + '099 #### ###', + '0800 ## ##', + ) diff --git a/src/libs/faker/providers/phone_number/hu_HU/__init__.py b/src/libs/faker/providers/phone_number/hu_HU/__init__.py new file mode 100644 index 0000000..3b9e28b --- /dev/null +++ b/src/libs/faker/providers/phone_number/hu_HU/__init__.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+36 ## ###-####', + '(06)##/###-####', + '(##)/###-####', + '##/###-####', + '##/### ####', + '06-#/### ####', + '06-##/### ####' + ) diff --git a/src/libs/faker/providers/phone_number/id_ID/__init__.py b/src/libs/faker/providers/phone_number/id_ID/__init__.py new file mode 100644 index 0000000..a149c5d --- /dev/null +++ b/src/libs/faker/providers/phone_number/id_ID/__init__.py @@ -0,0 +1,34 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + # Currently this is my own work + formats = ( + '+62-##-###-####', + '+62-0##-###-####', + + '+62 (0##) ### ####', + '+62 (0##) ###-####', + + '+62 (##) ### ####', + '+62 (##) ###-####', + + '+62-###-###-####', + '+62-0###-###-####', + + '+62 (0###) ### ####', + '+62 (0###) ###-####', + + '+62 (###) ### ####', + '+62 (###) ###-####', + + '(0##) ### ####', + '(0##) ###-####', + + '(0###) ### ####', + '(0###) ###-####', + + '08# ### ####', + '08########', + ) diff --git a/src/libs/faker/providers/phone_number/it_IT/__init__.py b/src/libs/faker/providers/phone_number/it_IT/__init__.py new file mode 100644 index 0000000..67ba8c1 --- /dev/null +++ b/src/libs/faker/providers/phone_number/it_IT/__init__.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+39 ### ## ## ####', + '+39 ## #######', + '+39 ## ########', + '+39 ### #######', + '+39 ### ########', + '+39 #### #######', + '+39 #### ########' + ) \ No newline at end of file diff --git a/src/libs/faker/providers/phone_number/ja_JP/__init__.py b/src/libs/faker/providers/phone_number/ja_JP/__init__.py new file mode 100644 index 0000000..59d10d4 --- /dev/null +++ b/src/libs/faker/providers/phone_number/ja_JP/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '070-####-####', + '080-####-####', + '090-####-####', + '##-####-####', + ) diff --git a/src/faker/providers/ko_KR/phone_number.py b/src/libs/faker/providers/phone_number/ko_KR/__init__.py similarity index 88% rename from src/faker/providers/ko_KR/phone_number.py rename to src/libs/faker/providers/phone_number/ko_KR/__init__.py index 1e80fec..c31e6e2 100644 --- a/src/faker/providers/ko_KR/phone_number.py +++ b/src/libs/faker/providers/phone_number/ko_KR/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): formats = ( @@ -21,7 +21,7 @@ class Provider(PhoneNumberProvider): '061-###-####', '062-###-####', '063-###-####', - '064-###-####', + '064-7##-####', '010-####-####', '011-###-####', '016-###-####', diff --git a/src/faker/providers/lt_LT/phone_number.py b/src/libs/faker/providers/phone_number/lt_LT/__init__.py similarity index 74% rename from src/faker/providers/lt_LT/phone_number.py rename to src/libs/faker/providers/phone_number/lt_LT/__init__.py index a03ef21..6c7fb4d 100644 --- a/src/faker/providers/lt_LT/phone_number.py +++ b/src/libs/faker/providers/phone_number/lt_LT/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/lv_LV/phone_number.py b/src/libs/faker/providers/phone_number/lv_LV/__init__.py similarity index 74% rename from src/faker/providers/lv_LV/phone_number.py rename to src/libs/faker/providers/phone_number/lv_LV/__init__.py index d7e49b7..011a120 100644 --- a/src/faker/providers/lv_LV/phone_number.py +++ b/src/libs/faker/providers/phone_number/lv_LV/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/ne_NP/__init__.py b/src/libs/faker/providers/phone_number/ne_NP/__init__.py new file mode 100644 index 0000000..08a236c --- /dev/null +++ b/src/libs/faker/providers/phone_number/ne_NP/__init__.py @@ -0,0 +1,12 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+977 ##########', + '+977 ### #######', + '984#######', + '985#######', + '980#######', + ) diff --git a/src/libs/faker/providers/phone_number/nl_BE/__init__.py b/src/libs/faker/providers/phone_number/nl_BE/__init__.py new file mode 100644 index 0000000..2c6177f --- /dev/null +++ b/src/libs/faker/providers/phone_number/nl_BE/__init__.py @@ -0,0 +1,25 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '0### ######', + '0## #######', + '+32### ######', + '+32## #######', + '+32(0)### ######', + '+32(0)## #######', + '(0###) ######', + '(0##) #######', + '0###-######', + '0##-#######', + '+32###-######', + '+32##-#######', + '+32(0)###-######', + '+32(0)##-#######', + '(0###)-######', + '(0##)-#######', + ) diff --git a/src/faker/providers/nl_NL/phone_number.py b/src/libs/faker/providers/phone_number/nl_NL/__init__.py similarity index 89% rename from src/faker/providers/nl_NL/phone_number.py rename to src/libs/faker/providers/phone_number/nl_NL/__init__.py index 265eb9c..efc2af4 100644 --- a/src/faker/providers/nl_NL/phone_number.py +++ b/src/libs/faker/providers/phone_number/nl_NL/__init__.py @@ -1,7 +1,7 @@ # coding=utf-8 from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/faker/providers/no_NO/phone_number.py b/src/libs/faker/providers/phone_number/no_NO/__init__.py similarity index 84% rename from src/faker/providers/no_NO/phone_number.py rename to src/libs/faker/providers/phone_number/no_NO/__init__.py index 4a13b4b..df8687a 100644 --- a/src/faker/providers/no_NO/phone_number.py +++ b/src/libs/faker/providers/phone_number/no_NO/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/pl_PL/__init__.py b/src/libs/faker/providers/phone_number/pl_PL/__init__.py new file mode 100644 index 0000000..b276d96 --- /dev/null +++ b/src/libs/faker/providers/phone_number/pl_PL/__init__.py @@ -0,0 +1,39 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + # Mobile + # Government website: http://www.uke.gov.pl/numeracja-843 + '50# ### ###', + '51# ### ###', + '53# ### ###', + '57# ### ###', + '60# ### ###', + '66# ### ###', + '69# ### ###', + '72# ### ###', + '73# ### ###', + '78# ### ###', + '79# ### ###', + '88# ### ###', + + '+48 50# ### ###', + '+48 51# ### ###', + '+48 53# ### ###', + '+48 57# ### ###', + '+48 60# ### ###', + '+48 66# ### ###', + '+48 69# ### ###', + '+48 72# ### ###', + '+48 73# ### ###', + '+48 78# ### ###', + '+48 79# ### ###', + '+48 88# ### ###', + + '32 ### ## ##', + '+48 32 ### ## ##', + '22 ### ## ##', + '+48 22 ### ## ##', + ) diff --git a/src/faker/providers/pt_BR/phone_number.py b/src/libs/faker/providers/phone_number/pt_BR/__init__.py similarity index 87% rename from src/faker/providers/pt_BR/phone_number.py rename to src/libs/faker/providers/phone_number/pt_BR/__init__.py index c6910bb..95707ba 100644 --- a/src/faker/providers/pt_BR/phone_number.py +++ b/src/libs/faker/providers/phone_number/pt_BR/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): @@ -70,4 +70,14 @@ class Provider(PhoneNumberProvider): '81 ####-####', '#### ####', '####-####', - ) \ No newline at end of file + ) + msisdn_formats = ( + '5511#########', + '5521#########', + '5531#########', + '5541#########', + '5551#########', + '5561#########', + '5571#########', + '5581#########', + ) diff --git a/src/libs/faker/providers/phone_number/pt_PT/__init__.py b/src/libs/faker/providers/phone_number/pt_PT/__init__.py new file mode 100644 index 0000000..abdb14d --- /dev/null +++ b/src/libs/faker/providers/phone_number/pt_PT/__init__.py @@ -0,0 +1,42 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '(351) 91# ### ###', + '(351) 92# ### ###', + '(351) 93# ### ###', + '(351) 96# ### ###', + '(351) 2## ### ###', + '(351) 91#######', + '(351) 92#######', + '(351) 93#######', + '(351) 96#######', + '(351) 2########', + '(351) 91# ### ###', + '(351) 92# ### ###', + '(351) 93# ### ###', + '(351) 96# ### ###', + '(351) 2## ### ###', + '(351) 91#######', + '(351) 92#######', + '(351) 93#######', + '(351) 96#######', + '(351) 2########', + '+35191#######', + '+35192#######', + '+35193#######', + '+35196#######', + '+3512########', + '91# ### ###', + '92# ### ###', + '93# ### ###', + '96# ### ###', + '2## ### ###', + '91#######', + '92#######', + '93#######', + '96#######', + '2########', + ) diff --git a/src/faker/providers/ru_RU/phone_number.py b/src/libs/faker/providers/phone_number/ru_RU/__init__.py similarity index 78% rename from src/faker/providers/ru_RU/phone_number.py rename to src/libs/faker/providers/phone_number/ru_RU/__init__.py index fb8e0c1..22c95af 100644 --- a/src/faker/providers/ru_RU/phone_number.py +++ b/src/libs/faker/providers/phone_number/ru_RU/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/sk_SK/__init__.py b/src/libs/faker/providers/phone_number/sk_SK/__init__.py new file mode 100644 index 0000000..6d1be10 --- /dev/null +++ b/src/libs/faker/providers/phone_number/sk_SK/__init__.py @@ -0,0 +1,17 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+421 2 ########', + '+421 3# ### ####', + '+421 4# ### ####', + '+421 5# ### ####', + '+421 90# ### ###', + '+421 91# ### ###', + '+421 940 ### ###', + '+421 944 ### ###', + '+421 948 ### ###', + '+421 949 ### ###', + ) \ No newline at end of file diff --git a/src/faker/providers/sl_SI/phone_number.py b/src/libs/faker/providers/phone_number/sl_SI/__init__.py similarity index 85% rename from src/faker/providers/sl_SI/phone_number.py rename to src/libs/faker/providers/phone_number/sl_SI/__init__.py index c8dc252..4b47cd5 100644 --- a/src/faker/providers/sl_SI/phone_number.py +++ b/src/libs/faker/providers/phone_number/sl_SI/__init__.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider class Provider(PhoneNumberProvider): diff --git a/src/libs/faker/providers/phone_number/sv_SE/__init__.py b/src/libs/faker/providers/phone_number/sv_SE/__init__.py new file mode 100644 index 0000000..60edf27 --- /dev/null +++ b/src/libs/faker/providers/phone_number/sv_SE/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+46 (0)8 ### ### ##', + '+46 (0)## ## ## ##', + '+46 (0)### ### ##', + '08-### ### ##', + '08-### ## ##', + '08-## ## ##', + '0##-### ## ##', + '0##-## ## ##', + '0###-## ## ##', + '0###-### ##', + ) diff --git a/src/libs/faker/providers/phone_number/tr_TR/__init__.py b/src/libs/faker/providers/phone_number/tr_TR/__init__.py new file mode 100644 index 0000000..738a759 --- /dev/null +++ b/src/libs/faker/providers/phone_number/tr_TR/__init__.py @@ -0,0 +1,16 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+90(###)#######', + '+90 (###) #######', + '0### ### ## ##', + '0##########', + '0###-### ####', + '(###)### ####', + '### # ###', + '+90(###)###-####x###', + '+90(###)###-####x####' + ) \ No newline at end of file diff --git a/src/libs/faker/providers/phone_number/tw_GH/__init__.py b/src/libs/faker/providers/phone_number/tw_GH/__init__.py new file mode 100644 index 0000000..f1552c9 --- /dev/null +++ b/src/libs/faker/providers/phone_number/tw_GH/__init__.py @@ -0,0 +1,27 @@ +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '+23327#######', + '+23357#######', + '+23355#######', + '+23324#######', + '+23354#######', + '+23320#######', + '+23350#######', + '+23326#######', + '+23356#######', + '+23328#######', + '024#######', + '054#######', + '055#######', + '027#######', + '057#######', + '020#######', + '050#######', + '026#######', + '056#######', + '028#######', + ) diff --git a/src/libs/faker/providers/phone_number/uk_UA/__init__.py b/src/libs/faker/providers/phone_number/uk_UA/__init__.py new file mode 100644 index 0000000..1d72e3b --- /dev/null +++ b/src/libs/faker/providers/phone_number/uk_UA/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + + +class Provider(PhoneNumberProvider): + formats = ( + '###-##-##', + '### ## ##', + '0## ### ## ##', + '0## ###-##-##', + '+38 0## ###-##-##', + '+38 0## ###-##-##', + '+38 (0##) ###-##-##', + '+38 0## ### ## ##', + ) diff --git a/src/faker/providers/zh_CN/phone_number.py b/src/libs/faker/providers/phone_number/zh_CN/__init__.py similarity index 71% rename from src/faker/providers/zh_CN/phone_number.py rename to src/libs/faker/providers/phone_number/zh_CN/__init__.py index 2ad2432..d73dd51 100644 --- a/src/faker/providers/zh_CN/phone_number.py +++ b/src/libs/faker/providers/phone_number/zh_CN/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from ..phone_number import Provider as PhoneNumberProvider +from .. import Provider as PhoneNumberProvider + class Provider(PhoneNumberProvider): phonenumber_prefixes = [134, 135, 136, 137, 138, 139, 147, 150, @@ -9,6 +10,5 @@ class Provider(PhoneNumberProvider): 145, 133, 153, 180, 181, 189] formats = [str(i) + "########" for i in phonenumber_prefixes] - @classmethod - def phonenumber_prefix(cls): - return cls.random_element(cls.phonenumber_prefixes) + def phonenumber_prefix(self): + return self.random_element(self.phonenumber_prefixes) diff --git a/src/libs/faker/providers/phone_number/zh_TW/__init__.py b/src/libs/faker/providers/phone_number/zh_TW/__init__.py new file mode 100644 index 0000000..e2b2fd6 --- /dev/null +++ b/src/libs/faker/providers/phone_number/zh_TW/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from .. import Provider as PhoneNumberProvider + +# phone number from https://en.wikipedia.org/wiki/Telephone_numbers_in_Taiwan + +class Provider(PhoneNumberProvider): + formats = ("(0#) %#######", + "0#-%#######", + "0## %#######", + "09########", + "09##-######", + "0#-%######", + "0# %######") diff --git a/src/libs/faker/providers/profile/__init__.py b/src/libs/faker/providers/profile/__init__.py new file mode 100644 index 0000000..a071ea0 --- /dev/null +++ b/src/libs/faker/providers/profile/__init__.py @@ -0,0 +1,59 @@ +# coding=utf-8 + +from .. import BaseProvider +import itertools + + +class Provider(BaseProvider): + """ + This provider is a collection of functions to generate personal profiles and identities. + + """ + + def simple_profile(self, sex=None): + """ + Generates a basic profile with personal informations + """ + SEX = ["F", "M"] + if sex not in SEX: + sex = self.random_element(SEX) + if sex == 'F': + name = self.generator.name_female() + elif sex == 'M': + name = self.generator.name_male() + return { + "username": self.generator.user_name(), + "name": name, + "sex": sex, + "address": self.generator.address(), + "mail": self.generator.free_email(), + + #"password":self.generator.password() + "birthdate": self.generator.date(), + + } + + def profile(self, fields=None, sex=None): + """ + Generates a complete profile. + If "fields" is not empty, only the fields in the list will be returned + """ + if fields is None: + fields = [] + + d = { + "job": self.generator.job(), + "company": self.generator.company(), + "ssn": self.generator.ssn(), + "residence": self.generator.address(), + "current_location": (self.generator.latitude(), self.generator.longitude()), + "blood_group": "".join(self.random_element(list(itertools.product(["A", "B", "AB", "0"], ["+", "-"])))), + "website": [self.generator.url() for i in range(1, self.random_int(2, 5))] + } + + d = dict(d, **self.generator.simple_profile(sex)) + #field selection + if len(fields) > 0: + d = dict((k, v) for (k, v) in d.items() if k in fields) + + return d diff --git a/src/libs/faker/providers/profile/en_US/__init__.py b/src/libs/faker/providers/profile/en_US/__init__.py new file mode 100644 index 0000000..677c976 --- /dev/null +++ b/src/libs/faker/providers/profile/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as ProfileProvider + + +class Provider(ProfileProvider): + pass diff --git a/src/faker/providers/python.py b/src/libs/faker/providers/python/__init__.py similarity index 51% rename from src/faker/providers/python.py rename to src/libs/faker/providers/python/__init__.py index 8b2da9c..3cfbb7e 100644 --- a/src/faker/providers/python.py +++ b/src/libs/faker/providers/python/__init__.py @@ -1,38 +1,64 @@ # coding=utf-8 from __future__ import unicode_literals -from . import BaseProvider + from decimal import Decimal -from .lorem import Provider as Lorem import sys +from .. import BaseProvider + + +if sys.version_info[0] == 2: + string_types = (basestring,) +elif sys.version_info[0] == 3: + string_types = (str, bytes) +else: + raise SystemError("Unrecognized python version: {}".format(sys.version_info[0])) + class Provider(BaseProvider): - @classmethod - def pybool(cls): - return cls.random_int(0, 1) == 1 + def pybool(self): + return self.random_int(0, 1) == 1 - @classmethod - def pystr(cls, max_chars=20): - return Lorem.text(max_chars) + def pystr(self, min_chars=None, max_chars=20): + """ + Generates a random string of upper and lowercase letters. + :type min_chars: int + :type max_chars: int + :return: String. Random of random length between min and max characters. + """ + if min_chars is None: + return "".join(self.random_letter() for i in range(max_chars)) + else: + assert (max_chars >= min_chars), "Maximum length must be greater than or equal to minium length" + return "".join(self.random_letter() for i in range(0, self.generator.random.randint(min_chars, max_chars))) - @classmethod - def pyfloat(cls, left_digits=None, right_digits=None, positive=False): - left_digits = left_digits or cls.random_int(1, sys.float_info.dig) - right_digits = right_digits or cls.random_int(0, sys.float_info.dig - left_digits) - sign = 1 if positive or cls.random_int(0, 1) else -1 + def pyfloat(self, left_digits=None, right_digits=None, positive=False): + if left_digits is not None and left_digits < 0: + raise ValueError('A float number cannot have less than 0 digits in its ' + 'integer part') + if right_digits is not None and right_digits < 0: + raise ValueError('A float number cannot have less than 0 digits in its ' + 'fractional part') + if left_digits == 0 and right_digits == 0: + raise ValueError('A float number cannot have less than 0 digits in total') + + left_digits = left_digits if left_digits is not None else ( + self.random_int(1, sys.float_info.dig)) + right_digits = right_digits if right_digits is not None else ( + self.random_int(0, sys.float_info.dig - left_digits)) + sign = 1 if positive else self.random_element((-1, 1)) return float("{0}.{1}".format( - sign * cls.random_number(left_digits), cls.random_number(right_digits) + sign * self.random_number(left_digits), + self.random_number(right_digits) )) - @classmethod - def pyint(cls): - return cls.random_int() + def pyint(self): + return self.generator.random_int() - @classmethod - def pydecimal(cls, left_digits=None, right_digits=None, positive=False): - return Decimal(str(cls.pyfloat(left_digits, right_digits, positive))) + def pydecimal(self, left_digits=None, right_digits=None, positive=False): + return Decimal(str(self.pyfloat(left_digits, right_digits, positive))) def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types): return tuple(self.pyset(nb_elements, variable_nb_elements, *value_types)) @@ -57,7 +83,7 @@ class Provider(BaseProvider): def _pyiterable(self, nb_elements=10, variable_nb_elements=True, *value_types): - value_types = [t if isinstance(t, basestring) else getattr(t, '__name__', type(t).__name__).lower() + value_types = [t if isinstance(t, string_types) else getattr(t, '__name__', type(t).__name__).lower() for t in value_types # avoid recursion if t not in ['iterable', 'list', 'tuple', 'dict', 'set']] @@ -65,29 +91,30 @@ class Provider(BaseProvider): value_types = ['str', 'str', 'str', 'str', 'float', 'int', 'int', 'decimal', 'date_time', 'uri', 'email'] if variable_nb_elements: - nb_elements = self.randomize_nb_elements(nb_elements) + nb_elements = self.randomize_nb_elements(nb_elements, min=1) for f in range(nb_elements): yield self._random_type(value_types) - def pydict(self, nb_elements=10, variable_nb_elements=True, *value_types): """ - Use this function to generate data, returns a touple containing - a list, a dictionary and a nested dictionary. - """ + Returns a dictionary. + + :nb_elements: number of elements for dictionary + :variable_nb_elements: is use variable number of elements for dictionary + :value_types: type of dictionary values + """ if variable_nb_elements: - nb_elements = self.randomize_nb_elements(nb_elements) + nb_elements = self.randomize_nb_elements(nb_elements, min=1) return dict(zip( - Lorem.words(nb_elements), + self.generator.words(nb_elements), self._pyiterable(nb_elements, False, *value_types) )) - def pystruct(self, count=10, *value_types): - value_types = [t if isinstance(t, basestring) else getattr(t, '__name__', type(t).__name__).lower() + value_types = [t if isinstance(t, string_types) else getattr(t, '__name__', type(t).__name__).lower() for t in value_types # avoid recursion if t != 'struct'] @@ -98,9 +125,9 @@ class Provider(BaseProvider): d = {} nd = {} for i in range(count): - d[Lorem.word()] = self._random_type(value_types) + d[self.generator.word()] = self._random_type(value_types) l.append(self._random_type(value_types)) - nd[Lorem.word()] = { + nd[self.generator.word()] = { i: self._random_type(value_types), i + 1: [self._random_type(value_types), self._random_type(value_types), self._random_type(value_types)], i + 2: { diff --git a/src/libs/faker/providers/python/en_US/__init__.py b/src/libs/faker/providers/python/en_US/__init__.py new file mode 100644 index 0000000..7420bfd --- /dev/null +++ b/src/libs/faker/providers/python/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as PythonProvider + + +class Provider(PythonProvider): + pass diff --git a/src/libs/faker/providers/ssn/__init__.py b/src/libs/faker/providers/ssn/__init__.py new file mode 100644 index 0000000..9a057e6 --- /dev/null +++ b/src/libs/faker/providers/ssn/__init__.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from __future__ import unicode_literals +localized = True + +from .. import BaseProvider + + +class Provider(BaseProvider): + ssn_formats = ("###-##-####",) + + def ssn(self): + return self.bothify(self.random_element(self.ssn_formats)) diff --git a/src/libs/faker/providers/ssn/en_CA/__init__.py b/src/libs/faker/providers/ssn/en_CA/__init__.py new file mode 100644 index 0000000..1f8c9ae --- /dev/null +++ b/src/libs/faker/providers/ssn/en_CA/__init__.py @@ -0,0 +1,36 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +class Provider(SsnProvider): + + # in order to create a valid SIN we need to provide a number that passes a simple modified Luhn Algorithmn checksum + # this function essentially reverses the checksum steps to create a random valid SIN (Social Insurance Number) + def ssn(self): + + # create an array of 8 elements initialized randomly + digits = self.generator.random.sample(range(10), 8) + + # All of the digits must sum to a multiple of 10. + # sum the first 8 and set 9th to the value to get to a multiple of 10 + digits.append(10 - (sum(digits) % 10)) + + # digits is now the digital root of the number we want multiplied by the magic number 121 212 121 + # reverse the multiplication which occurred on every other element + for i in range(1, len(digits), 2): + if digits[i] % 2 == 0: + digits[i] = (digits[i] / 2) + else: + digits[i] = (digits[i] + 9) / 2 + + # build the resulting SIN string + sin = "" + for i in range(0, len(digits), 1): + sin += str(digits[i]) + # add a space to make it conform to normal standards in Canada + if i % 3 == 2: + sin += " " + + # finally return our random but valid SIN + return sin diff --git a/src/libs/faker/providers/ssn/en_US/__init__.py b/src/libs/faker/providers/ssn/en_US/__init__.py new file mode 100644 index 0000000..4357535 --- /dev/null +++ b/src/libs/faker/providers/ssn/en_US/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as BaseProvider + + +class Provider(BaseProvider): + + def ssn(self): + # Certain numbers are invalid for U.S. SSNs. The area (first 3 digits) + # cannot be 666 or 900-999. The group number (middle digits) cannot be + # 00. The serial (last 4 digits) cannot be 0000 + area = self.random_int(min=1, max=899) + if area == 666: + area += 1 + group = self.random_int(1, 99) + serial = self.random_int(1, 9999) + + ssn = "{0:03d}-{1:02d}-{2:04d}".format(area, group, serial) + return ssn diff --git a/src/libs/faker/providers/ssn/et_EE/__init__.py b/src/libs/faker/providers/ssn/et_EE/__init__.py new file mode 100644 index 0000000..6c5da83 --- /dev/null +++ b/src/libs/faker/providers/ssn/et_EE/__init__.py @@ -0,0 +1,65 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider +import datetime +import operator + + +def checksum(digits): + """Calculate checksum of Estonian personal identity code. + + Checksum is calculated with "Modulo 11" method using level I or II scale: + Level I scale: 1 2 3 4 5 6 7 8 9 1 + Level II scale: 3 4 5 6 7 8 9 1 2 3 + + The digits of the personal code are multiplied by level I scale and summed; + if remainder of modulo 11 of the sum is less than 10, checksum is the + remainder. + If remainder is 10, then level II scale is used; checksum is remainder if + remainder < 10 or 0 if remainder is 10. + + See also https://et.wikipedia.org/wiki/Isikukood + """ + sum_mod11 = sum(map(operator.mul, digits, Provider.scale1)) % 11 + if sum_mod11 < 10: + return sum_mod11 + sum_mod11 = sum(map(operator.mul, digits, Provider.scale2)) % 11 + return 0 if sum_mod11 == 10 else sum_mod11 + + +class Provider(SsnProvider): + min_age = 16 * 365 + max_age = 90 * 365 + scale1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 1) + scale2 = (3, 4, 5, 6, 7, 8, 9, 1, 2, 3) + + def ssn(self): + """ + Returns 11 character Estonian personal identity code (isikukood, IK). + + Age of person is between 16 and 90 years, based on local computer date. + This function assigns random sex to person. + An Estonian Personal identification code consists of 11 digits, + generally given without any whitespace or other delimiters. + The form is GYYMMDDSSSC, where G shows sex and century of birth (odd + number male, even number female, 1-2 19th century, 3-4 20th century, + 5-6 21st century), SSS is a serial number separating persons born on + the same date and C a checksum. + + https://en.wikipedia.org/wiki/National_identification_number#Estonia + """ + age = datetime.timedelta(days=self.generator.random.randrange(self.min_age, + self.max_age)) + birthday = datetime.date.today() - age + if birthday.year < 2000: + ik = self.generator.random.choice(('3', '4')) + elif birthday.year < 2100: + ik = self.generator.random.choice(('5', '6')) + else: + ik = self.generator.random.choice(('7', '8')) + + ik += "%02d%02d%02d" % ((birthday.year % 100), birthday.month, + birthday.day) + ik += str(self.generator.random.randrange(0, 999)).zfill(3) + return ik + str(checksum([int(ch) for ch in ik])) diff --git a/src/libs/faker/providers/ssn/fi_FI/__init__.py b/src/libs/faker/providers/ssn/fi_FI/__init__.py new file mode 100644 index 0000000..a440b00 --- /dev/null +++ b/src/libs/faker/providers/ssn/fi_FI/__init__.py @@ -0,0 +1,44 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider +import datetime + + +class Provider(SsnProvider): + + def ssn(self): + """ + Returns 11 character Finnish personal identity code (Henkilötunnus, + HETU, Swedish: Personbeteckning). Age of person is between 18 and 90 + years, based on local computer date. This function assigns random + sex to person. + + HETU consists of eleven characters of the form DDMMYYCZZZQ, where + DDMMYY is the date of birth, C the century sign, ZZZ the individual + number and Q the control character (checksum). The sign for the + century is either + (1800–1899), - (1900–1999), or A (2000–2099). + The individual number ZZZ is odd for males and even for females. + For people born in Finland its range is 002-899 + (larger numbers may be used in special cases). + An example of a valid code is 311280-888Y. + + https://en.wikipedia.org/wiki/National_identification_number#Finland + """ + def _checksum(hetu): + checksum_characters = "0123456789ABCDEFHJKLMNPRSTUVWXY" + return checksum_characters[int(hetu) % 31] + + min_age = 18 * 365 + max_age = 90 * 365 + age = datetime.timedelta(days=self.generator.random.randrange(min_age, max_age)) + birthday = datetime.date.today() - age + hetu_date = "%02d%02d%s" % (birthday.day, birthday.month, str(birthday.year)[-2:]) + if birthday.year < 2000: + separator = '-' + else: + separator = 'A' + suffix = str(self.generator.random.randrange(2, 899)).zfill(3) + checksum = _checksum(hetu_date + suffix) + hetu = "".join([hetu_date, separator, suffix, checksum]) + return hetu diff --git a/src/libs/faker/providers/ssn/fr_CH/__init__.py b/src/libs/faker/providers/ssn/fr_CH/__init__.py new file mode 100644 index 0000000..84f2bdc --- /dev/null +++ b/src/libs/faker/providers/ssn/fr_CH/__init__.py @@ -0,0 +1,33 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +class Provider(SsnProvider): + ssn_formats = ("###.####.####.##",) + + def ssn(self): + """ + Returns a 13 digits Swiss SSN named AHV (German) or + AVS (French and Italian) + See: http://www.bsv.admin.ch/themen/ahv/00011/02185/ + """ + def _checksum(digits): + evensum = sum(digits[:-1:2]) + oddsum = sum(digits[1::2]) + return (10 - ((evensum + oddsum * 3) % 10)) % 10 + + digits = [7, 5, 6] + # create an array of first 9 elements initialized randomly + digits += self.generator.random.sample(range(10), 9) + # determine the last digit to make it qualify the test + digits.append(_checksum(digits)) + # repeat steps until it does qualify the test + + digits = ''.join([str(d) for d in digits]) + ssn = digits[:3] + '.' \ + + digits[3:7] + '.' \ + + digits[7:11] + '.' \ + + digits[11:] + return ssn diff --git a/src/libs/faker/providers/ssn/he_IL/__init__.py b/src/libs/faker/providers/ssn/he_IL/__init__.py new file mode 100644 index 0000000..214e83d --- /dev/null +++ b/src/libs/faker/providers/ssn/he_IL/__init__.py @@ -0,0 +1,33 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider +from math import ceil + + +class Provider(SsnProvider): + + def ssn(self): + """ + Returns an Israeli identity number, known as Teudat Zehut ("tz"). + + https://en.wikipedia.org/wiki/Israeli_identity_card + """ + + newID = str(self.generator.random.randrange(111111, 99999999)) + newID = newID.zfill(8) + theSum = 0 + indexRange = [0, 2, 4, 6] + for i in indexRange: + digit = newID[i] + num = int(digit) + theSum = theSum + num + num = int(newID[i + 1]) * 2 + if num > 9: + num = int(str(num)[0]) + int(str(num)[1]) + theSum = theSum + num + lastDigit = theSum % 10 + if lastDigit != 0: + lastDigit = 10 - lastDigit + + return str(newID) + str(lastDigit) diff --git a/src/libs/faker/providers/ssn/hr_HR/__init__.py b/src/libs/faker/providers/ssn/hr_HR/__init__.py new file mode 100644 index 0000000..9eb73ed --- /dev/null +++ b/src/libs/faker/providers/ssn/hr_HR/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +def checksum(digits): + """ + Calculate and return control digit for given list of digits based on + ISO7064, MOD 11,10 standard. + """ + remainder = 10 + for digit in digits: + remainder = (remainder + digit) % 10 + if remainder == 0: + remainder = 10 + remainder = (remainder * 2) % 11 + + control_digit = 11 - remainder + if control_digit == 10: + control_digit = 0 + return control_digit + + +class Provider(SsnProvider): + """ + The Personal identification number (Croatian: Osobni identifikacijski + broj or OIB) is a permanent national identification number of every + Croatian citizen and legal persons domiciled in the Republic of Croatia. + + OIB consists of 11 digits which contain no personal information. The OIB + is constructed from ten randomly chosen digits and one digit control number + (international standard ISO 7064, module 11.10). + """ + + def ssn(self): + digits = self.generator.random.sample(range(10), 10) + + digits.append(checksum(digits)) + + return ''.join(map(str, digits)) diff --git a/src/libs/faker/providers/ssn/hu_HU/__init__.py b/src/libs/faker/providers/ssn/hu_HU/__init__.py new file mode 100644 index 0000000..8a421b3 --- /dev/null +++ b/src/libs/faker/providers/ssn/hu_HU/__init__.py @@ -0,0 +1,126 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as SsnProvider +from functools import reduce +from math import fmod + +def zfix(d): + if d < 10: + return "0" + str(d) + else: + return d + +class Provider(SsnProvider): + def ssn(self, dob=None, gender=None): + """ + Generates Hungarian SSN equivalent (személyazonosító szám or, colloquially, személyi szám) + + :param dob: date of birth as a "YYMMDD" string - this determines the checksum regime and is also encoded in the személyazonosító szám. + :type dob: str + :param gender: gender of the person - "F" for female, M for male. + :type gender: str + :return: személyazonosító szám in str format (11 digs) + :rtype: str + """ + # Hungarian SSNs consist of 11 decimal characters, of the following + # schema: + # + # M EEHHNN SSSK + # ↑ ↑ ↑ ↑ + # gender bday ser check digit + # + # + # The M (gender) character + # ------------------------ + # + # Born <= 1999 Born > 1999 + # Male Female Male Female + # 1 2 3 4 + # + # It also includes information on original citizenship,but this is + # ignored for the sake of simplicity. + # + # Birthday + # -------- + # + # Simply encoded as EEHHNN. + # + # + # Serial + # ------ + # + # These digits differentiate persons born on the same date. + # + # + # Check digit + # ----------- + # + # For those born before 1996: + # + # k11 = (1k1 + 2k2 + 3k3... 10k10) mod 11 + # + # That is, you multiply each digit with its ordinal, add it up and + # take it mod 11. After 1996: + # + # k11 = (10k1 + 9k2 + 8k3... 1k10) mod 11 + # + + if dob: + E = int(dob[0:2]) + H = int(dob[2:4]) + N = int(dob[4:6]) + + if E <= 17: + # => person born after '99 in all likelihood... + if gender: + if gender.upper() == "F": + M = 4 + elif gender.upper() == "M": + M = 3 + else: + raise ValueError("Unknown gender - specify M or F.") + else: + M = self.generator.random_int(3, 4) + else: + # => person born before '99. + if gender: + if gender.upper() == "F": + M = 2 + elif gender.upper() == "M": + M = 1 + else: + raise ValueError("Unknown gender - specify M or F.") + else: + M = self.generator.random_int(1, 2) + elif gender: + # => assume statistically that the person will be born before '99. + E = self.generator.random_int(17, 99) + H = self.generator.random_int(1, 12) + N = self.generator.random_int(1, 30) + + if gender.upper() == "F": + M = 2 + elif gender.upper() == "M": + M = 1 + else: + raise ValueError("Unknown gender - specify M or F") + else: + M = self.generator.random_int(1, 2) + E = self.generator.random_int(17, 99) + H = self.generator.random_int(1, 12) + N = self.generator.random_int(1, 30) + + H = zfix(H) + N = zfix(N) + S = "{}{}{}".format(self.generator.random_digit(), self.generator.random_digit(), self.generator.random_digit()) + + vdig = "{M}{E}{H}{N}{S}".format(M=M, E=E, H=H, N=N, S=S) + + if 17 < E < 97: + cum = [(k+1) * int(v) for k,v in enumerate(vdig)] + else: + cum = [(10-k) * int(v) for k,v in enumerate(vdig)] + + K = fmod(reduce(lambda x,y: x+y, cum), 11) + + return vdig + str(int(K)) diff --git a/src/faker/providers/it_IT/ssn.py b/src/libs/faker/providers/ssn/it_IT/__init__.py similarity index 88% rename from src/faker/providers/it_IT/ssn.py rename to src/libs/faker/providers/ssn/it_IT/__init__.py index 37897bd..51df7e4 100644 --- a/src/faker/providers/it_IT/ssn.py +++ b/src/libs/faker/providers/ssn/it_IT/__init__.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from string import ascii_uppercase, digits -from ..ssn import Provider as SsnProvider +from .. import Provider as SsnProvider ALPHANUMERICS = sorted(digits + ascii_uppercase) @@ -31,7 +31,6 @@ class Provider(SsnProvider): ''' fiscal_code_format = '??????##?##?###' - @classmethod - def ssn(cls): - code = cls.bothify(cls.fiscal_code_format).upper() + def ssn(self): + code = self.bothify(self.fiscal_code_format).upper() return code + checksum(code) diff --git a/src/libs/faker/providers/ssn/ko_KR/__init__.py b/src/libs/faker/providers/ssn/ko_KR/__init__.py new file mode 100644 index 0000000..23a18e3 --- /dev/null +++ b/src/libs/faker/providers/ssn/ko_KR/__init__.py @@ -0,0 +1,8 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +class Provider(SsnProvider): + ssn_formats = ("##0#0#-1######", "##0#1#-1######", "##0#2#-1######", + "##0#0#-2######", "##0#1#-2######", "##0#2#-2######",) diff --git a/src/libs/faker/providers/ssn/nl_BE/__init__.py b/src/libs/faker/providers/ssn/nl_BE/__init__.py new file mode 100644 index 0000000..8897c96 --- /dev/null +++ b/src/libs/faker/providers/ssn/nl_BE/__init__.py @@ -0,0 +1,57 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider + +""" +For more info on rijksregisternummer, see https://nl.wikipedia.org/wiki/Rijksregisternummer +Dutch/French only for now ... +""" + +class Provider(SsnProvider): + + def ssn(self): + """ + Returns a 11 digits Belgian SSN called "rijksregisternummer" as a string + + The first 6 digits represent the birthdate with (in order) year, month and day. + The second group of 3 digits is represents a sequence number (order of birth). + It is even for women and odd for men. + For men the range starts at 1 and ends 997, for women 2 until 998. + The third group of 2 digits is a checksum based on the previous 9 digits (modulo 97). + Divide those 9 digits by 97, subtract the remainder from 97 and that's the result. + For persons born in or after 2000, the 9 digit number needs to be proceeded by a 2 + (add 2000000000) before the division by 97. + + """ + # see http://nl.wikipedia.org/wiki/Burgerservicenummer (in Dutch) + def _checksum(digits): + res = 97 - (digits % 97) + return res + + # Generate a date (random) + mydate = self.generator.date() + # Convert it to an int + elms = mydate.split("-") + # Adjust for year 2000 if necessary + if elms[0][0] == '2': + above = True + else: + above = False + # Only keep the last 2 digits of the year + elms[0] = elms[0][2:4] + # Simulate the gender/sequence - should be 3 digits + seq = self.generator.random_int(1,998) + # Right justify sequence and append to list + seq_str = "{:0>3}".format(seq) + elms.append(seq_str) + # Now convert list to an integer so the checksum can be calculated + date_as_int = int("".join(elms)) + if above: + date_as_int += 2000000000 + # Generate checksum + s = _checksum(date_as_int) + s_rjust = "{:0>2}".format(s) + # return result as a string + elms.append(s_rjust) + return "".join(elms) diff --git a/src/faker/providers/nl_NL/ssn.py b/src/libs/faker/providers/ssn/nl_NL/__init__.py similarity index 90% rename from src/faker/providers/nl_NL/ssn.py rename to src/libs/faker/providers/ssn/nl_NL/__init__.py index d3f1175..2d3c183 100644 --- a/src/faker/providers/nl_NL/ssn.py +++ b/src/libs/faker/providers/ssn/nl_NL/__init__.py @@ -1,14 +1,12 @@ # coding=utf-8 from __future__ import unicode_literals -from ..ssn import Provider as SsnProvider -import random +from .. import Provider as SsnProvider class Provider(SsnProvider): - @classmethod - def ssn(cls): + def ssn(self): """ Returns a 9 digits Dutch SSN called "burgerservicenummer (BSN)". @@ -26,7 +24,7 @@ class Provider(SsnProvider): while True: # create an array of first 8 elements initialized randomly - digits = random.sample(range(10), 8) + digits = self.generator.random.sample(range(10), 8) # sum those 8 digits according to (part of) the "11-proef" s = _checksum(digits) # determine the last digit to make it qualify the test diff --git a/src/libs/faker/providers/ssn/pl_PL/__init__.py b/src/libs/faker/providers/ssn/pl_PL/__init__.py new file mode 100644 index 0000000..275aa7f --- /dev/null +++ b/src/libs/faker/providers/ssn/pl_PL/__init__.py @@ -0,0 +1,64 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +def checksum(digits): + """ + Calculates and returns a control digit for given list of digits basing on PESEL standard. + """ + weights_for_check_digit = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7] + check_digit = 0 + + for i in range(0, 10): + check_digit += weights_for_check_digit[i] * digits[i] + + check_digit %= 10 + + return check_digit + + +def calculate_month(birth_date): + """ + Calculates and returns a month number basing on PESEL standard. + """ + year = int(birth_date.strftime('%Y')) + month = int(birth_date.strftime('%m')) + ((int(year / 100) - 14) % 5) * 20 + + return month + + +class Provider(SsnProvider): + + def ssn(self): + """ + Returns 11 character Polish national identity code (Public Electronic Census System, + Polish: Powszechny Elektroniczny System Ewidencji Ludności - PESEL). + + It has the form YYMMDDZZZXQ, where YYMMDD is the date of birth (with century + encoded in month field), ZZZ is the personal identification number, X denotes sex + (even for females, odd for males) and Q is a parity number. + + https://en.wikipedia.org/wiki/National_identification_number#Poland + """ + birth_date = self.generator.date_time() + + year_without_century = int(birth_date.strftime('%y')) + month = calculate_month(birth_date) + day = int(birth_date.strftime('%d')) + + pesel_digits = [ + int(year_without_century / 10), + year_without_century % 10, + int(month / 10), + month % 10, + int(day / 10), day % 10 + ] + + for _ in range(4): + pesel_digits.append(self.random_digit()) + + pesel_digits.append(checksum(pesel_digits)) + + return ''.join(str(digit) for digit in pesel_digits) diff --git a/src/libs/faker/providers/ssn/pt_BR/__init__.py b/src/libs/faker/providers/ssn/pt_BR/__init__.py new file mode 100644 index 0000000..7fcdcda --- /dev/null +++ b/src/libs/faker/providers/ssn/pt_BR/__init__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +def checksum(digits): + s = 0 + p = len(digits) + 1 + for i in range(0, len(digits)): + s += digits[i] * p + p -= 1 + + reminder = s % 11 + if reminder == 0 or reminder == 1: + return 1 + else: + return 11 - reminder + + +class Provider(SsnProvider): + """ + Provider for Brazilian SSN also known in Brazil as CPF. + There are two methods Provider.ssn and Provider.cpf + The snn returns a valid number with numbers only + The cpf return a valid number formatted with brazilian mask. eg nnn.nnn.nnn-nn + """ + + def ssn(self): + digits = self.generator.random.sample(range(10), 9) + + dv = checksum(digits) + digits.append(dv) + digits.append(checksum(digits)) + + return ''.join(map(str, digits)) + + def cpf(self): + c = self.ssn() + return c[:3] + '.' + c[3:6] + '.' + c[6:9] + '-' + c[9:] diff --git a/src/libs/faker/providers/ssn/ru_RU/__init__.py b/src/libs/faker/providers/ssn/ru_RU/__init__.py new file mode 100644 index 0000000..91dc61f --- /dev/null +++ b/src/libs/faker/providers/ssn/ru_RU/__init__.py @@ -0,0 +1,6 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as SsnProvider + +class Provider(SsnProvider): + ssn_formats = ("############",) diff --git a/src/libs/faker/providers/ssn/sv_SE/__init__.py b/src/libs/faker/providers/ssn/sv_SE/__init__.py new file mode 100644 index 0000000..0d3a2a6 --- /dev/null +++ b/src/libs/faker/providers/ssn/sv_SE/__init__.py @@ -0,0 +1,45 @@ +# coding=utf-8 + +from __future__ import unicode_literals +from .. import Provider as SsnProvider +import datetime + + +class Provider(SsnProvider): + + def ssn(self): + """ + Returns a 10 digit Swedish SSN, "Personnummer". + + It consists of 10 digits in the form YYMMDD-SSGQ, where + YYMMDD is the date of birth, SSS is a serial number + and Q is a control character (Luhn checksum). + + http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden) + """ + def _luhn_checksum(number): + def digits_of(n): + return [int(d) for d in str(n)] + digits = digits_of(number) + odd_digits = digits[-1::-2] + even_digits = digits[-2::-2] + checksum = 0 + checksum += sum(odd_digits) + for d in even_digits: + checksum += sum(digits_of(d * 2)) + return checksum % 10 + + def _calculate_luhn(partial_number): + check_digit = _luhn_checksum(int(partial_number) * 10) + return check_digit if check_digit == 0 else 10 - check_digit + + min_age = 18 * 365 + max_age = 90 * 365 + age = datetime.timedelta(days=self.generator.random.randrange(min_age, max_age)) + birthday = datetime.datetime.now() - age + pnr_date = birthday.strftime('%y%m%d') + suffix = str(self.generator.random.randrange(0, 999)).zfill(3) + luhn_checksum = str(_calculate_luhn(pnr_date + suffix)) + pnr = '{0}-{1}{2}'.format(pnr_date, suffix, luhn_checksum) + + return pnr diff --git a/src/libs/faker/providers/ssn/uk_UA/__init__.py b/src/libs/faker/providers/ssn/uk_UA/__init__.py new file mode 100644 index 0000000..d43b4bf --- /dev/null +++ b/src/libs/faker/providers/ssn/uk_UA/__init__.py @@ -0,0 +1,32 @@ +# coding=utf-8 +from __future__ import unicode_literals + +from datetime import date + +from .. import Provider as SsnProvider + + +class Provider(SsnProvider): + def ssn(self): + """ + Ukrainian "Реєстраційний номер облікової картки платника податків" + also known as "Ідентифікаційний номер фізичної особи". + """ + digits = [] + + # Number of days between 1899-12-31 and a birth date + for digit in str((self.generator.date_object() - + date(1899, 12, 31)).days): + digits.append(int(digit)) + + # Person's sequence number + for _ in range(4): + digits.append(self.random_int(0, 9)) + + checksum = (digits[0]*-1 + digits[1]*5 + digits[2]*7 + digits[3]*9 + + digits[4]*4 + digits[5]*6 + digits[6]*10 + digits[7]*5 + + digits[8]*7) + # Remainder of a checksum divided by 11 or 1 if it equals to 10 + digits.append(checksum % 11 % 10) + + return ''.join(str(digit) for digit in digits) diff --git a/src/libs/faker/providers/ssn/zh_CN/__init__.py b/src/libs/faker/providers/ssn/zh_CN/__init__.py new file mode 100644 index 0000000..e785f47 --- /dev/null +++ b/src/libs/faker/providers/ssn/zh_CN/__init__.py @@ -0,0 +1,372 @@ +from __future__ import unicode_literals +from .. import Provider as SsnProvider +import datetime + + +class Provider(SsnProvider): + # Extracted from http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html + area_codes = ["110000", "110100", "110101", "110102", "110105", "110106", "110107", "110108", "110109", "110111", + "110112", "110113", "110114", "110115", "110116", "110117", "110200", "110228", "110229", "120000", + "120100", "120101", "120102", "120103", "120104", "120105", "120106", "120110", "120111", "120112", + "120113", "120114", "120115", "120116", "120200", "120221", "120223", "120225", "130000", "130100", + "130101", "130102", "130104", "130105", "130107", "130108", "130109", "130110", "130111", "130121", + "130123", "130125", "130126", "130127", "130128", "130129", "130130", "130131", "130132", "130133", + "130181", "130183", "130184", "130200", "130201", "130202", "130203", "130204", "130205", "130207", + "130208", "130209", "130223", "130224", "130225", "130227", "130229", "130281", "130283", "130300", + "130301", "130302", "130303", "130304", "130321", "130322", "130323", "130324", "130400", "130401", + "130402", "130403", "130404", "130406", "130421", "130423", "130424", "130425", "130426", "130427", + "130428", "130429", "130430", "130431", "130432", "130433", "130434", "130435", "130481", "130500", + "130501", "130502", "130503", "130521", "130522", "130523", "130524", "130525", "130526", "130527", + "130528", "130529", "130530", "130531", "130532", "130533", "130534", "130535", "130581", "130582", + "130600", "130601", "130602", "130603", "130604", "130621", "130622", "130623", "130624", "130625", + "130626", "130627", "130628", "130629", "130630", "130631", "130632", "130633", "130634", "130635", + "130636", "130637", "130638", "130681", "130682", "130683", "130684", "130700", "130701", "130702", + "130703", "130705", "130706", "130721", "130722", "130723", "130724", "130725", "130726", "130727", + "130728", "130729", "130730", "130731", "130732", "130733", "130800", "130801", "130802", "130803", + "130804", "130821", "130822", "130823", "130824", "130825", "130826", "130827", "130828", "130900", + "130901", "130902", "130903", "130921", "130922", "130923", "130924", "130925", "130926", "130927", + "130928", "130929", "130930", "130981", "130982", "130983", "130984", "131000", "131001", "131002", + "131003", "131022", "131023", "131024", "131025", "131026", "131028", "131081", "131082", "131100", + "131101", "131102", "131121", "131122", "131123", "131124", "131125", "131126", "131127", "131128", + "131181", "131182", "140000", "140100", "140101", "140105", "140106", "140107", "140108", "140109", + "140110", "140121", "140122", "140123", "140181", "140200", "140201", "140202", "140203", "140211", + "140212", "140221", "140222", "140223", "140224", "140225", "140226", "140227", "140300", "140301", + "140302", "140303", "140311", "140321", "140322", "140400", "140401", "140402", "140411", "140421", + "140423", "140424", "140425", "140426", "140427", "140428", "140429", "140430", "140431", "140481", + "140500", "140501", "140502", "140521", "140522", "140524", "140525", "140581", "140600", "140601", + "140602", "140603", "140621", "140622", "140623", "140624", "140700", "140701", "140702", "140721", + "140722", "140723", "140724", "140725", "140726", "140727", "140728", "140729", "140781", "140800", + "140801", "140802", "140821", "140822", "140823", "140824", "140825", "140826", "140827", "140828", + "140829", "140830", "140881", "140882", "140900", "140901", "140902", "140921", "140922", "140923", + "140924", "140925", "140926", "140927", "140928", "140929", "140930", "140931", "140932", "140981", + "141000", "141001", "141002", "141021", "141022", "141023", "141024", "141025", "141026", "141027", + "141028", "141029", "141030", "141031", "141032", "141033", "141034", "141081", "141082", "141100", + "141101", "141102", "141121", "141122", "141123", "141124", "141125", "141126", "141127", "141128", + "141129", "141130", "141181", "141182", "150000", "150100", "150101", "150102", "150103", "150104", + "150105", "150121", "150122", "150123", "150124", "150125", "150200", "150201", "150202", "150203", + "150204", "150205", "150206", "150207", "150221", "150222", "150223", "150300", "150301", "150302", + "150303", "150304", "150400", "150401", "150402", "150403", "150404", "150421", "150422", "150423", + "150424", "150425", "150426", "150428", "150429", "150430", "150500", "150501", "150502", "150521", + "150522", "150523", "150524", "150525", "150526", "150581", "150600", "150601", "150602", "150621", + "150622", "150623", "150624", "150625", "150626", "150627", "150700", "150701", "150702", "150703", + "150721", "150722", "150723", "150724", "150725", "150726", "150727", "150781", "150782", "150783", + "150784", "150785", "150800", "150801", "150802", "150821", "150822", "150823", "150824", "150825", + "150826", "150900", "150901", "150902", "150921", "150922", "150923", "150924", "150925", "150926", + "150927", "150928", "150929", "150981", "152200", "152201", "152202", "152221", "152222", "152223", + "152224", "152500", "152501", "152502", "152522", "152523", "152524", "152525", "152526", "152527", + "152528", "152529", "152530", "152531", "152900", "152921", "152922", "152923", "210000", "210100", + "210101", "210102", "210103", "210104", "210105", "210106", "210111", "210112", "210113", "210114", + "210122", "210123", "210124", "210181", "210200", "210201", "210202", "210203", "210204", "210211", + "210212", "210213", "210224", "210281", "210282", "210283", "210300", "210301", "210302", "210303", + "210304", "210311", "210321", "210323", "210381", "210400", "210401", "210402", "210403", "210404", + "210411", "210421", "210422", "210423", "210500", "210501", "210502", "210503", "210504", "210505", + "210521", "210522", "210600", "210601", "210602", "210603", "210604", "210624", "210681", "210682", + "210700", "210701", "210702", "210703", "210711", "210726", "210727", "210781", "210782", "210800", + "210801", "210802", "210803", "210804", "210811", "210881", "210882", "210900", "210901", "210902", + "210903", "210904", "210905", "210911", "210921", "210922", "211000", "211001", "211002", "211003", + "211004", "211005", "211011", "211021", "211081", "211100", "211101", "211102", "211103", "211121", + "211122", "211200", "211201", "211202", "211204", "211221", "211223", "211224", "211281", "211282", + "211300", "211301", "211302", "211303", "211321", "211322", "211324", "211381", "211382", "211400", + "211401", "211402", "211403", "211404", "211421", "211422", "211481", "220000", "220100", "220101", + "220102", "220103", "220104", "220105", "220106", "220112", "220113", "220122", "220182", "220183", + "220200", "220201", "220202", "220203", "220204", "220211", "220221", "220281", "220282", "220283", + "220284", "220300", "220301", "220302", "220303", "220322", "220323", "220381", "220382", "220400", + "220401", "220402", "220403", "220421", "220422", "220500", "220501", "220502", "220503", "220521", + "220523", "220524", "220581", "220582", "220600", "220601", "220602", "220605", "220621", "220622", + "220623", "220681", "220700", "220701", "220702", "220721", "220722", "220723", "220781", "220800", + "220801", "220802", "220821", "220822", "220881", "220882", "222400", "222401", "222402", "222403", + "222404", "222405", "222406", "222424", "222426", "230000", "230100", "230101", "230102", "230103", + "230104", "230108", "230109", "230110", "230111", "230112", "230123", "230124", "230125", "230126", + "230127", "230128", "230129", "230182", "230183", "230184", "230200", "230201", "230202", "230203", + "230204", "230205", "230206", "230207", "230208", "230221", "230223", "230224", "230225", "230227", + "230229", "230230", "230231", "230281", "230300", "230301", "230302", "230303", "230304", "230305", + "230306", "230307", "230321", "230381", "230382", "230400", "230401", "230402", "230403", "230404", + "230405", "230406", "230407", "230421", "230422", "230500", "230501", "230502", "230503", "230505", + "230506", "230521", "230522", "230523", "230524", "230600", "230601", "230602", "230603", "230604", + "230605", "230606", "230621", "230622", "230623", "230624", "230700", "230701", "230702", "230703", + "230704", "230705", "230706", "230707", "230708", "230709", "230710", "230711", "230712", "230713", + "230714", "230715", "230716", "230722", "230781", "230800", "230801", "230803", "230804", "230805", + "230811", "230822", "230826", "230828", "230833", "230881", "230882", "230900", "230901", "230902", + "230903", "230904", "230921", "231000", "231001", "231002", "231003", "231004", "231005", "231024", + "231025", "231081", "231083", "231084", "231085", "231100", "231101", "231102", "231121", "231123", + "231124", "231181", "231182", "231200", "231201", "231202", "231221", "231222", "231223", "231224", + "231225", "231226", "231281", "231282", "231283", "232700", "232721", "232722", "232723", "310000", + "310100", "310101", "310104", "310105", "310106", "310107", "310108", "310109", "310110", "310112", + "310113", "310114", "310115", "310116", "310117", "310118", "310120", "310200", "310230", "320000", + "320100", "320101", "320102", "320104", "320105", "320106", "320111", "320113", "320114", "320115", + "320116", "320117", "320118", "320200", "320201", "320202", "320203", "320204", "320205", "320206", + "320211", "320281", "320282", "320300", "320301", "320302", "320303", "320305", "320311", "320312", + "320321", "320322", "320324", "320381", "320382", "320400", "320401", "320402", "320404", "320405", + "320411", "320412", "320481", "320482", "320500", "320501", "320505", "320506", "320507", "320508", + "320509", "320581", "320582", "320583", "320585", "320600", "320601", "320602", "320611", "320612", + "320621", "320623", "320681", "320682", "320684", "320700", "320701", "320703", "320706", "320707", + "320722", "320723", "320724", "320800", "320801", "320802", "320803", "320804", "320811", "320826", + "320829", "320830", "320831", "320900", "320901", "320902", "320903", "320921", "320922", "320923", + "320924", "320925", "320981", "320982", "321000", "321001", "321002", "321003", "321012", "321023", + "321081", "321084", "321100", "321101", "321102", "321111", "321112", "321181", "321182", "321183", + "321200", "321201", "321202", "321203", "321204", "321281", "321282", "321283", "321300", "321301", + "321302", "321311", "321322", "321323", "321324", "330000", "330100", "330101", "330102", "330103", + "330104", "330105", "330106", "330108", "330109", "330110", "330122", "330127", "330182", "330183", + "330185", "330200", "330201", "330203", "330204", "330205", "330206", "330211", "330212", "330225", + "330226", "330281", "330282", "330283", "330300", "330301", "330302", "330303", "330304", "330322", + "330324", "330326", "330327", "330328", "330329", "330381", "330382", "330400", "330401", "330402", + "330411", "330421", "330424", "330481", "330482", "330483", "330500", "330501", "330502", "330503", + "330521", "330522", "330523", "330600", "330601", "330602", "330603", "330604", "330624", "330681", + "330683", "330700", "330701", "330702", "330703", "330723", "330726", "330727", "330781", "330782", + "330783", "330784", "330800", "330801", "330802", "330803", "330822", "330824", "330825", "330881", + "330900", "330901", "330902", "330903", "330921", "330922", "331000", "331001", "331002", "331003", + "331004", "331021", "331022", "331023", "331024", "331081", "331082", "331100", "331101", "331102", + "331121", "331122", "331123", "331124", "331125", "331126", "331127", "331181", "340000", "340100", + "340101", "340102", "340103", "340104", "340111", "340121", "340122", "340123", "340124", "340181", + "340200", "340201", "340202", "340203", "340207", "340208", "340221", "340222", "340223", "340225", + "340300", "340301", "340302", "340303", "340304", "340311", "340321", "340322", "340323", "340400", + "340401", "340402", "340403", "340404", "340405", "340406", "340421", "340500", "340501", "340503", + "340504", "340506", "340521", "340522", "340523", "340600", "340601", "340602", "340603", "340604", + "340621", "340700", "340701", "340702", "340703", "340711", "340721", "340800", "340801", "340802", + "340803", "340811", "340822", "340823", "340824", "340825", "340826", "340827", "340828", "340881", + "341000", "341001", "341002", "341003", "341004", "341021", "341022", "341023", "341024", "341100", + "341101", "341102", "341103", "341122", "341124", "341125", "341126", "341181", "341182", "341200", + "341201", "341202", "341203", "341204", "341221", "341222", "341225", "341226", "341282", "341300", + "341301", "341302", "341321", "341322", "341323", "341324", "341500", "341501", "341502", "341503", + "341521", "341522", "341523", "341524", "341525", "341600", "341601", "341602", "341621", "341622", + "341623", "341700", "341701", "341702", "341721", "341722", "341723", "341800", "341801", "341802", + "341821", "341822", "341823", "341824", "341825", "341881", "350000", "350100", "350101", "350102", + "350103", "350104", "350105", "350111", "350121", "350122", "350123", "350124", "350125", "350128", + "350181", "350182", "350200", "350201", "350203", "350205", "350206", "350211", "350212", "350213", + "350300", "350301", "350302", "350303", "350304", "350305", "350322", "350400", "350401", "350402", + "350403", "350421", "350423", "350424", "350425", "350426", "350427", "350428", "350429", "350430", + "350481", "350500", "350501", "350502", "350503", "350504", "350505", "350521", "350524", "350525", + "350526", "350527", "350581", "350582", "350583", "350600", "350601", "350602", "350603", "350622", + "350623", "350624", "350625", "350626", "350627", "350628", "350629", "350681", "350700", "350701", + "350702", "350721", "350722", "350723", "350724", "350725", "350781", "350782", "350783", "350784", + "350800", "350801", "350802", "350821", "350822", "350823", "350824", "350825", "350881", "350900", + "350901", "350902", "350921", "350922", "350923", "350924", "350925", "350926", "350981", "350982", + "360000", "360100", "360101", "360102", "360103", "360104", "360105", "360111", "360121", "360122", + "360123", "360124", "360200", "360201", "360202", "360203", "360222", "360281", "360300", "360301", + "360302", "360313", "360321", "360322", "360323", "360400", "360401", "360402", "360403", "360421", + "360423", "360424", "360425", "360426", "360427", "360428", "360429", "360430", "360481", "360482", + "360500", "360501", "360502", "360521", "360600", "360601", "360602", "360622", "360681", "360700", + "360701", "360702", "360703", "360721", "360722", "360723", "360724", "360725", "360726", "360727", + "360728", "360729", "360730", "360731", "360732", "360733", "360734", "360735", "360781", "360800", + "360801", "360802", "360803", "360821", "360822", "360823", "360824", "360825", "360826", "360827", + "360828", "360829", "360830", "360881", "360900", "360901", "360902", "360921", "360922", "360923", + "360924", "360925", "360926", "360981", "360982", "360983", "361000", "361001", "361002", "361021", + "361022", "361023", "361024", "361025", "361026", "361027", "361028", "361029", "361030", "361100", + "361101", "361102", "361121", "361122", "361123", "361124", "361125", "361126", "361127", "361128", + "361129", "361130", "361181", "370000", "370100", "370101", "370102", "370103", "370104", "370105", + "370112", "370113", "370124", "370125", "370126", "370181", "370200", "370201", "370202", "370203", + "370211", "370212", "370213", "370214", "370281", "370282", "370283", "370285", "370300", "370301", + "370302", "370303", "370304", "370305", "370306", "370321", "370322", "370323", "370400", "370401", + "370402", "370403", "370404", "370405", "370406", "370481", "370500", "370501", "370502", "370503", + "370521", "370522", "370523", "370600", "370601", "370602", "370611", "370612", "370613", "370634", + "370681", "370682", "370683", "370684", "370685", "370686", "370687", "370700", "370701", "370702", + "370703", "370704", "370705", "370724", "370725", "370781", "370782", "370783", "370784", "370785", + "370786", "370800", "370801", "370811", "370812", "370826", "370827", "370828", "370829", "370830", + "370831", "370832", "370881", "370883", "370900", "370901", "370902", "370911", "370921", "370923", + "370982", "370983", "371000", "371001", "371002", "371003", "371082", "371083", "371100", "371101", + "371102", "371103", "371121", "371122", "371200", "371201", "371202", "371203", "371300", "371301", + "371302", "371311", "371312", "371321", "371322", "371323", "371324", "371325", "371326", "371327", + "371328", "371329", "371400", "371401", "371402", "371403", "371422", "371423", "371424", "371425", + "371426", "371427", "371428", "371481", "371482", "371500", "371501", "371502", "371521", "371522", + "371523", "371524", "371525", "371526", "371581", "371600", "371601", "371602", "371603", "371621", + "371622", "371623", "371625", "371626", "371700", "371701", "371702", "371721", "371722", "371723", + "371724", "371725", "371726", "371727", "371728", "410000", "410100", "410101", "410102", "410103", + "410104", "410105", "410106", "410108", "410122", "410181", "410182", "410183", "410184", "410185", + "410200", "410201", "410202", "410203", "410204", "410205", "410211", "410221", "410222", "410223", + "410224", "410225", "410300", "410301", "410302", "410303", "410304", "410305", "410306", "410311", + "410322", "410323", "410324", "410325", "410326", "410327", "410328", "410329", "410381", "410400", + "410401", "410402", "410403", "410404", "410411", "410421", "410422", "410423", "410425", "410481", + "410482", "410500", "410501", "410502", "410503", "410505", "410506", "410522", "410523", "410526", + "410527", "410581", "410600", "410601", "410602", "410603", "410611", "410621", "410622", "410700", + "410701", "410702", "410703", "410704", "410711", "410721", "410724", "410725", "410726", "410727", + "410728", "410781", "410782", "410800", "410801", "410802", "410803", "410804", "410811", "410821", + "410822", "410823", "410825", "410882", "410883", "410900", "410901", "410902", "410922", "410923", + "410926", "410927", "410928", "411000", "411001", "411002", "411023", "411024", "411025", "411081", + "411082", "411100", "411101", "411102", "411103", "411104", "411121", "411122", "411200", "411201", + "411202", "411221", "411222", "411224", "411281", "411282", "411300", "411301", "411302", "411303", + "411321", "411322", "411323", "411324", "411325", "411326", "411327", "411328", "411329", "411330", + "411381", "411400", "411401", "411402", "411403", "411421", "411422", "411423", "411424", "411425", + "411426", "411481", "411500", "411501", "411502", "411503", "411521", "411522", "411523", "411524", + "411525", "411526", "411527", "411528", "411600", "411601", "411602", "411621", "411622", "411623", + "411624", "411625", "411626", "411627", "411628", "411681", "411700", "411701", "411702", "411721", + "411722", "411723", "411724", "411725", "411726", "411727", "411728", "411729", "419000", "419001", + "420000", "420100", "420101", "420102", "420103", "420104", "420105", "420106", "420107", "420111", + "420112", "420113", "420114", "420115", "420116", "420117", "420200", "420201", "420202", "420203", + "420204", "420205", "420222", "420281", "420300", "420301", "420302", "420303", "420304", "420322", + "420323", "420324", "420325", "420381", "420500", "420501", "420502", "420503", "420504", "420505", + "420506", "420525", "420526", "420527", "420528", "420529", "420581", "420582", "420583", "420600", + "420601", "420602", "420606", "420607", "420624", "420625", "420626", "420682", "420683", "420684", + "420700", "420701", "420702", "420703", "420704", "420800", "420801", "420802", "420804", "420821", + "420822", "420881", "420900", "420901", "420902", "420921", "420922", "420923", "420981", "420982", + "420984", "421000", "421001", "421002", "421003", "421022", "421023", "421024", "421081", "421083", + "421087", "421100", "421101", "421102", "421121", "421122", "421123", "421124", "421125", "421126", + "421127", "421181", "421182", "421200", "421201", "421202", "421221", "421222", "421223", "421224", + "421281", "421300", "421301", "421303", "421321", "421381", "422800", "422801", "422802", "422822", + "422823", "422825", "422826", "422827", "422828", "429000", "429004", "429005", "429006", "429021", + "430000", "430100", "430101", "430102", "430103", "430104", "430105", "430111", "430112", "430121", + "430124", "430181", "430200", "430201", "430202", "430203", "430204", "430211", "430221", "430223", + "430224", "430225", "430281", "430300", "430301", "430302", "430304", "430321", "430381", "430382", + "430400", "430401", "430405", "430406", "430407", "430408", "430412", "430421", "430422", "430423", + "430424", "430426", "430481", "430482", "430500", "430501", "430502", "430503", "430511", "430521", + "430522", "430523", "430524", "430525", "430527", "430528", "430529", "430581", "430600", "430601", + "430602", "430603", "430611", "430621", "430623", "430624", "430626", "430681", "430682", "430700", + "430701", "430702", "430703", "430721", "430722", "430723", "430724", "430725", "430726", "430781", + "430800", "430801", "430802", "430811", "430821", "430822", "430900", "430901", "430902", "430903", + "430921", "430922", "430923", "430981", "431000", "431001", "431002", "431003", "431021", "431022", + "431023", "431024", "431025", "431026", "431027", "431028", "431081", "431100", "431101", "431102", + "431103", "431121", "431122", "431123", "431124", "431125", "431126", "431127", "431128", "431129", + "431200", "431201", "431202", "431221", "431222", "431223", "431224", "431225", "431226", "431227", + "431228", "431229", "431230", "431281", "431300", "431301", "431302", "431321", "431322", "431381", + "431382", "433100", "433101", "433122", "433123", "433124", "433125", "433126", "433127", "433130", + "440000", "440100", "440101", "440103", "440104", "440105", "440106", "440111", "440112", "440113", + "440114", "440115", "440116", "440117", "440118", "440200", "440201", "440203", "440204", "440205", + "440222", "440224", "440229", "440232", "440233", "440281", "440282", "440300", "440301", "440303", + "440304", "440305", "440306", "440307", "440308", "440400", "440401", "440402", "440403", "440404", + "440500", "440501", "440507", "440511", "440512", "440513", "440514", "440515", "440523", "440600", + "440601", "440604", "440605", "440606", "440607", "440608", "440700", "440701", "440703", "440704", + "440705", "440781", "440783", "440784", "440785", "440800", "440801", "440802", "440803", "440804", + "440811", "440823", "440825", "440881", "440882", "440883", "440900", "440901", "440902", "440904", + "440981", "440982", "440983", "441200", "441201", "441202", "441203", "441223", "441224", "441225", + "441226", "441283", "441284", "441300", "441301", "441302", "441303", "441322", "441323", "441324", + "441400", "441401", "441402", "441403", "441422", "441423", "441424", "441426", "441427", "441481", + "441500", "441501", "441502", "441521", "441523", "441581", "441600", "441601", "441602", "441621", + "441622", "441623", "441624", "441625", "441700", "441701", "441702", "441721", "441723", "441781", + "441800", "441801", "441802", "441803", "441821", "441823", "441825", "441826", "441881", "441882", + "441900", "442000", "445100", "445101", "445102", "445103", "445122", "445200", "445201", "445202", + "445203", "445222", "445224", "445281", "445300", "445301", "445302", "445303", "445321", "445322", + "445381", "450000", "450100", "450101", "450102", "450103", "450105", "450107", "450108", "450109", + "450122", "450123", "450124", "450125", "450126", "450127", "450200", "450201", "450202", "450203", + "450204", "450205", "450221", "450222", "450223", "450224", "450225", "450226", "450300", "450301", + "450302", "450303", "450304", "450305", "450311", "450312", "450321", "450323", "450324", "450325", + "450326", "450327", "450328", "450329", "450330", "450331", "450332", "450400", "450401", "450403", + "450405", "450406", "450421", "450422", "450423", "450481", "450500", "450501", "450502", "450503", + "450512", "450521", "450600", "450601", "450602", "450603", "450621", "450681", "450700", "450701", + "450702", "450703", "450721", "450722", "450800", "450801", "450802", "450803", "450804", "450821", + "450881", "450900", "450901", "450902", "450903", "450921", "450922", "450923", "450924", "450981", + "451000", "451001", "451002", "451021", "451022", "451023", "451024", "451025", "451026", "451027", + "451028", "451029", "451030", "451031", "451100", "451101", "451102", "451121", "451122", "451123", + "451200", "451201", "451202", "451221", "451222", "451223", "451224", "451225", "451226", "451227", + "451228", "451229", "451281", "451300", "451301", "451302", "451321", "451322", "451323", "451324", + "451381", "451400", "451401", "451402", "451421", "451422", "451423", "451424", "451425", "451481", + "460000", "460100", "460101", "460105", "460106", "460107", "460108", "460200", "460201", "460202", + "460203", "460204", "460205", "460300", "469000", "469001", "469002", "469003", "469005", "469006", + "469007", "469021", "469022", "469023", "469024", "469025", "469026", "469027", "469028", "469029", + "469030", "500000", "500100", "500101", "500102", "500103", "500104", "500105", "500106", "500107", + "500108", "500109", "500110", "500111", "500112", "500113", "500114", "500115", "500116", "500117", + "500118", "500119", "500120", "500151", "500200", "500223", "500226", "500228", "500229", "500230", + "500231", "500232", "500233", "500234", "500235", "500236", "500237", "500238", "500240", "500241", + "500242", "500243", "510000", "510100", "510101", "510104", "510105", "510106", "510107", "510108", + "510112", "510113", "510114", "510115", "510121", "510122", "510124", "510129", "510131", "510132", + "510181", "510182", "510183", "510184", "510300", "510301", "510302", "510303", "510304", "510311", + "510321", "510322", "510400", "510401", "510402", "510403", "510411", "510421", "510422", "510500", + "510501", "510502", "510503", "510504", "510521", "510522", "510524", "510525", "510600", "510601", + "510603", "510623", "510626", "510681", "510682", "510683", "510700", "510701", "510703", "510704", + "510722", "510723", "510724", "510725", "510726", "510727", "510781", "510800", "510801", "510802", + "510811", "510812", "510821", "510822", "510823", "510824", "510900", "510901", "510903", "510904", + "510921", "510922", "510923", "511000", "511001", "511002", "511011", "511024", "511025", "511028", + "511100", "511101", "511102", "511111", "511112", "511113", "511123", "511124", "511126", "511129", + "511132", "511133", "511181", "511300", "511301", "511302", "511303", "511304", "511321", "511322", + "511323", "511324", "511325", "511381", "511400", "511401", "511402", "511421", "511422", "511423", + "511424", "511425", "511500", "511501", "511502", "511503", "511521", "511523", "511524", "511525", + "511526", "511527", "511528", "511529", "511600", "511601", "511602", "511603", "511621", "511622", + "511623", "511681", "511700", "511701", "511702", "511703", "511722", "511723", "511724", "511725", + "511781", "511800", "511801", "511802", "511803", "511822", "511823", "511824", "511825", "511826", + "511827", "511900", "511901", "511902", "511903", "511921", "511922", "511923", "512000", "512001", + "512002", "512021", "512022", "512081", "513200", "513221", "513222", "513223", "513224", "513225", + "513226", "513227", "513228", "513229", "513230", "513231", "513232", "513233", "513300", "513321", + "513322", "513323", "513324", "513325", "513326", "513327", "513328", "513329", "513330", "513331", + "513332", "513333", "513334", "513335", "513336", "513337", "513338", "513400", "513401", "513422", + "513423", "513424", "513425", "513426", "513427", "513428", "513429", "513430", "513431", "513432", + "513433", "513434", "513435", "513436", "513437", "520000", "520100", "520101", "520102", "520103", + "520111", "520112", "520113", "520115", "520121", "520122", "520123", "520181", "520200", "520201", + "520203", "520221", "520222", "520300", "520301", "520302", "520303", "520321", "520322", "520323", + "520324", "520325", "520326", "520327", "520328", "520329", "520330", "520381", "520382", "520400", + "520401", "520402", "520421", "520422", "520423", "520424", "520425", "520500", "520501", "520502", + "520521", "520522", "520523", "520524", "520525", "520526", "520527", "520600", "520601", "520602", + "520603", "520621", "520622", "520623", "520624", "520625", "520626", "520627", "520628", "522300", + "522301", "522322", "522323", "522324", "522325", "522326", "522327", "522328", "522600", "522601", + "522622", "522623", "522624", "522625", "522626", "522627", "522628", "522629", "522630", "522631", + "522632", "522633", "522634", "522635", "522636", "522700", "522701", "522702", "522722", "522723", + "522725", "522726", "522727", "522728", "522729", "522730", "522731", "522732", "530000", "530100", + "530101", "530102", "530103", "530111", "530112", "530113", "530114", "530122", "530124", "530125", + "530126", "530127", "530128", "530129", "530181", "530300", "530301", "530302", "530321", "530322", + "530323", "530324", "530325", "530326", "530328", "530381", "530400", "530401", "530402", "530421", + "530422", "530423", "530424", "530425", "530426", "530427", "530428", "530500", "530501", "530502", + "530521", "530522", "530523", "530524", "530600", "530601", "530602", "530621", "530622", "530623", + "530624", "530625", "530626", "530627", "530628", "530629", "530630", "530700", "530701", "530702", + "530721", "530722", "530723", "530724", "530800", "530801", "530802", "530821", "530822", "530823", + "530824", "530825", "530826", "530827", "530828", "530829", "530900", "530901", "530902", "530921", + "530922", "530923", "530924", "530925", "530926", "530927", "532300", "532301", "532322", "532323", + "532324", "532325", "532326", "532327", "532328", "532329", "532331", "532500", "532501", "532502", + "532503", "532504", "532523", "532524", "532525", "532527", "532528", "532529", "532530", "532531", + "532532", "532600", "532601", "532622", "532623", "532624", "532625", "532626", "532627", "532628", + "532800", "532801", "532822", "532823", "532900", "532901", "532922", "532923", "532924", "532925", + "532926", "532927", "532928", "532929", "532930", "532931", "532932", "533100", "533102", "533103", + "533122", "533123", "533124", "533300", "533321", "533323", "533324", "533325", "533400", "533421", + "533422", "533423", "540000", "540100", "540101", "540102", "540121", "540122", "540123", "540124", + "540125", "540126", "540127", "540200", "540202", "540221", "540222", "540223", "540224", "540225", + "540226", "540227", "540228", "540229", "540230", "540231", "540232", "540233", "540234", "540235", + "540236", "540237", "542100", "542121", "542122", "542123", "542124", "542125", "542126", "542127", + "542128", "542129", "542132", "542133", "542200", "542221", "542222", "542223", "542224", "542225", + "542226", "542227", "542228", "542229", "542231", "542232", "542233", "542400", "542421", "542422", + "542423", "542424", "542425", "542426", "542427", "542428", "542429", "542430", "542431", "542500", + "542521", "542522", "542523", "542524", "542525", "542526", "542527", "542600", "542621", "542622", + "542623", "542624", "542625", "542626", "542627", "610000", "610100", "610101", "610102", "610103", + "610104", "610111", "610112", "610113", "610114", "610115", "610116", "610122", "610124", "610125", + "610126", "610200", "610201", "610202", "610203", "610204", "610222", "610300", "610301", "610302", + "610303", "610304", "610322", "610323", "610324", "610326", "610327", "610328", "610329", "610330", + "610331", "610400", "610401", "610402", "610403", "610404", "610422", "610423", "610424", "610425", + "610426", "610427", "610428", "610429", "610430", "610431", "610481", "610500", "610501", "610502", + "610521", "610522", "610523", "610524", "610525", "610526", "610527", "610528", "610581", "610582", + "610600", "610601", "610602", "610621", "610622", "610623", "610624", "610625", "610626", "610627", + "610628", "610629", "610630", "610631", "610632", "610700", "610701", "610702", "610721", "610722", + "610723", "610724", "610725", "610726", "610727", "610728", "610729", "610730", "610800", "610801", + "610802", "610821", "610822", "610823", "610824", "610825", "610826", "610827", "610828", "610829", + "610830", "610831", "610900", "610901", "610902", "610921", "610922", "610923", "610924", "610925", + "610926", "610927", "610928", "610929", "611000", "611001", "611002", "611021", "611022", "611023", + "611024", "611025", "611026", "620000", "620100", "620101", "620102", "620103", "620104", "620105", + "620111", "620121", "620122", "620123", "620200", "620201", "620300", "620301", "620302", "620321", + "620400", "620401", "620402", "620403", "620421", "620422", "620423", "620500", "620501", "620502", + "620503", "620521", "620522", "620523", "620524", "620525", "620600", "620601", "620602", "620621", + "620622", "620623", "620700", "620701", "620702", "620721", "620722", "620723", "620724", "620725", + "620800", "620801", "620802", "620821", "620822", "620823", "620824", "620825", "620826", "620900", + "620901", "620902", "620921", "620922", "620923", "620924", "620981", "620982", "621000", "621001", + "621002", "621021", "621022", "621023", "621024", "621025", "621026", "621027", "621100", "621101", + "621102", "621121", "621122", "621123", "621124", "621125", "621126", "621200", "621201", "621202", + "621221", "621222", "621223", "621224", "621225", "621226", "621227", "621228", "622900", "622901", + "622921", "622922", "622923", "622924", "622925", "622926", "622927", "623000", "623001", "623021", + "623022", "623023", "623024", "623025", "623026", "623027", "630000", "630100", "630101", "630102", + "630103", "630104", "630105", "630121", "630122", "630123", "630200", "630202", "630221", "630222", + "630223", "630224", "630225", "632200", "632221", "632222", "632223", "632224", "632300", "632321", + "632322", "632323", "632324", "632500", "632521", "632522", "632523", "632524", "632525", "632600", + "632621", "632622", "632623", "632624", "632625", "632626", "632700", "632701", "632722", "632723", + "632724", "632725", "632726", "632800", "632801", "632802", "632821", "632822", "632823", "640000", + "640100", "640101", "640104", "640105", "640106", "640121", "640122", "640181", "640200", "640201", + "640202", "640205", "640221", "640300", "640301", "640302", "640303", "640323", "640324", "640381", + "640400", "640401", "640402", "640422", "640423", "640424", "640425", "640500", "640501", "640502", + "640521", "640522", "650000", "650100", "650101", "650102", "650103", "650104", "650105", "650106", + "650107", "650109", "650121", "650200", "650201", "650202", "650203", "650204", "650205", "652100", + "652101", "652122", "652123", "652200", "652201", "652222", "652223", "652300", "652301", "652302", + "652323", "652324", "652325", "652327", "652328", "652700", "652701", "652702", "652722", "652723", + "652800", "652801", "652822", "652823", "652824", "652825", "652826", "652827", "652828", "652829", + "652900", "652901", "652922", "652923", "652924", "652925", "652926", "652927", "652928", "652929", + "653000", "653001", "653022", "653023", "653024", "653100", "653101", "653121", "653122", "653123", + "653124", "653125", "653126", "653127", "653128", "653129", "653130", "653131", "653200", "653201", + "653221", "653222", "653223", "653224", "653225", "653226", "653227", "654000", "654002", "654003", + "654021", "654022", "654023", "654024", "654025", "654026", "654027", "654028", "654200", "654201", + "654202", "654221", "654223", "654224", "654225", "654226", "654300", "654301", "654321", "654322", + "654323", "654324", "654325", "654326", "659000", "659001", "659002", "659003", "659004", "710000", + "810000", "820000"] + + def ssn(self): + def checksum(s): + return str((1 - 2 * int(s, 13)) % 11).replace('10', 'X') + + min_age = 18 * 365 + max_age = 90 * 365 + age = datetime.timedelta(days=self.random_int(min_age, max_age)) + birthday = datetime.date.today() - age + birthday_str = birthday.strftime('%Y%m%d') + + ssn_without_checksum = self.numerify(self.random_element(self.area_codes) + birthday_str + "###") + return ssn_without_checksum + checksum(ssn_without_checksum) diff --git a/src/libs/faker/providers/ssn/zh_TW/__init__.py b/src/libs/faker/providers/ssn/zh_TW/__init__.py new file mode 100644 index 0000000..3eec5bd --- /dev/null +++ b/src/libs/faker/providers/ssn/zh_TW/__init__.py @@ -0,0 +1,10 @@ +# coding=utf-8 +from __future__ import unicode_literals +from .. import Provider as SsnProvider + + +class Provider(SsnProvider): + ssn_formats = ("?#########",) + + def ssn(self): + return self.bothify(self.random_element(self.ssn_formats)).upper() diff --git a/src/libs/faker/providers/user_agent/__init__.py b/src/libs/faker/providers/user_agent/__init__.py new file mode 100644 index 0000000..69fbb4b --- /dev/null +++ b/src/libs/faker/providers/user_agent/__init__.py @@ -0,0 +1,163 @@ +# coding=utf-8 + +from __future__ import unicode_literals + +from datetime import datetime + +from .. import BaseProvider + + +class Provider(BaseProvider): + user_agents = ( + 'chrome', 'firefox', 'internet_explorer', 'opera', 'safari', + ) + + windows_platform_tokens = ( + 'Windows 95', 'Windows 98', 'Windows 98; Win 9x 4.90', 'Windows CE', + 'Windows NT 4.0', 'Windows NT 5.0', 'Windows NT 5.01', + 'Windows NT 5.1', 'Windows NT 5.2', 'Windows NT 6.0', 'Windows NT 6.1', + 'Windows NT 6.2', + ) + + linux_processors = ('i686', 'x86_64',) + + mac_processors = ('Intel', 'PPC', 'U; Intel', 'U; PPC',) + + def mac_processor(self): + return self.random_element(self.mac_processors) + + def linux_processor(self): + return self.random_element(self.linux_processors) + + def user_agent(self): + name = self.random_element(self.user_agents) + return getattr(self, name)() + + def chrome(self): + saf = str(self.generator.random.randint(531, 536)) + str(self.generator.random.randint(0, 2)) + tmplt = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \ + ' Chrome/{2}.0.{3}.0 Safari/{4}' + platforms = ( + tmplt.format(self.linux_platform_token(), + saf, + self.generator.random.randint(13, 15), + self.generator.random.randint(800, 899), + saf), + tmplt.format(self.windows_platform_token(), + saf, + self.generator.random.randint(13, 15), + self.generator.random.randint(800, 899), + saf), + tmplt.format(self.mac_platform_token(), + saf, + self.generator.random.randint(13, 15), + self.generator.random.randint(800, 899), + saf), + ) + + return 'Mozilla/5.0 ' + self.random_element(platforms) + + def firefox(self): + ver = ( + 'Gecko/{0} Firefox/{1}.0'.format( + self.generator.date_time_between( + datetime(2011, 1, 1)), self.generator.random.randint(4, 15)), + 'Gecko/{0} Firefox/3.6.{1}'.format( + self.generator.date_time_between( + datetime(2010, 1, 1)), self.generator.random.randint(1, 20)), + 'Gecko/{0} Firefox/3.8'.format( + self.generator.date_time_between( + datetime(2010, 1, 1)), ), + ) + tmplt_win = '({0}; {1}; rv:1.9.{2}.20) {3}' + tmplt_lin = '({0}; rv:1.9.{1}.20) {2}' + tmplt_mac = '({0}; rv:1.9.{1}.20) {2}' + platforms = ( + tmplt_win.format(self.windows_platform_token(), + self.generator.locale().replace('_', '-'), + self.generator.random.randint(0, 2), + self.generator.random.choice(ver)), + tmplt_lin.format(self.linux_platform_token(), + self.generator.random.randint(5, 7), + self.generator.random.choice(ver)), + tmplt_mac.format(self.mac_platform_token(), + self.generator.random.randint(2, 6), + self.generator.random.choice(ver)), + ) + + return 'Mozilla/5.0 ' + self.random_element(platforms) + + def safari(self): + saf = "{0}.{1}.{2}".format(self.generator.random.randint(531, 535), + self.generator.random.randint(1, 50), + self.generator.random.randint(1, 7)) + if not self.generator.random.getrandbits(1): + ver = "{0}.{1}".format(self.generator.random.randint(4, 5), + self.generator.random.randint(0, 1)) + else: + ver = "{0}.0.{1}".format(self.generator.random.randint(4, 5), + self.generator.random.randint(1, 5)) + tmplt_win = '(Windows; U; {0}) AppleWebKit/{1} (KHTML, like Gecko)' \ + ' Version/{2} Safari/{3}' + tmplt_mac = '({0} rv:{1}.0; {2}) AppleWebKit/{3} (KHTML, like Gecko)' \ + ' Version/{4} Safari/{5}' + tmplt_ipod = '(iPod; U; CPU iPhone OS {0}_{1} like Mac OS X; {2})' \ + ' AppleWebKit/{3} (KHTML, like Gecko) Version/{4}.0.5' \ + ' Mobile/8B{5} Safari/6{6}' + locale = self.generator.locale().replace('_', '-') + platforms = ( + tmplt_win.format(self.windows_platform_token(), + saf, + ver, + saf), + tmplt_mac.format(self.mac_platform_token(), + self.generator.random.randint(2, 6), + locale, + saf, + ver, + saf), + tmplt_ipod.format(self.generator.random.randint(3, 4), + self.generator.random.randint(0, 3), + locale, + saf, + self.generator.random.randint(3, 4), + self.generator.random.randint(111, 119), + saf), + ) + + return 'Mozilla/5.0 ' + self.random_element(platforms) + + def opera(self): + platform = '({0}; {1}) Presto/2.9.{2} Version/{3}.00'.format( + ( + self.linux_platform_token() if self.generator.random.getrandbits(1) + else self.windows_platform_token() + ), + self.generator.locale().replace('_', '-'), + self.generator.random.randint(160, 190), + self.generator.random.randint(10, 12), + ) + return 'Opera/{0}.{1}.{2}'.format( + self.generator.random.randint(8, 9), + self.generator.random.randint(10, 99), + platform, + ) + + def internet_explorer(self): + tmplt = 'Mozilla/5.0 (compatible; MSIE {0}.0; {1}; Trident/{2}.{3})' + return tmplt.format(self.generator.random.randint(5, 9), + self.windows_platform_token(), + self.generator.random.randint(3, 5), + self.generator.random.randint(0, 1)) + + def windows_platform_token(self): + return self.random_element(self.windows_platform_tokens) + + def linux_platform_token(self): + return 'X11; Linux {0}'.format( + self.random_element(self.linux_processors)) + + def mac_platform_token(self): + return 'Macintosh; {0} Mac OS X 10_{1}_{2}'.format( + self.random_element(self.mac_processors), + self.generator.random.randint(5, 8), self.generator.random.randint(0, 9)) diff --git a/src/libs/faker/providers/user_agent/en_US/__init__.py b/src/libs/faker/providers/user_agent/en_US/__init__.py new file mode 100644 index 0000000..9440601 --- /dev/null +++ b/src/libs/faker/providers/user_agent/en_US/__init__.py @@ -0,0 +1,5 @@ +from .. import Provider as UserAgentProvider + + +class Provider(UserAgentProvider): + pass diff --git a/src/faker/utils/__init__.py b/src/libs/faker/utils/__init__.py similarity index 100% rename from src/faker/utils/__init__.py rename to src/libs/faker/utils/__init__.py diff --git a/src/faker/utils/datasets.py b/src/libs/faker/utils/datasets.py similarity index 93% rename from src/faker/utils/datasets.py rename to src/libs/faker/utils/datasets.py index e387ffe..6c7716b 100644 --- a/src/faker/utils/datasets.py +++ b/src/libs/faker/utils/datasets.py @@ -1,7 +1,7 @@ # coding=utf-8 +from collections import Counter from functools import reduce -from faker.shims import Counter import operator diff --git a/src/faker/utils/datetime_safe.py b/src/libs/faker/utils/datetime_safe.py similarity index 100% rename from src/faker/utils/datetime_safe.py rename to src/libs/faker/utils/datetime_safe.py diff --git a/src/faker/utils/decorators.py b/src/libs/faker/utils/decorators.py similarity index 55% rename from src/faker/utils/decorators.py rename to src/libs/faker/utils/decorators.py index eb9d497..14fd7f4 100644 --- a/src/faker/utils/decorators.py +++ b/src/libs/faker/utils/decorators.py @@ -17,3 +17,17 @@ def slugify_domain(fn): def wrapper(*args, **kwargs): return text.slugify(fn(*args, **kwargs), allow_dots=True) return wrapper + + +def slugify_unicode(fn): + @wraps(fn) + def wrapper(*args, **kwargs): + return text.slugify(fn(*args, **kwargs), allow_unicode=True) + return wrapper + + +def lowercase(fn): + @wraps(fn) + def wrapper(*args, **kwargs): + return fn(*args, **kwargs).lower() + return wrapper diff --git a/src/libs/faker/utils/distribution.py b/src/libs/faker/utils/distribution.py new file mode 100644 index 0000000..3e39f59 --- /dev/null +++ b/src/libs/faker/utils/distribution.py @@ -0,0 +1,34 @@ +# coding=utf-8 + +import bisect +from faker.generator import random as mod_random + + +def random_sample(random=None): + if random is None: + random = mod_random + return random.uniform(0.0, 1.0) + + +def cumsum(it): + total = 0 + for x in it: + total += x + yield total + + +def choice_distribution(a, p, random=None): + if random is None: + random = mod_random + + assert len(a) == len(p) + + if hasattr(random, 'choices'): + return random.choices(a, weights=p)[0] + else: + cdf = list(cumsum(p)) + normal = cdf[-1] + cdf2 = [float(i) / float(normal) for i in cdf] + uniform_sample = random_sample(random=random) + idx = bisect.bisect_right(cdf2, uniform_sample) + return a[idx] diff --git a/src/libs/faker/utils/loading.py b/src/libs/faker/utils/loading.py new file mode 100644 index 0000000..40e4b5d --- /dev/null +++ b/src/libs/faker/utils/loading.py @@ -0,0 +1,31 @@ +import os +from importlib import import_module +import pkgutil + + +def list_module(module): + path = os.path.dirname(module.__file__) + modules = [name for finder, name, is_pkg in pkgutil.iter_modules([path]) if is_pkg] + if len(modules) > 0: + return modules + return [i for i in os.listdir(path) if os.path.isdir(os.path.join(path, i)) and not i.startswith('_')] + + +def find_available_locales(providers): + available_locales = set() + + for provider_path in providers: + + provider_module = import_module(provider_path) + if getattr(provider_module, 'localized', False): + langs = list_module(provider_module) + available_locales.update(langs) + return available_locales + + +def find_available_providers(modules): + available_providers = set() + for providers_mod in modules: + providers = ['.'.join([providers_mod.__package__, mod]) for mod in list_module(providers_mod)] + available_providers.update(providers) + return sorted(available_providers) diff --git a/src/libs/faker/utils/text.py b/src/libs/faker/utils/text.py new file mode 100644 index 0000000..47bfc0b --- /dev/null +++ b/src/libs/faker/utils/text.py @@ -0,0 +1,89 @@ +# coding=utf-8 + +import datetime +from decimal import Decimal +import re + +import six +import unicodedata + + +_re_pattern = re.compile('[^\w\s-]', flags=re.U) +_re_pattern_allow_dots = re.compile('[^\.\w\s-]', flags=re.U) +_re_spaces = re.compile('[-\s]+', flags=re.U) + + +_PROTECTED_TYPES = six.integer_types + (type(None), float, Decimal, + datetime.datetime, datetime.date, datetime.time) + + +def is_protected_type(obj): + """Determine if the object instance is of a protected type. + Objects of protected types are preserved as-is when passed to + force_text(strings_only=True). + """ + return isinstance(obj, _PROTECTED_TYPES) + + +def force_text(s, encoding='utf-8', strings_only=False, errors='strict'): + """ + Similar to smart_text, except that lazy instances are resolved to + strings, rather than kept as lazy objects. + If strings_only is True, don't convert (some) non-string-like objects. + """ + # Handle the common case first for performance reasons. + if issubclass(type(s), six.text_type): + return s + if strings_only and is_protected_type(s): + return s + try: + if not issubclass(type(s), six.string_types): + if six.PY3: + if isinstance(s, bytes): + s = six.text_type(s, encoding, errors) + else: + s = six.text_type(s) + elif hasattr(s, '__unicode__'): + s = six.text_type(s) + else: + s = six.text_type(bytes(s), encoding, errors) + else: + # Note: We use .decode() here, instead of six.text_type(s, encoding, + # errors), so that if s is a SafeBytes, it ends up being a + # SafeText at the end. + s = s.decode(encoding, errors) + except UnicodeDecodeError as e: + if not isinstance(s, Exception): + raise ValueError(s, *e.args) + else: + # If we get to here, the caller has passed in an Exception + # subclass populated with non-ASCII bytestring data without a + # working unicode method. Try to handle this without raising a + # further exception by individually forcing the exception args + # to unicode. + s = ' '.join(force_text(arg, encoding, strings_only, errors) + for arg in s) + return s + + +def slugify(value, allow_dots=False, allow_unicode=False): + """ + Converts to lowercase, removes non-word characters (alphanumerics and + underscores) and converts spaces to hyphens. Also strips leading and + trailing whitespace. Modified to optionally allow dots. + + Adapted from Django 1.9 + """ + if allow_dots: + pattern = _re_pattern_allow_dots + else: + pattern = _re_pattern + + value = force_text(value) + if allow_unicode: + value = unicodedata.normalize('NFKC', value) + value = pattern.sub('', value).strip().lower() + return _re_spaces.sub('-', value) + value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii') + value = pattern.sub('', value).strip().lower() + return _re_spaces.sub('-', value) diff --git a/src/libs/ipaddress.py b/src/libs/ipaddress.py new file mode 100644 index 0000000..f602c71 --- /dev/null +++ b/src/libs/ipaddress.py @@ -0,0 +1,2425 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.18' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + def subnet_of(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if (hasattr(other, 'network_address') and + hasattr(other, 'broadcast_address')): + return (other.network_address <= self.network_address and + other.broadcast_address >= self.broadcast_address) + # dealing with another address + else: + raise TypeError('Unable to test subnet containment with element ' + 'of type %s' % type(other)) + + def supernet_of(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if (hasattr(other, 'network_address') and + hasattr(other, 'broadcast_address')): + return (other.network_address >= self.network_address and + other.broadcast_address <= self.broadcast_address) + # dealing with another address + else: + raise TypeError('Unable to test subnet containment with element ' + 'of type %s' % type(other)) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return self.network < other.network + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return self.network < other.network + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/src/libs/six.py b/src/libs/six.py new file mode 100644 index 0000000..6bf4fd3 --- /dev/null +++ b/src/libs/six.py @@ -0,0 +1,891 @@ +# Copyright (c) 2010-2017 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.11.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/src/libs/text_unidecode/__init__.py b/src/libs/text_unidecode/__init__.py new file mode 100644 index 0000000..5bdf8dd --- /dev/null +++ b/src/libs/text_unidecode/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import, unicode_literals +import os +from pkg_resources import resource_filename + +_data_path = resource_filename(__name__, 'data.bin') +with open(_data_path, 'rb') as f: + _replaces = f.read().decode('utf8').split('\x00') + + +def unidecode(txt): + chars = [] + for ch in txt: + codepoint = ord(ch) + + if not codepoint: + chars.append('\x00') + continue + + try: + chars.append(_replaces[codepoint-1]) + except IndexError: + pass + return "".join(chars) diff --git a/src/libs/text_unidecode/data.bin b/src/libs/text_unidecode/data.bin new file mode 100644 index 0000000000000000000000000000000000000000..523d4898e815eaff4d5a0b16eefb5a0a6835b0bf GIT binary patch literal 311077 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 literal 0 HcmV?d00001 diff --git a/src/update-available.png b/src/update-available.png deleted file mode 100644 index 0c6ad6111463708be7d1b3794bc03de4e8304a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11504 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 literal 0 HcmV?d00001 diff --git a/src/workflow/__init__.py b/src/workflow/__init__.py index 5de1a96..2c4f8c0 100644 --- a/src/workflow/__init__.py +++ b/src/workflow/__init__.py @@ -8,22 +8,13 @@ # Created on 2014-02-15 # -""" -A Python helper library for `Alfred 2 `_ Workflow -authors. -""" +"""A helper library for `Alfred `_ workflows.""" import os -__title__ = 'Alfred-Workflow' -__version__ = open(os.path.join(os.path.dirname(__file__), 'version')).read() -__author__ = 'Dean Jackson' -__licence__ = 'MIT' -__copyright__ = 'Copyright 2014 Dean Jackson' - - # Workflow objects from .workflow import Workflow, manager +from .workflow3 import Variables, Workflow3 # Exceptions from .workflow import PasswordNotFound, KeychainError @@ -68,8 +59,17 @@ from .workflow import ( MATCH_SUBSTRING, ) + +__title__ = 'Alfred-Workflow' +__version__ = open(os.path.join(os.path.dirname(__file__), 'version')).read() +__author__ = 'Dean Jackson' +__licence__ = 'MIT' +__copyright__ = 'Copyright 2014-2017 Dean Jackson' + __all__ = [ + 'Variables', 'Workflow', + 'Workflow3', 'manager', 'PasswordNotFound', 'KeychainError', diff --git a/src/workflow/background.py b/src/workflow/background.py index bcfa74d..cd5400b 100644 --- a/src/workflow/background.py +++ b/src/workflow/background.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 # -# Copyright © 2014 deanishe@deanishe.net +# Copyright (c) 2014 deanishe@deanishe.net # # MIT Licence. See http://opensource.org/licenses/MIT # @@ -9,11 +9,17 @@ # """ -Run background tasks +This module provides an API to run commands in background processes. +Combine with the :ref:`caching API ` to work from cached data +while you fetch fresh data in the background. + +See :ref:`the User Manual ` for more information +and examples. """ from __future__ import print_function, unicode_literals +import signal import sys import os import subprocess @@ -33,8 +39,12 @@ def wf(): return _wf +def _log(): + return wf().logger + + def _arg_cache(name): - """Return path to pickle cache file for arguments + """Return path to pickle cache file for arguments. :param name: name of task :type name: ``unicode`` @@ -42,12 +52,11 @@ def _arg_cache(name): :rtype: ``unicode`` filepath """ - - return wf().cachefile('{0}.argcache'.format(name)) + return wf().cachefile(name + '.argcache') def _pid_file(name): - """Return path to PID file for ``name`` + """Return path to PID file for ``name``. :param name: name of task :type name: ``unicode`` @@ -55,19 +64,18 @@ def _pid_file(name): :rtype: ``unicode`` filepath """ - - return wf().cachefile('{0}.pid'.format(name)) + return wf().cachefile(name + '.pid') def _process_exists(pid): - """Check if a process with PID ``pid`` exists + """Check if a process with PID ``pid`` exists. :param pid: PID to check :type pid: ``int`` :returns: ``True`` if process exists, else ``False`` :rtype: ``Boolean`` - """ + """ try: os.kill(pid, 0) except OSError: # not running @@ -75,36 +83,52 @@ def _process_exists(pid): return True -def is_running(name): - """ - Test whether task is running under ``name`` +def _job_pid(name): + """Get PID of job or `None` if job does not exist. - :param name: name of task - :type name: ``unicode`` - :returns: ``True`` if task with name ``name`` is running, else ``False`` - :rtype: ``Boolean`` + Args: + name (str): Name of job. + Returns: + int: PID of job process (or `None` if job doesn't exist). """ pidfile = _pid_file(name) if not os.path.exists(pidfile): - return False + return - with open(pidfile, 'rb') as file_obj: - pid = int(file_obj.read().strip()) + with open(pidfile, 'rb') as fp: + pid = int(fp.read()) - if _process_exists(pid): - return True + if _process_exists(pid): + return pid - elif os.path.exists(pidfile): + try: os.unlink(pidfile) + except Exception: # pragma: no cover + pass + + +def is_running(name): + """Test whether task ``name`` is currently running. + + :param name: name of task + :type name: unicode + :returns: ``True`` if task with name ``name`` is running, else ``False`` + :rtype: bool + + """ + if _job_pid(name) is not None: + return True return False -def _background(stdin='/dev/null', stdout='/dev/null', +def _background(pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): # pragma: no cover """Fork the current process into a background daemon. + :param pidfile: file to write PID of daemon process to. + :type pidfile: filepath :param stdin: where to read input :type stdin: filepath :param stdout: where to write stdout output @@ -113,34 +137,37 @@ def _background(stdin='/dev/null', stdout='/dev/null', :type stderr: filepath """ + def _fork_and_exit_parent(errmsg, wait=False, write=False): + try: + pid = os.fork() + if pid > 0: + if write: # write PID of child process to `pidfile` + tmp = pidfile + '.tmp' + with open(tmp, 'wb') as fp: + fp.write(str(pid)) + os.rename(tmp, pidfile) + if wait: # wait for child process to exit + os.waitpid(pid, 0) + os._exit(0) + except OSError as err: + _log().critical('%s: (%d) %s', errmsg, err.errno, err.strerror) + raise err + + # Do first fork and wait for second fork to finish. + _fork_and_exit_parent('fork #1 failed', wait=True) - # Do first fork. - try: - pid = os.fork() - if pid > 0: - sys.exit(0) # Exit first parent. - except OSError as e: - wf().logger.critical("fork #1 failed: ({0:d}) {1}".format( - e.errno, e.strerror)) - sys.exit(1) # Decouple from parent environment. os.chdir(wf().workflowdir) - os.umask(0) os.setsid() - # Do second fork. - try: - pid = os.fork() - if pid > 0: - sys.exit(0) # Exit second parent. - except OSError as e: - wf().logger.critical("fork #2 failed: ({0:d}) {1}".format( - e.errno, e.strerror)) - sys.exit(1) + + # Do second fork and write PID to pidfile. + _fork_and_exit_parent('fork #2 failed', write=True) + # Now I am a daemon! # Redirect standard file descriptors. - si = file(stdin, 'r', 0) - so = file(stdout, 'a+', 0) - se = file(stderr, 'a+', 0) + si = open(stdin, 'r', 0) + so = open(stdout, 'a+', 0) + se = open(stderr, 'a+', 0) if hasattr(sys.stdin, 'fileno'): os.dup2(si.fileno(), sys.stdin.fileno()) if hasattr(sys.stdout, 'fileno'): @@ -149,16 +176,35 @@ def _background(stdin='/dev/null', stdout='/dev/null', os.dup2(se.fileno(), sys.stderr.fileno()) -def run_in_background(name, args, **kwargs): - """Pickle arguments to cache file, then call this script again via - :func:`subprocess.call`. +def kill(name, sig=signal.SIGTERM): + """Send a signal to job ``name`` via :func:`os.kill`. - :param name: name of task - :type name: ``unicode`` + .. versionadded:: 1.29 + + Args: + name (str): Name of the job + sig (int, optional): Signal to send (default: SIGTERM) + + Returns: + bool: `False` if job isn't running, `True` if signal was sent. + """ + pid = _job_pid(name) + if pid is None: + return False + + os.kill(pid, sig) + return True + + +def run_in_background(name, args, **kwargs): + r"""Cache arguments then call this script again via :func:`subprocess.call`. + + :param name: name of job + :type name: unicode :param args: arguments passed as first argument to :func:`subprocess.call` :param \**kwargs: keyword arguments to :func:`subprocess.call` :returns: exit code of sub-process - :rtype: ``int`` + :rtype: int When you call this function, it caches its arguments and then calls ``background.py`` in a subprocess. The Python subprocess will load the @@ -175,45 +221,52 @@ def run_in_background(name, args, **kwargs): return immediately and will not run the specified command. """ - if is_running(name): - wf().logger.info('Task `{0}` is already running'.format(name)) + _log().info('[%s] job already running', name) return argcache = _arg_cache(name) # Cache arguments - with open(argcache, 'wb') as file_obj: - pickle.dump({'args': args, 'kwargs': kwargs}, file_obj) - wf().logger.debug('Command arguments cached to `{0}`'.format(argcache)) + with open(argcache, 'wb') as fp: + pickle.dump({'args': args, 'kwargs': kwargs}, fp) + _log().debug('[%s] command cached: %s', name, argcache) # Call this script cmd = ['/usr/bin/python', __file__, name] - wf().logger.debug('Calling {0!r} ...'.format(cmd)) + _log().debug('[%s] passing job to background runner: %r', name, cmd) retcode = subprocess.call(cmd) + if retcode: # pragma: no cover - wf().logger.error('Failed to call task in background') + _log().error('[%s] background runner failed with %d', name, retcode) else: - wf().logger.debug('Executing task `{0}` in background...'.format(name)) + _log().debug('[%s] background job started', name) + return retcode def main(wf): # pragma: no cover - """ + """Run command in a background process. + Load cached arguments, fork into background, then call - :meth:`subprocess.call` with cached arguments + :meth:`subprocess.call` with cached arguments. """ - + log = wf.logger name = wf.args[0] argcache = _arg_cache(name) if not os.path.exists(argcache): - wf.logger.critical('No arg cache found : {0!r}'.format(argcache)) - return 1 + msg = '[{0}] command cache not found: {1}'.format(name, argcache) + log.critical(msg) + raise IOError(msg) + + # Fork to background and run command + pidfile = _pid_file(name) + _background(pidfile) # Load cached arguments - with open(argcache, 'rb') as file_obj: - data = pickle.load(file_obj) + with open(argcache, 'rb') as fp: + data = pickle.load(fp) # Cached arguments args = data['args'] @@ -222,30 +275,18 @@ def main(wf): # pragma: no cover # Delete argument cache file os.unlink(argcache) - pidfile = _pid_file(name) - - # Fork to background - _background() - - # Write PID to file - with open(pidfile, 'wb') as file_obj: - file_obj.write('{0}'.format(os.getpid())) - - # Run the command try: - wf.logger.debug('Task `{0}` running'.format(name)) - wf.logger.debug('cmd : {0!r}'.format(args)) + # Run the command + log.debug('[%s] running command: %r', name, args) retcode = subprocess.call(args, **kwargs) if retcode: - wf.logger.error('Command failed with [{0}] : {1!r}'.format( - retcode, args)) - + log.error('[%s] command failed with status %d', name, retcode) finally: - if os.path.exists(pidfile): - os.unlink(pidfile) - wf.logger.debug('Task `{0}` finished'.format(name)) + os.unlink(pidfile) + + log.debug('[%s] job complete', name) if __name__ == '__main__': # pragma: no cover diff --git a/src/workflow/notify.py b/src/workflow/notify.py new file mode 100644 index 0000000..4542c78 --- /dev/null +++ b/src/workflow/notify.py @@ -0,0 +1,345 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2015 deanishe@deanishe.net +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2015-11-26 +# + +# TODO: Exclude this module from test and code coverage in py2.6 + +""" +Post notifications via the macOS Notification Center. This feature +is only available on Mountain Lion (10.8) and later. It will +silently fail on older systems. + +The main API is a single function, :func:`~workflow.notify.notify`. + +It works by copying a simple application to your workflow's data +directory. It replaces the application's icon with your workflow's +icon and then calls the application to post notifications. +""" + +from __future__ import print_function, unicode_literals + +import os +import plistlib +import shutil +import subprocess +import sys +import tarfile +import tempfile +import uuid + +import workflow + + +_wf = None +_log = None + + +#: Available system sounds from System Preferences > Sound > Sound Effects +SOUNDS = ( + 'Basso', + 'Blow', + 'Bottle', + 'Frog', + 'Funk', + 'Glass', + 'Hero', + 'Morse', + 'Ping', + 'Pop', + 'Purr', + 'Sosumi', + 'Submarine', + 'Tink', +) + + +def wf(): + """Return Workflow object for this module. + + Returns: + workflow.Workflow: Workflow object for current workflow. + """ + global _wf + if _wf is None: + _wf = workflow.Workflow() + return _wf + + +def log(): + """Return logger for this module. + + Returns: + logging.Logger: Logger for this module. + """ + global _log + if _log is None: + _log = wf().logger + return _log + + +def notifier_program(): + """Return path to notifier applet executable. + + Returns: + unicode: Path to Notify.app ``applet`` executable. + """ + return wf().datafile('Notify.app/Contents/MacOS/applet') + + +def notifier_icon_path(): + """Return path to icon file in installed Notify.app. + + Returns: + unicode: Path to ``applet.icns`` within the app bundle. + """ + return wf().datafile('Notify.app/Contents/Resources/applet.icns') + + +def install_notifier(): + """Extract ``Notify.app`` from the workflow to data directory. + + Changes the bundle ID of the installed app and gives it the + workflow's icon. + """ + archive = os.path.join(os.path.dirname(__file__), 'Notify.tgz') + destdir = wf().datadir + app_path = os.path.join(destdir, 'Notify.app') + n = notifier_program() + log().debug('installing Notify.app to %r ...', destdir) + # z = zipfile.ZipFile(archive, 'r') + # z.extractall(destdir) + tgz = tarfile.open(archive, 'r:gz') + tgz.extractall(destdir) + assert os.path.exists(n), \ + 'Notify.app could not be installed in %s' % destdir + + # Replace applet icon + icon = notifier_icon_path() + workflow_icon = wf().workflowfile('icon.png') + if os.path.exists(icon): + os.unlink(icon) + + png_to_icns(workflow_icon, icon) + + # Set file icon + # PyObjC isn't available for 2.6, so this is 2.7 only. Actually, + # none of this code will "work" on pre-10.8 systems. Let it run + # until I figure out a better way of excluding this module + # from coverage in py2.6. + if sys.version_info >= (2, 7): # pragma: no cover + from AppKit import NSWorkspace, NSImage + + ws = NSWorkspace.sharedWorkspace() + img = NSImage.alloc().init() + img.initWithContentsOfFile_(icon) + ws.setIcon_forFile_options_(img, app_path, 0) + + # Change bundle ID of installed app + ip_path = os.path.join(app_path, 'Contents/Info.plist') + bundle_id = '{0}.{1}'.format(wf().bundleid, uuid.uuid4().hex) + data = plistlib.readPlist(ip_path) + log().debug('changing bundle ID to %r', bundle_id) + data['CFBundleIdentifier'] = bundle_id + plistlib.writePlist(data, ip_path) + + +def validate_sound(sound): + """Coerce ``sound`` to valid sound name. + + Returns ``None`` for invalid sounds. Sound names can be found + in ``System Preferences > Sound > Sound Effects``. + + Args: + sound (str): Name of system sound. + + Returns: + str: Proper name of sound or ``None``. + """ + if not sound: + return None + + # Case-insensitive comparison of `sound` + if sound.lower() in [s.lower() for s in SOUNDS]: + # Title-case is correct for all system sounds as of macOS 10.11 + return sound.title() + return None + + +def notify(title='', text='', sound=None): + """Post notification via Notify.app helper. + + Args: + title (str, optional): Notification title. + text (str, optional): Notification body text. + sound (str, optional): Name of sound to play. + + Raises: + ValueError: Raised if both ``title`` and ``text`` are empty. + + Returns: + bool: ``True`` if notification was posted, else ``False``. + """ + if title == text == '': + raise ValueError('Empty notification') + + sound = validate_sound(sound) or '' + + n = notifier_program() + + if not os.path.exists(n): + install_notifier() + + env = os.environ.copy() + enc = 'utf-8' + env['NOTIFY_TITLE'] = title.encode(enc) + env['NOTIFY_MESSAGE'] = text.encode(enc) + env['NOTIFY_SOUND'] = sound.encode(enc) + cmd = [n] + retcode = subprocess.call(cmd, env=env) + if retcode == 0: + return True + + log().error('Notify.app exited with status {0}.'.format(retcode)) + return False + + +def convert_image(inpath, outpath, size): + """Convert an image file using ``sips``. + + Args: + inpath (str): Path of source file. + outpath (str): Path to destination file. + size (int): Width and height of destination image in pixels. + + Raises: + RuntimeError: Raised if ``sips`` exits with non-zero status. + """ + cmd = [ + b'sips', + b'-z', str(size), str(size), + inpath, + b'--out', outpath] + # log().debug(cmd) + with open(os.devnull, 'w') as pipe: + retcode = subprocess.call(cmd, stdout=pipe, stderr=subprocess.STDOUT) + + if retcode != 0: + raise RuntimeError('sips exited with %d' % retcode) + + +def png_to_icns(png_path, icns_path): + """Convert PNG file to ICNS using ``iconutil``. + + Create an iconset from the source PNG file. Generate PNG files + in each size required by macOS, then call ``iconutil`` to turn + them into a single ICNS file. + + Args: + png_path (str): Path to source PNG file. + icns_path (str): Path to destination ICNS file. + + Raises: + RuntimeError: Raised if ``iconutil`` or ``sips`` fail. + """ + tempdir = tempfile.mkdtemp(prefix='aw-', dir=wf().datadir) + + try: + iconset = os.path.join(tempdir, 'Icon.iconset') + + assert not os.path.exists(iconset), \ + 'iconset already exists: ' + iconset + os.makedirs(iconset) + + # Copy source icon to icon set and generate all the other + # sizes needed + configs = [] + for i in (16, 32, 128, 256, 512): + configs.append(('icon_{0}x{0}.png'.format(i), i)) + configs.append((('icon_{0}x{0}@2x.png'.format(i), i * 2))) + + shutil.copy(png_path, os.path.join(iconset, 'icon_256x256.png')) + shutil.copy(png_path, os.path.join(iconset, 'icon_128x128@2x.png')) + + for name, size in configs: + outpath = os.path.join(iconset, name) + if os.path.exists(outpath): + continue + convert_image(png_path, outpath, size) + + cmd = [ + b'iconutil', + b'-c', b'icns', + b'-o', icns_path, + iconset] + + retcode = subprocess.call(cmd) + if retcode != 0: + raise RuntimeError('iconset exited with %d' % retcode) + + assert os.path.exists(icns_path), \ + 'generated ICNS file not found: ' + repr(icns_path) + finally: + try: + shutil.rmtree(tempdir) + except OSError: # pragma: no cover + pass + + +if __name__ == '__main__': # pragma: nocover + # Simple command-line script to test module with + # This won't work on 2.6, as `argparse` isn't available + # by default. + import argparse + + from unicodedata import normalize + + def ustr(s): + """Coerce `s` to normalised Unicode.""" + return normalize('NFD', s.decode('utf-8')) + + p = argparse.ArgumentParser() + p.add_argument('-p', '--png', help="PNG image to convert to ICNS.") + p.add_argument('-l', '--list-sounds', help="Show available sounds.", + action='store_true') + p.add_argument('-t', '--title', + help="Notification title.", type=ustr, + default='') + p.add_argument('-s', '--sound', type=ustr, + help="Optional notification sound.", default='') + p.add_argument('text', type=ustr, + help="Notification body text.", default='', nargs='?') + o = p.parse_args() + + # List available sounds + if o.list_sounds: + for sound in SOUNDS: + print(sound) + sys.exit(0) + + # Convert PNG to ICNS + if o.png: + icns = os.path.join( + os.path.dirname(o.png), + os.path.splitext(os.path.basename(o.png))[0] + '.icns') + + print('converting {0!r} to {1!r} ...'.format(o.png, icns), + file=sys.stderr) + + assert not os.path.exists(icns), \ + 'destination file already exists: ' + icns + + png_to_icns(o.png, icns) + sys.exit(0) + + # Post notification + if o.title == o.text == '': + print('ERROR: empty notification.', file=sys.stderr) + sys.exit(1) + else: + notify(o.title, o.text, o.sound) diff --git a/src/workflow/update.py b/src/workflow/update.py index b946e79..37569bb 100644 --- a/src/workflow/update.py +++ b/src/workflow/update.py @@ -1,16 +1,15 @@ #!/usr/bin/env python # encoding: utf-8 # -# Copyright © 2014 Fabio Niephaus , -# Dean Jackson +# Copyright (c) 2014 Fabio Niephaus , +# Dean Jackson # # MIT Licence. See http://opensource.org/licenses/MIT # # Created on 2014-08-16 # -""" -Self-updating from GitHub +"""Self-updating from GitHub. .. versionadded:: 1.9 @@ -42,6 +41,7 @@ _wf = None def wf(): + """Lazy `Workflow` object.""" global _wf if _wf is None: _wf = workflow.Workflow() @@ -49,16 +49,37 @@ def wf(): class Version(object): - """Mostly semantic versioning + """Mostly semantic versioning. The main difference to proper :ref:`semantic versioning ` is that this implementation doesn't require a minor or patch version. + + Version strings may also be prefixed with "v", e.g.: + + >>> v = Version('v1.1.1') + >>> v.tuple + (1, 1, 1, '') + + >>> v = Version('2.0') + >>> v.tuple + (2, 0, 0, '') + + >>> Version('3.1-beta').tuple + (3, 1, 0, 'beta') + + >>> Version('1.0.1') > Version('0.0.1') + True """ #: Match version and pre-release/build information in version strings match_version = re.compile(r'([0-9\.]+)(.+)?').match def __init__(self, vstr): + """Create new `Version` object. + + Args: + vstr (basestring): Semantic version string. + """ self.vstr = vstr self.major = 0 self.minor = 0 @@ -73,7 +94,7 @@ class Version(object): else: m = self.match_version(vstr) if not m: - raise ValueError('Invalid version number: {0}'.format(vstr)) + raise ValueError('invalid version number: {0}'.format(vstr)) version, suffix = m.groups() parts = self._parse_dotted_string(version) @@ -83,7 +104,7 @@ class Version(object): if len(parts): self.patch = parts.pop(0) if not len(parts) == 0: - raise ValueError('Invalid version (too long) : {0}'.format(vstr)) + raise ValueError('invalid version (too long) : {0}'.format(vstr)) if suffix: # Build info @@ -94,14 +115,13 @@ class Version(object): if suffix: if not suffix.startswith('-'): raise ValueError( - 'Invalid suffix : `{0}`. Must start with `-`'.format( - suffix)) + 'suffix must start with - : {0}'.format(suffix)) self.suffix = suffix[1:] # wf().logger.debug('version str `{}` -> {}'.format(vstr, repr(self))) def _parse_dotted_string(self, s): - """Parse string ``s`` into list of ints and strings""" + """Parse string ``s`` into list of ints and strings.""" parsed = [] parts = s.split('.') for p in parts: @@ -112,14 +132,13 @@ class Version(object): @property def tuple(self): - """Return version number as a tuple of major, minor, patch, pre-release - """ - + """Version number as a tuple of major, minor, patch, pre-release.""" return (self.major, self.minor, self.patch, self.suffix) def __lt__(self, other): + """Implement comparison.""" if not isinstance(other, Version): - raise ValueError('Not a Version instance: {0!r}'.format(other)) + raise ValueError('not a Version instance: {0!r}'.format(other)) t = self.tuple[:3] o = other.tuple[:3] if t < o: @@ -135,57 +154,62 @@ class Version(object): return False def __eq__(self, other): + """Implement comparison.""" if not isinstance(other, Version): - raise ValueError('Not a Version instance: {0!r}'.format(other)) + raise ValueError('not a Version instance: {0!r}'.format(other)) return self.tuple == other.tuple def __ne__(self, other): + """Implement comparison.""" return not self.__eq__(other) def __gt__(self, other): + """Implement comparison.""" if not isinstance(other, Version): - raise ValueError('Not a Version instance: {0!r}'.format(other)) + raise ValueError('not a Version instance: {0!r}'.format(other)) return other.__lt__(self) def __le__(self, other): + """Implement comparison.""" if not isinstance(other, Version): - raise ValueError('Not a Version instance: {0!r}'.format(other)) + raise ValueError('not a Version instance: {0!r}'.format(other)) return not other.__lt__(self) def __ge__(self, other): + """Implement comparison.""" return not self.__lt__(other) def __str__(self): + """Return semantic version string.""" vstr = '{0}.{1}.{2}'.format(self.major, self.minor, self.patch) if self.suffix: - vstr += '-{0}'.format(self.suffix) + vstr = '{0}-{1}'.format(vstr, self.suffix) if self.build: - vstr += '+{0}'.format(self.build) + vstr = '{0}+{1}'.format(vstr, self.build) return vstr def __repr__(self): + """Return 'code' representation of `Version`.""" return "Version('{0}')".format(str(self)) def download_workflow(url): - """Download workflow at ``url`` to a local temporary file + """Download workflow at ``url`` to a local temporary file. :param url: URL to .alfredworkflow file in GitHub repo :returns: path to downloaded file """ + filename = url.split('/')[-1] - filename = url.split("/")[-1] - - if (not url.endswith('.alfredworkflow') or - not filename.endswith('.alfredworkflow')): - raise ValueError('Attachment `{}` not a workflow'.format(filename)) + if (not filename.endswith('.alfredworkflow') and + not filename.endswith('.alfred3workflow')): + raise ValueError('attachment not a workflow: {0}'.format(filename)) local_path = os.path.join(tempfile.gettempdir(), filename) wf().logger.debug( - 'Downloading updated workflow from `{0}` to `{1}` ...'.format( - url, local_path)) + 'downloading updated workflow from `%s` to `%s` ...', url, local_path) response = web.get(url) @@ -196,25 +220,80 @@ def download_workflow(url): def build_api_url(slug): - """Generate releases URL from GitHub slug + """Generate releases URL from GitHub slug. :param slug: Repo name in form ``username/repo`` :returns: URL to the API endpoint for the repo's releases - """ - + """ if len(slug.split('/')) != 2: - raise ValueError('Invalid GitHub slug : {0}'.format(slug)) + raise ValueError('invalid GitHub slug: {0}'.format(slug)) return RELEASES_BASE.format(slug) -def get_valid_releases(github_slug): - """Return list of all valid releases +def _validate_release(release): + """Return release for running version of Alfred.""" + alf3 = wf().alfred_version.major == 3 + + downloads = {'.alfredworkflow': [], '.alfred3workflow': []} + dl_count = 0 + version = release['tag_name'] + + for asset in release.get('assets', []): + url = asset.get('browser_download_url') + if not url: # pragma: nocover + continue + + ext = os.path.splitext(url)[1].lower() + if ext not in downloads: + continue + + # Ignore Alfred 3-only files if Alfred 2 is running + if ext == '.alfred3workflow' and not alf3: + continue + + downloads[ext].append(url) + dl_count += 1 + + # download_urls.append(url) + + if dl_count == 0: + wf().logger.warning( + 'invalid release (no workflow file): %s', version) + return None + + for k in downloads: + if len(downloads[k]) > 1: + wf().logger.warning( + 'invalid release (multiple %s files): %s', k, version) + return None + + # Prefer .alfred3workflow file if there is one and Alfred 3 is + # running. + if alf3 and len(downloads['.alfred3workflow']): + download_url = downloads['.alfred3workflow'][0] + + else: + download_url = downloads['.alfredworkflow'][0] + + wf().logger.debug('release %s: %s', version, download_url) + + return { + 'version': version, + 'download_url': download_url, + 'prerelease': release['prerelease'] + } + + +def get_valid_releases(github_slug, prereleases=False): + """Return list of all valid releases. :param github_slug: ``username/repo`` for workflow's GitHub repo + :param prereleases: Whether to include pre-releases. :returns: list of dicts. Each :class:`dict` has the form - ``{'version': '1.1', 'download_url': 'http://github.com/...'}`` + ``{'version': '1.1', 'download_url': 'http://github.com/...', + 'prerelease': False }`` A valid release is one that contains one ``.alfredworkflow`` file. @@ -223,55 +302,42 @@ def get_valid_releases(github_slug): ``v`` will be stripped. """ - api_url = build_api_url(github_slug) releases = [] - wf().logger.debug('Retrieving releases list from `{0}` ...'.format( - api_url)) + wf().logger.debug('retrieving releases list: %s', api_url) def retrieve_releases(): wf().logger.info( - 'Retrieving releases for `{0}` ...'.format(github_slug)) + 'retrieving releases: %s', github_slug) return web.get(api_url).json() slug = github_slug.replace('/', '-') - for release in wf().cached_data('gh-releases-{0}'.format(slug), - retrieve_releases): - version = release['tag_name'] - download_urls = [] - for asset in release.get('assets', []): - url = asset.get('browser_download_url') - if not url or not url.endswith('.alfredworkflow'): - continue - download_urls.append(url) + for release in wf().cached_data('gh-releases-' + slug, retrieve_releases): - # Validate release - if release['prerelease']: - wf().logger.warning( - 'Invalid release {0} : pre-release detected'.format(version)) - continue - if not download_urls: - wf().logger.warning( - 'Invalid release {0} : No workflow file'.format(version)) - continue - if len(download_urls) > 1: - wf().logger.warning( - 'Invalid release {0} : multiple workflow files'.format(version)) + release = _validate_release(release) + if release is None: + wf().logger.debug('invalid release: %r', release) continue - wf().logger.debug('Release `{0}` : {1}'.format(version, url)) - releases.append({'version': version, 'download_url': download_urls[0]}) + elif release['prerelease'] and not prereleases: + wf().logger.debug('ignoring prerelease: %s', release['version']) + continue + + wf().logger.debug('release: %r', release) + + releases.append(release) return releases -def check_update(github_slug, current_version): - """Check whether a newer release is available on GitHub +def check_update(github_slug, current_version, prereleases=False): + """Check whether a newer release is available on GitHub. :param github_slug: ``username/repo`` for workflow's GitHub repo :param current_version: the currently installed version of the workflow. :ref:`Semantic versioning ` is required. + :param prereleases: Whether to include pre-releases. :type current_version: ``unicode`` :returns: ``True`` if an update is available, else ``False`` @@ -279,14 +345,12 @@ def check_update(github_slug, current_version): be cached. """ - - releases = get_valid_releases(github_slug) - - wf().logger.info('{0} releases for {1}'.format(len(releases), - github_slug)) + releases = get_valid_releases(github_slug, prereleases) if not len(releases): - raise ValueError('No valid releases for {0}'.format(github_slug)) + raise ValueError('no valid releases for %s', github_slug) + + wf().logger.info('%d releases for %s', len(releases), github_slug) # GitHub returns releases newest-first latest_release = releases[0] @@ -294,7 +358,7 @@ def check_update(github_slug, current_version): # (latest_version, download_url) = get_latest_release(releases) vr = Version(latest_release['version']) vl = Version(current_version) - wf().logger.debug('Latest : {0!r} Installed : {1!r}'.format(vr, vl)) + wf().logger.debug('latest=%r, installed=%r', vr, vl) if vr > vl: wf().cache_data('__workflow_update_status', { @@ -305,36 +369,25 @@ def check_update(github_slug, current_version): return True - wf().cache_data('__workflow_update_status', { - 'available': False - }) + wf().cache_data('__workflow_update_status', {'available': False}) return False -def install_update(github_slug, current_version): - """If a newer release is available, download and install it - - :param github_slug: ``username/repo`` for workflow's GitHub repo - :param current_version: the currently installed version of the - workflow. :ref:`Semantic versioning ` is required. - :type current_version: ``unicode`` - - If an update is available, it will be downloaded and installed. +def install_update(): + """If a newer release is available, download and install it. :returns: ``True`` if an update is installed, else ``False`` """ - # TODO: `github_slug` and `current_version` are both unusued. - update_data = wf().cached_data('__workflow_update_status', max_age=0) if not update_data or not update_data.get('available'): - wf().logger.info('No update available') + wf().logger.info('no update available') return False local_file = download_workflow(update_data['download_url']) - wf().logger.info('Installing updated workflow ...') + wf().logger.info('installing updated workflow ...') subprocess.call(['open', local_file]) update_data['available'] = False @@ -345,19 +398,29 @@ def install_update(github_slug, current_version): if __name__ == '__main__': # pragma: nocover import sys - def show_help(): - print('Usage : update.py (check|install) github_slug version') - sys.exit(1) + def show_help(status=0): + """Print help message.""" + print('Usage : update.py (check|install) ' + '[--prereleases] ') + sys.exit(status) - if len(sys.argv) != 4: + argv = sys.argv[:] + if '-h' in argv or '--help' in argv: show_help() - action, github_slug, version = sys.argv[1:] + prereleases = '--prereleases' in argv - if action not in ('check', 'install'): - show_help() + if prereleases: + argv.remove('--prereleases') + + if len(argv) != 4: + show_help(1) + + action, github_slug, version = argv[1:] if action == 'check': - check_update(github_slug, version) + check_update(github_slug, version, prereleases) elif action == 'install': - install_update(github_slug, version) + install_update() + else: + show_help(1) diff --git a/src/workflow/version b/src/workflow/version index 9f76d37..476d2ce 100644 --- a/src/workflow/version +++ b/src/workflow/version @@ -1 +1 @@ -1.13 \ No newline at end of file +1.29 \ No newline at end of file diff --git a/src/workflow/web.py b/src/workflow/web.py index 153833b..d64bb6f 100644 --- a/src/workflow/web.py +++ b/src/workflow/web.py @@ -7,11 +7,7 @@ # Created on 2014-02-15 # -""" -A lightweight HTTP library with a requests-like interface. -""" - -from __future__ import print_function +"""Lightweight HTTP library with a requests-like interface.""" import codecs import json @@ -28,7 +24,7 @@ import urlparse import zlib -USER_AGENT = u'Alfred-Workflow/1.11 (http://www.deanishe.net)' +USER_AGENT = u'Alfred-Workflow/1.19 (+http://www.deanishe.net/alfred-workflow)' # Valid characters for multipart form data boundaries BOUNDARY_CHARS = string.digits + string.ascii_letters @@ -79,10 +75,12 @@ RESPONSES = { def str_dict(dic): - """Convert keys and values in ``dic`` into UTF-8-encoded :class:`str` + """Convert keys and values in ``dic`` into UTF-8-encoded :class:`str`. - :param dic: :class:`dict` of Unicode strings - :returns: :class:`dict` + :param dic: Mapping of Unicode strings + :type dic: dict + :returns: Dictionary containing only UTF-8 strings + :rtype: dict """ if isinstance(dic, CaseInsensitiveDictionary): @@ -99,7 +97,7 @@ def str_dict(dic): class NoRedirectHandler(urllib2.HTTPRedirectHandler): - """Prevent redirections""" + """Prevent redirections.""" def redirect_request(self, *args): return None @@ -107,9 +105,10 @@ class NoRedirectHandler(urllib2.HTTPRedirectHandler): # Adapted from https://gist.github.com/babakness/3901174 class CaseInsensitiveDictionary(dict): - """ - Dictionary that enables case insensitive searching while preserving - case sensitivity when keys are listed, ie, via keys() or items() methods. + """Dictionary with caseless key search. + + Enables case insensitive searching while preserving case sensitivity + when keys are listed, ie, via keys() or items() methods. Works by storing a lowercase version of the key as the new key and stores the original key-value pair as the key's value @@ -118,7 +117,7 @@ class CaseInsensitiveDictionary(dict): """ def __init__(self, initval=None): - + """Create new case-insensitive dictionary.""" if isinstance(initval, dict): for key, value in initval.iteritems(): self.__setitem__(key, value) @@ -174,7 +173,7 @@ class Response(object): """ Returned by :func:`request` / :func:`get` / :func:`post` functions. - A simplified version of the ``Response`` object in the ``requests`` library. + Simplified version of the ``Response`` object in the ``requests`` library. >>> r = request('http://www.google.com') >>> r.status_code @@ -189,14 +188,16 @@ class Response(object): """ - def __init__(self, request): + def __init__(self, request, stream=False): """Call `request` with :mod:`urllib2` and process results. :param request: :class:`urllib2.Request` instance + :param stream: Whether to stream response or retrieve it all at once + :type stream: bool """ - self.request = request + self._stream = stream self.url = None self.raw = None self._encoding = None @@ -205,6 +206,7 @@ class Response(object): self.reason = None self.headers = CaseInsensitiveDictionary() self._content = None + self._content_loaded = False self._gzipped = False # Execute query @@ -242,24 +244,40 @@ class Response(object): 'gzip' in headers.get('transfer-encoding', '')): self._gzipped = True + @property + def stream(self): + """Whether response is streamed. + + Returns: + bool: `True` if response is streamed. + """ + return self._stream + + @stream.setter + def stream(self, value): + if self._content_loaded: + raise RuntimeError("`content` has already been read from " + "this Response.") + + self._stream = value + def json(self): """Decode response contents as JSON. :returns: object decoded from JSON - :rtype: :class:`list` / :class:`dict` + :rtype: list, dict or unicode """ - return json.loads(self.content, self.encoding or 'utf-8') @property def encoding(self): - """Text encoding of document or ``None`` + """Text encoding of document or ``None``. - :returns: :class:`str` or ``None`` + :returns: Text encoding if found. + :rtype: str or ``None`` """ - if not self._encoding: self._encoding = self._get_encoding() @@ -267,13 +285,12 @@ class Response(object): @property def content(self): - """Raw content of response (i.e. bytes) + """Raw content of response (i.e. bytes). :returns: Body of HTTP response - :rtype: :class:`str` + :rtype: str """ - if not self._content: # Decompress gzipped content @@ -284,6 +301,8 @@ class Response(object): else: self._content = self.raw.read() + self._content_loaded = True + return self._content @property @@ -294,10 +313,9 @@ class Response(object): itself, the encoded response body will be returned instead. :returns: Body of HTTP response - :rtype: :class:`unicode` or :class:`str` + :rtype: unicode or str """ - if self.encoding: return unicodedata.normalize('NFC', unicode(self.content, self.encoding)) @@ -309,12 +327,20 @@ class Response(object): .. versionadded:: 1.6 :param chunk_size: Number of bytes to read into memory - :type chunk_size: ``int`` + :type chunk_size: int :param decode_unicode: Decode to Unicode using detected encoding - :type decode_unicode: ``Boolean`` + :type decode_unicode: bool :returns: iterator """ + if not self.stream: + raise RuntimeError("You cannot call `iter_content` on a " + "Response unless you passed `stream=True`" + " to `get()`/`post()`/`request()`.") + + if self._content_loaded: + raise RuntimeError( + "`content` has already been read from this Response.") def decode_stream(iterator, r): @@ -326,8 +352,8 @@ class Response(object): yield data data = decoder.decode(b'', final=True) - if data: - yield data # pragma: nocover + if data: # pragma: no cover + yield data def generate(): @@ -352,19 +378,20 @@ class Response(object): return chunks def save_to_path(self, filepath): - """Save retrieved data to file at ``filepath`` + """Save retrieved data to file at ``filepath``. .. versionadded: 1.9.6 :param filepath: Path to save retrieved data. """ - filepath = os.path.abspath(filepath) dirname = os.path.dirname(filepath) if not os.path.exists(dirname): os.makedirs(dirname) + self.stream = True + with open(filepath, 'wb') as fileobj: for data in self.iter_content(): fileobj.write(data) @@ -374,7 +401,6 @@ class Response(object): error will be instance of :class:`urllib2.HTTPError` """ - if self.error is not None: raise self.error return @@ -383,10 +409,9 @@ class Response(object): """Get encoding from HTTP headers or content. :returns: encoding or `None` - :rtype: ``unicode`` or ``None`` + :rtype: unicode or ``None`` """ - headers = self.raw.info() encoding = None @@ -399,20 +424,21 @@ class Response(object): encoding = param[8:] break - # Encoding declared in document should override HTTP headers - if self.mimetype == 'text/html': # sniff HTML headers - m = re.search("""""", - self.content) - if m: - encoding = m.group(1) + if not self.stream: # Try sniffing response content + # Encoding declared in document should override HTTP headers + if self.mimetype == 'text/html': # sniff HTML headers + m = re.search("""""", + self.content) + if m: + encoding = m.group(1) - elif ((self.mimetype.startswith('application/') or - self.mimetype.startswith('text/')) and - 'xml' in self.mimetype): - m = re.search("""]*\?>""", - self.content) - if m: - encoding = m.group(1) + elif ((self.mimetype.startswith('application/') or + self.mimetype.startswith('text/')) and + 'xml' in self.mimetype): + m = re.search("""]*\?>""", + self.content) + if m: + encoding = m.group(1) # Format defaults if self.mimetype == 'application/json' and not encoding: @@ -430,31 +456,35 @@ class Response(object): def request(method, url, params=None, data=None, headers=None, cookies=None, - files=None, auth=None, timeout=60, allow_redirects=False): + files=None, auth=None, timeout=60, allow_redirects=False, + stream=False): """Initiate an HTTP(S) request. Returns :class:`Response` object. :param method: 'GET' or 'POST' - :type method: ``unicode`` + :type method: unicode :param url: URL to open - :type url: ``unicode`` + :type url: unicode :param params: mapping of URL parameters - :type params: :class:`dict` + :type params: dict :param data: mapping of form data ``{'field_name': 'value'}`` or :class:`str` - :type data: :class:`dict` or :class:`str` + :type data: dict or str :param headers: HTTP headers - :type headers: :class:`dict` + :type headers: dict :param cookies: cookies to send to server - :type cookies: :class:`dict` + :type cookies: dict :param files: files to upload (see below). - :type files: :class:`dict` + :type files: dict :param auth: username, password - :type auth: ``tuple`` + :type auth: tuple :param timeout: connection timeout limit in seconds - :type timeout: ``int`` + :type timeout: int :param allow_redirects: follow redirections - :type allow_redirects: ``Boolean`` - :returns: :class:`Response` object + :type allow_redirects: bool + :param stream: Stream content instead of fetching it all at once. + :type stream: bool + :returns: Response object + :rtype: :class:`Response` The ``files`` argument is a dictionary:: @@ -470,9 +500,7 @@ def request(method, url, params=None, data=None, headers=None, cookies=None, will be used. """ - # TODO: cookies - # TODO: any way to force GET or POST? socket.setdefaulttimeout(timeout) # Default handlers @@ -508,6 +536,10 @@ def request(method, url, params=None, data=None, headers=None, cookies=None, headers['accept-encoding'] = ', '.join(encodings) + # Force POST by providing an empty data string + if method == 'POST' and not data: + data = '' + if files: if not data: data = {} @@ -536,41 +568,42 @@ def request(method, url, params=None, data=None, headers=None, cookies=None, url = urlparse.urlunsplit((scheme, netloc, path, query, fragment)) req = urllib2.Request(url, data, headers) - return Response(req) + return Response(req, stream) def get(url, params=None, headers=None, cookies=None, auth=None, - timeout=60, allow_redirects=True): + timeout=60, allow_redirects=True, stream=False): """Initiate a GET request. Arguments as for :func:`request`. :returns: :class:`Response` instance """ - return request('GET', url, params, headers=headers, cookies=cookies, - auth=auth, timeout=timeout, allow_redirects=allow_redirects) + auth=auth, timeout=timeout, allow_redirects=allow_redirects, + stream=stream) def post(url, params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=60, allow_redirects=False): + auth=None, timeout=60, allow_redirects=False, stream=False): """Initiate a POST request. Arguments as for :func:`request`. :returns: :class:`Response` instance """ return request('POST', url, params, data, headers, cookies, files, auth, - timeout, allow_redirects) + timeout, allow_redirects, stream) def encode_multipart_formdata(fields, files): """Encode form data (``fields``) and ``files`` for POST request. :param fields: mapping of ``{name : value}`` pairs for normal form fields. - :type fields: :class:`dict` + :type fields: dict :param files: dictionary of fieldnames/files elements for file data. See below for details. - :type files: :class:`dict` of :class:`dicts` - :returns: ``(headers, body)`` ``headers`` is a :class:`dict` of HTTP headers + :type files: dict of :class:`dict` + :returns: ``(headers, body)`` ``headers`` is a + :class:`dict` of HTTP headers :rtype: 2-tuple ``(dict, str)`` The ``files`` argument is a dictionary:: @@ -581,17 +614,18 @@ def encode_multipart_formdata(fields, files): } - ``fieldname`` is the name of the field in the HTML form. - - ``mimetype`` is optional. If not provided, :mod:`mimetypes` will be used to guess the mimetype, or ``application/octet-stream`` will be used. + - ``mimetype`` is optional. If not provided, :mod:`mimetypes` will + be used to guess the mimetype, or ``application/octet-stream`` + will be used. """ - def get_content_type(filename): """Return or guess mimetype of ``filename``. :param filename: filename of file - :type filename: unicode/string + :type filename: unicode/str :returns: mime-type, e.g. ``text/html`` - :rtype: :class::class:`str` + :rtype: str """ diff --git a/src/workflow/workflow.py b/src/workflow/workflow.py index fe65a81..488ae3c 100644 --- a/src/workflow/workflow.py +++ b/src/workflow/workflow.py @@ -7,8 +7,12 @@ # Created on 2014-02-15 # -""" -The :class:`Workflow` object is the main interface to this library. +"""The :class:`Workflow` object is the main interface to this library. + +:class:`Workflow` is targeted at Alfred 2. Use +:class:`~workflow.Workflow3` if you want to use Alfred 3's new +features, such as :ref:`workflow variables ` or +more powerful modifiers. See :ref:`setup` in the :ref:`user-manual` for an example of how to set up your Python script to best utilise the :class:`Workflow` object. @@ -17,9 +21,11 @@ up your Python script to best utilise the :class:`Workflow` object. from __future__ import print_function, unicode_literals +import atexit import binascii from contextlib import contextmanager import cPickle +from copy import deepcopy import errno import json import logging @@ -50,7 +56,7 @@ UNSET = object() # Standard system icons #################################################################### -# These icons are default OS X icons. They are super-high quality, and +# These icons are default macOS icons. They are super-high quality, and # will be familiar to users. # This library uses `ICON_ERROR` when a workflow dies in flames, so # in my own workflows, I use `ICON_WARNING` for less fatal errors @@ -445,7 +451,9 @@ class AcquisitionError(Exception): class KeychainError(Exception): - """Raised by methods :meth:`Workflow.save_password`, + """Raised for unknown Keychain errors. + + Raised by methods :meth:`Workflow.save_password`, :meth:`Workflow.get_password` and :meth:`Workflow.delete_password` when ``security`` CLI app returns an unknown error code. @@ -453,7 +461,9 @@ class KeychainError(Exception): class PasswordNotFound(KeychainError): - """Raised by method :meth:`Workflow.get_password` when ``account`` + """Password not in Keychain. + + Raised by method :meth:`Workflow.get_password` when ``account`` is unknown to the Keychain. """ @@ -474,14 +484,14 @@ class PasswordExists(KeychainError): #################################################################### def isascii(text): - """Test if ``text`` contains only ASCII characters + """Test if ``text`` contains only ASCII characters. :param text: text to test for ASCII-ness :type text: ``unicode`` :returns: ``True`` if ``text`` contains only ASCII characters :rtype: ``Boolean`` - """ + """ try: text.encode('ascii') except UnicodeEncodeError: @@ -499,18 +509,19 @@ class SerializerManager(object): .. versionadded:: 1.8 A configured instance of this class is available at - ``workflow.manager``. + :attr:`workflow.manager`. Use :meth:`register()` to register new (or replace existing) serializers, which you can specify by name when calling - :class:`Workflow` data storage methods. + :class:`~workflow.Workflow` data storage methods. - See :ref:`manual-serialization` and :ref:`manual-persistent-data` + See :ref:`guide-serialization` and :ref:`guide-persistent-data` for further information. """ def __init__(self): + """Create new SerializerManager object.""" self._serializers = {} def register(self, name, serializer): @@ -528,7 +539,6 @@ class SerializerManager(object): methods """ - # Basic validation getattr(serializer, 'load') getattr(serializer, 'dump') @@ -536,19 +546,18 @@ class SerializerManager(object): self._serializers[name] = serializer def serializer(self, name): - """Return serializer object for ``name`` or ``None`` if no such - serializer is registered + """Return serializer object for ``name``. :param name: Name of serializer to return :type name: ``unicode`` or ``str`` - :returns: serializer object or ``None`` + :returns: serializer object or ``None`` if no such serializer + is registered. """ - return self._serializers.get(name) def unregister(self, name): - """Remove registered serializer with ``name`` + """Remove registered serializer with ``name``. Raises a :class:`ValueError` if there is no such registered serializer. @@ -558,9 +567,9 @@ class SerializerManager(object): :returns: serializer object """ - if name not in self._serializers: - raise ValueError('No such serializer registered : {0}'.format(name)) + raise ValueError('No such serializer registered : {0}'.format( + name)) serializer = self._serializers[name] del self._serializers[name] @@ -569,7 +578,7 @@ class SerializerManager(object): @property def serializers(self): - """Return names of registered serializers""" + """Return names of registered serializers.""" return sorted(self._serializers.keys()) @@ -596,7 +605,6 @@ class JSONSerializer(object): :rtype: object """ - return json.load(file_obj) @classmethod @@ -611,7 +619,6 @@ class JSONSerializer(object): :type file_obj: ``file`` object """ - return json.dump(obj, file_obj, indent=2, encoding='utf-8') @@ -637,7 +644,6 @@ class CPickleSerializer(object): :rtype: object """ - return cPickle.load(file_obj) @classmethod @@ -652,7 +658,6 @@ class CPickleSerializer(object): :type file_obj: ``file`` object """ - return cPickle.dump(obj, file_obj, protocol=-1) @@ -677,7 +682,6 @@ class PickleSerializer(object): :rtype: object """ - return pickle.load(file_obj) @classmethod @@ -692,7 +696,6 @@ class PickleSerializer(object): :type file_obj: ``file`` object """ - return pickle.dump(obj, file_obj, protocol=-1) @@ -704,8 +707,9 @@ manager.register('json', JSONSerializer) class Item(object): - """Represents a feedback item for Alfred. Generates Alfred-compliant - XML for a single item. + """Represents a feedback item for Alfred. + + Generates Alfred-compliant XML for a single item. You probably shouldn't use this class directly, but via :meth:`Workflow.add_item`. See :meth:`~Workflow.add_item` @@ -716,11 +720,8 @@ class Item(object): def __init__(self, title, subtitle='', modifier_subtitles=None, arg=None, autocomplete=None, valid=False, uid=None, icon=None, icontype=None, type=None, largetext=None, - copytext=None): - """Arguments the same as for :meth:`Workflow.add_item`. - - """ - + copytext=None, quicklookurl=None): + """Same arguments as :meth:`Workflow.add_item`.""" self.title = title self.subtitle = subtitle self.modifier_subtitles = modifier_subtitles or {} @@ -733,6 +734,7 @@ class Item(object): self.type = type self.largetext = largetext self.copytext = copytext + self.quicklookurl = quicklookurl @property def elem(self): @@ -742,7 +744,6 @@ class Item(object): instance for this :class:`Item` instance. """ - # Attributes on element attr = {} if self.valid: @@ -792,17 +793,42 @@ class Item(object): ET.SubElement(root, 'text', {'type': 'copy'}).text = self.copytext + if self.quicklookurl: + ET.SubElement(root, 'quicklookurl').text = self.quicklookurl + return root class LockFile(object): - """Context manager to create lock files""" + """Context manager to protect filepaths with lockfiles. + + .. versionadded:: 1.13 + + Creates a lockfile alongside ``protected_path``. Other ``LockFile`` + instances will refuse to lock the same path. + + >>> path = '/path/to/file' + >>> with LockFile(path): + >>> with open(path, 'wb') as fp: + >>> fp.write(data) + + Args: + protected_path (unicode): File to protect with a lockfile + timeout (int, optional): Raises an :class:`AcquisitionError` + if lock cannot be acquired within this number of seconds. + If ``timeout`` is 0 (the default), wait forever. + delay (float, optional): How often to check (in seconds) if + lock has been released. + + """ def __init__(self, protected_path, timeout=0, delay=0.05): + """Create new :class:`LockFile` object.""" self.lockfile = protected_path + '.lock' self.timeout = timeout self.delay = delay self._locked = False + atexit.register(self.release) @property def locked(self): @@ -816,21 +842,25 @@ class LockFile(object): ``False``. Otherwise, check every `self.delay` seconds until it acquires - lock or exceeds `self.timeout` and raises an exception. + lock or exceeds `self.timeout` and raises an `~AcquisitionError`. """ start = time.time() while True: + + self._validate_lockfile() + try: fd = os.open(self.lockfile, os.O_CREAT | os.O_EXCL | os.O_RDWR) with os.fdopen(fd, 'w') as fd: - fd.write('{0}'.format(os.getpid())) + fd.write(str(os.getpid())) break except OSError as err: if err.errno != errno.EEXIST: # pragma: no cover raise + if self.timeout and (time.time() - start) >= self.timeout: - raise AcquisitionError('Lock acquisition timed out.') + raise AcquisitionError('lock acquisition timed out') if not blocking: return False time.sleep(self.delay) @@ -838,10 +868,36 @@ class LockFile(object): self._locked = True return True + def _validate_lockfile(self): + """Check existence and validity of lockfile. + + If the lockfile exists, but contains an invalid PID + or the PID of a non-existant process, it is removed. + + """ + try: + with open(self.lockfile) as fp: + s = fp.read() + except Exception: + return + + try: + pid = int(s) + except ValueError: + return self.release() + + from background import _process_exists + if not _process_exists(pid): + self.release() + def release(self): """Release the lock by deleting `self.lockfile`.""" self._locked = False - os.unlink(self.lockfile) + try: + os.unlink(self.lockfile) + except (OSError, IOError) as err: # pragma: no cover + if err.errno != 2: + raise err def __enter__(self): """Acquire lock.""" @@ -862,18 +918,17 @@ class LockFile(object): def atomic_writer(file_path, mode): """Atomic file writer. - :param file_path: path of file to write to. - :type file_path: ``unicode`` - :param mode: sames as for `func:open` - :type mode: string - .. versionadded:: 1.12 Context manager that ensures the file is only written if the write succeeds. The data is first written to a temporary file. - """ + :param file_path: path of file to write to. + :type file_path: ``unicode`` + :param mode: sames as for :func:`open` + :type mode: string + """ temp_suffix = '.aw.temp' temp_file_path = file_path + temp_suffix with open(temp_file_path, mode) as file_obj: @@ -888,11 +943,13 @@ def atomic_writer(file_path, mode): class uninterruptible(object): - """Decorator that postpones SIGTERM until wrapped function is complete. + """Decorator that postpones SIGTERM until wrapped function returns. .. versionadded:: 1.12 - Since version 2.7, Alfred allows Script Filters to be killed. If + .. important:: This decorator is NOT thread-safe. + + As of version 2.7, Alfred allows Script Filters to be killed. If your workflow is killed in the middle of critical code (e.g. writing data to disk), this may corrupt your workflow's data. @@ -904,13 +961,10 @@ class uninterruptible(object): Alfred-Workflow uses this internally to ensure its settings, data and cache writes complete. - .. important:: - - This decorator is NOT thread-safe. - """ def __init__(self, func, class_name=''): + """Decorate `func`.""" self.func = func self._caught_signal = None @@ -919,6 +973,7 @@ class uninterruptible(object): self._caught_signal = (signum, frame) def __call__(self, *args, **kwargs): + """Trap ``SIGTERM`` and call wrapped function.""" self._caught_signal = None # Register handler for SIGTERM, then call `self.func` self.old_signal_handler = signal.getsignal(signal.SIGTERM) @@ -938,6 +993,7 @@ class uninterruptible(object): sys.exit(0) def __get__(self, obj=None, klass=None): + """Decorator API.""" return self.__class__(self.func.__get__(obj, klass), klass.__name__) @@ -961,10 +1017,11 @@ class Settings(dict): """ def __init__(self, filepath, defaults=None): - + """Create new :class:`Settings` object.""" super(Settings, self).__init__() self._filepath = filepath self._nosave = False + self._original = {} if os.path.exists(self._filepath): self._load() elif defaults: @@ -973,16 +1030,19 @@ class Settings(dict): self.save() # save default settings def _load(self): - """Load cached settings from JSON file `self._filepath`""" - + """Load cached settings from JSON file `self._filepath`.""" self._nosave = True + d = {} with open(self._filepath, 'rb') as file_obj: for key, value in json.load(file_obj, encoding='utf-8').items(): - self[key] = value + d[key] = value + self.update(d) + self._original = deepcopy(d) self._nosave = False + @uninterruptible def save(self): - """Save settings to JSON file specified in ``self._filepath`` + """Save settings to JSON file specified in ``self._filepath``. If you're using this class via :attr:`Workflow.settings`, which you probably are, ``self._filepath`` will be ``settings.json`` @@ -991,8 +1051,9 @@ class Settings(dict): if self._nosave: return data = {} - for key, value in self.items(): - data[key] = value + data.update(self) + # for key, value in self.items(): + # data[key] = value with LockFile(self._filepath): with atomic_writer(self._filepath, 'wb') as file_obj: json.dump(data, file_obj, sort_keys=True, indent=2, @@ -1000,10 +1061,13 @@ class Settings(dict): # dict methods def __setitem__(self, key, value): - super(Settings, self).__setitem__(key, value) - self.save() + """Implement :class:`dict` interface.""" + if self._original.get(key) != value: + super(Settings, self).__setitem__(key, value) + self.save() def __delitem__(self, key): + """Implement :class:`dict` interface.""" super(Settings, self).__delitem__(key) self.save() @@ -1020,36 +1084,48 @@ class Settings(dict): class Workflow(object): - """Create new :class:`Workflow` instance. + """The ``Workflow`` object is the main interface to Alfred-Workflow. - :param default_settings: default workflow settings. If no settings file - exists, :class:`Workflow.settings` will be pre-populated with - ``default_settings``. - :type default_settings: :class:`dict` - :param update_settings: settings for updating your workflow from GitHub. - This must be a :class:`dict` that contains ``github_slug`` and - ``version`` keys. ``github_slug`` is of the form ``username/repo`` - and ``version`` **must** correspond to the tag of a release. - See :ref:`updates` for more information. - :type update_settings: :class:`dict` - :param input_encoding: encoding of command line arguments - :type input_encoding: :class:`unicode` - :param normalization: normalisation to apply to CLI args. - See :meth:`Workflow.decode` for more details. - :type normalization: :class:`unicode` - :param capture_args: capture and act on ``workflow:*`` arguments. See - :ref:`Magic arguments ` for details. - :type capture_args: :class:`Boolean` - :param libraries: sequence of paths to directories containing - libraries. These paths will be prepended to ``sys.path``. - :type libraries: :class:`tuple` or :class:`list` - :param help_url: URL to webpage where a user can ask for help with - the workflow, report bugs, etc. This could be the GitHub repo - or a page on AlfredForum.com. If your workflow throws an error, - this URL will be displayed in the log and Alfred's debugger. It can - also be opened directly in a web browser with the ``workflow:help`` - :ref:`magic argument `. - :type help_url: :class:`unicode` or :class:`str` + It provides APIs for accessing the Alfred/workflow environment, + storing & caching data, using Keychain, and generating Script + Filter feedback. + + ``Workflow`` is compatible with both Alfred 2 and 3. The + :class:`~workflow.Workflow3` subclass provides additional, + Alfred 3-only features, such as workflow variables. + + :param default_settings: default workflow settings. If no settings file + exists, :class:`Workflow.settings` will be pre-populated with + ``default_settings``. + :type default_settings: :class:`dict` + :param update_settings: settings for updating your workflow from + GitHub releases. The only required key is ``github_slug``, + whose value must take the form of ``username/repo``. + If specified, ``Workflow`` will check the repo's releases + for updates. Your workflow must also have a semantic version + number. Please see the :ref:`User Manual ` and + `update API docs ` for more information. + :type update_settings: :class:`dict` + :param input_encoding: encoding of command line arguments. You + should probably leave this as the default (``utf-8``), which + is the encoding Alfred uses. + :type input_encoding: :class:`unicode` + :param normalization: normalisation to apply to CLI args. + See :meth:`Workflow.decode` for more details. + :type normalization: :class:`unicode` + :param capture_args: Capture and act on ``workflow:*`` arguments. See + :ref:`Magic arguments ` for details. + :type capture_args: :class:`Boolean` + :param libraries: sequence of paths to directories containing + libraries. These paths will be prepended to ``sys.path``. + :type libraries: :class:`tuple` or :class:`list` + :param help_url: URL to webpage where a user can ask for help with + the workflow, report bugs, etc. This could be the GitHub repo + or a page on AlfredForum.com. If your workflow throws an error, + this URL will be displayed in the log and Alfred's debugger. It can + also be opened directly in a web browser with the ``workflow:help`` + :ref:`magic argument `. + :type help_url: :class:`unicode` or :class:`str` """ @@ -1061,7 +1137,7 @@ class Workflow(object): input_encoding='utf-8', normalization='NFC', capture_args=True, libraries=None, help_url=None): - + """Create new :class:`Workflow` object.""" self._default_settings = default_settings or {} self._update_settings = update_settings or {} self._input_encoding = input_encoding @@ -1072,11 +1148,10 @@ class Workflow(object): self._settings_path = None self._settings = None self._bundleid = None + self._debugging = None self._name = None self._cache_serializer = 'cpickle' self._data_serializer = 'cpickle' - # info.plist should be in the directory above this one - self._info_plist = self.workflowfile('info.plist') self._info = None self._info_loaded = False self._logger = None @@ -1114,9 +1189,15 @@ class Workflow(object): # info.plist contents and alfred_* environment variables ---------- + @property + def alfred_version(self): + """Alfred version as :class:`~workflow.update.Version` object.""" + from update import Version + return Version(self.alfred_env.get('version')) + @property def alfred_env(self): - """Alfred's environmental variables minus the ``alfred_`` prefix. + """Dict of Alfred's environmental variables minus ``alfred_`` prefix. .. versionadded:: 1.7 @@ -1125,29 +1206,33 @@ class Workflow(object): ============================ ========================================= Variable Description ============================ ========================================= - alfred_preferences Path to Alfred.alfredpreferences + debug Set to ``1`` if Alfred's debugger is + open, otherwise unset. + preferences Path to Alfred.alfredpreferences (where your workflows and settings are stored). - alfred_preferences_localhash Machine-specific preferences are stored + preferences_localhash Machine-specific preferences are stored in ``Alfred.alfredpreferences/preferences/local/`` - (see ``alfred_preferences`` above for + (see ``preferences`` above for the path to ``Alfred.alfredpreferences``) - alfred_theme ID of selected theme - alfred_theme_background Background colour of selected theme in + theme ID of selected theme + theme_background Background colour of selected theme in format ``rgba(r,g,b,a)`` - alfred_theme_subtext Show result subtext. + theme_subtext Show result subtext. ``0`` = Always, ``1`` = Alternative actions only, ``2`` = Selected result only, ``3`` = Never - alfred_version Alfred version number, e.g. ``'2.4'`` - alfred_version_build Alfred build number, e.g. ``277`` - alfred_workflow_bundleid Bundle ID, e.g. + version Alfred version number, e.g. ``'2.4'`` + version_build Alfred build number, e.g. ``277`` + workflow_bundleid Bundle ID, e.g. ``net.deanishe.alfred-mailto`` - alfred_workflow_cache Path to workflow's cache directory - alfred_workflow_data Path to workflow's data directory - alfred_workflow_name Name of current workflow - alfred_workflow_uid UID of workflow + workflow_cache Path to workflow's cache directory + workflow_data Path to workflow's data directory + workflow_name Name of current workflow + workflow_uid UID of workflow + workflow_version The version number specified in the + workflow configuration sheet/info.plist ============================ ========================================= **Note:** all values are Unicode strings except ``version_build`` and @@ -1157,13 +1242,13 @@ class Workflow(object): ``alfred_`` prefix, e.g. ``preferences``, ``workflow_data``. """ - if self._alfred_env is not None: return self._alfred_env data = {} for key in ( + 'alfred_debug', 'alfred_preferences', 'alfred_preferences_localhash', 'alfred_theme', @@ -1175,12 +1260,14 @@ class Workflow(object): 'alfred_workflow_cache', 'alfred_workflow_data', 'alfred_workflow_name', - 'alfred_workflow_uid'): + 'alfred_workflow_uid', + 'alfred_workflow_version'): value = os.getenv(key) if isinstance(value, str): - if key in ('alfred_version_build', 'alfred_theme_subtext'): + if key in ('alfred_debug', 'alfred_version_build', + 'alfred_theme_subtext'): value = int(value) else: value = self.decode(value) @@ -1194,7 +1281,6 @@ class Workflow(object): @property def info(self): """:class:`dict` of ``info.plist`` contents.""" - if not self._info_loaded: self._load_info_plist() return self._info @@ -1207,7 +1293,6 @@ class Workflow(object): :rtype: ``unicode`` """ - if not self._bundleid: if self.alfred_env.get('workflow_bundleid'): self._bundleid = self.alfred_env.get('workflow_bundleid') @@ -1216,6 +1301,21 @@ class Workflow(object): return self._bundleid + @property + def debugging(self): + """Whether Alfred's debugger is open. + + :returns: ``True`` if Alfred's debugger is open. + :rtype: ``bool`` + + """ + if self._debugging is None: + if self.alfred_env.get('debug') == 1: + self._debugging = True + else: + self._debugging = False + return self._debugging + @property def name(self): """Workflow name from Alfred's environmental vars or ``info.plist``. @@ -1224,7 +1324,6 @@ class Workflow(object): :rtype: ``unicode`` """ - if not self._name: if self.alfred_env.get('workflow_name'): self._name = self.decode(self.alfred_env.get('workflow_name')) @@ -1235,29 +1334,33 @@ class Workflow(object): @property def version(self): - """Return the version of the workflow + """Return the version of the workflow. .. versionadded:: 1.9.10 - Get the version from the ``update_settings`` dict passed on - instantiation or the ``version`` file located in the workflow's - root directory. Return ``None`` if neither exist or - :class:`ValueError` if the version number is invalid (i.e. not - semantic). + Get the workflow version from environment variable, + the ``update_settings`` dict passed on + instantiation, the ``version`` file located in the workflow's + root directory or ``info.plist``. Return ``None`` if none + exists or :class:`ValueError` if the version number is invalid + (i.e. not semantic). :returns: Version of the workflow (not Alfred-Workflow) :rtype: :class:`~workflow.update.Version` object """ - if self._version is UNSET: version = None - # First check `update_settings` - if self._update_settings: + # environment variable has priority + if self.alfred_env.get('workflow_version'): + version = self.alfred_env['workflow_version'] + + # Try `update_settings` + elif self._update_settings: version = self._update_settings.get('version') - # Fallback to `version` file + # `version` file if not version: filepath = self.workflowfile('version') @@ -1265,6 +1368,10 @@ class Workflow(object): with open(filepath, 'rb') as fileobj: version = fileobj.read() + # info.plist + if not version: + version = self.info.get('version') + if version: from update import Version version = Version(version) @@ -1293,7 +1400,6 @@ class Workflow(object): See :ref:`Magic arguments ` for details. """ - msg = None args = [self.decode(arg) for arg in sys.argv[1:]] @@ -1316,28 +1422,34 @@ class Workflow(object): def cachedir(self): """Path to workflow's cache directory. - The cache directory is a subdirectory of Alfred's own cache directory in - ``~/Library/Caches``. The full path is: + The cache directory is a subdirectory of Alfred's own cache directory + in ``~/Library/Caches``. The full path is: - ``~/Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data/`` + ``~/Library/Caches/com.runningwithcrayons.Alfred-X/Workflow Data/`` + + ``Alfred-X`` may be ``Alfred-2`` or ``Alfred-3``. :returns: full path to workflow's cache directory :rtype: ``unicode`` """ - if self.alfred_env.get('workflow_cache'): dirpath = self.alfred_env.get('workflow_cache') else: - dirpath = os.path.join( - os.path.expanduser( - '~/Library/Caches/com.runningwithcrayons.Alfred-2/' - 'Workflow Data/'), - self.bundleid) + dirpath = self._default_cachedir return self._create(dirpath) + @property + def _default_cachedir(self): + """Alfred 2's default cache directory.""" + return os.path.join( + os.path.expanduser( + '~/Library/Caches/com.runningwithcrayons.Alfred-2/' + 'Workflow Data/'), + self.bundleid) + @property def datadir(self): """Path to workflow's data directory. @@ -1351,17 +1463,21 @@ class Workflow(object): :rtype: ``unicode`` """ - if self.alfred_env.get('workflow_data'): dirpath = self.alfred_env.get('workflow_data') else: - dirpath = os.path.join(os.path.expanduser( - '~/Library/Application Support/Alfred 2/Workflow Data/'), - self.bundleid) + dirpath = self._default_datadir return self._create(dirpath) + @property + def _default_datadir(self): + """Alfred 2's default data directory.""" + return os.path.join(os.path.expanduser( + '~/Library/Application Support/Alfred 2/Workflow Data/'), + self.bundleid) + @property def workflowdir(self): """Path to workflow's root directory (where ``info.plist`` is). @@ -1370,7 +1486,6 @@ class Workflow(object): :rtype: ``unicode`` """ - if not self._workflowdir: # Try the working directory first, then the directory # the library is in. CWD will be the workflow root if @@ -1407,7 +1522,9 @@ class Workflow(object): return self._workflowdir def cachefile(self, filename): - """Return full path to ``filename`` within your workflow's + """Path to ``filename`` in workflow's cache directory. + + Return absolute path to ``filename`` within your workflow's :attr:`cache directory `. :param filename: basename of file @@ -1416,11 +1533,12 @@ class Workflow(object): :rtype: ``unicode`` """ - return os.path.join(self.cachedir, filename) def datafile(self, filename): - """Return full path to ``filename`` within your workflow's + """Path to ``filename`` in workflow's data directory. + + Return absolute path to ``filename`` within your workflow's :attr:`data directory `. :param filename: basename of file @@ -1429,12 +1547,10 @@ class Workflow(object): :rtype: ``unicode`` """ - return os.path.join(self.datadir, filename) def workflowfile(self, filename): - """Return full path to ``filename`` in workflow's root dir - (where ``info.plist`` is). + """Return full path to ``filename`` in workflow's root directory. :param filename: basename of file :type filename: ``unicode`` @@ -1442,31 +1558,30 @@ class Workflow(object): :rtype: ``unicode`` """ - return os.path.join(self.workflowdir, filename) @property def logfile(self): - """Return path to logfile + """Path to logfile. :returns: path to logfile within workflow's cache directory :rtype: ``unicode`` """ - return self.cachefile('%s.log' % self.bundleid) @property def logger(self): - """Create and return a logger that logs to both console and - a log file. + """Logger that logs to both console and a log file. + + If Alfred's debugger is open, log level will be ``DEBUG``, + else it will be ``INFO``. Use :meth:`open_log` to open the log file in Console. :returns: an initialised :class:`~logging.Logger` """ - if self._logger: return self._logger @@ -1474,25 +1589,28 @@ class Workflow(object): logger = logging.getLogger('workflow') if not len(logger.handlers): # Only add one set of handlers - logfile = logging.handlers.RotatingFileHandler( - self.logfile, - maxBytes=1024*1024, - backupCount=0) - - console = logging.StreamHandler() fmt = logging.Formatter( '%(asctime)s %(filename)s:%(lineno)s' ' %(levelname)-8s %(message)s', datefmt='%H:%M:%S') + logfile = logging.handlers.RotatingFileHandler( + self.logfile, + maxBytes=1024 * 1024, + backupCount=1) logfile.setFormatter(fmt) - console.setFormatter(fmt) - logger.addHandler(logfile) + + console = logging.StreamHandler() + console.setFormatter(fmt) logger.addHandler(console) - logger.setLevel(logging.DEBUG) + if self.debugging: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.INFO) + self._logger = logger return self._logger @@ -1505,7 +1623,6 @@ class Workflow(object): :type logger: `~logging.Logger` instance """ - self._logger = logger @property @@ -1516,7 +1633,6 @@ class Workflow(object): :rtype: ``unicode`` """ - if not self._settings_path: self._settings_path = self.datafile('settings.json') return self._settings_path @@ -1525,7 +1641,7 @@ class Workflow(object): def settings(self): """Return a dictionary subclass that saves itself when changed. - See :ref:`manual-settings` in the :ref:`user-manual` for more + See :ref:`guide-settings` in the :ref:`user-manual` for more information on how to use :attr:`settings` and **important limitations** on what it can do. @@ -1537,10 +1653,8 @@ class Workflow(object): :rtype: :class:`~workflow.workflow.Settings` instance """ - if not self._settings: - self.logger.debug('Reading settings from `{0}` ...'.format( - self.settings_path)) + self.logger.debug('reading settings from %s', self.settings_path) self._settings = Settings(self.settings_path, self._default_settings) return self._settings @@ -1560,7 +1674,6 @@ class Workflow(object): :rtype: ``unicode`` """ - return self._cache_serializer @cache_serializer.setter @@ -1580,14 +1693,12 @@ class Workflow(object): :type serializer_name: """ - if manager.serializer(serializer_name) is None: raise ValueError( 'Unknown serializer : `{0}`. Register your serializer ' 'with `manager` first.'.format(serializer_name)) - self.logger.debug( - 'default cache serializer set to `{0}`'.format(serializer_name)) + self.logger.debug('default cache serializer: %s', serializer_name) self._cache_serializer = serializer_name @@ -1606,7 +1717,6 @@ class Workflow(object): :rtype: ``unicode`` """ - return self._data_serializer @data_serializer.setter @@ -1625,31 +1735,29 @@ class Workflow(object): :param serializer_name: Name of serializer to use by default. """ - if manager.serializer(serializer_name) is None: raise ValueError( 'Unknown serializer : `{0}`. Register your serializer ' 'with `manager` first.'.format(serializer_name)) - self.logger.debug( - 'default data serializer set to `{0}`'.format(serializer_name)) + self.logger.debug('default data serializer: %s', serializer_name) self._data_serializer = serializer_name def stored_data(self, name): - """Retrieve data from data directory. Returns ``None`` if there - are no data stored. + """Retrieve data from data directory. + + Returns ``None`` if there are no data stored under ``name``. .. versionadded:: 1.8 :param name: name of datastore """ - metadata_path = self.datafile('.{0}.alfred-workflow'.format(name)) if not os.path.exists(metadata_path): - self.logger.debug('No data stored for `{0}`'.format(name)) + self.logger.debug('no data stored for `%s`', name) return None with open(metadata_path, 'rb') as file_obj: @@ -1663,14 +1771,13 @@ class Workflow(object): 'serializer with `manager.register()` ' 'to load this data.'.format(serializer_name)) - self.logger.debug('Data `{0}` stored in `{1}` format'.format( - name, serializer_name)) + self.logger.debug('data `%s` stored as `%s`', name, serializer_name) filename = '{0}.{1}'.format(name, serializer_name) data_path = self.datafile(filename) if not os.path.exists(data_path): - self.logger.debug('No data stored for `{0}`'.format(name)) + self.logger.debug('no data stored: %s', name) if os.path.exists(metadata_path): os.unlink(metadata_path) @@ -1679,7 +1786,7 @@ class Workflow(object): with open(data_path, 'rb') as file_obj: data = serializer.load(file_obj) - self.logger.debug('Stored data loaded from : {0}'.format(data_path)) + self.logger.debug('stored data loaded: %s', data_path) return data @@ -1701,7 +1808,6 @@ class Workflow(object): :returns: data in datastore or ``None`` """ - # Ensure deletion is not interrupted by SIGTERM @uninterruptible def delete_paths(paths): @@ -1709,7 +1815,7 @@ class Workflow(object): for path in paths: if os.path.exists(path): os.unlink(path) - self.logger.debug('Deleted data file : {0}'.format(path)) + self.logger.debug('deleted data file: %s', path) serializer_name = serializer or self.data_serializer @@ -1749,10 +1855,12 @@ class Workflow(object): _store() - self.logger.debug('Stored data saved at : {0}'.format(data_path)) + self.logger.debug('saved data: %s', data_path) def cached_data(self, name, data_func=None, max_age=60): - """Retrieve data from cache or re-generate and re-cache data if + """Return cached data if younger than ``max_age`` seconds. + + Retrieve data from cache or re-generate and re-cache data if stale/non-existant. If ``max_age`` is 0, return cached data no matter how old. @@ -1765,7 +1873,6 @@ class Workflow(object): if ``data_func`` is not set """ - serializer = manager.serializer(self.cache_serializer) cache_path = self.cachefile('%s.%s' % (name, self.cache_serializer)) @@ -1774,8 +1881,7 @@ class Workflow(object): if (age < max_age or max_age == 0) and os.path.exists(cache_path): with open(cache_path, 'rb') as file_obj: - self.logger.debug('Loading cached data from : %s', - cache_path) + self.logger.debug('loading cached data: %s', cache_path) return serializer.load(file_obj) if not data_func: @@ -1797,7 +1903,6 @@ class Workflow(object): the cache serializer """ - serializer = manager.serializer(self.cache_serializer) cache_path = self.cachefile('%s.%s' % (name, self.cache_serializer)) @@ -1805,16 +1910,16 @@ class Workflow(object): if data is None: if os.path.exists(cache_path): os.unlink(cache_path) - self.logger.debug('Deleted cache file : %s', cache_path) + self.logger.debug('deleted cache file: %s', cache_path) return with atomic_writer(cache_path, 'wb') as file_obj: serializer.dump(data, file_obj) - self.logger.debug('Cached data saved at : %s', cache_path) + self.logger.debug('cached data: %s', cache_path) def cached_data_fresh(self, name, max_age): - """Is data cached at `name` less than `max_age` old? + """Whether cache `name` is less than `max_age` seconds old. :param name: name of datastore :param max_age: maximum age of data in seconds @@ -1823,7 +1928,6 @@ class Workflow(object): ``False`` """ - age = self.cached_data_age(name) if not age: @@ -1832,8 +1936,7 @@ class Workflow(object): return age < max_age def cached_data_age(self, name): - """Return age of data cached at `name` in seconds or 0 if - cache doesn't exist + """Return age in seconds of cache `name` or 0 if cache doesn't exist. :param name: name of datastore :type name: ``unicode`` @@ -1841,7 +1944,6 @@ class Workflow(object): :rtype: ``int`` """ - cache_path = self.cachefile('%s.%s' % (name, self.cache_serializer)) if not os.path.exists(cache_path): @@ -1857,10 +1959,8 @@ class Workflow(object): ``query`` is case-insensitive. Any item that does not contain the entirety of ``query`` is rejected. - .. warning:: - - If ``query`` is an empty string or contains only whitespace, - a :class:`ValueError` will be raised. + If ``query`` is an empty string or contains only whitespace, + all items will match. :param query: query to test items against :type query: ``unicode`` @@ -1897,26 +1997,30 @@ class Workflow(object): By default, :meth:`filter` uses all of the following flags (i.e. :const:`MATCH_ALL`). The tests are always run in the given order: - 1. :const:`MATCH_STARTSWITH` : Item search key startswith - ``query``(case-insensitive). - 2. :const:`MATCH_CAPITALS` : The list of capital letters in item - search key starts with ``query`` (``query`` may be - lower-case). E.g., ``of`` would match ``OmniFocus``, - ``gc`` would match ``Google Chrome`` - 3. :const:`MATCH_ATOM` : Search key is split into "atoms" on - non-word characters (.,-,' etc.). Matches if ``query`` is - one of these atoms (case-insensitive). - 4. :const:`MATCH_INITIALS_STARTSWITH` : Initials are the first - characters of the above-described "atoms" (case-insensitive). - 5. :const:`MATCH_INITIALS_CONTAIN` : ``query`` is a substring of - the above-described initials. - 6. :const:`MATCH_INITIALS` : Combination of (4) and (5). - 7. :const:`MATCH_SUBSTRING` : Match if ``query`` is a substring - of item search key (case-insensitive). - 8. :const:`MATCH_ALLCHARS` : Matches if all characters in - ``query`` appear in item search key in the same order + 1. :const:`MATCH_STARTSWITH` + Item search key starts with ``query`` (case-insensitive). + 2. :const:`MATCH_CAPITALS` + The list of capital letters in item search key starts with + ``query`` (``query`` may be lower-case). E.g., ``of`` + would match ``OmniFocus``, ``gc`` would match ``Google Chrome``. + 3. :const:`MATCH_ATOM` + Search key is split into "atoms" on non-word characters + (.,-,' etc.). Matches if ``query`` is one of these atoms (case-insensitive). - 9. :const:`MATCH_ALL` : Combination of all the above. + 4. :const:`MATCH_INITIALS_STARTSWITH` + Initials are the first characters of the above-described + "atoms" (case-insensitive). + 5. :const:`MATCH_INITIALS_CONTAIN` + ``query`` is a substring of the above-described initials. + 6. :const:`MATCH_INITIALS` + Combination of (4) and (5). + 7. :const:`MATCH_SUBSTRING` + ``query`` is a substring of item search key (case-insensitive). + 8. :const:`MATCH_ALLCHARS` + All characters in ``query`` appear in item search key in + the same order (case-insensitive). + 9. :const:`MATCH_ALL` + Combination of all the above. :const:`MATCH_ALLCHARS` is considerably slower than the other @@ -1948,15 +2052,14 @@ class Workflow(object): altered. """ - if not query: - raise ValueError('Empty `query`') + return items # Remove preceding/trailing spaces query = query.strip() if not query: - raise ValueError('`query` contains only whitespace') + return items # Use user override if there is one fold_diacritics = self.settings.get('__workflow_diacritic_folding', @@ -2008,12 +2111,11 @@ class Workflow(object): return [t[0] for t in results] def _filter_item(self, value, query, match_on, fold_diacritics): - """Filter ``value`` against ``query`` using rules ``match_on`` + """Filter ``value`` against ``query`` using rules ``match_on``. :returns: ``(score, rule)`` """ - query = query.lower() if not isascii(query): @@ -2115,11 +2217,16 @@ class Workflow(object): self._search_pattern_cache[query] = search return search - def run(self, func): - """Call ``func`` to run your workflow + def run(self, func, text_errors=False): + """Call ``func`` to run your workflow. :param func: Callable to call with ``self`` (i.e. the :class:`Workflow` instance) as first argument. + :param text_errors: Emit error messages in plain text, not in + Alfred's XML/JSON feedback format. Use this when you're not + running Alfred-Workflow in a Script Filter and would like + to pass the error message to, say, a notification. + :type text_errors: ``Boolean`` ``func`` will be called with :class:`Workflow` instance as first argument. @@ -2130,20 +2237,21 @@ class Workflow(object): output to Alfred. """ - start = time.time() # Call workflow's entry function/method within a try-except block # to catch any errors and display an error message in Alfred try: if self.version: - self.logger.debug('Workflow version : {0}'.format(self.version)) + self.logger.debug('---------- %s (%s) ----------', + self.name, self.version) + else: + self.logger.debug('---------- %s ----------', self.name) # Run update check if configured for self-updates. # This call has to go in the `run` try-except block, as it will # initialise `self.settings`, which will raise an exception # if `settings.json` isn't valid. - if self._update_settings: self.check_update() @@ -2157,31 +2265,38 @@ class Workflow(object): except Exception as err: self.logger.exception(err) if self.help_url: - self.logger.info( - 'For assistance, see: {0}'.format(self.help_url)) + self.logger.info('for assistance, see: %s', self.help_url) + if not sys.stdout.isatty(): # Show error in Alfred - self._items = [] - if self._name: - name = self._name - elif self._bundleid: - name = self._bundleid - else: # pragma: no cover - name = os.path.dirname(__file__) - self.add_item("Error in workflow '%s'" % name, unicode(err), - icon=ICON_ERROR) - self.send_feedback() + if text_errors: + print(unicode(err).encode('utf-8'), end='') + else: + self._items = [] + if self._name: + name = self._name + elif self._bundleid: # pragma: no cover + name = self._bundleid + else: # pragma: no cover + name = os.path.dirname(__file__) + self.add_item("Error in workflow '%s'" % name, + unicode(err), + icon=ICON_ERROR) + self.send_feedback() return 1 + finally: - self.logger.debug('Workflow finished in {0:0.3f} seconds.'.format( - time.time() - start)) + self.logger.debug('---------- finished in %0.3fs ----------', + time.time() - start) + return 0 # Alfred feedback methods ------------------------------------------ def add_item(self, title, subtitle='', modifier_subtitles=None, arg=None, autocomplete=None, valid=False, uid=None, icon=None, - icontype=None, type=None, largetext=None, copytext=None): - """Add an item to be output to Alfred + icontype=None, type=None, largetext=None, copytext=None, + quicklookurl=None): + """Add an item to be output to Alfred. :param title: Title shown in Alfred :type title: ``unicode`` @@ -2220,12 +2335,11 @@ class Workflow(object): :param copytext: Text to be copied to pasteboard if user presses CMD+C on item. :type copytext: ``unicode`` + :param quicklookurl: URL to be displayed using Alfred's Quick Look + feature (tapping ``SHIFT`` or ``⌘+Y`` on a result). + :type quicklookurl: ``unicode`` :returns: :class:`Item` instance - See the :ref:`script-filter-results` section of the documentation - for a detailed description of what the various parameters do and how - they interact with one another. - See :ref:`icons` for a list of the supported system icons. .. note:: @@ -2239,10 +2353,9 @@ class Workflow(object): edit it or do something with it other than send it to Alfred. """ - item = self.item_class(title, subtitle, modifier_subtitles, arg, autocomplete, valid, uid, icon, icontype, type, - largetext, copytext) + largetext, copytext, quicklookurl) self._items.append(item) return item @@ -2268,7 +2381,6 @@ class Workflow(object): Raises a :class:`ValueError` if :attr:`version` isn't set. """ - if not self.version: raise ValueError('No workflow version set') @@ -2279,7 +2391,7 @@ class Workflow(object): @property def last_version_run(self): - """Return version of last version to run (or ``None``) + """Return version of last version to run (or ``None``). .. versionadded:: 1.9.10 @@ -2287,7 +2399,6 @@ class Workflow(object): or ``None`` """ - if self._last_version_run is UNSET: version = self.settings.get('__workflow_last_version') @@ -2297,13 +2408,12 @@ class Workflow(object): self._last_version_run = version - self.logger.debug('Last run version : {0}'.format( - self._last_version_run)) + self.logger.debug('last run version: %s', self._last_version_run) return self._last_version_run def set_last_version(self, version=None): - """Set :attr:`last_version_run` to current version + """Set :attr:`last_version_run` to current version. .. versionadded:: 1.9.10 @@ -2313,7 +2423,6 @@ class Workflow(object): :returns: ``True`` if version is saved, else ``False`` """ - if not version: if not self.version: self.logger.warning( @@ -2328,47 +2437,65 @@ class Workflow(object): self.settings['__workflow_last_version'] = str(version) - self.logger.debug('Set last run version : {0}'.format(version)) + self.logger.debug('set last run version: %s', version) return True @property def update_available(self): - """Is an update available? + """Whether an update is available. .. versionadded:: 1.9 - See :ref:`manual-updates` in the :ref:`user-manual` for detailed + See :ref:`guide-updates` in the :ref:`user-manual` for detailed information on how to enable your workflow to update itself. :returns: ``True`` if an update is available, else ``False`` """ + # Create a new workflow object to ensure standard serialiser + # is used (update.py is called without the user's settings) + update_data = Workflow().cached_data('__workflow_update_status', + max_age=0) - update_data = self.cached_data('__workflow_update_status', max_age=0) - self.logger.debug('update_data : {0}'.format(update_data)) + self.logger.debug('update_data: %r', update_data) if not update_data or not update_data.get('available'): return False return update_data['available'] + @property + def prereleases(self): + """Whether workflow should update to pre-release versions. + + .. versionadded:: 1.16 + + :returns: ``True`` if pre-releases are enabled with the :ref:`magic + argument ` or the ``update_settings`` dict, else + ``False``. + + """ + if self._update_settings.get('prereleases'): + return True + + return self.settings.get('__workflow_prereleases') or False + def check_update(self, force=False): - """Call update script if it's time to check for a new release + """Call update script if it's time to check for a new release. .. versionadded:: 1.9 The update script will be run in the background, so it won't interfere in the execution of your workflow. - See :ref:`manual-updates` in the :ref:`user-manual` for detailed + See :ref:`guide-updates` in the :ref:`user-manual` for detailed information on how to enable your workflow to update itself. :param force: Force update check :type force: ``Boolean`` """ - frequency = self._update_settings.get('frequency', DEFAULT_UPDATE_FREQUENCY) @@ -2393,33 +2520,35 @@ class Workflow(object): cmd = ['/usr/bin/python', update_script, 'check', github_slug, version] - self.logger.info('Checking for update ...') + if self.prereleases: + cmd.append('--prereleases') + + self.logger.info('checking for update ...') run_in_background('__workflow_update_check', cmd) else: - self.logger.debug('Update check not due') + self.logger.debug('update check not due') def start_update(self): - """Check for update and download and install new workflow file + """Check for update and download and install new workflow file. .. versionadded:: 1.9 - See :ref:`manual-updates` in the :ref:`user-manual` for detailed + See :ref:`guide-updates` in the :ref:`user-manual` for detailed information on how to enable your workflow to update itself. :returns: ``True`` if an update is available and will be installed, else ``False`` """ - import update github_slug = self._update_settings['github_slug'] # version = self._update_settings['version'] version = str(self.version) - if not update.check_update(github_slug, version): + if not update.check_update(github_slug, version, self.prereleases): return False from background import run_in_background @@ -2431,7 +2560,10 @@ class Workflow(object): cmd = ['/usr/bin/python', update_script, 'install', github_slug, version] - self.logger.debug('Downloading update ...') + if self.prereleases: + cmd.append('--prereleases') + + self.logger.debug('downloading update ...') run_in_background('__workflow_update_install', cmd) return True @@ -2465,14 +2597,14 @@ class Workflow(object): try: self._call_security('add-generic-password', service, account, '-w', password) - self.logger.debug('Saved password : %s:%s', service, account) + self.logger.debug('saved password : %s:%s', service, account) except PasswordExists: - self.logger.debug('Password exists : %s:%s', service, account) + self.logger.debug('password exists : %s:%s', service, account) current_password = self.get_password(account, service) if current_password == password: - self.logger.debug('Password unchanged') + self.logger.debug('password unchanged') else: self.delete_password(account, service) @@ -2481,8 +2613,9 @@ class Workflow(object): self.logger.debug('save_password : %s:%s', service, account) def get_password(self, account, service=None): - """Retrieve the password saved at ``service/account``. Raise - :class:`PasswordNotFound` exception if password doesn't exist. + """Retrieve the password saved at ``service/account``. + + Raise :class:`PasswordNotFound` exception if password doesn't exist. :param account: name of the account the password is for, e.g. "Pinboard" @@ -2494,7 +2627,6 @@ class Workflow(object): :rtype: ``unicode`` """ - if not service: service = self.bundleid @@ -2515,13 +2647,14 @@ class Workflow(object): if h: password = unicode(binascii.unhexlify(h), 'utf-8') - self.logger.debug('Got password : %s:%s', service, account) + self.logger.debug('got password : %s:%s', service, account) return password def delete_password(self, account, service=None): - """Delete the password stored at ``service/account``. Raises - :class:`PasswordNotFound` if account is unknown. + """Delete the password stored at ``service/account``. + + Raise :class:`PasswordNotFound` if account is unknown. :param account: name of the account the password is for, e.g. "Pinboard" @@ -2531,22 +2664,20 @@ class Workflow(object): :type service: ``unicode`` """ - if not service: service = self.bundleid self._call_security('delete-generic-password', service, account) - self.logger.debug('Deleted password : %s:%s', service, account) + self.logger.debug('deleted password : %s:%s', service, account) #################################################################### # Methods for workflow:* magic args #################################################################### def _register_default_magic(self): - """Register the built-in magic arguments""" + """Register the built-in magic arguments.""" # TODO: refactor & simplify - # Wrap callback and message with callable def callback(func, msg): def wrapper(): @@ -2601,6 +2732,14 @@ class Workflow(object): self.settings['__workflow_autoupdate'] = False return 'Auto update turned off' + def prereleases_on(): + self.settings['__workflow_prereleases'] = True + return 'Prerelease updates turned on' + + def prereleases_off(): + self.settings['__workflow_prereleases'] = False + return 'Prerelease updates turned off' + def do_update(): if self.start_update(): return 'Downloading and installing update ...' @@ -2609,6 +2748,8 @@ class Workflow(object): self.magic_arguments['autoupdate'] = update_on self.magic_arguments['noautoupdate'] = update_off + self.magic_arguments['prereleases'] = prereleases_on + self.magic_arguments['noprereleases'] = prereleases_off self.magic_arguments['update'] = do_update # Help @@ -2626,12 +2767,12 @@ class Workflow(object): return 'This workflow has no version number' def list_magic(): - """Display all available magic args in Alfred""" + """Display all available magic args in Alfred.""" isatty = sys.stderr.isatty() for name in sorted(self.magic_arguments.keys()): if name == 'magic': continue - arg = '{0}{1}'.format(self.magic_prefix, name) + arg = self.magic_prefix + name self.logger.debug(arg) if not isatty: @@ -2672,24 +2813,21 @@ class Workflow(object): """Delete workflow's :attr:`settings_path`.""" if os.path.exists(self.settings_path): os.unlink(self.settings_path) - self.logger.debug('Deleted : %r', self.settings_path) + self.logger.debug('deleted : %r', self.settings_path) def reset(self): - """Delete :attr:`settings `, :attr:`cache ` - and :attr:`data ` + """Delete workflow settings, cache and data. + + File :attr:`settings ` and directories + :attr:`cache ` and :attr:`data ` are deleted. """ - self.clear_cache() self.clear_data() self.clear_settings() def open_log(self): - """Open workflows :attr:`logfile` in standard - application (usually Console.app). - - """ - + """Open :attr:`logfile` in default app (usually Console.app).""" subprocess.call(['open', self.logfile]) def open_cachedir(self): @@ -2706,12 +2844,11 @@ class Workflow(object): def open_terminal(self): """Open a Terminal window at workflow's :attr:`workflowdir`.""" - subprocess.call(['open', '-a', 'Terminal', self.workflowdir]) def open_help(self): - """Open :attr:`help_url` in default browser""" + """Open :attr:`help_url` in default browser.""" subprocess.call(['open', self.help_url]) return 'Opening workflow help URL in browser' @@ -2741,14 +2878,13 @@ class Workflow(object): standard for Python and will work well with data from the web (via :mod:`~workflow.web` or :mod:`json`). - OS X, on the other hand, uses "NFD" normalisation (nearly), so data + macOS, on the other hand, uses "NFD" normalisation (nearly), so data coming from the system (e.g. via :mod:`subprocess` or :func:`os.listdir`/:mod:`os.path`) may not match. You should either normalise this data, too, or change the default normalisation used by :class:`Workflow`. """ - encoding = encoding or self._input_encoding normalization = normalization or self._normalizsation if not isinstance(text, unicode): @@ -2796,15 +2932,15 @@ class Workflow(object): return text def _delete_directory_contents(self, dirpath, filter_func): - """Delete all files in a directory + """Delete all files in a directory. :param dirpath: path to directory to clear :type dirpath: ``unicode`` or ``str`` :param filter_func function to determine whether a file shall be deleted or not. :type filter_func ``callable`` - """ + """ if os.path.exists(dirpath): for filename in os.listdir(dirpath): if not filter_func(filename): @@ -2814,18 +2950,16 @@ class Workflow(object): shutil.rmtree(path) else: os.unlink(path) - self.logger.debug('Deleted : %r', path) + self.logger.debug('deleted : %r', path) def _load_info_plist(self): - """Load workflow info from ``info.plist`` - - """ - - self._info = plistlib.readPlist(self._info_plist) + """Load workflow info from ``info.plist``.""" + # info.plist should be in the directory above this one + self._info = plistlib.readPlist(self.workflowfile('info.plist')) self._info_loaded = True def _create(self, dirpath): - """Create directory `dirpath` if it doesn't exist + """Create directory `dirpath` if it doesn't exist. :param dirpath: path to directory :type dirpath: ``unicode`` @@ -2833,14 +2967,12 @@ class Workflow(object): :rtype: ``unicode`` """ - if not os.path.exists(dirpath): os.makedirs(dirpath) return dirpath def _call_security(self, action, service, account, *args): - """Call the ``security`` CLI app that provides access to keychains. - + """Call ``security`` CLI program that provides access to keychains. May raise `PasswordNotFound`, `PasswordExists` or `KeychainError` exceptions (the first two are subclasses of `KeychainError`). @@ -2863,17 +2995,16 @@ class Workflow(object): :rtype: `tuple` (`int`, ``unicode``) """ - cmd = ['security', action, '-s', service, '-a', account] + list(args) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - retcode, output = p.wait(), p.stdout.read().strip().decode('utf-8') - if retcode == 44: # password does not exist + stdout, _ = p.communicate() + if p.returncode == 44: # password does not exist raise PasswordNotFound() - elif retcode == 45: # password already exists + elif p.returncode == 45: # password already exists raise PasswordExists() - elif retcode > 0: - err = KeychainError('Unknown Keychain error : %s' % output) - err.retcode = retcode + elif p.returncode > 0: + err = KeychainError('Unknown Keychain error : %s' % stdout) + err.retcode = p.returncode raise err - return output + return stdout.strip().decode('utf-8') diff --git a/src/workflow/workflow3.py b/src/workflow/workflow3.py new file mode 100644 index 0000000..e800b60 --- /dev/null +++ b/src/workflow/workflow3.py @@ -0,0 +1,684 @@ +# encoding: utf-8 +# +# Copyright (c) 2016 Dean Jackson +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2016-06-25 +# + +"""An Alfred 3-only version of :class:`~workflow.Workflow`. + +:class:`~workflow.Workflow3` supports Alfred 3's new features, such as +setting :ref:`workflow-variables` and +:class:`the more advanced modifiers ` supported by Alfred 3. + +In order for the feedback mechanism to work correctly, it's important +to create :class:`Item3` and :class:`Modifier` objects via the +:meth:`Workflow3.add_item()` and :meth:`Item3.add_modifier()` methods +respectively. If you instantiate :class:`Item3` or :class:`Modifier` +objects directly, the current :class:`Workflow3` object won't be aware +of them, and they won't be sent to Alfred when you call +:meth:`Workflow3.send_feedback()`. + +""" + +from __future__ import print_function, unicode_literals, absolute_import + +import json +import os +import sys + +from .workflow import Workflow + + +class Variables(dict): + """Workflow variables for Run Script actions. + + .. versionadded: 1.26 + + This class allows you to set workflow variables from + Run Script actions. + + It is a subclass of :class:`dict`. + + >>> v = Variables(username='deanishe', password='hunter2') + >>> v.arg = u'output value' + >>> print(v) + + See :ref:`variables-run-script` in the User Guide for more + information. + + Args: + arg (unicode, optional): Main output/``{query}``. + **variables: Workflow variables to set. + + + Attributes: + arg (unicode): Output value (``{query}``). + config (dict): Configuration for downstream workflow element. + + """ + + def __init__(self, arg=None, **variables): + """Create a new `Variables` object.""" + self.arg = arg + self.config = {} + super(Variables, self).__init__(**variables) + + @property + def obj(self): + """Return ``alfredworkflow`` `dict`.""" + o = {} + if self: + d2 = {} + for k, v in self.items(): + d2[k] = v + o['variables'] = d2 + + if self.config: + o['config'] = self.config + + if self.arg is not None: + o['arg'] = self.arg + + return {'alfredworkflow': o} + + def __unicode__(self): + """Convert to ``alfredworkflow`` JSON object. + + Returns: + unicode: ``alfredworkflow`` JSON object + + """ + if not self and not self.config: + if self.arg: + return self.arg + else: + return u'' + + return json.dumps(self.obj) + + def __str__(self): + """Convert to ``alfredworkflow`` JSON object. + + Returns: + str: UTF-8 encoded ``alfredworkflow`` JSON object + + """ + return unicode(self).encode('utf-8') + + +class Modifier(object): + """Modify :class:`Item3` arg/icon/variables when modifier key is pressed. + + Don't use this class directly (as it won't be associated with any + :class:`Item3`), but rather use :meth:`Item3.add_modifier()` + to add modifiers to results. + + >>> it = wf.add_item('Title', 'Subtitle', valid=True) + >>> it.setvar('name', 'default') + >>> m = it.add_modifier('cmd') + >>> m.setvar('name', 'alternate') + + See :ref:`workflow-variables` in the User Guide for more information + and :ref:`example usage `. + + Args: + key (unicode): Modifier key, e.g. ``"cmd"``, ``"alt"`` etc. + subtitle (unicode, optional): Override default subtitle. + arg (unicode, optional): Argument to pass for this modifier. + valid (bool, optional): Override item's validity. + icon (unicode, optional): Filepath/UTI of icon to use + icontype (unicode, optional): Type of icon. See + :meth:`Workflow.add_item() ` + for valid values. + + Attributes: + arg (unicode): Arg to pass to following action. + config (dict): Configuration for a downstream element, such as + a File Filter. + icon (unicode): Filepath/UTI of icon. + icontype (unicode): Type of icon. See + :meth:`Workflow.add_item() ` + for valid values. + key (unicode): Modifier key (see above). + subtitle (unicode): Override item subtitle. + valid (bool): Override item validity. + variables (dict): Workflow variables set by this modifier. + + """ + + def __init__(self, key, subtitle=None, arg=None, valid=None, icon=None, + icontype=None): + """Create a new :class:`Modifier`. + + Don't use this class directly (as it won't be associated with any + :class:`Item3`), but rather use :meth:`Item3.add_modifier()` + to add modifiers to results. + + Args: + key (unicode): Modifier key, e.g. ``"cmd"``, ``"alt"`` etc. + subtitle (unicode, optional): Override default subtitle. + arg (unicode, optional): Argument to pass for this modifier. + valid (bool, optional): Override item's validity. + icon (unicode, optional): Filepath/UTI of icon to use + icontype (unicode, optional): Type of icon. See + :meth:`Workflow.add_item() ` + for valid values. + + """ + self.key = key + self.subtitle = subtitle + self.arg = arg + self.valid = valid + self.icon = icon + self.icontype = icontype + + self.config = {} + self.variables = {} + + def setvar(self, name, value): + """Set a workflow variable for this Item. + + Args: + name (unicode): Name of variable. + value (unicode): Value of variable. + + """ + self.variables[name] = value + + def getvar(self, name, default=None): + """Return value of workflow variable for ``name`` or ``default``. + + Args: + name (unicode): Variable name. + default (None, optional): Value to return if variable is unset. + + Returns: + unicode or ``default``: Value of variable if set or ``default``. + + """ + return self.variables.get(name, default) + + @property + def obj(self): + """Modifier formatted for JSON serialization for Alfred 3. + + Returns: + dict: Modifier for serializing to JSON. + + """ + o = {} + + if self.subtitle is not None: + o['subtitle'] = self.subtitle + + if self.arg is not None: + o['arg'] = self.arg + + if self.valid is not None: + o['valid'] = self.valid + + if self.variables: + o['variables'] = self.variables + + if self.config: + o['config'] = self.config + + icon = self._icon() + if icon: + o['icon'] = icon + + return o + + def _icon(self): + """Return `icon` object for item. + + Returns: + dict: Mapping for item `icon` (may be empty). + + """ + icon = {} + if self.icon is not None: + icon['path'] = self.icon + + if self.icontype is not None: + icon['type'] = self.icontype + + return icon + + +class Item3(object): + """Represents a feedback item for Alfred 3. + + Generates Alfred-compliant JSON for a single item. + + Don't use this class directly (as it then won't be associated with + any :class:`Workflow3 ` object), but rather use + :meth:`Workflow3.add_item() `. + See :meth:`~workflow.Workflow3.add_item` for details of arguments. + + """ + + def __init__(self, title, subtitle='', arg=None, autocomplete=None, + match=None, valid=False, uid=None, icon=None, icontype=None, + type=None, largetext=None, copytext=None, quicklookurl=None): + """Create a new :class:`Item3` object. + + Use same arguments as for + :class:`Workflow.Item `. + + Argument ``subtitle_modifiers`` is not supported. + + """ + self.title = title + self.subtitle = subtitle + self.arg = arg + self.autocomplete = autocomplete + self.match = match + self.valid = valid + self.uid = uid + self.icon = icon + self.icontype = icontype + self.type = type + self.quicklookurl = quicklookurl + self.largetext = largetext + self.copytext = copytext + + self.modifiers = {} + + self.config = {} + self.variables = {} + + def setvar(self, name, value): + """Set a workflow variable for this Item. + + Args: + name (unicode): Name of variable. + value (unicode): Value of variable. + + """ + self.variables[name] = value + + def getvar(self, name, default=None): + """Return value of workflow variable for ``name`` or ``default``. + + Args: + name (unicode): Variable name. + default (None, optional): Value to return if variable is unset. + + Returns: + unicode or ``default``: Value of variable if set or ``default``. + + """ + return self.variables.get(name, default) + + def add_modifier(self, key, subtitle=None, arg=None, valid=None, icon=None, + icontype=None): + """Add alternative values for a modifier key. + + Args: + key (unicode): Modifier key, e.g. ``"cmd"`` or ``"alt"`` + subtitle (unicode, optional): Override item subtitle. + arg (unicode, optional): Input for following action. + valid (bool, optional): Override item validity. + icon (unicode, optional): Filepath/UTI of icon. + icontype (unicode, optional): Type of icon. See + :meth:`Workflow.add_item() ` + for valid values. + + Returns: + Modifier: Configured :class:`Modifier`. + + """ + mod = Modifier(key, subtitle, arg, valid, icon, icontype) + + for k in self.variables: + mod.setvar(k, self.variables[k]) + + self.modifiers[key] = mod + + return mod + + @property + def obj(self): + """Item formatted for JSON serialization. + + Returns: + dict: Data suitable for Alfred 3 feedback. + + """ + # Required values + o = { + 'title': self.title, + 'subtitle': self.subtitle, + 'valid': self.valid, + } + + # Optional values + if self.arg is not None: + o['arg'] = self.arg + + if self.autocomplete is not None: + o['autocomplete'] = self.autocomplete + + if self.match is not None: + o['match'] = self.match + + if self.uid is not None: + o['uid'] = self.uid + + if self.type is not None: + o['type'] = self.type + + if self.quicklookurl is not None: + o['quicklookurl'] = self.quicklookurl + + if self.variables: + o['variables'] = self.variables + + if self.config: + o['config'] = self.config + + # Largetype and copytext + text = self._text() + if text: + o['text'] = text + + icon = self._icon() + if icon: + o['icon'] = icon + + # Modifiers + mods = self._modifiers() + if mods: + o['mods'] = mods + + return o + + def _icon(self): + """Return `icon` object for item. + + Returns: + dict: Mapping for item `icon` (may be empty). + + """ + icon = {} + if self.icon is not None: + icon['path'] = self.icon + + if self.icontype is not None: + icon['type'] = self.icontype + + return icon + + def _text(self): + """Return `largetext` and `copytext` object for item. + + Returns: + dict: `text` mapping (may be empty) + + """ + text = {} + if self.largetext is not None: + text['largetype'] = self.largetext + + if self.copytext is not None: + text['copy'] = self.copytext + + return text + + def _modifiers(self): + """Build `mods` dictionary for JSON feedback. + + Returns: + dict: Modifier mapping or `None`. + + """ + if self.modifiers: + mods = {} + for k, mod in self.modifiers.items(): + mods[k] = mod.obj + + return mods + + return None + + +class Workflow3(Workflow): + """Workflow class that generates Alfred 3 feedback. + + ``Workflow3`` is a subclass of :class:`~workflow.Workflow` and + most of its methods are documented there. + + Attributes: + item_class (class): Class used to generate feedback items. + variables (dict): Top level workflow variables. + + """ + + item_class = Item3 + + def __init__(self, **kwargs): + """Create a new :class:`Workflow3` object. + + See :class:`~workflow.Workflow` for documentation. + + """ + Workflow.__init__(self, **kwargs) + self.variables = {} + self._rerun = 0 + # Get session ID from environment if present + self._session_id = os.getenv('_WF_SESSION_ID') or None + if self._session_id: + self.setvar('_WF_SESSION_ID', self._session_id) + + @property + def _default_cachedir(self): + """Alfred 3's default cache directory.""" + return os.path.join( + os.path.expanduser( + '~/Library/Caches/com.runningwithcrayons.Alfred-3/' + 'Workflow Data/'), + self.bundleid) + + @property + def _default_datadir(self): + """Alfred 3's default data directory.""" + return os.path.join(os.path.expanduser( + '~/Library/Application Support/Alfred 3/Workflow Data/'), + self.bundleid) + + @property + def rerun(self): + """How often (in seconds) Alfred should re-run the Script Filter.""" + return self._rerun + + @rerun.setter + def rerun(self, seconds): + """Interval at which Alfred should re-run the Script Filter. + + Args: + seconds (int): Interval between runs. + """ + self._rerun = seconds + + @property + def session_id(self): + """A unique session ID every time the user uses the workflow. + + .. versionadded:: 1.25 + + The session ID persists while the user is using this workflow. + It expires when the user runs a different workflow or closes + Alfred. + + """ + if not self._session_id: + from uuid import uuid4 + self._session_id = uuid4().hex + self.setvar('_WF_SESSION_ID', self._session_id) + + return self._session_id + + def setvar(self, name, value): + """Set a "global" workflow variable. + + These variables are always passed to downstream workflow objects. + + If you have set :attr:`rerun`, these variables are also passed + back to the script when Alfred runs it again. + + Args: + name (unicode): Name of variable. + value (unicode): Value of variable. + + """ + self.variables[name] = value + + def getvar(self, name, default=None): + """Return value of workflow variable for ``name`` or ``default``. + + Args: + name (unicode): Variable name. + default (None, optional): Value to return if variable is unset. + + Returns: + unicode or ``default``: Value of variable if set or ``default``. + + """ + return self.variables.get(name, default) + + def add_item(self, title, subtitle='', arg=None, autocomplete=None, + valid=False, uid=None, icon=None, icontype=None, type=None, + largetext=None, copytext=None, quicklookurl=None, match=None): + """Add an item to be output to Alfred. + + Args: + match (unicode, optional): If you have "Alfred filters results" + turned on for your Script Filter, Alfred (version 3.5 and + above) will filter against this field, not ``title``. + + See :meth:`Workflow.add_item() ` for + the main documentation and other parameters. + + The key difference is that this method does not support the + ``modifier_subtitles`` argument. Use the :meth:`~Item3.add_modifier()` + method instead on the returned item instead. + + Returns: + Item3: Alfred feedback item. + + """ + item = self.item_class(title, subtitle, arg, autocomplete, + match, valid, uid, icon, icontype, type, + largetext, copytext, quicklookurl) + + self._items.append(item) + return item + + @property + def _session_prefix(self): + """Filename prefix for current session.""" + return '_wfsess-{0}-'.format(self.session_id) + + def _mk_session_name(self, name): + """New cache name/key based on session ID.""" + return self._session_prefix + name + + def cache_data(self, name, data, session=False): + """Cache API with session-scoped expiry. + + .. versionadded:: 1.25 + + Args: + name (str): Cache key + data (object): Data to cache + session (bool, optional): Whether to scope the cache + to the current session. + + ``name`` and ``data`` are the same as for the + :meth:`~workflow.Workflow.cache_data` method on + :class:`~workflow.Workflow`. + + If ``session`` is ``True``, then ``name`` is prefixed + with :attr:`session_id`. + + """ + if session: + name = self._mk_session_name(name) + + return super(Workflow3, self).cache_data(name, data) + + def cached_data(self, name, data_func=None, max_age=60, session=False): + """Cache API with session-scoped expiry. + + .. versionadded:: 1.25 + + Args: + name (str): Cache key + data_func (callable): Callable that returns fresh data. It + is called if the cache has expired or doesn't exist. + max_age (int): Maximum allowable age of cache in seconds. + session (bool, optional): Whether to scope the cache + to the current session. + + ``name``, ``data_func`` and ``max_age`` are the same as for the + :meth:`~workflow.Workflow.cached_data` method on + :class:`~workflow.Workflow`. + + If ``session`` is ``True``, then ``name`` is prefixed + with :attr:`session_id`. + + """ + if session: + name = self._mk_session_name(name) + + return super(Workflow3, self).cached_data(name, data_func, max_age) + + def clear_session_cache(self, current=False): + """Remove session data from the cache. + + .. versionadded:: 1.25 + .. versionchanged:: 1.27 + + By default, data belonging to the current session won't be + deleted. Set ``current=True`` to also clear current session. + + Args: + current (bool, optional): If ``True``, also remove data for + current session. + + """ + def _is_session_file(filename): + if current: + return filename.startswith('_wfsess-') + return filename.startswith('_wfsess-') \ + and not filename.startswith(self._session_prefix) + + self.clear_cache(_is_session_file) + + @property + def obj(self): + """Feedback formatted for JSON serialization. + + Returns: + dict: Data suitable for Alfred 3 feedback. + + """ + items = [] + for item in self._items: + items.append(item.obj) + + o = {'items': items} + if self.variables: + o['variables'] = self.variables + if self.rerun: + o['rerun'] = self.rerun + return o + + def send_feedback(self): + """Print stored items to console/Alfred as JSON.""" + json.dump(self.obj, sys.stdout) + sys.stdout.flush()