From 6244691a6bc1d789c3f1545a213b49024dec20b7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 1 May 2024 14:57:11 +0200 Subject: [PATCH 01/98] Prepare new class PhoneNumberValidator - currently just reusing PhoneLibWrapper to access PhoneLib logic. First testcase set taken from PhoneNumberNormalizer as starting point. Define expected behaviour and outcomment all testcases which currently do not work. Those can be used to test logic addition to capture more detailed behaviour than phone lib. After standard cases work, next phase will be to include special testcases from PhoneNumberUtil test folder. --- .../PhoneNumberValidator.java | 33 ++++ .../PhoneNumberValidatorImpl.java | 48 +++++ .../numberplans/PhoneLibWrapper.java | 53 ++++++ .../PhoneNumberValidationResult.java | 18 ++ .../PhoneNumberValidatorImplTest.groovy | 69 +++++++ .../numberplans/PhoneLibWrapperTest.groovy | 178 ++++++++++-------- 6 files changed, 319 insertions(+), 80 deletions(-) create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java create mode 100644 src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java new file mode 100644 index 0000000..e6d14bd --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java @@ -0,0 +1,33 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer; + +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; +import de.telekom.phonenumbernormalizer.dto.DeviceContext; + +/** + * An interface for dependency injection - for direct use within your code just use {@link PhoneNumberValidatorImpl}. + */ +public interface PhoneNumberValidator { + + /** + * Validates the number using PhoneLib with some additions to compensate. + * @param number plain number to validate + * @param regionCode ISO2 code of the country, which number-plan is used for normalization + * @return PhoneNumberValidationResult reason if the number is possible (and maybe its limited context) or why not. + */ + PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode); +} diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java new file mode 100644 index 0000000..66584e2 --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -0,0 +1,48 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer; + +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; +import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +/** + * Concrete implementation of {@link PhoneNumberValidator} using {@link PhoneLibWrapper} to validate a number by mitigating some inaccuracies when it comes to number plans of optional NDC and NAC as zero. + */ +@RequiredArgsConstructor +@Component +public class PhoneNumberValidatorImpl implements PhoneNumberValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(PhoneNumberValidatorImpl.class); + + + @Override + public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + + // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); + + // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + + return wrapper.validate(); + } + +} diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index cb80983..a760d7d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -349,4 +349,57 @@ public static String getRegionCodeForCountryCode(String countryCode) { } } + + /** + * Using PhoneLib to check the number by isPossibleWithReason code. If number has been parsed during initialization + * this is a straight invocation, so no compensation of some inaccuracy is done here. Otherwise, parsing is done + * locally and exceptions are directly mapped to a result. + *

+ * @return PhoneNumberUtil.ValidationResult which is PhoneLib isPossible Reason code + * + * @see PhoneLibWrapper#PhoneLibWrapper(String, String) + */ + private PhoneNumberUtil.ValidationResult isPossibleWithReason() { + if (semiNormalizedNumber == null) { + try { + Phonenumber.PhoneNumber tempNumber = phoneUtil.parse(dialableNumber, regionCode); + return phoneUtil.isPossibleNumberWithReason(tempNumber); + // international prefix is added by the lib even if it's not valid in the number plan. + } catch (NumberParseException e) { + LOGGER.info("could not parse normalize number: {}", dialableNumber); + LOGGER.debug("{}", e.getMessage()); + + switch (e.getErrorType()) { + case INVALID_COUNTRY_CODE: + return PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE; + case TOO_SHORT_NSN: + return PhoneNumberUtil.ValidationResult.TOO_SHORT; + case TOO_SHORT_AFTER_IDD: + return PhoneNumberUtil.ValidationResult.TOO_SHORT; + case TOO_LONG: + return PhoneNumberUtil.ValidationResult.TOO_LONG; + default: + // NOT_A_NUMBER + return PhoneNumberUtil.ValidationResult.INVALID_LENGTH; + } + } + } + return phoneUtil.isPossibleNumberWithReason(semiNormalizedNumber); + } + + + /** + * Using PhoneLib to check the number by isPossibleWithReason code by internal wrapper method isPossibleWithReason + * and map the result to PhoneNumberValidationResult type + * + * @return PhoneNumberValidationResult + * + * @see PhoneLibWrapper#isPossibleWithReason() + * @see PhoneNumberValidationResult + */ + public PhoneNumberValidationResult validate() { + return PhoneNumberValidationResult.byPhoneLibValidationResult(isPossibleWithReason()); + } + + } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index c108a3d..d2e204f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -143,6 +143,24 @@ public ValidationResult getPhoneLibValidationResult() { return phoneLibResult; } + public static PhoneNumberValidationResult byPhoneLibValidationResult(ValidationResult result) { + switch(result){ + case IS_POSSIBLE: + return PhoneNumberValidationResult.IS_POSSIBLE; + case IS_POSSIBLE_LOCAL_ONLY: + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + case INVALID_LENGTH: + return PhoneNumberValidationResult.INVALID_LENGTH; + case INVALID_COUNTRY_CODE: + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + case TOO_SHORT: + return PhoneNumberValidationResult.TOO_SHORT; + case TOO_LONG: + return PhoneNumberValidationResult.TOO_LONG; + } + return null; + } + /** * Returns if the validation result identifies a possible number regardless of calling limitations * @return boolean true for any IS_POSSIBLE(_xxx) enum value diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy new file mode 100644 index 0000000..b25dbc5 --- /dev/null +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -0,0 +1,69 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer + +import de.telekom.phonenumbernormalizer.dto.DeviceContext +import de.telekom.phonenumbernormalizer.dto.DeviceContextDto +import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult +import spock.lang.Specification + +class PhoneNumberValidatorImplTest extends Specification { + + PhoneNumberValidator target + + def "setup"() { + target = new PhoneNumberValidatorImpl() + } + + def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { + given: + + when: + "validate number: $number for country: $countryCode" + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + number | countryCode | expectedResult + null | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + // NDC+ national Romania numbers might be longer than 9 digits + "0040(0176) 3 0 6 9 6541" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040 176 3 0 6 9 6542" | "DE" | PhoneNumberValidationResult.TOO_LONG + "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + // "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + // "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + // "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + // "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + // "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + } + +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy index 8cc7151..cee9586 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy @@ -29,84 +29,84 @@ class PhoneLibWrapperTest extends Specification { def "national number and leading zeros"( number, regionCode, expectedResult) { given: - def result = "" - def pn = null - try { - pn = phoneUtil.parse(number, regionCode) - } catch (NumberParseException e) { - result = e.errorType.toString() - } + def result = "" + def pn = null + try { + pn = phoneUtil.parse(number, regionCode) + } catch (NumberParseException e) { + result = e.errorType.toString() + } when: - if (pn != null) { - result = PhoneLibWrapper.nationalPhoneNumberWithoutNationalPrefix(pn) - } + if (pn != null) { + result = PhoneLibWrapper.nationalPhoneNumberWithoutNationalPrefix(pn) + } then: - result == expectedResult + result == expectedResult where: - number | regionCode | expectedResult - "+49203556677" | "DE" | "203556677" - "0203556677" | "DE" | "203556677" - "203556677" | "DE" | "203556677" - "556677" | "DE" | "556677" - - "3784000" | "US" | "3784000" - "14253784000" | "US" | "4253784000" - "+14253784000" | "US" | "4253784000" - "01114253784000"| "US" | "4253784000" - - //special Short Code only valid in Australia, but retain in parsing for the others - "000" | "AU" | "000" - "000" | "DE" | "000" - "000" | "US" | "000" - "000" | "IT" | "000" - // shorter zero check - "00" | "AU" | "00" - "00" | "DE" | "TOO_SHORT_AFTER_IDD" // because IDC in Germany is 00 - "00" | "US" | "00" - "00" | "IT" | "TOO_SHORT_AFTER_IDD" // because IDC in Italy is 00 - //shorter zero check - just current PhoneLib behavior - "0" | "AU" | "NOT_A_NUMBER" // because its to short - "0" | "DE" | "NOT_A_NUMBER" // because its to short - "0" | "US" | "NOT_A_NUMBER" // because its to short - "0" | "IT" | "NOT_A_NUMBER" // because its to short - //shorter 1 check - just current PhoneLib behavior - "1" | "AU" | "NOT_A_NUMBER" // because its to short - "1" | "DE" | "NOT_A_NUMBER" // because its to short - "1" | "US" | "NOT_A_NUMBER" // because its to short - "1" | "IT" | "NOT_A_NUMBER" // because its to short - //shorter zero check - just current PhoneLib behavior - "01" | "AU" | "01" - "01" | "DE" | "01" - "01" | "US" | "01" - "01" | "IT" | "01" - - //Special Italian leading Zero within national number (and not) - "012345678" | "IT" | "012345678" - "+39012345678" | "IT" | "012345678" - "0039012345678" | "IT" | "012345678" - "+39012345678" | "DE" | "012345678" //Italy called from Germany - "0039012345678" | "DE" | "012345678" //Italy called from Germany - "+39012345678" | "US" | "012345678" //Italy called from North America - "01139012345678"| "US" | "012345678" //Italy called from North America - "312345678" | "IT" | "312345678" - "+39312345678" | "IT" | "312345678" - "0039312345678" | "IT" | "312345678" - "+39312345678" | "DE" | "312345678" //Italy called from Germany - "0039312345678" | "DE" | "312345678" //Italy called from Germany - "+39312345678" | "US" | "312345678" //Italy called from North America - "01139312345678"| "US" | "312345678" //Italy called from North America + number | regionCode | expectedResult + "+49203556677" | "DE" | "203556677" + "0203556677" | "DE" | "203556677" + "203556677" | "DE" | "203556677" + "556677" | "DE" | "556677" + + "3784000" | "US" | "3784000" + "14253784000" | "US" | "4253784000" + "+14253784000" | "US" | "4253784000" + "01114253784000"| "US" | "4253784000" + + //special Short Code only valid in Australia, but retain in parsing for the others + "000" | "AU" | "000" + "000" | "DE" | "000" + "000" | "US" | "000" + "000" | "IT" | "000" + // shorter zero check + "00" | "AU" | "00" + "00" | "DE" | "TOO_SHORT_AFTER_IDD" // because IDC in Germany is 00 + "00" | "US" | "00" + "00" | "IT" | "TOO_SHORT_AFTER_IDD" // because IDC in Italy is 00 + //shorter zero check - just current PhoneLib behavior + "0" | "AU" | "NOT_A_NUMBER" // because its to short + "0" | "DE" | "NOT_A_NUMBER" // because its to short + "0" | "US" | "NOT_A_NUMBER" // because its to short + "0" | "IT" | "NOT_A_NUMBER" // because its to short + //shorter 1 check - just current PhoneLib behavior + "1" | "AU" | "NOT_A_NUMBER" // because its to short + "1" | "DE" | "NOT_A_NUMBER" // because its to short + "1" | "US" | "NOT_A_NUMBER" // because its to short + "1" | "IT" | "NOT_A_NUMBER" // because its to short + //shorter zero check - just current PhoneLib behavior + "01" | "AU" | "01" + "01" | "DE" | "01" + "01" | "US" | "01" + "01" | "IT" | "01" + + //Special Italian leading Zero within national number (and not) + "012345678" | "IT" | "012345678" + "+39012345678" | "IT" | "012345678" + "0039012345678" | "IT" | "012345678" + "+39012345678" | "DE" | "012345678" //Italy called from Germany + "0039012345678" | "DE" | "012345678" //Italy called from Germany + "+39012345678" | "US" | "012345678" //Italy called from North America + "01139012345678"| "US" | "012345678" //Italy called from North America + "312345678" | "IT" | "312345678" + "+39312345678" | "IT" | "312345678" + "0039312345678" | "IT" | "312345678" + "+39312345678" | "DE" | "312345678" //Italy called from Germany + "0039312345678" | "DE" | "312345678" //Italy called from Germany + "+39312345678" | "US" | "312345678" //Italy called from North America + "01139312345678"| "US" | "312345678" //Italy called from North America } def "isNormalizingTried"( number, regionCode, expectedResult) { given: - target = new PhoneLibWrapper(number, regionCode) + target = new PhoneLibWrapper(number, regionCode) when: "isNormalizingTried: $number and $regionCode" - def result = target.isNormalizingTried() + def result = target.isNormalizingTried() then: "it should be: $expectedResult" - result == expectedResult + result == expectedResult where: number | regionCode | expectedResult @@ -246,42 +246,42 @@ class PhoneLibWrapperTest extends Specification { def "private extendNumberByDefaultAreaCodeAndCountryCode null"() { given: - target = new PhoneLibWrapper(null, "DE") + target = new PhoneLibWrapper(null, "DE") when: - def result = target.extendNumberByDefaultAreaCodeAndCountryCode(null, null) + def result = target.extendNumberByDefaultAreaCodeAndCountryCode(null, null) then: - assert result == null + assert result == null } def "parseNumber"( number, regionCode, expectedResult) { given: - target = new PhoneLibWrapper(number, regionCode) + target = new PhoneLibWrapper(number, regionCode) when: "parseNumber: $number and $regionCode" - def result = target.parseNumber(number, regionCode) + def result = target.parseNumber(number, regionCode) then: "it should normalize the number to: $expectedResult" - result == expectedResult + result == expectedResult where: - number | regionCode | expectedResult - null | null | null - "" | "" | null + number | regionCode | expectedResult + null | null | null + "" | "" | null } def "exception check for getMetadataForRegion: phoneUtil == null"(){ given: - //overriding read only attribute by .metaClass. access - target = new PhoneLibWrapper(null, "49") - target.metaClass.phoneUtil = null + //overriding read only attribute by .metaClass. access + target = new PhoneLibWrapper(null, "49") + target.metaClass.phoneUtil = null when: - def result = target.getMetadataForRegion() + def result = target.getMetadataForRegion() then: - assert result == null + assert result == null } def "getRegionCodeForCountryCode"(countryCode, expectedResult) { @@ -299,7 +299,25 @@ class PhoneLibWrapperTest extends Specification { "" | PhoneLibWrapper.UNKNOWN_REGIONCODE "invalid" | PhoneLibWrapper.UNKNOWN_REGIONCODE "49" | "DE" + } + def "test parsing within validate"(String number, String regionCode, expectedResult) { + given: + target = new PhoneLibWrapper(number, regionCode) + + when: + def result = target.isPossibleWithReason() + + then: + result == expectedResult + + where: + number | regionCode | expectedResult + "XXX" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH // NOT_A_NUMBER + "+99123456" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE // INVALID_COUNTRY_CODE + "+491" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT // TOO_SHORT_NSN + "0049" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT // TOO_SHORT_AFTER_IDD + "+492031234567891011" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG // TOO_LONG } } From ee909864392e00f5be3a293ad3941335a371162e Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 1 May 2024 14:59:27 +0200 Subject: [PATCH 02/98] Update copyright year of initial setting --- .../de/telekom/phonenumbernormalizer/PhoneNumberValidator.java | 2 +- .../telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java | 2 +- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- .../numberplans/PhoneLibWrapperTest.groovy | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java index e6d14bd..272e3fe 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 66584e2..e407849 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index b25dbc5..47122ed 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy index cee9586..a3171ca 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 69b0acc8a17d2e6862a33f9cdca724d4bb347eb9 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 03/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 25 +++- .../numberplans/PhoneLibWrapper.java | 119 +++++++++++++++++- .../PhoneNumberValidatorImplTest.groovy | 24 ++-- 3 files changed, 149 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index e407849..60409fa 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -36,13 +36,36 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + if (number == null || number.length()==0) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + if (wrapper.startsWithIDP()) { // Country Exit Code is part + // IDP indicates CC is used + return wrapper.validate(); + //return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + // No Country Exit Code has been used, so no CC is following. + if (wrapper.getNationalAccessCode()=="") { + // no NAC is used in region + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } else { + // NAC can be used in region + if (wrapper.startsWithNAC()) { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + } + } + // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; - return wrapper.validate(); + // return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index a760d7d..fce333d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -28,7 +28,8 @@ /** * Wrapper around the PhoneLib library from Google *

- * Using reflection to access internal information to know if a region has a nation prefix & which one it is. + * Using reflection to access internal information to know if a region has a nation prefix & which one it is or + * which IDP is used. *

* Providing own NumberPlans logic as an alternative to PhoneLib ShortNumber. *

@@ -97,7 +98,7 @@ public class PhoneLibWrapper { */ public PhoneLibWrapper(String number, String regionCode) { this.regionCode = regionCode; - this.metadata = getMetadataForRegion(); + this.metadata = getMetadataForRegion(this.regionCode); if (number != null) { this.dialableNumber = PhoneNumberUtil.normalizeDiallableCharsOnly(number); @@ -231,6 +232,71 @@ static boolean isSpecialFormat(String value) { return ("+".equals(value.substring(0, 1))) || ("*".equals(value.substring(0, 1))); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed @@ -248,17 +314,58 @@ private static Phonenumber.PhoneNumber parseNumber(String number, String regionC } } + + private static String internationalDialingPrefix(Phonemetadata.PhoneMetadata metadata) { + if (metadata == null) { + return null; + } + return metadata.getInternationalPrefix(); + } + /** - * The National Access Code used before the National Destination Code in the given region from PhoneLib - * @return NAC of given {@link PhoneLibWrapper#regionCode} + * The International Dialing Prefix used in the given region from PhoneLib + * @return IDP of given {@link PhoneLibWrapper#regionCode} */ - public String getNationalAccessCode() { + public String getInternationalDialingPrefix() { + return internationalDialingPrefix(this.metadata); + } + + /** + * The International Dialing Prefix used in the given region from PhoneLib + * + * @param regionCode the Region which NAC is requested. + * @return IDP of given regionCode + */ + static public String getInternationalDialingPrefix(String regionCode) { + return internationalDialingPrefix(getMetadataForRegion(regionCode)); + } + + + private static String nationalAccessCode(Phonemetadata.PhoneMetadata metadata) { if (metadata == null) { return null; } return metadata.getNationalPrefix(); } + /** + * The National Access Code used before the National Destination Code in the given region from PhoneLib + * @return NAC of given {@link PhoneLibWrapper#regionCode} + */ + public String getNationalAccessCode() { + return nationalAccessCode(this.metadata); + } + + /** + * The National Access Code used before the National Destination Code in the given region from PhoneLib + * + * @param regionCode the Region which NAC is requested. + * @return NAC of given regionCode + */ + static public String getNationalAccessCode(String regionCode) { + return nationalAccessCode(getMetadataForRegion(regionCode)); + } + /** * From PhoneLib, if a National Access Code is used before the National Destination Code in the given region * @return if given {@link PhoneLibWrapper#regionCode} is using NAC @@ -273,7 +380,7 @@ public boolean hasRegionNationalAccessCode() { * and Google rejected suggestion to make it public, because they did not see our need in correcting normalization. * @return {@link Phonemetadata.PhoneMetadata} of {@link PhoneLibWrapper#regionCode} */ - private Phonemetadata.PhoneMetadata getMetadataForRegion() { + static private Phonemetadata.PhoneMetadata getMetadataForRegion(String regionCode) { try { Method m = phoneUtil.getClass().getDeclaredMethod("getMetadataForRegion", String.class); // violating encupsulation is intended by this method, so no need for SONAR code smell warning here diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 47122ed..7144941 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -49,21 +49,21 @@ class PhoneNumberValidatorImplTest extends Specification { "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - // "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - // "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - // "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - // "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - // "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY } } From ce2a4b98903e2b320a7a44a3642bc6fe7732c595 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:44:23 +0200 Subject: [PATCH 04/98] Create Area Code Extractor (NDC) for Germany. --- .../NVONB.INTERNET.20220727.ONB.csv | 5204 ++++ .../GermanAreaCodeExtractor/main.py | 82 + .../constants/GermanAreaCodeExtractor.java | 21596 ++++++++++++++++ .../GermanAreaCodeExtractorTest.groovy | 44 + 4 files changed, 26926 insertions(+) create mode 100644 src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv create mode 100644 src/generators/GermanAreaCodeExtractor/main.py create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java create mode 100644 src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy diff --git a/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv b/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv new file mode 100644 index 0000000..4e805f5 --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv @@ -0,0 +1,5204 @@ +Ortsnetzkennzahl;Ortsnetzname;KennzeichenAktiv +201;Essen;1 +202;Wuppertal;1 +203;Duisburg;1 +2041;Bottrop;1 +2043;Gladbeck;1 +2045;Bottrop-Kirchhellen;1 +2051;Velbert;1 +2052;Velbert-Langenberg;1 +2053;Velbert-Neviges;1 +2054;Essen-Kettwig;1 +2056;Heiligenhaus;1 +2058;Wülfrath;1 +2064;Dinslaken;1 +2065;Duisburg-Rheinhausen;1 +2066;Duisburg-Homberg;1 +208;Oberhausen Rheinl;1 +209;Gelsenkirchen;1 +2102;Ratingen;1 +2103;Hilden;1 +2104;Mettmann;1 +211;Düsseldorf;1 +212;Solingen;1 +2129;Haan Rheinl;1 +2131;Neuss;1 +2132;Meerbusch-Büderich;1 +2133;Dormagen;1 +2137;Neuss-Norf;1 +214;Leverkusen;1 +2150;Meerbusch-Lank;1 +2151;Krefeld;1 +2152;Kempen;1 +2153;Nettetal-Lobberich;1 +2154;Willich;1 +2156;Willich-Anrath;1 +2157;Nettetal-Kaldenkirchen;1 +2158;Grefrath b Krefeld;1 +2159;Meerbusch-Osterath;1 +2161;Mönchengladbach;1 +2162;Viersen;1 +2163;Schwalmtal Niederrhein;1 +2164;Jüchen-Otzenrath;1 +2165;Jüchen;1 +2166;Mönchengladbach-Rheydt;1 +2171;Leverkusen-Opladen;1 +2173;Langenfeld Rheinland;1 +2174;Burscheid Rheinl;1 +2175;Leichlingen Rheinland;1 +2181;Grevenbroich;1 +2182;Grevenbroich-Kapellen;1 +2183;Rommerskirchen;1 +2191;Remscheid;1 +2192;Hückeswagen;1 +2193;Dabringhausen;1 +2195;Radevormwald;1 +2196;Wermelskirchen;1 +2202;Bergisch Gladbach;1 +2203;Köln-Porz;1 +2204;Bensberg;1 +2205;Rösrath;1 +2206;Overath;1 +2207;Kürten-Dürscheid;1 +2208;Niederkassel;1 +221;Köln;1 +2222;Bornheim Rheinl;1 +2223;Königswinter;1 +2224;Bad Honnef;1 +2225;Meckenheim Rheinl;1 +2226;Rheinbach;1 +2227;Bornheim-Merten;1 +2228;Remagen-Rolandseck;1 +2232;Brühl Rheinl;1 +2233;Hürth Rheinl;1 +2234;Frechen;1 +2235;Erftstadt;1 +2236;Wesseling Rheinl;1 +2237;Kerpen Rheinl-Türnich;1 +2238;Pulheim;1 +2241;Siegburg;1 +2242;Hennef Sieg;1 +2243;Eitorf;1 +2244;Königswinter-Oberpleis;1 +2245;Much;1 +2246;Lohmar Rheinland;1 +2247;Neunkirchen-Seelscheid;1 +2248;Hennef-Uckerath;1 +2251;Euskirchen;1 +2252;Zülpich;1 +2253;Bad Münstereifel;1 +2254;Weilerswist;1 +2255;Euskirchen-Flamersheim;1 +2256;Mechernich-Satzvey;1 +2257;Reckerscheid;1 +2261;Gummersbach;1 +2262;Wiehl;1 +2263;Engelskirchen;1 +2264;Marienheide;1 +2265;Reichshof-Eckenhagen;1 +2266;Lindlar;1 +2267;Wipperfürth;1 +2268;Kürten;1 +2269;Kierspe-Rönsahl;1 +2271;Bergheim Erft;1 +2272;Bedburg Erft;1 +2273;Kerpen-Horrem;1 +2274;Elsdorf Rheinl;1 +2275;Kerpen-Buir;1 +228;Bonn;1 +2291;Waldbröl;1 +2292;Windeck Sieg;1 +2293;Nümbrecht;1 +2294;Morsbach Sieg;1 +2295;Ruppichteroth;1 +2296;Reichshof-Brüchermühle;1 +2297;Wildbergerhütte;1 +2301;Holzwickede;1 +2302;Witten;1 +2303;Unna;1 +2304;Schwerte;1 +2305;Castrop-Rauxel;1 +2306;Lünen;1 +2307;Kamen;1 +2308;Unna-Hemmerde;1 +2309;Waltrop;1 +231;Dortmund;1 +2323;Herne;1 +2324;Hattingen Ruhr;1 +2325;Wanne-Eickel;1 +2327;Bochum-Wattenscheid;1 +2330;Herdecke;1 +2331;Hagen Westf;1 +2332;Gevelsberg;1 +2333;Ennepetal;1 +2334;Hagen-Hohenlimburg;1 +2335;Wetter Ruhr;1 +2336;Schwelm;1 +2337;Hagen-Dahl;1 +2338;Breckerfeld;1 +2339;Sprockhövel-Haßlinghausen;1 +234;Bochum;1 +2351;Lüdenscheid;1 +2352;Altena Westf;1 +2353;Halver;1 +2354;Meinerzhagen;1 +2355;Schalksmühle;1 +2357;Herscheid Westf;1 +2358;Meinerzhagen-Valbert;1 +2359;Kierspe;1 +2360;Haltern-Lippramsdorf;1 +2361;Recklinghausen;1 +2362;Dorsten;1 +2363;Datteln;1 +2364;Haltern Westf;1 +2365;Marl;1 +2366;Herten Westf;1 +2367;Henrichenburg;1 +2368;Oer-Erkenschwick;1 +2369;Dorsten-Wulfen;1 +2371;Iserlohn;1 +2372;Hemer;1 +2373;Menden Sauerland;1 +2374;Iserlohn-Letmathe;1 +2375;Balve;1 +2377;Wickede Ruhr;1 +2378;Fröndenberg-Langschede;1 +2379;Menden-Asbeck;1 +2381;Hamm Westf;1 +2382;Ahlen Westf;1 +2383;Bönen;1 +2384;Welver;1 +2385;Hamm-Rhynern;1 +2387;Drensteinfurt-Walstedde;1 +2388;Hamm-Uentrop;1 +2389;Werne;1 +2391;Plettenberg;1 +2392;Werdohl;1 +2393;Sundern-Allendorf;1 +2394;Neuenrade-Affeln;1 +2395;Finnentrop-Rönkhausen;1 +2401;Baesweiler;1 +2402;Stolberg Rheinl;1 +2403;Eschweiler Rheinl;1 +2404;Alsdorf Rheinl;1 +2405;Würselen;1 +2406;Herzogenrath;1 +2407;Herzogenrath-Kohlscheid;1 +2408;Aachen-Kornelimünster;1 +2409;Stolberg-Gressenich;1 +241;Aachen;1 +2421;Düren;1 +2422;Kreuzau;1 +2423;Langerwehe;1 +2424;Vettweiss;1 +2425;Nideggen-Embken;1 +2426;Nörvenich;1 +2427;Nideggen;1 +2428;Niederzier;1 +2429;Hürtgenwald;1 +2431;Erkelenz;1 +2432;Wassenberg;1 +2433;Hückelhoven;1 +2434;Wegberg;1 +2435;Erkelenz-Lövenich;1 +2436;Wegberg-Rödgen;1 +2440;Nettersheim-Tondorf;1 +2441;Kall;1 +2443;Mechernich;1 +2444;Schleiden-Gemünd;1 +2445;Schleiden Eifel;1 +2446;Heimbach Eifel;1 +2447;Dahlem b Kall;1 +2448;Hellenthal-Rescheid;1 +2449;Blankenheim Ahr;1 +2451;Geilenkirchen;1 +2452;Heinsberg Rheinl;1 +2453;Heinsberg-Randerath;1 +2454;Gangelt;1 +2455;Waldfeucht;1 +2456;Selfkant;1 +2461;Jülich;1 +2462;Linnich;1 +2463;Titz;1 +2464;Aldenhoven b Jülich;1 +2465;Inden;1 +2471;Roetgen Eifel;1 +2472;Monschau;1 +2473;Simmerath;1 +2474;Nideggen-Schmidt;1 +2482;Hellenthal;1 +2484;Mechernich-Eiserfey;1 +2485;Schleiden-Dreiborn;1 +2486;Nettersheim;1 +2501;Münster-Hiltrup;1 +2502;Nottuln;1 +2504;Telgte;1 +2505;Altenberge Westf;1 +2506;Münster-Wolbeck;1 +2507;Havixbeck;1 +2508;Drensteinfurt;1 +2509;Nottuln-Appelhülsen;1 +251;Münster;1 +2520;Wadersloh-Diestedde;1 +2521;Beckum;1 +2522;Oelde;1 +2523;Wadersloh;1 +2524;Ennigerloh;1 +2525;Beckum-Neubeckum;1 +2526;Sendenhorst;1 +2527;Lippetal-Lippborg;1 +2528;Ennigerloh-Enniger;1 +2529;Oelde-Stromberg;1 +2532;Ostbevern;1 +2533;Münster-Nienberge;1 +2534;Münster-Roxel;1 +2535;Sendenhorst-Albersloh;1 +2536;Münster-Albachten;1 +2538;Drensteinfurt-Rinkerode;1 +2541;Coesfeld;1 +2542;Gescher;1 +2543;Billerbeck Westf;1 +2545;Rosendahl-Darfeld;1 +2546;Coesfeld-Lette;1 +2547;Rosendahl-Osterwick;1 +2548;Dülmen-Rorup;1 +2551;Steinfurt-Burgsteinfurt;1 +2552;Steinfurt-Borghorst;1 +2553;Ochtrup;1 +2554;Laer Kr Steinfurt;1 +2555;Schöppingen;1 +2556;Metelen;1 +2557;Wettringen Kr Steinfurt;1 +2558;Horstmar;1 +2561;Ahaus;1 +2562;Gronau Westfalen;1 +2563;Stadtlohn;1 +2564;Vreden;1 +2565;Gronau-Epe;1 +2566;Legden;1 +2567;Ahaus-Alstätte;1 +2568;Heek;1 +2571;Greven Westf;1 +2572;Emsdetten;1 +2573;Nordwalde;1 +2574;Saerbeck;1 +2575;Greven-Reckenfeld;1 +2581;Warendorf;1 +2582;Everswinkel;1 +2583;Sassenberg;1 +2584;Warendorf-Milte;1 +2585;Warendorf-Hoetmar;1 +2586;Beelen;1 +2587;Ennigerloh-Westkirchen;1 +2588;Harsewinkel-Greffen;1 +2590;Dülmen-Buldern;1 +2591;Lüdinghausen;1 +2592;Selm;1 +2593;Ascheberg Westf;1 +2594;Dülmen;1 +2595;Olfen;1 +2596;Nordkirchen;1 +2597;Senden Westf;1 +2598;Senden-Ottmarsbocholt;1 +2599;Ascheberg-Herbern;1 +2601;Nauort;1 +2602;Montabaur;1 +2603;Bad Ems;1 +2604;Nassau Lahn;1 +2605;Löf;1 +2606;Winningen Mosel;1 +2607;Kobern-Gondorf;1 +2608;Welschneudorf;1 +261;Koblenz a Rhein;1 +2620;Neuhäusel Westerw;1 +2621;Lahnstein;1 +2622;Bendorf Rhein;1 +2623;Ransbach-Baumbach;1 +2624;Höhr-Grenzhausen;1 +2625;Ochtendung;1 +2626;Selters Westferwald;1 +2627;Braubach;1 +2628;Rhens;1 +2630;Mülheim-Kärlich;1 +2631;Neuwied;1 +2632;Andernach;1 +2633;Brohl-Lützing;1 +2634;Rengsdorf;1 +2635;Rheinbrohl;1 +2636;Burgbrohl;1 +2637;Weissenthurm;1 +2638;Waldbreitbach;1 +2639;Anhausen Kr Neuwied;1 +2641;Bad Neuenahr-Ahrweiler;1 +2642;Remagen;1 +2643;Altenahr;1 +2644;Linz am Rhein;1 +2645;Vettelschoss;1 +2646;Königsfeld Eifel;1 +2647;Kesseling;1 +2651;Mayen;1 +2652;Mendig;1 +2653;Kaisersesch;1 +2654;Polch;1 +2655;Weibern;1 +2656;Virneburg;1 +2657;Uersfeld;1 +2661;Bad Marienberg Westerwald;1 +2662;Hachenburg;1 +2663;Westerburg Westerw;1 +2664;Rennerod;1 +2666;Freilingen Westerw;1 +2667;Stein-Neukirch;1 +2671;Cochem;1 +2672;Treis-Karden;1 +2673;Ellenz-Poltersdorf;1 +2674;Bad Bertrich;1 +2675;Ediger-Eller;1 +2676;Ulmen;1 +2677;Lutzerath;1 +2678;Büchel b Cochem;1 +2680;Mündersbach;1 +2681;Altenkirchen Westerwald;1 +2682;Hamm Sieg;1 +2683;Asbach Westerw;1 +2684;Puderbach Westerw;1 +2685;Flammersfeld;1 +2686;Weyerbusch;1 +2687;Horhausen Westerwald;1 +2688;Kroppach;1 +2689;Dierdorf;1 +2691;Adenau;1 +2692;Kelberg;1 +2693;Antweiler;1 +2694;Wershofen;1 +2695;Insul;1 +2696;Nohn Eifel;1 +2697;Blankenheim-Ahrhütte;1 +271;Siegen;1 +2721;Lennestadt;1 +2722;Attendorn;1 +2723;Kirchhundem;1 +2724;Finnentrop-Serkenrode;1 +2725;Lennestadt-Oedingen;1 +2732;Kreuztal;1 +2733;Hilchenbach;1 +2734;Freudenberg Westf;1 +2735;Neunkirchen Siegerl;1 +2736;Burbach Siegerl;1 +2737;Netphen-Deuz;1 +2738;Netphen;1 +2739;Wilnsdorf;1 +2741;Betzdorf;1 +2742;Wissen;1 +2743;Daaden;1 +2744;Herdorf;1 +2745;Brachbach Sieg;1 +2747;Molzhain;1 +2750;Diedenshausen;1 +2751;Bad Berleburg;1 +2752;Bad Laasphe;1 +2753;Erndtebrück;1 +2754;Bad Laasphe-Feudingen;1 +2755;Bad Berleburg-Schwarzenau;1 +2758;Bad Berleburg-Girkhausen;1 +2759;Bad Berleburg-Aue;1 +2761;Olpe Biggesee;1 +2762;Wenden Südsauerland;1 +2763;Drolshagen-Bleche;1 +2764;Welschen Ennest;1 +2770;Eschenburg;1 +2771;Dillenburg;1 +2772;Herborn Hess;1 +2773;Haiger;1 +2774;Dietzhölztal;1 +2775;Driedorf;1 +2776;Bad Endbach-Hartenrod;1 +2777;Breitscheid Hess;1 +2778;Siegbach;1 +2779;Greifenstein-Beilstein;1 +2801;Xanten;1 +2802;Alpen;1 +2803;Wesel-Büderich;1 +2804;Xanten-Marienbaum;1 +281;Wesel;1 +2821;Kleve Niederrhein;1 +2822;Emmerich;1 +2823;Goch;1 +2824;Kalkar;1 +2825;Uedem;1 +2826;Kranenburg Niederrhein;1 +2827;Goch-Hassum;1 +2828;Emmerich-Elten;1 +2831;Geldern;1 +2832;Kevelaer;1 +2833;Kerken;1 +2834;Straelen;1 +2835;Issum;1 +2836;Wachtendonk;1 +2837;Weeze;1 +2838;Sonsbeck;1 +2839;Straelen-Herongen;1 +2841;Moers;1 +2842;Kamp-Lintfort;1 +2843;Rheinberg;1 +2844;Rheinberg-Orsoy;1 +2845;Neukirchen-Vluyn;1 +2850;Rees-Haldern;1 +2851;Rees;1 +2852;Hamminkeln;1 +2853;Schermbeck;1 +2855;Voerde Niederrhein;1 +2856;Hamminkeln-Brünen;1 +2857;Rees-Mehr;1 +2858;Hünxe;1 +2859;Wesel-Bislich;1 +2861;Borken Westf;1 +2862;Südlohn;1 +2863;Velen;1 +2864;Reken;1 +2865;Raesfeld;1 +2866;Dorsten-Rhade;1 +2867;Heiden Kr Borken;1 +2871;Bocholt;1 +2872;Rhede Westf;1 +2873;Isselburg-Werth;1 +2874;Isselburg;1 +2902;Warstein;1 +2903;Meschede-Freienohl;1 +2904;Bestwig;1 +2905;Bestwig-Ramsbeck;1 +291;Meschede;1 +2921;Soest;1 +2922;Werl;1 +2923;Lippetal-Herzfeld;1 +2924;Möhnesee;1 +2925;Warstein-Allagen;1 +2927;Neuengeseke;1 +2928;Soest-Ostönnen;1 +2931;Arnsberg;1 +2932;Neheim-Hüsten;1 +2933;Sundern Sauerland;1 +2934;Sundern-Altenhellefeld;1 +2935;Sundern-Hachen;1 +2937;Arnsberg-Oeventrop;1 +2938;Ense;1 +2941;Lippstadt;1 +2942;Geseke;1 +2943;Erwitte;1 +2944;Rietberg-Mastholte;1 +2945;Lippstadt-Benninghausen;1 +2947;Anröchte;1 +2948;Lippstadt-Rebbeke;1 +2951;Büren;1 +2952;Rüthen;1 +2953;Wünnenberg;1 +2954;Rüthen-Oestereiden;1 +2955;Büren-Wewelsburg;1 +2957;Wünnenberg-Haaren;1 +2958;Büren-Harth;1 +2961;Brilon;1 +2962;Olsberg;1 +2963;Brilon-Messinghausen;1 +2964;Brilon-Alme;1 +2971;Schmallenberg-Dorlar;1 +2972;Schmallenberg;1 +2973;Eslohe Sauerland;1 +2974;Schmallenberg-Fredeburg;1 +2975;Schmallenberg-Oberkirchen;1 +2977;Schmallenberg-Bödefeld;1 +2981;Winterberg Westf;1 +2982;Medebach;1 +2983;Winterberg-Siedlinghausen;1 +2984;Hallenberg;1 +2985;Winterberg-Niedersfeld;1 +2991;Marsberg-Bredelar;1 +2992;Marsberg;1 +2993;Marsberg-Canstein;1 +2994;Marsberg-Westheim;1 +30;Berlin;1 +3301;Oranienburg;1 +3302;Hennigsdorf;1 +3303;Birkenwerder;1 +3304;Velten;1 +33051;Nassenheide;1 +33052;Leegebruch;0 +33053;Zehlendorf Kr Oberhavel;1 +33054;Liebenwalde;1 +33055;Kremmen;1 +33056;Mühlenbeck Kr Oberhavel;1 +3306;Gransee;1 +3307;Zehdenick;1 +33080;Marienthal Kr Oberhavel;1 +33082;Menz Kr Oberhavel;1 +33083;Schulzendorf Kr Oberhavel;1 +33084;Gutengermendorf;1 +33085;Seilershof;1 +33086;Grieben Kr Oberhavel;1 +33087;Bredereiche;1 +33088;Falkenthal;1 +33089;Himmelpfort;1 +33093;Fürstenberg Havel;1 +33094;Löwenberg;1 +331;Potsdam;1 +33200;Bergholz-Rehbrücke;1 +33201;Gross Glienicke;1 +33202;Töplitz;1 +33203;Kleinmachnow;1 +33204;Beelitz Mark;1 +33205;Michendorf;1 +33206;Fichtenwalde;1 +33207;Gross Kreutz;1 +33208;Fahrland;1 +33209;Caputh;1 +3321;Nauen Brandenb;1 +3322;Falkensee;1 +33230;Börnicke Kr Havelland;1 +33231;Pausin;1 +33232;Brieselang;1 +33233;Ketzin;1 +33234;Wustermark;1 +33235;Friesack;1 +33237;Paulinenaue;1 +33238;Senzke;1 +33239;Gross Behnitz;1 +3327;Werder Havel;1 +3328;Teltow;1 +3329;Stahnsdorf;1 +3331;Angermünde;1 +3332;Schwedt/Oder;1 +33331;Casekow;1 +33332;Gartz Oder;1 +33333;Tantow;1 +33334;Greiffenberg;1 +33335;Pinnow Kr Uckermark;1 +33336;Passow Kr Uckermark;1 +33337;Altkünkendorf;1 +33338;Stolpe/Oder;1 +3334;Eberswalde;1 +3335;Finowfurt;1 +33361;Joachimsthal;1 +33362;Liepe Kr Barnim;1 +33363;Altenhof Kr Barnim;1 +33364;Gross Ziethen Kr Barnim;1 +33365;Lüdersdorf Kr Barnim;1 +33366;Chorin;1 +33367;Friedrichswalde Brandenb;1 +33368;Hohensaaten;1 +33369;Oderberg;1 +3337;Biesenthal Brandenb;1 +3338;Bernau Brandenb;1 +33393;Gross Schönebeck Kr Barnim;1 +33394;Blumberg Kr Barnim;1 +33395;Zerpenschleuse;1 +33396;Klosterfelde;1 +33397;Wandlitz;1 +33398;Werneuchen;1 +3341;Strausberg;1 +3342;Neuenhagen b Berlin;1 +33432;Müncheberg;1 +33433;Buckow Märk Schweiz;1 +33434;Herzfelde b Strausberg;1 +33435;Rehfelde;1 +33436;Prötzel;1 +33437;Reichenberg b Strausberg;1 +33438;Altlandsberg;1 +33439;Fredersdorf-Vogelsdorf;1 +3344;Bad Freienwalde;1 +33451;Heckelberg;1 +33452;Neulewin;1 +33454;Wölsickendorf/Wollenberg;1 +33456;Wriezen;1 +33457;Altreetz;1 +33458;Falkenberg Mark;1 +3346;Seelow;1 +33470;Lietzen;1 +33472;Golzow b Seelow;1 +33473;Zechin;1 +33474;Neutrebbin;1 +33475;Letschin;1 +33476;Neuhardenberg;1 +33477;Trebnitz b Müncheberg;1 +33478;Gross Neuendorf;1 +33479;Küstrin-Kietz;1 +335;Frankfurt (Oder);1 +33601;Podelzig;1 +33602;Alt Zeschdorf;1 +33603;Falkenhagen b Seelow;1 +33604;Lebus;1 +33605;Boossen;1 +33606;Müllrose;1 +33607;Briesen Mark;1 +33608;Jacobsdorf Mark;1 +33609;Brieskow-Finkenheerd;1 +3361;Fürstenwalde Spree;1 +3362;Erkner;1 +33631;Bad Saarow-Pieskow;1 +33632;Hangelsberg;1 +33633;Spreenhagen;1 +33634;Berkenbrück Kr Oder-Spree;1 +33635;Arensdorf Kr Oder-Spree;1 +33636;Steinhöfel Kr Oder-Spree;1 +33637;Beerfelde;1 +33638;Rüdersdorf b Berlin;1 +3364;Eisenhüttenstadt;1 +33652;Neuzelle;1 +33653;Ziltendorf;1 +33654;Fünfeichen;1 +33655;Grunow Kr Oder-Spree;1 +33656;Bahro;1 +33657;Steinsdorf Brandenb;1 +3366;Beeskow;1 +33671;Lieberose;1 +33672;Pfaffendorfb Beeskow;1 +33673;Weichensdorf;1 +33674;Trebatsch;1 +33675;Tauche;1 +33676;Friedland b Beeskow;1 +33677;Glienicke b Beeskow;1 +33678;Storkow Mark;1 +33679;Wendisch Rietz;1 +33701;Grossbeeren;1 +33702;Wünsdorf;1 +33703;Sperenberg;1 +33704;Baruth Mark;1 +33708;Rangsdorf;1 +3371;Luckenwalde;1 +3372;Jüterbog;1 +33731;Trebbin;1 +33732;Hennickendorf b Luckenwalde;1 +33733;Stülpe;1 +33734;Felgentreu;1 +33741;Niedergörsdorf;1 +33742;Oehna Brandenb;1 +33743;Blönsdorf;1 +33744;Hohenseefeld;1 +33745;Petkus;1 +33746;Werbig b Jüterbog;1 +33747;Marzahna;1 +33748;Treuenbrietzen;1 +3375;Königs Wusterhausen;1 +33760;Münchehofe Kr Dahme-Spreewald;1 +33762;Zeuthen;1 +33763;Bestensee;1 +33764;Mittenwalde Mark;1 +33765;Märkisch Buchholz;1 +33766;Teupitz;1 +33767;Friedersdorf b Berlin;1 +33768;Prieros;1 +33769;Töpchin;1 +3377;Zossen Brandenb;1 +3378;Ludwigsfelde;1 +3379;Mahlow;1 +3381;Brandenburg an der Havel;1 +3382;Lehnin;1 +33830;Ziesar;1 +33831;Weseram;1 +33832;Rogäsen;1 +33833;Wollin b Brandenburg;1 +33834;Pritzerbe;1 +33835;Golzow b Brandenburg;1 +33836;Butzow b Brandenburg;1 +33837;Brielow;1 +33838;Päwesin;1 +33839;Wusterwitz;1 +33841;Belzig;1 +33843;Niemegk;1 +33844;Brück Brandenb;1 +33845;Borkheide;1 +33846;Dippmannsdorf;1 +33847;Görzke;1 +33848;Raben;1 +33849;Wiesenburg Mark;1 +3385;Rathenow;1 +3386;Premnitz;1 +33870;Zollchow b Rathenow;1 +33872;Hohennauen;1 +33873;Grosswudicke;1 +33874;Stechow Brandenb;1 +33875;Rhinow;1 +33876;Buschow;1 +33877;Nitzahn;1 +33878;Nennhausen;1 +3391;Neuruppin;1 +33920;Walsleben b Neuruppin;1 +33921;Zechlinerhütte;1 +33922;Karwesee;1 +33923;Flecken Zechlin;1 +33924;Rägelin;1 +33925;Wustrau-Altfriesack;1 +33926;Herzberg Mark;1 +33927;Linum;0 +33928;Wildberg Brandenb;1 +33929;Gühlen-Glienicke;1 +33931;Rheinsberg Mark;1 +33932;Fehrbellin;1 +33933;Lindow Mark;1 +3394;Wittstock Dosse;1 +3395;Pritzwalk;1 +33962;Heiligengrabe;1 +33963;Wulfersdorf b Wittstock;1 +33964;Fretzdorf;1 +33965;Herzsprung b Wittstock;1 +33966;Dranse;1 +33967;Freyenstein;1 +33968;Meyenburg Kr Prignitz;1 +33969;Stepenitz;1 +33970;Neustadt Dosse;1 +33971;Kyritz Brandenb;1 +33972;Breddin;1 +33973;Zernitz b Neustadt Dosse;1 +33974;Dessow;1 +33975;Dannenwalde Kr Prignitz;1 +33976;Wutike;1 +33977;Gumtow;1 +33978;Segeletz;1 +33979;Wusterhausen Dosse;1 +33981;Putlitz;1 +33982;Hoppenrade Kr Prignitz;1 +33983;Gross Pankow Kr Prignitz;1 +33984;Blumenthal b Pritzwalk;1 +33986;Falkenhagen Kr Prignitz;1 +33989;Sadenbeck;1 +340;Dessau Anh;1 +341;Leipzig;1 +34202;Delitzsch;1 +34203;Zwenkau;1 +34204;Schkeuditz;1 +34205;Markranstädt;1 +34206;Rötha;1 +34207;Zwochau;1 +34208;Löbnitz B Delitzsch;1 +3421;Torgau;1 +34221;Schildau Gneisenaustadt;1 +34222;Arzberg b Torgau;1 +34223;Dommitzsch;1 +34224;Belgern Sachs;1 +3423;Eilenburg;1 +34241;Jesewitz;1 +34242;Hohenpriessnitz;1 +34243;Bad Düben;1 +34244;Mockrehna;1 +3425;Wurzen;1 +34261;Kühren b Wurzen;1 +34262;Falkenhain b Wurzen;1 +34263;Hohburg;1 +34291;Borsdorf;1 +34292;Brandis b Wurzen;1 +34293;Naunhof b Grimma;1 +34294;Rackwitz;1 +34295;Krensitz;1 +34296;Groitzsch b Pegau;1 +34297;Liebertwolkwitz;1 +34298;Taucha b Leipzig;1 +34299;Gaschwitz;1 +3431;Döbeln;1 +34321;Leisnig;1 +34322;Rosswein;1 +34324;Ostrau Sachs;1 +34325;Mochau-Lüttewitz;1 +34327;Waldheim Sachs;1 +34328;Hartha b Döbeln;1 +3433;Borna Stadt;1 +34341;Geithain;1 +34342;Neukieritzsch;1 +34343;Regis-Breitingen;1 +34344;Kohren-Sahlis;1 +34345;Bad Lausick;1 +34346;Narsdorf;1 +34347;Oelzschau b Borna;1 +34348;Frohburg;1 +3435;Oschatz;1 +34361;Dahlen Sachs;1 +34362;Mügeln b Oschatz;1 +34363;Cavertitz;1 +34364;Wermsdorf;1 +3437;Grimma;1 +34381;Colditz;1 +34382;Nerchau;1 +34383;Trebsen Mulde;1 +34384;Grossbothen;1 +34385;Mutzschen;1 +34386;Dürrweitzschen B Grimma;1 +3441;Zeitz;1 +34422;Osterfeld;1 +34423;Heuckewalde;1 +34424;Reuden b Zeitz;1 +34425;Droyssig;1 +34426;Kayna;1 +3443;Weissenfels Sachs-Anh;1 +34441;Hohenmölsen;1 +34443;Teuchern;1 +34444;Lützen;1 +34445;Stößen;1 +34446;Grosskorbetha;1 +3445;Naumburg Saale;1 +34461;Nebra Unstrut;1 +34462;Laucha Unstrut;1 +34463;Bad Kösen;1 +34464;Freyburg Unstrut;1 +34465;Bad Bibra;1 +34466;Janisroda;1 +34467;Eckartsberga;1 +3447;Altenburg Thür;1 +3448;Meuselwitz Thür;1 +34491;Schmölln Thür;1 +34492;Lucka;1 +34493;Gößnitz Thür;1 +34494;Ehrenhain;1 +34495;Dobitschen;1 +34496;Nöbdenitz;1 +34497;Langenleuba-Niederhain;1 +34498;Rositz;1 +345;Halle Saale;1 +34600;Ostrau Saalkreis;1 +34601;Teutschenthal;1 +34602;Landsberg Sachs-Anh;1 +34603;Nauendorf Sachs-Anh;1 +34604;Niemberg;1 +34605;Gröbers;1 +34606;Teicha Sachs-Anh;1 +34607;Wettin;1 +34609;Salzmünde;1 +3461;Merseburg Saale;1 +3462;Bad Dürrenberg;1 +34632;Mücheln Geiseltal;1 +34633;Braunsbedra;1 +34635;Bad Lauchstädt;1 +34636;Schafstädt;1 +34637;Frankleben;1 +34638;Zöschen;1 +34639;Wallendorf Luppe;1 +3464;Sangerhausen;1 +34651;Rossla;1 +34652;Allstedt;1 +34653;Rottleberode;1 +34654;Stolberg Harz;1 +34656;Wallhausen Sachs-Anh;1 +34658;Hayn Harz;1 +34659;Blankenheim b Sangerhausen;1 +3466;Artern Unstrut;1 +34671;Bad Frankenhausen Kyffhäuser;1 +34672;Rossleben;1 +34673;Heldrungen;1 +34691;Könnern;1 +34692;Alsleben Saale;1 +3471;Bernburg Saale;1 +34721;Nienburg Saale;1 +34722;Preusslitz;1 +3473;Aschersleben Sachs-Anh;1 +34741;Frose;1 +34742;Sylda;1 +34743;Ermsleben;1 +34745;Winningen Sachs-Anh;1 +34746;Giersleben;1 +3475;Lutherstadt Eisleben;1 +3476;Hettstedt Sachs-Anh;1 +34771;Querfurt;1 +34772;Helbra;1 +34773;Schwittersdorf;1 +34774;Röblingen am See;1 +34775;Wippra;1 +34776;Rothenschirmbach;1 +34779;Abberode;1 +34781;Greifenhagen;1 +34782;Mansfeld Südharz;1 +34783;Gerbstedt;1 +34785;Sandersleben;1 +34901;Roßlau Elbe;1 +34903;Coswig Anhalt;1 +34904;Oranienbaum;1 +34905;Wörlitz;1 +34906;Raguhn;1 +34907;Jeber-Bergfrieden;1 +34909;Aken Elbe;1 +3491;Lutherstadt Wittenberg;1 +34920;Kropstädt;1 +34921;Kemberg;1 +34922;Mühlanger;1 +34923;Cobbelsdorf;1 +34924;Zahna;1 +34925;Bad Schmiedeberg;1 +34926;Pretzsch Elbe;1 +34927;Globig-Bleddin;1 +34928;Seegrehna;1 +34929;Straach;1 +3493;Bitterfeld;1 +3494;Wolfen;1 +34953;Gräfenhainichen;1 +34954;Roitzsch b Bitterfeld;1 +34955;Gossa;1 +34956;Zörbig;1 +3496;Köthen Anhalt;1 +34973;Osternienburg;1 +34975;Görzig Kr Köthen;1 +34976;Gröbzig;1 +34977;Quellendorf;1 +34978;Radegast Kr Köthen;1 +34979;Wulfen Sachs-Anh;1 +3501;Pirna;1 +35020;Struppen;1 +35021;Königstein Sächs Schweiz;1 +35022;Bad Schandau;1 +35023;Bad Gottleuba;1 +35024;Stadt Wehlen;1 +35025;Liebstadt;1 +35026;Dürrröhrsdorf-Dittersbach;1 +35027;Weesenstein;1 +35028;Krippen;1 +35032;Langenhennersdorf;1 +35033;Rosenthal Sächs Schweiz;1 +3504;Dippoldiswalde;1 +35052;Kipsdorf Kurort;1 +35053;Glashütte Sachs;1 +35054;Lauenstein Sachs;1 +35055;Höckendorf b Dippoldiswalde;1 +35056;Altenberg Sachs;1 +35057;Hermsdorf Erzgeb;1 +35058;Pretzschendorf;1 +351;Dresden;1 +35200;Arnsdorf b Dresden;1 +35201;Langebrück;1 +35202;Klingenberg Sachs;1 +35203;Tharandt;1 +35204;Wilsdruff;1 +35205;Ottendorf-Okrilla;1 +35206;Kreischa b Dresden;1 +35207;Moritzburg;1 +35208;Radeburg;1 +35209;Mohorn;1 +3521;Meissen;1 +3522;Grossenhain Sachs;1 +3523;Coswig b Dresden;1 +35240;Tauscha b Großenhain;1 +35241;Lommatzsch;1 +35242;Nossen;1 +35243;Weinböhla;1 +35244;Krögis;1 +35245;Burkhardswalde-Munzig;1 +35246;Ziegenhain Sachs;1 +35247;Zehren Sachs;1 +35248;Schönfeld b Großenhain;1 +35249;Basslitz;1 +3525;Riesa;1 +35263;Gröditz b Riesa;1 +35264;Strehla;1 +35265;Glaubitz;1 +35266;Heyda b Riesa;1 +35267;Diesbar-Seusslitz;1 +35268;Stauchitz;1 +3528;Radeberg;1 +3529;Heidenau Sachs;1 +3531;Finsterwalde;1 +35322;Doberlug-Kirchhain;1 +35323;Sonnewalde;1 +35324;Crinitz;1 +35325;Rückersdorf b Finsterwalde;1 +35326;Schönborn Kr Elbe-Elster;1 +35327;Priessen;1 +35329;Dollenchen;1 +3533;Elsterwerda;1 +35341;Bad Liebenwerda;1 +35342;Mühlberg Elbe;1 +35343;Hirschfeld b Elsterwerda;1 +3535;Herzberg Elster;1 +35361;Schlieben;1 +35362;Schönewalde b Herzberg;1 +35363;Fermerswalde;1 +35364;Lebusa;1 +35365;Falkenberg Elster;1 +3537;Jessen Elster;1 +35383;Elster Elbe;1 +35384;Steinsdorf b Jessen;1 +35385;Annaburg;1 +35386;Prettin;1 +35387;Seyda;1 +35388;Klöden;1 +35389;Holzdorf Elster;1 +3541;Calau;1 +3542;Lübbenau Spreewald;1 +35433;Vetschau;1 +35434;Altdöbern;1 +35435;Gollmitz b Calau;1 +35436;Laasow b Calau;1 +35439;Zinnitz;1 +3544;Luckau Brandenb;1 +35451;Dahme Brandenb;1 +35452;Golssen;1 +35453;Drahnsdorf;1 +35454;Uckro;1 +35455;Walddrehna;1 +35456;Terpt;1 +3546;Lübben Spreewald;1 +35471;Birkenhainchen;1 +35472;Schlepzig;1 +35473;Neu Lübbenau;1 +35474;Schönwalde b Lübben;1 +35475;Straupitz;1 +35476;Wittmannsdorf-Bückchen;1 +35477;Rietzneuendorf-Friedrichshof;1 +35478;Goyatz;1 +355;Cottbus;1 +35600;Döbern NL;1 +35601;Peitz;1 +35602;Drebkau;1 +35603;Burg Spreewald;1 +35604;Krieschow;1 +35605;Komptendorf;1 +35606;Briesen b Cottbus;1 +35607;Jänschwalde;1 +35608;Gross Ossnig;1 +35609;Drachhausen;1 +3561;Guben;1 +3562;Forst Lausitz;1 +3563;Spremberg;1 +3564;Schwarze Pumpe;1 +35691;Bärenklau NL;1 +35692;Kerkwitz;1 +35693;Lauschütz;1 +35694;Gosda b Klinge;1 +35695;Simmersdorf;1 +35696;Briesnig;1 +35697;Bagenz;1 +35698;Hornow;1 +3571;Hoyerswerda;1 +35722;Lauta b Hoyerswerda;1 +35723;Bernsdorf OL;1 +35724;Lohsa;1 +35725;Wittichenau;1 +35726;Groß Särchen;1 +35727;Burghammer;1 +35728;Uhyst Spree;1 +3573;Senftenberg;1 +3574;Lauchhammer;1 +35751;Welzow;1 +35752;Ruhland;1 +35753;Großräschen;1 +35754;Klettwitz;1 +35755;Ortrand;1 +35756;Hosena;1 +3576;Weisswasser;1 +35771;Bad Muskau;1 +35772;Rietschen;1 +35773;Schleife;1 +35774;Boxberg Sachs;1 +35775;Pechern;1 +3578;Kamenz;1 +35792;Ossling;1 +35793;Elstra;1 +35795;Königsbrück;1 +35796;Panschwitz-Kuckau;1 +35797;Schwepnitz;1 +3581;Görlitz;1 +35820;Zodel;1 +35822;Hagenwerder;1 +35823;Ostritz;1 +35825;Kodersdorf;1 +35826;Königshain b Görlitz;1 +35827;Nieder-Seifersdorf;1 +35828;Reichenbach OL;1 +35829;Gersdorf b Görlitz;1 +3583;Zittau;1 +35841;Großschönau Sachs;1 +35842;Oderwitz;1 +35843;Hirschfelde b Zittau;1 +35844;Oybin Kurort;1 +3585;Löbau;1 +3586;Neugersdorf Sachs;1 +35872;Neusalza-Spremberg;1 +35873;Herrnhut;1 +35874;Bernstadt a d Eigen;1 +35875;Obercunnersdorf b Löbau;1 +35876;Weissenberg Sachs;1 +35877;Cunewalde;1 +3588;Niesky;1 +35891;Rothenburg OL;1 +35892;Horka OL;1 +35893;Mücka;1 +35894;Hähnichen;1 +35895;Klitten;1 +3591;Bautzen;1 +3592;Kirschau;1 +35930;Seitschen;1 +35931;Königswartha;1 +35932;Guttau;1 +35933;Neschwitz;1 +35934;Grossdubrau;1 +35935;Kleinwelka;1 +35936;Sohland Spree;1 +35937;Prischwitz;1 +35938;Großpostwitz OL;1 +35939;Hochkirch;1 +3594;Bischofswerda;1 +35951;Neukirch Lausitz;1 +35952;Großröhrsdorf OL;1 +35953;Burkau;1 +35954;Grossharthau;1 +35955;Pulsnitz;1 +3596;Neustadt i Sa;1 +35971;Sebnitz;1 +35973;Stolpen;1 +35974;Hinterhermsdorf;1 +35975;Hohnstein;1 +3601;Mühlhausen Thür;1 +36020;Ebeleben;1 +36021;Schlotheim;1 +36022;Grossengottern;1 +36023;Horsmar;1 +36024;Diedorf b Mühlhausen Thür;1 +36025;Körner;1 +36026;Struth b Mühlhausen Thür;1 +36027;Lengenfeld Unterm Stein;1 +36028;Kammerforst Thür;1 +36029;Menteroda;1 +3603;Bad Langensalza;1 +36041;Bad Tennstedt;1 +36042;Tonna;1 +36043;Kirchheilingen;1 +3605;Leinefelde;1 +3606;Heiligenstadt Heilbad;1 +36071;Teistungen;1 +36072;Weißenborn-Lüderode;1 +36074;Worbis;1 +36075;Dingelstädt Eichsfeld;1 +36076;Niederorschel;1 +36077;Grossbodungen;1 +36081;Arenshausen;1 +36082;Ershausen;1 +36083;Uder;1 +36084;Heuthen;1 +36085;Reinholterode;1 +36087;Wüstheuterode;1 +361;Erfurt;1 +36200;Elxleben b Arnstadt;1 +36201;Walschleben;1 +36202;Neudietendorf;1 +36203;Vieselbach;1 +36204;Stotternheim;1 +36205;Gräfenroda;1 +36206;Grossfahner;1 +36207;Plaue Thür;1 +36208;Ermstedt;1 +36209;Klettbach;1 +3621;Gotha Thür;1 +3622;Waltershausen Thür;1 +3623;Friedrichroda;1 +3624;Ohrdruf;1 +36252;Tambach-Dietharz Thür Wald;1 +36253;Georgenthal Thür Wald;1 +36254;Friedrichswerth;1 +36255;Goldbach b Gotha;1 +36256;Wechmar;1 +36257;Luisenthal Thür;1 +36258;Friemar;1 +36259;Tabarz Thür Wald;1 +3628;Arnstadt;1 +3629;Stadtilm;1 +3631;Nordhausen Thür;1 +3632;Sondershausen;1 +36330;Grossberndten;1 +36331;Ilfeld;1 +36332;Ellrich;1 +36333;Heringen Helme;1 +36334;Wolkramshausen;1 +36335;Grosswechsungen;1 +36336;Klettenberg;1 +36337;Schiedungen;1 +36338;Bleicherode;1 +3634;Sömmerda;1 +3635;Kölleda;1 +3636;Greussen;1 +36370;Grossenehrich;1 +36371;Schlossvippach;1 +36372;Kleinneuhausen;1 +36373;Buttstädt;1 +36374;Weissensee;1 +36375;Kindelbrück;1 +36376;Straussfurt;1 +36377;Rastenberg;1 +36378;Ostramondra;1 +36379;Holzengel;1 +3641;Jena;1 +36421;Camburg;1 +36422;Reinstädt Thür;1 +36423;Orlamünde;1 +36424;Kahla Thür;1 +36425;Isserstedt;1 +36426;Ottendorf b Stadtroda;1 +36427;Dornburg Saale;1 +36428;Stadtroda;1 +3643;Weimar Thür;1 +3644;Apolda;1 +36450;Kranichfeld;1 +36451;Buttelstedt;1 +36452;Berlstedt;1 +36453;Mellingen;1 +36454;Magdala;1 +36458;Bad Berka;1 +36459;Blankenhain Thür;1 +36461;Bad Sulza;1 +36462;Ossmannstedt;1 +36463;Gebstedt;1 +36464;Wormstedt;1 +36465;Oberndorf b Apolda;1 +3647;Pößneck;1 +36481;Neustadt an der Orla;1 +36482;Triptis;1 +36483;Ziegenrück;1 +36484;Knau b Pößneck;1 +365;Gera;1 +36601;Hermsdorf Thür;1 +36602;Ronneburg Thür;1 +36603;Weida;1 +36604;Münchenbernsdorf;1 +36605;Bad Köstritz;1 +36606;Kraftsdorf;1 +36607;Niederpöllnitz;1 +36608;Seelingstädt b Gera;1 +3661;Greiz;1 +36621;Elsterberg b Plauen;1 +36622;Triebes;1 +36623;Berga Elster;1 +36624;Teichwolframsdorf;1 +36625;Langenwetzendorf;1 +36626;Auma;1 +36628;Zeulenroda;1 +3663;Schleiz;1 +36640;Remptendorf;1 +36642;Harra;1 +36643;Thimmendorf;1 +36644;Hirschberg Saale;1 +36645;Mühltroff;1 +36646;Tanna b Schleiz;1 +36647;Saalburg Thür;1 +36648;Dittersdorf b Schleiz;1 +36649;Gefell b Schleiz;1 +36651;Lobenstein;1 +36652;Wurzbach;1 +36653;Lehesten Thür Wald;1 +36691;Eisenberg Thür;1 +36692;Bürgel;1 +36693;Crossen an der Elster;1 +36694;Schkölen Thür;1 +36695;Söllmnitz;1 +36701;Lichte;1 +36702;Lauscha;1 +36703;Gräfenthal;1 +36704;Steinheid;1 +36705;Oberweißbach Thür Wald;1 +3671;Saalfeld Saale;1 +3672;Rudolstadt;1 +36730;Sitzendorf;1 +36731;Unterloquitz;1 +36732;Könitz;1 +36733;Kaulsdorf;1 +36734;Leutenberg;1 +36735;Probstzella;1 +36736;Arnsgereuth;1 +36737;Drognitz;1 +36738;Königsee;1 +36739;Rottenbach;1 +36741;Bad Blankenburg;1 +36742;Uhlstädt;1 +36743;Teichel;1 +36744;Remda;1 +3675;Sonneberg Thür;1 +36761;Heubisch;1 +36762;Steinach Thür;1 +36764;Neuhaus-Schierschnitz;1 +36766;Schalkau;1 +3677;Ilmenau Thür;1 +36781;Grossbreitenbach;1 +36782;Schmiedefeld a Rennsteig;1 +36783;Gehren Thür;1 +36784;Stützerbach;1 +36785;Gräfinau-Angstedt;1 +3679;Neuhaus a Rennweg;1 +3681;Suhl;1 +3682;Zella-Mehlis;1 +3683;Schmalkalden;1 +36840;Trusetal;1 +36841;Schleusingen;1 +36842;Oberhof Thür;1 +36843;Benshausen;1 +36844;Rohr Thür;1 +36845;Gehlberg;1 +36846;Suhl-Dietzhausen;1 +36847;Steinbach-Hallenberg;1 +36848;Wernshausen;1 +36849;Kleinschmalkalden;1 +3685;Hildburghausen;1 +3686;Eisfeld;1 +36870;Masserberg;1 +36871;Bad Colberg-Heldburg;1 +36873;Themar;1 +36874;Schönbrunn b Hildburghaus;1 +36875;Straufhain-Streufdorf;1 +36878;Oberland;1 +3691;Eisenach Thür;1 +36920;Grossenlupnitz;1 +36921;Wutha-Farnroda;1 +36922;Gerstungen;1 +36923;Treffurt;1 +36924;Mihla;1 +36925;Marksuhl;1 +36926;Creuzburg;1 +36927;Unterellen;1 +36928;Neuenhof Thür;1 +36929;Ruhla;1 +3693;Meiningen;1 +36940;Oepfershausen;1 +36941;Wasungen;1 +36943;Bettenhausen Thür;1 +36944;Rentwertshausen;1 +36945;Henneberg;1 +36946;Erbenhausen Thür;1 +36947;Jüchsen;1 +36948;Römhild;1 +36949;Obermaßfeld-Grimmenthal;1 +3695;Bad Salzungen;1 +36961;Bad Liebenstein;1 +36962;Vacha;1 +36963;Dorndorf Rhön;1 +36964;Dermbach Rhön;1 +36965;Stadtlengsfeld;1 +36966;Kaltennordheim;1 +36967;Geisa;1 +36968;Rossdorf Rhön;1 +36969;Merkers;1 +371;Chemnitz Sachs;1 +37200;Wittgensdorf b Chemnitz;1 +37202;Claussnitz b Chemnitz;1 +37203;Gersdorf b Chemnitz;1 +37204;Lichtenstein Sachs;1 +37206;Frankenberg Sachs;1 +37207;Hainichen Sachs;1 +37208;Auerswalde;1 +37209;Einsiedel b Chemnitz;1 +3721;Meinersdorf;1 +3722;Limbach-Oberfrohna;1 +3723;Hohenstein-Ernstthal;1 +3724;Burgstädt;1 +3725;Zschopau;1 +3726;Flöha;1 +3727;Mittweida;1 +37291;Augustusburg;1 +37292;Oederan;1 +37293;Eppendorf Sachs;1 +37294;Grünhainichen;1 +37295;Lugau Erzgeb;1 +37296;Stollberg Erzgeb;1 +37297;Thum Sachs;1 +37298;Oelsnitz Erzgeb;1 +3731;Freiberg Sachs;1 +37320;Mulda Sachs;1 +37321;Frankenstein Sachs;1 +37322;Brand-Erbisdorf;1 +37323;Lichtenberg Erzgeb;1 +37324;Reinsberg Sachs;1 +37325;Niederbobritzsch;1 +37326;Frauenstein Sachs;1 +37327;Rechenberg-Bienenmühle;1 +37328;Grossschirma;1 +37329;Grosshartmannsdorf;1 +3733;Annaberg-Buchholz;1 +37341;Ehrenfriedersdorf;1 +37342;Cranzahl;1 +37343;Jöhstadt;1 +37344;Crottendorf Sachs;1 +37346;Geyer;1 +37347;Bärenstein Kr Annaberg;1 +37348;Oberwiesenthal Kurort;1 +37349;Scheibenberg;1 +3735;Marienberg Sachs;1 +37360;Olbernhau;1 +37361;Neuhausen Erzgeb;1 +37362;Seiffen Erzgeb;1 +37363;Zöblitz;1 +37364;Reitzenhain Erzgeb;1 +37365;Sayda;1 +37366;Rübenau;1 +37367;Lengefeld Erzgeb;1 +37368;Deutschneudorf;1 +37369;Wolkenstein;1 +3737;Rochlitz;1 +37381;Penig;1 +37382;Geringswalde;1 +37383;Lunzenau;1 +37384;Wechselburg;1 +3741;Plauen;1 +37421;Oelsnitz Vogtl;1 +37422;Markneukirchen;1 +37423;Adorf Vogtl;1 +37430;Eichigt;1 +37431;Mehltheuer Vogtl;1 +37432;Pausa Vogtl;1 +37433;Gutenfürst;1 +37434;Bobenneukirchen;1 +37435;Reuth b Plauen;1 +37436;Weischlitz;1 +37437;Bad Elster;1 +37438;Bad Brambach;1 +37439;Jocketa;1 +3744;Auerbach Vogtl;1 +3745;Falkenstein Vogtl;1 +37462;Rothenkirchen Vogtl;1 +37463;Bergen Vogtl;1 +37464;Schöneck Vogtl;1 +37465;Tannenbergsthal Vogtl;1 +37467;Klingenthal Sachs;1 +37468;Treuen Vogtl;1 +375;Zwickau;1 +37600;Neumark Sachs;1 +37601;Mülsen Skt Jacob;1 +37602;Kirchberg Sachs;1 +37603;Wildenfels;1 +37604;Mosel;1 +37605;Hartenstein Sachs;1 +37606;Lengenfeld Vogtl;1 +37607;Ebersbrunn Sachs;1 +37608;Waldenburg Sachs;1 +37609;Wolkenburg Mulde;1 +3761;Werdau Sachs;1 +3762;Crimmitschau;1 +3763;Glauchau;1 +3764;Meerane;1 +3765;Reichenbach Vogtl;1 +3771;Aue Sachs;1 +3772;Schneeberg Erzgeb;1 +3773;Johanngeorgenstadt;1 +3774;Schwarzenberg;1 +37752;Eibenstock;1 +37754;Zwönitz;1 +37755;Schönheide Erzgeb;1 +37756;Breitenbrunn Erzgeb;1 +37757;Rittersgrün;1 +381;Rostock;1 +38201;Gelbensande;1 +38202;Volkenshagen;1 +38203;Bad Doberan;1 +38204;Broderstorf;1 +38205;Tessin b Rostock;1 +38206;Graal-Müritz Seeheilbad;1 +38207;Stäbelow;1 +38208;Kavelstorf;1 +38209;Sanitz b Rostock;1 +3821;Ribnitz-Damgarten;1 +38220;Wustrow Ostseebad;1 +38221;Marlow;1 +38222;Semlow;1 +38223;Saal Vorpom;1 +38224;Gresenhorst;1 +38225;Trinwillershagen;1 +38226;Dierhagen Ostseebad;1 +38227;Lüdershagen b Barth;1 +38228;Dettmannsdorf-Kölzow;1 +38229;Bad Sülze;1 +38231;Barth;1 +38232;Zingst Ostseebad;1 +38233;Prerow Ostseebad;1 +38234;Born a Darß;1 +38292;Kröpelin;1 +38293;Kühlungsborn Ostseebad;1 +38294;Neubukow;1 +38295;Satow b Bad Doberan;1 +38296;Rerik Ostseebad;1 +38297;Moitin;1 +38300;Insel Hiddensee;1 +38301;Putbus;1 +38302;Sagard;1 +38303;Sellin Ostseebad;1 +38304;Garz Rügen;1 +38305;Gingst;1 +38306;Samtens;1 +38307;Poseritz;1 +38308;Göhren Rügen;1 +38309;Trent;1 +3831;Stralsund;1 +38320;Tribsees;1 +38321;Martensdorf b Stralsund;1 +38322;Richtenberg;1 +38323;Prohn;1 +38324;Velgast;1 +38325;Rolofshagen;1 +38326;Grimmen;1 +38327;Elmenhorst Vorpom;1 +38328;Miltzow;1 +38331;Rakow Vorpom;1 +38332;Gross Bisdorf;1 +38333;Horst b Grimmen;1 +38334;Grammendorf;1 +3834;Greifswald;1 +38351;Mesekenhagen;1 +38352;Kemnitz b Greifswald;1 +38353;Gützkow b Greifswald;1 +38354;Wusterhusen;1 +38355;Züssow;1 +38356;Behrenhoff;1 +3836;Wolgast;1 +38370;Kröslin;1 +38371;Karlshagen;1 +38372;Usedom;1 +38373;Katzow;1 +38374;Lassan b Wolgast;1 +38375;Koserow;1 +38376;Zirchow;1 +38377;Zinnowitz;1 +38378;Heringsdorf Seebad;1 +38379;Benz Usedom;1 +3838;Bergen auf Rügen;1 +38391;Altenkirchen Rügen;1 +38392;Sassnitz;1 +38393;Binz Ostseebad;1 +3841;Wismar Meckl;1 +38422;Neukloster;1 +38423;Bad Kleinen;1 +38424;Bobitz;1 +38425;Kirchdorf Poel;1 +38426;Neuburg-Steinhausen;1 +38427;Blowatz;1 +38428;Hohenkirchen b Wismar;1 +38429;Glasin;1 +3843;Güstrow;1 +3844;Schwaan;1 +38450;Tarnow b Bützow;1 +38451;Hoppenrade b Güstrow;1 +38452;Lalendorf;1 +38453;Mistorf;1 +38454;Kritzkow;1 +38455;Plaaz;1 +38456;Langhagen b Güstrow;1 +38457;Krakow am See;1 +38458;Zehna;1 +38459;Laage;1 +38461;Bützow;1 +38462;Baumgarten Meckl;1 +38464;Bernitt;1 +38466;Jürgenshagen;1 +3847;Sternberg;1 +38481;Witzin;1 +38482;Warin;1 +38483;Brüel;1 +38484;Ventschow;1 +38485;Dabel;1 +38486;Gustävel;1 +38488;Demen;1 +385;Schwerin Meckl;1 +3860;Raben Steinfeld;1 +3861;Plate;1 +3863;Crivitz;1 +3865;Holthusen;1 +3866;Cambs;1 +3867;Lübstorf;1 +3868;Rastow;1 +3869;Dümmer;1 +3871;Parchim;1 +38720;Grebbin;1 +38721;Ziegendorf;1 +38722;Raduhn;1 +38723;Kladrum;1 +38724;Siggelkow;1 +38725;Gross Godems;1 +38726;Spornitz;1 +38727;Mestlin;1 +38728;Domsühl;1 +38729;Marnitz;1 +38731;Lübz;1 +38732;Gallin b Lübz;1 +38733;Karbow-Vietlübbe;1 +38735;Plau am See;1 +38736;Goldberg Meckl;1 +38737;Ganzlin;1 +38738;Karow b Lübz;1 +3874;Ludwigslust Meckl;1 +38750;Malliss;1 +38751;Picher;1 +38752;Zierzow b Ludwigslust;1 +38753;Wöbbelin;1 +38754;Leussow b Ludwigslust;1 +38755;Eldena;1 +38756;Grabow Meckl;1 +38757;Neustadt-Glewe;1 +38758;Dömitz;1 +38759;Tewswoos;1 +3876;Perleberg;1 +3877;Wittenberge;1 +38780;Lanz Brandenb;1 +38781;Mellen;1 +38782;Reetz b Perleberg;1 +38783;Dallmin;1 +38784;Kleinow Kr Prignitz;1 +38785;Berge b Perleberg;1 +38787;Glöwen;1 +38788;Gross Warnow;1 +38789;Wolfshagen b Perleberg;1 +38791;Bad Wilsnack;1 +38792;Lenzen (Elbe);1 +38793;Dergenthin;1 +38794;Cumlosen;1 +38796;Viesecke;1 +38797;Karstädt Kr Prignitz;1 +3881;Grevesmühlen;1 +38821;Lüdersdorf Meckl;1 +38822;Diedrichshagen b Grevesmühlen;1 +38823;Selmsdorf;1 +38824;Mallentin;1 +38825;Klütz;1 +38826;Dassow;1 +38827;Kalkhorst;1 +38828;Schönberg Meckl;1 +3883;Hagenow;1 +38841;Neuhaus Elbe;1 +38842;Lüttenmark;1 +38843;Bennin;1 +38844;Gülze;1 +38845;Kaarssen;1 +38847;Boizenburg Elbe;1 +38848;Vellahn;1 +38850;Gammelin;1 +38851;Zarrentin Meckl;1 +38852;Wittenburg;1 +38853;Drönnewitz b Hagenow;1 +38854;Redefin;1 +38855;Lübtheen;1 +38856;Pritzier b Hagenow;1 +38858;Lassahn;1 +38859;Alt Zachun;1 +3886;Gadebusch;1 +38871;Mühlen Eichsen;1 +38872;Rehna;1 +38873;Carlow;1 +38874;Lützow;1 +38875;Schlagsdorf b Gadebusch;1 +38876;Roggendorf;1 +39000;Beetzendorf;1 +39001;Apenburg;1 +39002;Oebisfelde;1 +39003;Jübar;1 +39004;Köckte b Gardelegen;1 +39005;Kusey;1 +39006;Miesterhorst;1 +39007;Tangeln;1 +39008;Kunrau;1 +39009;Badel;1 +3901;Salzwedel;1 +3902;Diesdorf Altm;1 +39030;Brunau;1 +39031;Dähre;1 +39032;Mahlsdorf b Salzwedel;1 +39033;Wallstawe;1 +39034;Fleetmark;1 +39035;Kuhfelde;1 +39036;Binde;1 +39037;Pretzier;1 +39038;Henningen;1 +39039;Bonese;1 +3904;Haldensleben;1 +39050;Bartensleben;1 +39051;Calvörde;1 +39052;Erxleben b Haldensleben;1 +39053;Süplingen;1 +39054;Flechtingen;1 +39055;Hörsingen;1 +39056;Klüden;1 +39057;Rätzlingen Sachs-Anh;1 +39058;Uthmöden;1 +39059;Wegenstedt;1 +39061;Weferlingen;1 +39062;Bebertal;1 +3907;Gardelegen;1 +39080;Kalbe Milde;1 +39081;Kakerbeck Sachs-Anh;1 +39082;Mieste;1 +39083;Messdorf;1 +39084;Lindstedt;1 +39085;Zichtau;1 +39086;Jävenitz;1 +39087;Jerchel Altmark;1 +39088;Letzlingen;1 +39089;Bismark Altmark;1 +3909;Klötze Altmark;1 +391;Magdeburg;1 +39200;Gommern;1 +39201;Wolmirstedt;1 +39202;Gross Ammensleben;1 +39203;Barleben;1 +39204;Niederndodeleben;1 +39205;Langenweddingen;1 +39206;Eichenbarleben;1 +39207;Colbitz;1 +39208;Loitsche;1 +39209;Wanzleben;1 +3921;Burg b Magdeburg;1 +39221;Möckern b Magdeburg;1 +39222;Möser;1 +39223;Theessen;1 +39224;Büden;1 +39225;Altengrabow;1 +39226;Hohenziatz;1 +3923;Zerbst;1 +39241;Leitzkau;1 +39242;Prödel;1 +39243;Nedlitz b Zerbst;1 +39244;Steutz;1 +39245;Loburg;1 +39246;Lindau Anh;1 +39247;Güterglück;1 +39248;Dobritz;1 +3925;Stassfurt;1 +39262;Güsten Anh;1 +39263;Unseburg;1 +39264;Kroppenstedt;1 +39265;Löderburg;1 +39266;Förderstedt;1 +39267;Schneidlingen;1 +39268;Egeln;1 +3928;Schönebeck Elbe;1 +39291;Calbe Saale;1 +39292;Biederitz;1 +39293;Dreileben;1 +39294;Gross Rosenburg;1 +39295;Zuchau;1 +39296;Welsleben;1 +39297;Eickendorf Kr Schönebeck;1 +39298;Barby Elbe;1 +3931;Stendal;1 +39320;Schinne;1 +39321;Arneburg;1 +39322;Tangermünde;1 +39323;Schönhausen Elbe;1 +39324;Kläden b Stendal;1 +39325;Vinzelberg;1 +39327;Klietz;1 +39328;Rochau;1 +39329;Möringen;1 +3933;Genthin;1 +39341;Redekin;1 +39342;Gladau;1 +39343;Jerichow;1 +39344;Güsen;1 +39345;Parchen;1 +39346;Tucheim;1 +39347;Kade;1 +39348;Klitsche;1 +39349;Parey Elbe;1 +3935;Tangerhütte;1 +39361;Lüderitz;1 +39362;Grieben b Tangerhütte;1 +39363;Angern;1 +39364;Dolle;1 +39365;Bellingen b Stendal;1 +39366;Kehnert;1 +3937;Osterburg Altmark;1 +39382;Kamern;1 +39383;Sandau Elbe;1 +39384;Arendsee Altmark;1 +39386;Seehausen Altmark;1 +39387;Havelberg;1 +39388;Goldbeck Altm;1 +39389;Schollene;1 +39390;Iden;1 +39391;Lückstedt;1 +39392;Rönnebeck Sachs-Ahn;1 +39393;Werben Elbe;1 +39394;Hohenberg-Krusemark;1 +39395;Wanzer;1 +39396;Neukirchen Altmark;1 +39397;Geestgottberg;1 +39398;Gross Garz;1 +39399;Kleinau;1 +39400;Wefensleben;1 +39401;Neuwegersleben;1 +39402;Völpke;1 +39403;Gröningen Sachs-Ahn;1 +39404;Ausleben;1 +39405;Hötensleben;1 +39406;Harbke;1 +39407;Seehausen Börde;1 +39408;Hadmersleben;1 +39409;Eilsleben;1 +3941;Halberstadt;1 +39421;Osterwieck;1 +39422;Badersleben;1 +39423;Wegeleben;1 +39424;Schwanebeck Sachs-Anh;1 +39425;Dingelstedt a Huy;1 +39426;Hessen;1 +39427;Ströbeck;1 +39428;Pabstorf;1 +3943;Wernigerode;1 +3944;Blankenburg Harz;1 +39451;Wasserleben;1 +39452;Ilsenburg;1 +39453;Derenburg;1 +39454;Elbingerode Harz;1 +39455;Schierke;1 +39456;Altenbrak;1 +39457;Benneckenstein Harz;1 +39458;Heudeber;1 +39459;Hasselfelde;1 +3946;Quedlinburg;1 +3947;Thale;1 +39481;Hedersleben b Aschersleben;1 +39482;Gatersleben;1 +39483;Ballenstedt;1 +39484;Harzgerode;1 +39485;Gernrode Harz;1 +39487;Friedrichsbrunn;1 +39488;Güntersberge;1 +39489;Strassberg Harz;1 +3949;Oschersleben Bode;1 +395;Neubrandenburg;1 +39600;Zwiedorf;1 +39601;Friedland Meckl;1 +39602;Kleeth;1 +39603;Burg Stargard;1 +39604;Wildberg b Altentreptow;1 +39605;Gross Nemerow;1 +39606;Glienke;1 +39607;Kotelow;1 +39608;Staven;1 +3961;Altentreptow;1 +3962;Penzlin b Waren;1 +3963;Woldegk;1 +3964;Bredenfelde b Strasburg;1 +3965;Burow b Altentreptow;1 +3966;Cölpin;1 +3967;Oertzenhof b Strasburg;1 +3968;Schönbeck Meckl;1 +3969;Siedenbollentin;1 +3971;Anklam;1 +39721;Liepen b Anklam;1 +39722;Sarnow b Anklam;1 +39723;Krien;1 +39724;Klein Bünzow;1 +39726;Ducherow;1 +39727;Spantekow;1 +39728;Medow b Anklam;1 +3973;Pasewalk;1 +39740;Nechlin;1 +39741;Jatznick;1 +39742;Brüssow b Pasewalk;1 +39743;Zerrenthin;1 +39744;Rothenklempenow;1 +39745;Hetzdorf b Strasburg;1 +39746;Krackow;1 +39747;Züsedom;1 +39748;Viereck;1 +39749;Grambow b Pasewalk;1 +39751;Penkun;1 +39752;Blumenhagen b Strasburg;1 +39753;Strasburg;1 +39754;Löcknitz Vorpom;1 +3976;Torgelow b Ueckermünde;1 +39771;Ueckermünde;1 +39772;Rothemühl;1 +39773;Altwarp;1 +39774;Mönkebude;1 +39775;Ahlbeck b Torgelow;1 +39776;Hintersee;1 +39777;Borkenfriede;1 +39778;Ferdinandshof b Torgelow;1 +39779;Eggesin;1 +3981;Neustrelitz;1 +39820;Triepkendorf;1 +39821;Carpin;1 +39822;Kratzeburg;1 +39823;Rechlin;1 +39824;Hohenzieritz;1 +39825;Wokuhl;1 +39826;Blankensee b Neustrelitz;1 +39827;Schwarz b Neustrelitz;1 +39828;Wustrow Kr Mecklenburg-Strelitz;1 +39829;Blankenförde;1 +39831;Feldberg Meckl;1 +39832;Wesenberg Meckl;1 +39833;Mirow Kr Neustrelitz;1 +3984;Prenzlau;1 +39851;Göritz b Prenzlau;1 +39852;Schönermark b Prenzlau;1 +39853;Holzendorf b Prenzlau;1 +39854;Kleptow;1 +39855;Parmen-Weggun;1 +39856;Beenz b Prenzlau;1 +39857;Drense;1 +39858;Bietikow;1 +39859;Fürstenwerder;1 +39861;Gramzow b Prenzlau;1 +39862;Schmölln b Prenzlau;1 +39863;Seehausen b Prenzlau;1 +3987;Templin;1 +39881;Ringenwalde b Templin;1 +39882;Gollin;1 +39883;Groß Dölln;1 +39884;Hassleben b Prenzlau;1 +39885;Jakobshagen;1 +39886;Milmersdorf;1 +39887;Gerswalde;1 +39888;Lychen;1 +39889;Boitzenburg;1 +3991;Waren Müritz;1 +39921;Ankershagen;1 +39922;Dambeck b Röbel;1 +39923;Priborn;1 +39924;Stuer;1 +39925;Wredenhagen;1 +39926;Grabowhöfe;1 +39927;Nossentiner Hütte;1 +39928;Möllenhagen;1 +39929;Jabel b Waren;1 +39931;Röbel Müritz;1 +39932;Malchow b Waren;1 +39933;Vollrathsruhe;1 +39934;Groß Plasten;1 +3994;Malchin;1 +39951;Faulenrost;1 +39952;Grammentin;1 +39953;Schwinkendorf;1 +39954;Stavenhagen Reuterstadt;1 +39955;Jürgenstorf Meckl;1 +39956;Neukalen;1 +39957;Gielow;1 +39959;Dargun;1 +3996;Teterow;1 +39971;Gnoien;1 +39972;Walkendorf;1 +39973;Altkalen;1 +39975;Thürkow;1 +39976;Groß Bützin;1 +39977;Jördenstorf;1 +39978;Gross Roge;1 +3998;Demmin;1 +39991;Daberkow;1 +39992;Görmin;1 +39993;Hohenmocker;1 +39994;Metschow;1 +39995;Nossendorf;1 +39996;Törpin;1 +39997;Jarmen;1 +39998;Loitz b Demmin;1 +39999;Tutow;1 +40;Hamburg;1 +4101;Pinneberg;1 +4102;Ahrensburg;1 +4103;Wedel;1 +4104;Aumühle b Hamburg;1 +4105;Seevetal;1 +4106;Quickborn Kr Pinneberg;1 +4107;Siek Kr Stormarn;1 +4108;Rosengarten Kr Harburg;1 +4109;Tangstedt Bz Hamburg;1 +4120;Ellerhoop;1 +4121;Elmshorn;1 +4122;Uetersen;1 +4123;Barmstedt;1 +4124;Glückstadt;1 +4125;Seestermühe;1 +4126;Horst Holstein;1 +4127;Westerhorn;1 +4128;Kollmar;1 +4129;Haseldorf;1 +4131;Lüneburg;1 +4132;Amelinghausen;1 +4133;Wittorf Kr Lünebeburg;1 +4134;Embsen Kr Lünebeburg;1 +4135;Kirchgellersen;1 +4136;Scharnebeck;1 +4137;Barendorf;1 +4138;Betzendorf Kr Lünebeburg;1 +4139;Hohnstorf Elbe;1 +4140;Estorf Kr Stade;1 +4141;Stade;1 +4142;Steinkirchen Kr Stade;1 +4143;Drochtersen;1 +4144;Himmelpforten;1 +4146;Stade-Bützfleth;1 +4148;Drochtersen-Assel;1 +4149;Fredenbeck;1 +4151;Schwarzenbek;1 +4152;Geesthacht;1 +4153;Lauenburg Elbe;1 +4154;Trittau;1 +4155;Büchen;1 +4156;Talkau;1 +4158;Roseburg;1 +4159;Basthorst;1 +4161;Buxtehude;1 +4162;Jork;1 +4163;Horneburg Niederelbe;1 +4164;Harsefeld;1 +4165;Hollenstedt Nordheide;1 +4166;Ahlerstedt;1 +4167;Apensen;1 +4168;Neu Wulmstorf-Elstorf;1 +4169;Sauensiek;1 +4171;Winsen Luhe;1 +4172;Salzhausen;1 +4173;Wulfsen;1 +4174;Stelle Kr Harburg;1 +4175;Egestorf Nordheide;1 +4176;Marschacht;1 +4177;Drage Elbe;1 +4178;Radbruch;1 +4179;Winsen-Tönnhausen;1 +4180;Königsmoor;1 +4181;Buchholz in der Nordheide;1 +4182;Tostedt;1 +4183;Jesteburg;1 +4184;Hanstedt Nordheide;1 +4185;Marxen Auetal;1 +4186;Buchholz-Trelde;1 +4187;Holm-Seppensen;1 +4188;Welle Nordheide;1 +4189;Undeloh;1 +4191;Kaltenkirchen Holst;1 +4192;Bad Bramstedt;1 +4193;Henstedt-Ulzburg;1 +4194;Sievershütten;1 +4195;Hartenholm;1 +4202;Achim b Bremen;1 +4203;Weyhe b Bremen;1 +4204;Thedinghausen;1 +4205;Ottersberg;1 +4206;Stuhr-Heiligenrode;1 +4207;Oyten;1 +4208;Grasberg;1 +4209;Schwanewede;1 +421;Bremen;1 +4221;Delmenhorst;1 +4222;Ganderkesee;1 +4223;Ganderkesee-Bookholzberg;1 +4224;Gross Ippener;1 +4230;Verden-Walle;1 +4231;Verden Aller;1 +4232;Langwedel Kr Verden;1 +4233;Blender;1 +4234;Dörverden;1 +4235;Langwedel-Etelsen;1 +4236;Kirchlinteln;1 +4237;Bendingbostel;1 +4238;Neddenaverbergen;1 +4239;Dörverden-Westen;1 +4240;Syke-Heiligenfelde;1 +4241;Bassum;1 +4242;Syke;1 +4243;Twistringen;1 +4244;Harpstedt;1 +4245;Neuenkirchen b Bassum;1 +4246;Twistringen-Heiligenloh;1 +4247;Affinghausen;1 +4248;Bassum-Neubruchhausen;1 +4249;Bassum-Nordwohlde;1 +4251;Hoya;1 +4252;Bruchhausen-Vilsen;1 +4253;Asendorf Kr Diepholz;1 +4254;Eystrup;1 +4255;Martfeld;1 +4256;Hilgermissen;1 +4257;Schweringen;1 +4258;Schwarme;1 +4260;Visselhövede-Wittorf;1 +4261;Rotenburg Wümme;1 +4262;Visselhövede;1 +4263;Scheessel;1 +4264;Sottrum Kr Rotenburg;1 +4265;Fintel;1 +4266;Brockel;1 +4267;Lauenbrück;1 +4268;Bötersen;1 +4269;Ahausen-Kirchwalsede;1 +4271;Sulingen;1 +4272;Siedenburg;1 +4273;Kirchdorf b Sulingen;1 +4274;Varrel b Sulingen;1 +4275;Ehrenburg;1 +4276;Borstel b Sulingen;1 +4277;Schwaförden;1 +4281;Zeven;1 +4282;Sittensen;1 +4283;Tarmstedt;1 +4284;Selsingen;1 +4285;Rhade b Zeven;1 +4286;Gyhum;1 +4287;Heeslingen-Boitzen;1 +4288;Horstedt Kr Rotenburg;1 +4289;Kirchtimke;1 +4292;Ritterhude;1 +4293;Ottersberg-Fischerhude;1 +4294;Riede Kr Verden;1 +4295;Emtinghausen;1 +4296;Schwanewede-Aschwarden;1 +4297;Ottersberg-Posthausen;1 +4298;Lilienthal;1 +4302;Kirchbarkau;1 +4303;Schlesen;1 +4305;Westensee;1 +4307;Raisdorf;1 +4308;Schwedeneck;1 +431;Kiel;1 +4320;Heidmühlen;1 +4321;Neumünster;1 +4322;Bordesholm;1 +4323;Bornhöved;1 +4324;Brokstedt;1 +4326;Wankendorf;1 +4327;Grossenaspe;1 +4328;Rickling;1 +4329;Langwedel Holst;1 +4330;Emkendorf;1 +4331;Rendsburg;1 +4332;Hamdorf b Rendsburg;1 +4333;Erfde;1 +4334;Bredenbek b Rendsburg;1 +4335;Hohn b Rendsburg;1 +4336;Owschlag;1 +4337;Jevenstedt;1 +4338;Alt Duvenstedt;1 +4339;Christiansholm;1 +4340;Achterwehr;1 +4342;Preetz Kr Plön;1 +4343;Laboe;1 +4344;Schönberg Holstein;1 +4346;Gettorf;1 +4347;Flintbek;1 +4348;Schönkirchen;1 +4349;Dänischenhagen;1 +4351;Eckernförde;1 +4352;Damp;1 +4353;Ascheffel;1 +4354;Fleckeby;1 +4355;Rieseby;1 +4356;Gross Wittensee;1 +4357;Sehestedt Eider;1 +4358;Loose b Eckernförde;1 +4361;Oldenburg in Holstein;1 +4362;Heiligenhafen;1 +4363;Lensahn;1 +4364;Dahme Kr Ostholstein;1 +4365;Heringsdorf Holst;1 +4366;Grömitz-Cismar;1 +4367;Grossenbrode;1 +4371;Burg auf Fehmarn;1 +4372;Westfehmarn;1 +4381;Lütjenburg;1 +4382;Wangels;1 +4383;Grebin;1 +4384;Selent;1 +4385;Hohenfelde b Kiel;1 +4392;Nortorf b Neumünster;1 +4393;Boostedt;1 +4394;Bokhorst;1 +4401;Brake Unterweser;1 +4402;Rastede;1 +4403;Bad Zwischenahn;1 +4404;Elsfleth;1 +4405;Edewecht;1 +4406;Berne;1 +4407;Wardenburg;1 +4408;Hude Oldenburg;1 +4409;Westerstede-Ocholt;1 +441;Oldenburg (Oldb);1 +4421;Wilhelmshaven;1 +4422;Sande Kr Friesl;1 +4423;Fedderwarden;1 +4425;Wangerland-Hooksiel;1 +4426;Wangerland-Horumersiel;1 +4431;Wildeshausen;1 +4432;Dötlingen-Brettorf;1 +4433;Dötlingen;1 +4434;Colnrade;1 +4435;Grossenkneten;1 +4441;Vechta;1 +4442;Lohne Oldenburg;1 +4443;Dinklage;1 +4444;Goldenstedt;1 +4445;Visbek Kr Vechta;1 +4446;Bakum Kr Vechta;1 +4447;Vechta-Langförden;1 +4451;Varel Jadebusen;1 +4452;Zetel-Neuenburg;1 +4453;Zetel;1 +4454;Jade;1 +4455;Jade-Schweiburg;1 +4456;Varel-Altjührden;1 +4458;Wiefelstede-Spohle;1 +4461;Jever;1 +4462;Wittmund;1 +4463;Wangerland;1 +4464;Wittmund-Carolinensiel;1 +4465;Friedeburg Ostfriesl;1 +4466;Wittmund-Ardorf;1 +4467;Wittmund-Funnix;1 +4468;Friedeburg-Reepsholt;1 +4469;Wangerooge;1 +4471;Cloppenburg;1 +4472;Lastrup;1 +4473;Emstek;1 +4474;Garrel;1 +4475;Molbergen;1 +4477;Lastrup-Hemmelte;1 +4478;Cappeln Oldenburg;1 +4479;Molbergen-Peheim;1 +4480;Ovelgönne-Strückhausen;1 +4481;Hatten-Sandkrug;1 +4482;Hatten;1 +4483;Ovelgönne-Großenmeer;1 +4484;Hude-Wüsting;1 +4485;Elsfleth-Huntorf;1 +4486;Edewecht-Friedrichsfehn;1 +4487;Grossenkneten-Huntlosen;1 +4488;Westerstede;1 +4489;Apen;1 +4491;Friesoythe;1 +4492;Saterland;1 +4493;Friesoythe-Gehlenberg;1 +4494;Bösel Oldenburg;1 +4495;Friesoythe-Thüle;1 +4496;Friesoythe-Markhausen;1 +4497;Barßel-Harkebrügge;1 +4498;Saterland-Ramsloh;1 +4499;Barssel;1 +4501;Kastorf Holst;1 +4502;Lübeck-Travemünde;1 +4503;Timmendorfer Strand;1 +4504;Ratekau;1 +4505;Stockelsdorf-Curau;1 +4506;Stockelsdorf-Krumbeck;1 +4508;Krummesse;1 +4509;Groß Grönau;1 +451;Lübeck;1 +4521;Eutin;1 +4522;Plön;1 +4523;Malente;1 +4524;Scharbeutz-Pönitz;1 +4525;Ahrensbök;1 +4526;Ascheberg Holstein;1 +4527;Bosau;1 +4528;Schönwalde am Bungsberg;1 +4529;Süsel-Bujendorf;1 +4531;Bad Oldesloe;1 +4532;Bargteheide;1 +4533;Reinfeld Holstein;1 +4534;Steinburg Kr Storman;1 +4535;Nahe;1 +4536;Steinhorst Lauenb;1 +4537;Sülfeld Holst;1 +4539;Westerau;1 +4541;Ratzeburg;1 +4542;Mölln Lauenb;1 +4543;Nusse;1 +4544;Berkenthin;1 +4545;Seedorf Lauenb;1 +4546;Mustin Lauenburg;1 +4547;Gudow Lauenb;1 +4550;Bühnsdorf;1 +4551;Bad Segeberg;1 +4552;Leezen;1 +4553;Geschendorf;1 +4554;Wahlstedt;1 +4555;Seedorf b Bad Segeberg;1 +4556;Ahrensbök-Gnissau;1 +4557;Blunk;1 +4558;Todesfelde;1 +4559;Wensin;1 +4561;Neustadt in Holstein;1 +4562;Grömitz;1 +4563;Scharbeutz-Haffkrug;1 +4564;Schashagen;1 +4602;Freienwill;1 +4603;Havetoft;1 +4604;Grossenwiehe;1 +4605;Medelby;1 +4606;Wanderup;1 +4607;Janneby;1 +4608;Handewitt;1 +4609;Eggebek;1 +461;Flensburg;1 +4621;Schleswig;1 +4622;Taarstedt;1 +4623;Böklund;1 +4624;Kropp;1 +4625;Jübek;1 +4626;Treia;1 +4627;Dörpstedt;1 +4630;Barderup;1 +4631;Glücksburg Ostsee;1 +4632;Steinbergkirche;1 +4633;Satrup;1 +4634;Husby;1 +4635;Sörup;1 +4636;Langballig;1 +4637;Sterup;1 +4638;Tarp;1 +4639;Schafflund;1 +4641;Süderbrarup;1 +4642;Kappeln Schlei;1 +4643;Gelting Angeln;1 +4644;Karby;1 +4646;Mohrkirch;1 +4651;Sylt;1 +4661;Niebüll;1 +4662;Leck;1 +4663;Süderlügum;1 +4664;Neukirchen b Niebüll;1 +4665;Emmelsbüll-Horsbüll;1 +4666;Ladelund;1 +4667;Dagebüll;1 +4668;Klanxbüll;1 +4671;Bredstedt;1 +4672;Langenhorn;1 +4673;Joldelund;1 +4674;Ockholm;1 +4681;Wyk auf Föhr;1 +4682;Amrum;1 +4683;Oldsum;1 +4684;Langeneß Hallig;1 +4702;Sandstedt;1 +4703;Loxstedt-Donnern;1 +4704;Drangstedt;1 +4705;Wremen;1 +4706;Schiffdorf;1 +4707;Langen-Neuenwalde;1 +4708;Ringstedt;1 +471;Bremerhaven;1 +4721;Cuxhaven;1 +4722;Cuxhaven-Altenbruch;1 +4723;Cuxhaven-Altenwalde;1 +4724;Cuxhaven-Lüdingworth;1 +4725;Helgoland;1 +4731;Nordenham;1 +4732;Stadland-Rodenkirchen;1 +4733;Butjadingen-Burhave;1 +4734;Stadland-Seefeld;1 +4735;Butjadingen-Stollhamm;1 +4736;Butjadingen-Tossens;1 +4737;Stadland-Schwei;1 +4740;Loxstedt-Dedesdorf;1 +4741;Nordholz b Bremerhaven;1 +4742;Dorum;1 +4743;Langen b Bremerhaven;1 +4744;Loxstedt;1 +4745;Bad Bederkesa;1 +4746;Hagen b Bremerhaven;1 +4747;Beverstedt;1 +4748;Stubben b Bremerhaven;1 +4749;Schiffdorf-Geestenseth;1 +4751;Otterndorf;1 +4752;Neuhaus Oste;1 +4753;Balje;1 +4754;Bülkau;1 +4755;Ihlienworth;1 +4756;Odisheim;1 +4757;Wanna;1 +4758;Nordleda;1 +4761;Bremervörde;1 +4762;Kutenholz;1 +4763;Gnarrenburg;1 +4764;Gnarrenburg-Klenkendorf;1 +4765;Ebersdorf b Bremervörde;1 +4766;Basdahl;1 +4767;Bremervörde-Bevern;1 +4768;Hipstedt;1 +4769;Bremervörde-Iselersheim;1 +4770;Wischhafen;1 +4771;Hemmoor;1 +4772;Oberndorf Oste;1 +4773;Lamstedt;1 +4774;Hechthausen;1 +4775;Grossenwörden;1 +4776;Osten-Altendorf;1 +4777;Cadenberge;1 +4778;Wingst;1 +4779;Freiburg Elbe;1 +4791;Osterholz-Scharmbeck;1 +4792;Worpswede;1 +4793;Hambergen;1 +4794;Worpswede-Ostersode;1 +4795;Garlstedt;1 +4796;Teufelsmoor;1 +4802;Wrohm;1 +4803;Pahlen;1 +4804;Nordhastedt;1 +4805;Schafstedt;1 +4806;Sarzbüttel;1 +481;Heide Holst;1 +4821;Itzehoe;1 +4822;Kellinghusen;1 +4823;Wilster;1 +4824;Krempe;1 +4825;Burg Dithmarschen;1 +4826;Hohenlockstedt;1 +4827;Wacken;1 +4828;Lägerdorf;1 +4829;Wewelsfleth;1 +4830;Süderhastedt;1 +4832;Meldorf;1 +4833;Wesselburen;1 +4834;Büsum;1 +4835;Albersdorf Holst;1 +4836;Hennstedt Dithm;1 +4837;Neuenkirchen Dithm;1 +4838;Tellingstedt;1 +4839;Wöhrden Dithm;1 +4841;Husum Nordsee;1 +4842;Nordstrand;1 +4843;Viöl;1 +4844;Pellworm;1 +4845;Ostenfeld Husum;1 +4846;Hattstedt;1 +4847;Oster-Ohrstedt;1 +4848;Rantrum;1 +4849;Hooge;1 +4851;Marne;1 +4852;Brunsbüttel;1 +4853;Sankt Michaelisdonn;1 +4854;Friedrichskoog;1 +4855;Eddelak;1 +4856;Kronprinzenkoog;1 +4857;Barlt;1 +4858;Sankt Margarethen Holst;1 +4859;Windbergen;1 +4861;Tönning;1 +4862;Garding;1 +4863;Sankt Peter-Ording;1 +4864;Oldenswort;1 +4865;Osterhever;1 +4871;Hohenwestedt;1 +4872;Hanerau-Hademarschen;1 +4873;Aukrug;1 +4874;Todenbüttel;1 +4875;Stafstedt;1 +4876;Reher Holst;1 +4877;Hennstedt b Itzehoe;1 +4881;Friedrichstadt;1 +4882;Lunden;1 +4883;Süderstapel;1 +4884;Schwabstedt;1 +4885;Bergenhusen;1 +4892;Schenefeld Mittelholst;1 +4893;Hohenaspe;1 +4902;Jemgum-Ditzum;1 +4903;Wymeer;1 +491;Leer Ostfriesland;1 +4920;Wirdum;1 +4921;Emden Stadt;1 +4922;Borkum;1 +4923;Krummhörn-Pewsum;1 +4924;Moormerland-Oldersum;1 +4925;Hinte;1 +4926;Krummhörn-Greetsiel;1 +4927;Krummhörn-Loquard;1 +4928;Ihlow-Riepe;1 +4929;Ihlow Kr Aurich;1 +4931;Norden;1 +4932;Norderney;1 +4933;Dornum Ostfriesl;1 +4934;Marienhafe;1 +4935;Juist;1 +4936;Grossheide;1 +4938;Hagermarsch;1 +4939;Baltrum;1 +4941;Aurich;1 +4942;Südbrookmerland;1 +4943;Grossefehn;1 +4944;Wiesmoor;1 +4945;Grossefehn-Timmel;1 +4946;Grossefehn-Bagband;1 +4947;Aurich-Ogenbargen;1 +4948;Wiesmoor-Marcardsmoor;1 +4950;Holtland;1 +4951;Weener;1 +4952;Rhauderfehn;1 +4953;Bunde;1 +4954;Moormerland;1 +4955;Westoverledingen;1 +4956;Uplengen;1 +4957;Detern;1 +4958;Jemgum;1 +4959;Dollart;1 +4961;Papenburg;1 +4962;Papenburg-Aschendorf;1 +4963;Dörpen;1 +4964;Rhede Ems;1 +4965;Surwold;1 +4966;Neubörger;1 +4967;Rhauderfehn-Burlage;1 +4968;Neulehe;1 +4971;Esens;1 +4972;Langeoog;1 +4973;Wittmund-Burhafe;1 +4974;Neuharlingersiel;1 +4975;Westerholt Ostfriesl;1 +4976;Spiekeroog;1 +4977;Blomberg Ostfriesl;1 +5021;Nienburg Weser;1 +5022;Wietzen;1 +5023;Liebenau Kr Nieburg Weser;1 +5024;Rohrsen Kr Nienburg Weser;1 +5025;Estorf Weser;1 +5026;Steimbke;1 +5027;Linsburg;1 +5028;Pennigsehl;1 +5031;Wunstorf;1 +5032;Neustadt am Rübenberge;1 +5033;Wunstorf-Grossenheidorn;1 +5034;Neustadt-Hagen;1 +5035;Gross Munzel;1 +5036;Neustadt-Schneeren;1 +5037;Bad Rehburg;1 +5041;Springe Deister;1 +5042;Bad Münder am Deister;1 +5043;Lauenau;1 +5044;Springe-Eldagsen;1 +5045;Springe-Bennigsen;1 +5051;Bergen Kr Celle;1 +5052;Hermannsburg;1 +5053;Faßberg-Müden;1 +5054;Bergen-Sülze;1 +5055;Fassberg;1 +5056;Winsen-Meissendorf;1 +5060;Bodenburg;1 +5062;Holle b Hildesheim;1 +5063;Bad Salzdetfurth;1 +5064;Groß Düngen;1 +5065;Sibbesse;1 +5066;Sarstedt;1 +5067;Bockenem;1 +5068;Elze Leine;1 +5069;Nordstemmen;1 +5071;Schwarmstedt;1 +5072;Neustadt-Mandelsloh;1 +5073;Neustadt-Esperke;1 +5074;Rodewald;1 +5082;Langlingen;1 +5083;Hohne b Celle;1 +5084;Hambühren;1 +5085;Burgdorf-Ehlershausen;1 +5086;Celle-Scheuen;1 +5101;Pattensen;1 +5102;Laatzen;1 +5103;Wennigsen Deister;1 +5105;Barsinghausen;1 +5108;Gehrden Han;1 +5109;Ronnenberg;1 +511;Hannover;1 +5121;Hildesheim;1 +5123;Schellerten;1 +5126;Algermissen;1 +5127;Harsum;1 +5128;Hohenhameln;1 +5129;Söhlde;1 +5130;Wedemark;1 +5131;Garbsen;1 +5132;Lehrte;1 +5135;Burgwedel-Fuhrberg;1 +5136;Burgdorf Kr Hannover;1 +5137;Seelze;1 +5138;Sehnde;1 +5139;Burgwedel;1 +5141;Celle;1 +5142;Eschede;1 +5143;Winsen Aller;1 +5144;Wathlingen;1 +5145;Beedenbostel;1 +5146;Wietze;1 +5147;Uetze-Hänigsen;1 +5148;Steinhorst Niedersachs;1 +5149;Wienhausen;1 +5151;Hameln;1 +5152;Hessisch Oldendorf;1 +5153;Salzhemmendorf;1 +5154;Aerzen;1 +5155;Emmerthal;1 +5156;Coppenbrügge;1 +5157;Emmerthal-Börry;1 +5158;Hemeringen;1 +5159;Coppenbrügge-Bisperode;1 +5161;Walsrode;1 +5162;Fallingbostel;1 +5163;Fallingbostel-Dorfmark;1 +5164;Hodenhagen;1 +5165;Rethem Aller;1 +5166;Walsrode-Kirchboitzen;1 +5167;Walsrode-Westenholz;1 +5168;Walsrode-Stellichte;1 +5171;Peine;1 +5172;Ilsede;1 +5173;Uetze;1 +5174;Lahstedt;1 +5175;Lehrte-Arpke;1 +5176;Edemissen;1 +5177;Edemissen-Abbensen;1 +5181;Alfeld Leine;1 +5182;Gronau Leine;1 +5183;Lamspringe;1 +5184;Freden Leine;1 +5185;Duingen;1 +5186;Salzhemmendorf-Wallensen;1 +5187;Delligsen;1 +5190;Soltau-Emmingen;1 +5191;Soltau;1 +5192;Munster;1 +5193;Schneverdingen;1 +5194;Bispingen;1 +5195;Neuenkirchen b Soltau;1 +5196;Wietzendorf;1 +5197;Soltau-Frielingen;1 +5198;Schneverdingen-Wintermoor;1 +5199;Schneverdingen-Heber;1 +5201;Halle Westf;1 +5202;Oerlinghausen;1 +5203;Werther Westf;1 +5204;Steinhagen Westf;1 +5205;Bielefeld-Sennestadt;1 +5206;Bielefeld-Jöllenbeck;1 +5207;Schloss Holte-Stukenbrock;1 +5208;Leopoldshöhe;1 +5209;Gütersloh-Friedrichsdorf;1 +521;Bielefeld;1 +5221;Herford;1 +5222;Bad Salzuflen;1 +5223;Bünde;1 +5224;Enger Westf;1 +5225;Spenge;1 +5226;Bruchmühlen Westf;1 +5228;Vlotho-Exter;1 +5231;Detmold;1 +5232;Lage Lippe;1 +5233;Steinheim Westf;1 +5234;Horn-Bad Meinberg;1 +5235;Blomberg Lippe;1 +5236;Blomberg-Grossenmarpe;1 +5237;Augustdorf;1 +5238;Nieheim-Himmighausen;1 +5241;Gütersloh;1 +5242;Rheda-Wiedenbrück;1 +5244;Rietberg;1 +5245;Herzebrock-Clarholz;1 +5246;Verl;1 +5247;Harsewinkel;1 +5248;Langenberg Kr Gütersloh;1 +5250;Delbrück Westf;1 +5251;Paderborn;1 +5252;Bad Lippspringe;1 +5253;Bad Driburg;1 +5254;Paderborn-Schloss Neuhaus;1 +5255;Altenbeken;1 +5257;Hövelhof;1 +5258;Salzkotten;1 +5259;Bad Driburg-Neuenheerse;1 +5261;Lemgo;1 +5262;Extertal;1 +5263;Barntrup;1 +5264;Kalletal;1 +5265;Dörentrup;1 +5266;Lemgo-Kirchheide;1 +5271;Höxter;1 +5272;Brakel Westf;1 +5273;Beverungen;1 +5274;Nieheim;1 +5275;Höxter-Ottbergen;1 +5276;Marienmünster;1 +5277;Höxter-Fürstenau;1 +5278;Höxter-Ovenhausen;1 +5281;Bad Pyrmont;1 +5282;Schieder-Schwalenberg;1 +5283;Lügde-Rischenau;1 +5284;Schwalenberg;1 +5285;Bad Pyrmont-Kleinenberg;1 +5286;Ottenstein Niedersachs;1 +5292;Lichtenau-Atteln;1 +5293;Paderborn-Dahl;1 +5294;Hövelhof-Espeln;1 +5295;Lichtenau Westf;1 +5300;Salzgitter-Üfingen;1 +5301;Lehre-Essenrode;1 +5302;Vechelde;1 +5303;Wendeburg;1 +5304;Meine;1 +5305;Sickte;1 +5306;Cremlingen;1 +5307;Braunschweig-Wenden;1 +5308;Lehre;1 +5309;Lehre-Wendhausen;1 +531;Braunschweig;1 +5320;Torfhaus;1 +5321;Goslar;1 +5322;Bad Harzburg;1 +5323;Clausthal-Zellerfeld;1 +5324;Vienenburg;1 +5325;Goslar-Hahnenklee;1 +5326;Langelsheim;1 +5327;Bad Grund Harz;1 +5328;Altenau Harz;1 +5329;Schulenberg im Oberharz;1 +5331;Wolfenbüttel;1 +5332;Schöppenstedt;1 +5333;Dettum;1 +5334;Hornburg Kr Wolfenbüttel;1 +5335;Schladen;1 +5336;Semmenstedt;1 +5337;Kissenbrück;1 +5339;Gielde;1 +5341;Salzgitter;1 +5344;Lengede;1 +5345;Baddeckenstedt;1 +5346;Liebenburg;1 +5347;Burgdorf b Salzgitter;1 +5351;Helmstedt;1 +5352;Schöningen;1 +5353;Königslutter am Elm;1 +5354;Jerxheim;1 +5355;Frellstedt;1 +5356;Helmstedt-Barmke;1 +5357;Grasleben;1 +5358;Bahrdorf-Mackendorf;1 +5361;Wolfsburg;1 +5362;Wolfsburg-Fallersleben;1 +5363;Wolfsburg-Vorsfelde;1 +5364;Velpke;1 +5365;Wolfsburg-Neindorf;1 +5366;Jembke;1 +5367;Rühen;1 +5368;Parsau;1 +5371;Gifhorn;1 +5372;Meinersen;1 +5373;Hillerse Kr Gifhorn;1 +5374;Isenbüttel;1 +5375;Müden Aller;1 +5376;Wesendorf Kr Gifhorn;1 +5377;Ehra-Lessien;1 +5378;Sassenburg-Platendorf;1 +5379;Sassenburg-Grussendorf;1 +5381;Seesen;1 +5382;Bad Gandersheim;1 +5383;Lutter am Barenberge;1 +5384;Seesen-Groß Rhüden;1 +5401;Georgsmarienhütte;1 +5402;Bissendorf Kr Osnabrück;1 +5403;Bad Iburg;1 +5404;Westerkappeln;1 +5405;Hasbergen Kr Osnabrück;1 +5406;Belm;1 +5407;Wallenhorst;1 +5409;Hilter am Teutoburger Wald;1 +541;Osnabrück;1 +5421;Dissen am Teutoburger Wald;1 +5422;Melle;1 +5423;Versmold;1 +5424;Bad Rothenfelde;1 +5425;Borgholzhausen;1 +5426;Glandorf;1 +5427;Melle-Buer;1 +5428;Melle-Neuenkirchen;1 +5429;Melle-Wellingholzhausen;1 +5431;Quakenbrück;1 +5432;Löningen;1 +5433;Badbergen;1 +5434;Essen Oldenburg;1 +5435;Berge b Quakenbrück;1 +5436;Nortrup;1 +5437;Menslage;1 +5438;Bakum-Lüsche;1 +5439;Bersenbrück;1 +5441;Diepholz;1 +5442;Barnstorf Kr Diepholz;1 +5443;Lemförde;1 +5444;Wagenfeld;1 +5445;Drebber;1 +5446;Rehden;1 +5447;Lembruch;1 +5448;Barver;1 +5451;Ibbenbüren;1 +5452;Mettingen Westf;1 +5453;Recke;1 +5454;Hörstel-Riesenbeck;1 +5455;Tecklenburg-Brochterbeck;1 +5456;Westerkappeln-Velpe;1 +5457;Hopsten-Schale;1 +5458;Hopsten;1 +5459;Hörstel;1 +5461;Bramsche Hase;1 +5462;Ankum;1 +5464;Alfhausen;1 +5465;Neuenkirchen b Bramsche;1 +5466;Merzen;1 +5467;Voltlage;1 +5468;Bramsche-Engter;1 +5471;Bohmte;1 +5472;Bad Essen;1 +5473;Ostercappeln;1 +5474;Stemwede-Dielingen;1 +5475;Bohmte-Hunteburg;1 +5476;Ostercappeln-Venne;1 +5481;Lengerich Westf;1 +5482;Tecklenburg;1 +5483;Lienen;1 +5484;Lienen-Kattenvenne;1 +5485;Ladbergen;1 +5491;Damme Dümmer;1 +5492;Steinfeld Oldenburg;1 +5493;Neuenkirchen Kr Vechta;1 +5494;Holdorf Niedersachs;1 +5495;Vörden Kr Vechta;1 +5502;Dransfeld;1 +5503;Nörten-Hardenberg;1 +5504;Friedland Kr Göttingen;1 +5505;Hardegsen;1 +5506;Adelebsen;1 +5507;Ebergötzen;1 +5508;Gleichen-Rittmarshausen;1 +5509;Rosdorf Kr Göttingen;1 +551;Göttingen;1 +5520;Braunlage;1 +5521;Herzberg am Harz;1 +5522;Osterode am Harz;1 +5523;Bad Sachsa;1 +5524;Bad Lauterberg im Harz;1 +5525;Walkenried;1 +5527;Duderstadt;1 +5528;Gieboldehausen;1 +5529;Rhumspringe;1 +5531;Holzminden;1 +5532;Stadtoldendorf;1 +5533;Bodenwerder;1 +5534;Eschershausen a d Lenne;1 +5535;Polle;1 +5536;Holzminden-Neuhaus;1 +5541;Hann. Münden;1 +5542;Witzenhausen;1 +5543;Staufenberg Niedersachs;1 +5544;Reinhardshagen;1 +5545;Hedemünden;1 +5546;Scheden;1 +5551;Northeim;1 +5552;Katlenburg;1 +5553;Kalefeld;1 +5554;Moringen;1 +5555;Moringen-Fredelsloh;1 +5556;Lindau Harz;1 +5561;Einbeck;1 +5562;Dassel-Markoldendorf;1 +5563;Kreiensen;1 +5564;Dassel;1 +5565;Einbeck-Wenzen;1 +5571;Uslar;1 +5572;Bodenfelde;1 +5573;Uslar-Volpriehausen;1 +5574;Oberweser;1 +5582;Sankt Andreasberg;1 +5583;Braunlage-Hohegeiss;1 +5584;Hattorf am Harz;1 +5585;Herzberg-Sieber;1 +5586;Wieda;1 +5592;Gleichen-Bremke;1 +5593;Bovenden-Lenglern;1 +5594;Bovenden-Reyershausen;1 +5601;Schauenburg;1 +5602;Hessisch Lichtenau;1 +5603;Gudensberg;1 +5604;Grossalmerode;1 +5605;Kaufungen Hess;1 +5606;Zierenberg;1 +5607;Fuldatal;1 +5608;Söhrewald;1 +5609;Ahnatal;1 +561;Kassel;1 +5621;Bad Wildungen;1 +5622;Fritzlar;1 +5623;Edertal;1 +5624;Bad Emstal;1 +5625;Naumburg Hess;1 +5626;Bad Zwesten;1 +5631;Korbach;1 +5632;Willingen Upland;1 +5633;Diemelsee;1 +5634;Waldeck-Sachsenhausen;1 +5635;Vöhl;1 +5636;Lichtenfels-Goddelsheim;1 +5641;Warburg;1 +5642;Warburg-Scherfede;1 +5643;Borgentreich;1 +5644;Willebadessen-Peckelsheim;1 +5645;Borgentreich-Borgholz;1 +5646;Willebadessen;1 +5647;Lichtenau-Kleinenberg;1 +5648;Brakel-Gehrden;1 +5650;Cornberg;1 +5651;Eschwege;1 +5652;Bad Sooden-Allendorf;1 +5653;Sontra;1 +5654;Herleshausen;1 +5655;Wanfried;1 +5656;Waldkappel;1 +5657;Meissner;1 +5658;Wehretal;1 +5659;Ringgau;1 +5661;Melsungen;1 +5662;Felsberg Hess;1 +5663;Spangenberg;1 +5664;Morschen;1 +5665;Guxhagen;1 +5671;Hofgeismar;1 +5672;Bad Karlshafen;1 +5673;Immenhausen Hess;1 +5674;Grebenstein;1 +5675;Trendelburg;1 +5676;Liebenau Hess;1 +5677;Calden-Westuffeln;1 +5681;Homberg Efze;1 +5682;Borken Hessen;1 +5683;Wabern Hess;1 +5684;Frielendorf;1 +5685;Knüllwald;1 +5686;Schwarzenborn Knüll;1 +5691;Bad Arolsen;1 +5692;Wolfhagen;1 +5693;Volkmarsen;1 +5694;Diemelstadt;1 +5695;Twistetal;1 +5696;Bad Arolsen-Landau;1 +5702;Petershagen-Lahde;1 +5703;Hille;1 +5704;Petershagen-Friedewalde;1 +5705;Petershagen-Windheim;1 +5706;Porta Westfalica;1 +5707;Petershagen Weser;1 +571;Minden Westf;1 +5721;Stadthagen;1 +5722;Bückeburg;1 +5723;Bad Nenndorf;1 +5724;Obernkirchen;1 +5725;Lindhorst b Stadthagen;1 +5726;Wiedensahl;1 +5731;Bad Oeynhausen;1 +5732;Löhne;1 +5733;Vlotho;1 +5734;Bergkirchen Westf;1 +5741;Lübbecke;1 +5742;Preussisch Oldendorf;1 +5743;Espelkamp-Gestringen;1 +5744;Hüllhorst;1 +5745;Stemwede-Levern;1 +5746;Rödinghausen;1 +5751;Rinteln;1 +5752;Auetal-Hattendorf;1 +5753;Auetal-Bernsen;1 +5754;Extertal-Bremke;1 +5755;Kalletal-Varenholz;1 +5761;Stolzenau;1 +5763;Uchte;1 +5764;Steyerberg;1 +5765;Raddestorf;1 +5766;Rehburg-Loccum;1 +5767;Warmsen;1 +5768;Petershagen-Heimsen;1 +5769;Steyerberg-Voigtei;1 +5771;Rahden Westf;1 +5772;Espelkamp;1 +5773;Stemwede-Wehdem;1 +5774;Wagenfeld-Ströhen;1 +5775;Diepenau;1 +5776;Preussisch Ströhen;1 +5777;Diepenau-Essern;1 +5802;Wrestedt;1 +5803;Rosche;1 +5804;Rätzlingen Kr Uelzen;1 +5805;Oetzen;1 +5806;Barum b Bad Bevensen;1 +5807;Altenmedingen;1 +5808;Gerdau;1 +581;Uelzen;1 +5820;Suhlendorf;1 +5821;Bad Bevensen;1 +5822;Ebstorf;1 +5823;Bienenbüttel;1 +5824;Bad Bodenteich;1 +5825;Wieren;1 +5826;Suderburg;1 +5827;Unterlüß;1 +5828;Himbergen;1 +5829;Wriedel;1 +5831;Wittingen;1 +5832;Hankensbüttel;1 +5833;Brome;1 +5834;Wittingen-Knesebeck;1 +5835;Wahrenholz;1 +5836;Wittingen-Radenbeck;1 +5837;Sprakensehl;1 +5838;Gross Oesingen;1 +5839;Wittingen-Ohrdorf;1 +5840;Schnackenburg;1 +5841;Lüchow Wendland;1 +5842;Schnega;1 +5843;Wustrow Wendland;1 +5844;Clenze;1 +5845;Bergen Dumme;1 +5846;Gartow Niedersachs;1 +5848;Trebel;1 +5849;Waddeweitz;1 +5850;Neetze;1 +5851;Dahlenburg;1 +5852;Bleckede;1 +5853;Neu Darchau;1 +5854;Bleckede-Barskamp;1 +5855;Nahrendorf;1 +5857;Bleckede-Brackede;1 +5858;Hitzacker-Wietzetze;1 +5859;Thomasburg;1 +5861;Dannenberg Elbe;1 +5862;Hitzacker Elbe;1 +5863;Zernien;1 +5864;Jameln;1 +5865;Gusborn;1 +5872;Stoetze;1 +5873;Eimke;1 +5874;Soltendieck;1 +5875;Emmendorf;1 +5882;Gorleben;1 +5883;Lemgow;1 +5901;Fürstenau b Bramsche;1 +5902;Freren;1 +5903;Emsbüren;1 +5904;Lengerich Emsl;1 +5905;Beesten;1 +5906;Lünne;1 +5907;Geeste;1 +5908;Wietmarschen-Lohne;1 +5909;Wettrup;1 +591;Lingen (Ems);1 +5921;Nordhorn;1 +5922;Bad Bentheim;1 +5923;Schüttorf;1 +5924;Bad Bentheim-Gildehaus;1 +5925;Wietmarschen;1 +5926;Engden;1 +5931;Meppen;1 +5932;Haren Ems;1 +5933;Lathen;1 +5934;Haren-Rütenbrock;1 +5935;Twist-Schöninghsdorf;1 +5936;Twist;1 +5937;Geeste-Gross Hesepe;1 +5939;Sustrum;1 +5941;Neuenhaus Dinkel;1 +5942;Uelsen;1 +5943;Emlichheim;1 +5944;Hoogstede;1 +5945;Wilsum;1 +5946;Georgsdorf;1 +5947;Laar Vechte;1 +5948;Itterbeck;1 +5951;Werlte;1 +5952;Sögel;1 +5953;Börger;1 +5954;Lorup;1 +5955;Esterwegen;1 +5956;Rastdorf;1 +5957;Lindern Oldenburg;1 +5961;Haselünne;1 +5962;Herzlake;1 +5963;Bawinkel;1 +5964;Lähden;1 +5965;Klein Berssen;1 +5966;Meppen-Apeldorn;1 +5971;Rheine;1 +5973;Neuenkirchen Kr Steinfurt;1 +5975;Rheine-Mesum;1 +5976;Salzbergen;1 +5977;Spelle;1 +5978;Hörstel-Dreierwalde;1 +6002;Ober-Mörlen;1 +6003;Rosbach v d Höhe;1 +6004;Lich-Eberstadt;1 +6007;Rosbach-Rodheim;1 +6008;Echzell;1 +6020;Heigenbrücken;1 +6021;Aschaffenburg;1 +6022;Obernburg a Main;1 +6023;Alzenau i Ufr;1 +6024;Schöllkrippen;1 +6026;Grossostheim;1 +6027;Stockstadt a Main;1 +6028;Sulzbach a Main;1 +6029;Mömbris;1 +6031;Friedberg Hess;1 +6032;Bad Nauheim;1 +6033;Butzbach;1 +6034;Wöllstadt;1 +6035;Reichelsheim Wetterau;1 +6036;Wölfersheim;1 +6039;Karben;1 +6041;Glauburg;1 +6042;Büdingen Hess;1 +6043;Nidda;1 +6044;Schotten Hess;1 +6045;Gedern;1 +6046;Ortenberg Hess;1 +6047;Altenstadt Hess;1 +6048;Büdingen-Eckartshausen;1 +6049;Kefenrod;1 +6050;Biebergemünd;1 +6051;Gelnhausen;1 +6052;Bad Orb;1 +6053;Wächtersbach;1 +6054;Birstein;1 +6055;Freigericht;1 +6056;Bad Soden-Salmünster;1 +6057;Flörsbachtal;1 +6058;Gründau;1 +6059;Jossgrund;1 +6061;Michelstadt;1 +6062;Erbach Odenw;1 +6063;Bad König;1 +6066;Michelstadt-Vielbrunn;1 +6068;Beerfelden;1 +6071;Dieburg;1 +6073;Babenhausen Hess;1 +6074;Rödermark;1 +6078;Gross-Umstadt;1 +6081;Usingen;1 +6082;Niederreifenberg;1 +6083;Weilrod;1 +6084;Schmitten Taunus;1 +6085;Waldsolms;1 +6086;Grävenwiesbach;1 +6087;Waldems;1 +6092;Heimbuchenthal;1 +6093;Laufach;1 +6094;Weibersbrunn;1 +6095;Bessenbach;1 +6096;Wiesen Unterfr;1 +6101;Bad Vilbel;1 +6102;Neu-Isenburg;1 +6103;Langen Hess;1 +6104;Heusenstamm;1 +6105;Mörfelden-Walldorf;1 +6106;Rodgau;1 +6107;Kelsterbach;1 +6108;Mühlheim am Main;1 +6109;Frankfurt-Bergen-Enkheim;1 +611;Wiesbaden;1 +6120;Aarbergen;1 +6122;Hofheim-Wallau;1 +6123;Eltville am Rhein;1 +6124;Bad Schwalbach;1 +6126;Idstein;1 +6127;Niedernhausen Taunus;1 +6128;Taunusstein;1 +6129;Schlangenbad;1 +6130;Schwabenheim an der Selz;1 +6131;Mainz;1 +6132;Ingelheim am Rhein;1 +6133;Oppenheim;1 +6134;Mainz-Kastel;1 +6135;Bodenheim Rhein;1 +6136;Nieder-Olm;1 +6138;Mommenheim;1 +6139;Budenheim;1 +6142;Rüsselsheim;1 +6144;Bischofsheim b Rüsselsheim;1 +6145;Flörsheim am Main;1 +6146;Hochheim am Main;1 +6147;Trebur;1 +6150;Weiterstadt;1 +6151;Darmstadt;1 +6152;Gross-Gerau;1 +6154;Ober-Ramstadt;1 +6155;Griesheim Hess;1 +6157;Pfungstadt;1 +6158;Riedstadt;1 +6159;Messel;1 +6161;Brensbach;1 +6162;Reinheim Odenw;1 +6163;Höchst i Odw;1 +6164;Reichelsheim Odenwald;1 +6165;Breuberg;1 +6166;Fischbachtal;1 +6167;Modautal;1 +6171;Oberursel Taunus;1 +6172;Bad Homburg v d Höhe;1 +6173;Kronberg im Taunus;1 +6174;Königstein im Taunus;1 +6175;Friedrichsdorf Taunus;1 +6181;Hanau;1 +6182;Seligenstadt;1 +6183;Erlensee;1 +6184;Langenselbold;1 +6185;Hammersbach Hess;1 +6186;Grosskrotzenburg;1 +6187;Schöneck;1 +6188;Kahl a Main;1 +6190;Hattersheim a Main;1 +6192;Hofheim am Taunus;1 +6195;Kelkheim Taunus;1 +6196;Bad Soden am Taunus;1 +6198;Eppstein;1 +6201;Weinheim Bergstr;1 +6202;Schwetzingen;1 +6203;Ladenburg;1 +6204;Viernheim;1 +6205;Hockenheim;1 +6206;Lampertheim;1 +6207;Wald-Michelbach;1 +6209;Mörlenbach;1 +621;Mannheim;1 +6220;Wilhelmsfeld;1 +6221;Heidelberg;1 +6222;Wiesloch;1 +6223;Neckargemünd;1 +6224;Sandhausen Baden;1 +6226;Meckesheim;1 +6227;Walldorf Baden;1 +6228;Schönau Odenw;1 +6229;Neckarsteinach;1 +6231;Hochdorf-Assenheim;1 +6232;Speyer;1 +6233;Frankenthal Pfalz;1 +6234;Mutterstadt;1 +6235;Schifferstadt;1 +6236;Neuhofen Pfalz;1 +6237;Maxdorf;1 +6238;Dirmstein;1 +6239;Bobenheim-Roxheim;1 +6241;Worms;1 +6242;Osthofen;1 +6243;Monsheim;1 +6244;Westhofen Rheinhess;1 +6245;Biblis;1 +6246;Eich Rheinhess;1 +6247;Worms-Pfeddersheim;1 +6249;Guntersblum;1 +6251;Bensheim;1 +6252;Heppenheim Bergstraße;1 +6253;Fürth Odenw;1 +6254;Lautertal Odenwald;1 +6255;Lindenfels;1 +6256;Lampertheim-Hüttenfeld;1 +6257;Seeheim-Jugenheim;1 +6258;Gernsheim;1 +6261;Mosbach Baden;1 +6262;Aglasterhausen;1 +6263;Neckargerach;1 +6264;Neudenau;1 +6265;Billigheim Baden;1 +6266;Hassmersheim;1 +6267;Fahrenbach Baden;1 +6268;Hüffenhardt;1 +6269;Gundelsheim Württ;1 +6271;Eberbach Baden;1 +6272;Hirschhorn Neckar;1 +6274;Waldbrunn Odenw;1 +6275;Rothenberg Odenw;1 +6276;Hesseneck;1 +6281;Buchen Odenwald;1 +6282;Walldürn;1 +6283;Hardheim Odenw;1 +6284;Mudau;1 +6285;Walldürn-Altheim;1 +6286;Walldürn-Rippberg;1 +6287;Limbach Baden;1 +6291;Adelsheim;1 +6292;Seckach;1 +6293;Schefflenz;1 +6294;Krautheim Jagst;1 +6295;Rosenberg Baden;1 +6296;Ahorn Baden;1 +6297;Ravenstein Baden;1 +6298;Möckmühl;1 +6301;Otterbach Pfalz;1 +6302;Winnweiler;1 +6303;Enkenbach-Alsenborn;1 +6304;Wolfstein Pfalz;1 +6305;Hochspeyer;1 +6306;Trippstadt;1 +6307;Schopp;1 +6308;Olsbrücken;1 +631;Kaiserslautern;1 +6321;Neustadt an der Weinstraße;1 +6322;Bad Dürkheim;1 +6323;Edenkoben;1 +6324;Hassloch;1 +6325;Lambrecht Pfalz;1 +6326;Deidesheim;1 +6327;Neustadt-Lachen;1 +6328;Elmstein;1 +6329;Weidenthal Pfalz;1 +6331;Pirmasens;1 +6332;Zweibrücken;1 +6333;Waldfischbach-Burgalben;1 +6334;Thaleischweiler-Fröschen;1 +6335;Trulben;1 +6336;Dellfeld;1 +6337;Grossbundenbach;1 +6338;Hornbach Pfalz;1 +6339;Grosssteinhausen;1 +6340;Wörth-Schaidt;1 +6341;Landau in der Pfalz;1 +6342;Schweigen-Rechtenbach;1 +6343;Bad Bergzabern;1 +6344;Schwegenheim;1 +6345;Albersweiler;1 +6346;Annweiler am Trifels;1 +6347;Hochstadt Pfalz;1 +6348;Offenbach an der Queich;1 +6349;Billigheim-Ingenheim;1 +6351;Eisenberg Pfalz;1 +6352;Kirchheimbolanden;1 +6353;Freinsheim;1 +6355;Albisheim Pfrimm;1 +6356;Carlsberg Pfalz;1 +6357;Standenbühl;1 +6358;Kriegsfeld;1 +6359;Grünstadt;1 +6361;Rockenhausen;1 +6362;Alsenz;1 +6363;Niederkirchen;1 +6364;Nußbach Pfalz;1 +6371;Landstuhl;1 +6372;Bruchmühlbach-Miesau;1 +6373;Schönenberg-Kübelberg;1 +6374;Weilerbach;1 +6375;Wallhalben;1 +6381;Kusel;1 +6382;Lauterecken;1 +6383;Glan-Münchweiler;1 +6384;Konken;1 +6385;Reichenbach-Steegen;1 +6386;Altenkirchen Pfalz;1 +6387;Sankt Julian;1 +6391;Dahn;1 +6392;Hauenstein Pfalz;1 +6393;Fischbach bei Dahn;1 +6394;Bundenthal;1 +6395;Münchweiler an der Rodalb;1 +6396;Hinterweidenthal;1 +6397;Leimen Pfalz;1 +6398;Vorderweidenthal;1 +6400;Mücke;1 +6401;Grünberg Hess;1 +6402;Hungen;1 +6403;Linden Hess;1 +6404;Lich Hess;1 +6405;Laubach Hess;1 +6406;Lollar;1 +6407;Rabenau Hess;1 +6408;Buseck;1 +6409;Biebertal;1 +641;Giessen;1 +6420;Lahntal;1 +6421;Marburg;1 +6422;Kirchhain;1 +6423;Wetter Hessen;1 +6424;Ebsdorfergrund;1 +6425;Rauschenberg Hess;1 +6426;Fronhausen;1 +6427;Cölbe-Schönstadt;1 +6428;Stadtallendorf;1 +6429;Schweinsberg Hess;1 +6430;Hahnstätten;1 +6431;Limburg a d Lahn;1 +6432;Diez;1 +6433;Hadamar;1 +6434;Bad Camberg;1 +6435;Wallmerod;1 +6436;Dornburg Hess;1 +6438;Hünfelden;1 +6439;Holzappel;1 +6440;Kölschhausen;1 +6441;Wetzlar;1 +6442;Braunfels;1 +6443;Ehringshausen Dill;1 +6444;Bischoffen;1 +6445;Schöffengrund;1 +6446;Hohenahr;1 +6447;Langgöns-Niederkleen;1 +6449;Ehringshausen-Katzenfurt;1 +6451;Frankenberg Eder;1 +6452;Battenberg Eder;1 +6453;Gemünden Wohra;1 +6454;Lichtenfels-Sachsenberg;1 +6455;Frankenau Hess;1 +6456;Haina Kloster;1 +6457;Burgwald Eder;1 +6458;Rosenthal Hess;1 +6461;Biedenkopf;1 +6462;Gladenbach;1 +6464;Angelburg;1 +6465;Breidenbach b Biedenkopf;1 +6466;Dautphetal-Friedensdorf;1 +6467;Hatzfeld Eder;1 +6468;Dautphetal-Mornshausen;1 +6471;Weilburg;1 +6472;Weilmünster;1 +6473;Leun;1 +6474;Villmar-Aumenau;1 +6475;Weilmünster-Wolfenhausen;1 +6476;Mengerskirchen;1 +6477;Greifenstein-Nenderoth;1 +6478;Greifenstein-Ulm;1 +6479;Waldbrunn Westerwald;1 +6482;Runkel;1 +6483;Selters Taunus;1 +6484;Beselich;1 +6485;Nentershausen Westerw;1 +6486;Katzenelnbogen;1 +6500;Waldrach;1 +6501;Konz;1 +6502;Schweich;1 +6503;Hermeskeil;1 +6504;Thalfang;1 +6505;Kordel;1 +6506;Welschbillig;1 +6507;Neumagen-Dhron;1 +6508;Hetzerath Mosel;1 +6509;Büdlich;1 +651;Trier;1 +6522;Mettendorf;1 +6523;Holsthum;1 +6524;Rodershausen;1 +6525;Irrel;1 +6526;Bollendorf;1 +6527;Oberweis;1 +6531;Bernkastel-Kues;1 +6532;Zeltingen-Rachtig;1 +6533;Morbach Hunsrück;1 +6534;Mülheim Mosel;1 +6535;Osann-Monzel;1 +6536;Kleinich;1 +6541;Traben-Trarbach;1 +6542;Bullay;1 +6543;Büchenbeuren;1 +6544;Rhaunen;1 +6545;Blankenrath;1 +6550;Irrhausen;1 +6551;Prüm;1 +6552;Olzheim;1 +6553;Schönecken;1 +6554;Waxweiler;1 +6555;Bleialf;1 +6556;Pronsfeld;1 +6557;Hallschlag;1 +6558;Büdesheim Eifel;1 +6559;Leidenborn;1 +6561;Bitburg;1 +6562;Speicher;1 +6563;Kyllburg;1 +6564;Neuerburg Eifel;1 +6565;Dudeldorf;1 +6566;Körperich;1 +6567;Oberkail;1 +6568;Wolsfeld;1 +6569;Bickendorf;1 +6571;Wittlich;1 +6572;Manderscheid Eifel;1 +6573;Gillenfeld;1 +6574;Hasborn;1 +6575;Landscheid;1 +6578;Salmtal;1 +6580;Zemmer;1 +6581;Saarburg;1 +6582;Freudenburg;1 +6583;Palzem;1 +6584;Wellen Mosel;1 +6585;Ralingen;1 +6586;Beuren Hochwald;1 +6587;Zerf;1 +6588;Pluwig;1 +6589;Kell am See;1 +6591;Gerolstein;1 +6592;Daun;1 +6593;Hillesheim Eifel;1 +6594;Birresborn;1 +6595;Dockweiler;1 +6596;Üdersdorf;1 +6597;Jünkerath;1 +6599;Weidenbach b Gerolstein;1 +661;Fulda;1 +6620;Philippsthal Werra;1 +6621;Bad Hersfeld;1 +6622;Bebra;1 +6623;Rotenburg a d Fulda;1 +6624;Heringen Werra;1 +6625;Niederaula;1 +6626;Wildeck-Obersuhl;1 +6627;Nentershausen Hess;1 +6628;Oberaula;1 +6629;Schenklengsfeld;1 +6630;Schwalmtal-Storndorf;1 +6631;Alsfeld;1 +6633;Homberg Ohm;1 +6634;Gemünden Felda;1 +6635;Kirtorf;1 +6636;Romrod;1 +6637;Feldatal;1 +6638;Schwalmtal-Renzendorf;1 +6639;Ottrau;1 +6641;Lauterbach Hessen;1 +6642;Schlitz;1 +6643;Herbstein;1 +6644;Grebenhain;1 +6645;Ulrichstein;1 +6646;Grebenau;1 +6647;Herbstein-Stockhausen;1 +6648;Bad Salzschlirf;1 +6650;Hosenfeld;1 +6651;Rasdorf;1 +6652;Hünfeld;1 +6653;Burghaun;1 +6654;Gersfeld Rhön;1 +6655;Neuhof Kr Fulda;1 +6656;Ebersburg;1 +6657;Hofbieber;1 +6658;Poppenhausen Wasserkuppe;1 +6659;Eichenzell;1 +6660;Steinau-Marjoss;1 +6661;Schlüchtern;1 +6663;Steinau an der Straße;1 +6664;Sinntal-Sterbfritz;1 +6665;Sinntal-Altengronau;1 +6666;Freiensteinau;1 +6667;Steinau-Ulmbach;1 +6668;Birstein-Lichenroth;1 +6669;Neuhof-Hauswurz;1 +6670;Ludwigsau Hess;1 +6672;Eiterfeld;1 +6673;Haunetal;1 +6674;Friedewald Hess;1 +6675;Breitenbach a Herzberg;1 +6676;Hohenroda Hess;1 +6677;Neuenstein Hess;1 +6678;Wildeck-Hönebach;1 +6681;Hilders;1 +6682;Tann Rhön;1 +6683;Ehrenberg Rhön;1 +6684;Hofbieber-Schwarzbach;1 +6691;Schwalmstadt;1 +6692;Neustadt Hessen;1 +6693;Neuental;1 +6694;Neukirchen Knüll;1 +6695;Jesberg;1 +6696;Gilserberg;1 +6697;Willingshausen;1 +6698;Schrecksbach;1 +6701;Sprendlingen Rheinhess;1 +6703;Wöllstein Rheinhess;1 +6704;Langenlonsheim;1 +6706;Wallhausen Nahe;1 +6707;Windesheim;1 +6708;Bad Münster am Stein-Ebernburg;1 +6709;Fürfeld Kr Bad Kreuznach;1 +671;Bad Kreuznach;1 +6721;Bingen am Rhein;1 +6722;Rüdesheim am Rhein;1 +6723;Oestrich-Winkel;1 +6724;Stromberg Hunsrück;1 +6725;Gau-Algesheim;1 +6726;Lorch Rheingau;1 +6727;Gensingen;1 +6728;Ober-Hilbersheim;1 +6731;Alzey;1 +6732;Wörrstadt;1 +6733;Gau-Odernheim;1 +6734;Flonheim;1 +6735;Eppelsheim;1 +6736;Bechenheim;1 +6737;Köngernheim;1 +6741;St Goar;1 +6742;Boppard;1 +6743;Bacharach;1 +6744;Oberwesel;1 +6745;Gondershausen;1 +6746;Pfalzfeld;1 +6747;Emmelshausen;1 +6751;Bad Sobernheim;1 +6752;Kirn Nahe;1 +6753;Meisenheim;1 +6754;Martinstein;1 +6755;Odernheim am Glan;1 +6756;Winterbach Soonwald;1 +6757;Becherbach bei Kirn;1 +6758;Waldböckelheim;1 +6761;Simmern Hunsrück;1 +6762;Kastellaun;1 +6763;Kirchberg Hunsrück;1 +6764;Rheinböllen;1 +6765;Gemünden Hunsrück;1 +6766;Kisselbach;1 +6771;St Goarshausen;1 +6772;Nastätten;1 +6773;Kamp-Bornhofen;1 +6774;Kaub;1 +6775;Strüth Taunus;1 +6776;Dachsenhausen;1 +6781;Idar-Oberstein;1 +6782;Birkenfeld Nahe;1 +6783;Baumholder;1 +6784;Weierbach;1 +6785;Herrstein;1 +6786;Kempfeld;1 +6787;Niederbrombach;1 +6788;Sien;1 +6789;Heimbach Nahe;1 +6802;Völklingen-Lauterbach;1 +6803;Mandelbachtal-Ommersheim;1 +6804;Mandelbachtal;1 +6805;Kleinblittersdorf;1 +6806;Heusweiler;1 +6809;Grossrosseln;1 +681;Saarbrücken;1 +6821;Neunkirchen Saar;1 +6824;Ottweiler;1 +6825;Illingen Saar;1 +6826;Bexbach;1 +6827;Eppelborn;1 +6831;Saarlouis;1 +6832;Beckingen-Reimsbach;1 +6833;Rehlingen-Siersburg;1 +6834;Bous;1 +6835;Beckingen;1 +6836;Überherrn;1 +6837;Wallerfangen;1 +6838;Saarwellingen;1 +6841;Homburg Saar;1 +6842;Blieskastel;1 +6843;Gersheim;1 +6844;Blieskastel-Altheim;1 +6848;Homburg-Einöd;1 +6849;Kirkel;1 +6851;St Wendel;1 +6852;Nohfelden;1 +6853;Marpingen;1 +6854;Oberthal Saar;1 +6855;Freisen;1 +6856;St Wendel-Niederkirchen;1 +6857;Namborn;1 +6858;Ottweiler-Fürth;1 +6861;Merzig;1 +6864;Mettlach;1 +6865;Mettlach-Orscholz;1 +6866;Perl-Nennig;1 +6867;Perl;1 +6868;Mettlach-Tünsdorf;1 +6869;Merzig-Silwingen;1 +6871;Wadern;1 +6872;Losheim am See;1 +6873;Nonnweiler;1 +6874;Wadern-Nunkirchen;1 +6875;Nonnweiler-Primstal;1 +6876;Weiskirchen Saar;1 +6881;Lebach;1 +6887;Schmelz Saar;1 +6888;Lebach-Steinbach;1 +6893;Saarbrücken-Ensheim;1 +6894;St Ingbert;1 +6897;Sulzbach Saar;1 +6898;Völklingen;1 +69;Frankfurt am Main;1 +7021;Kirchheim unter Teck;1 +7022;Nürtingen;1 +7023;Weilheim an der Teck;1 +7024;Wendlingen am Neckar;1 +7025;Neuffen;1 +7026;Lenningen;1 +7031;Böblingen;1 +7032;Herrenberg;1 +7033;Weil Der Stadt;1 +7034;Ehningen;1 +7041;Mühlacker;1 +7042;Vaihingen an der Enz;1 +7043;Maulbronn;1 +7044;Mönsheim;1 +7045;Oberderdingen;1 +7046;Zaberfeld;1 +7051;Calw;1 +7052;Bad Liebenzell;1 +7053;Bad Teinach-Zavelstein;1 +7054;Wildberg Württ;1 +7055;Neuweiler Kr Calw;1 +7056;Gechingen;1 +7062;Beilstein Württ;1 +7063;Bad Wimpfen;1 +7066;Bad Rappenau-Bonfeld;1 +7071;Tübingen;1 +7072;Gomaringen;1 +7073;Ammerbuch;1 +7081;Bad Wildbad;1 +7082;Neuenbürg Württ;1 +7083;Bad Herrenalb;1 +7084;Schömberg b Neuenbürg;1 +7085;Enzklösterle;1 +711;Stuttgart;1 +7121;Reutlingen;1 +7122;St Johann Württ;1 +7123;Metzingen Württ;1 +7124;Trochtelfingen Hohenz;1 +7125;Bad Urach;1 +7126;Burladingen-Melchingen;1 +7127;Neckartenzlingen;1 +7128;Sonnenbühl;1 +7129;Lichtenstein Württ;1 +7130;Löwenstein Württ;1 +7131;Heilbronn Neckar;1 +7132;Neckarsulm;1 +7133;Lauffen am Neckar;1 +7134;Weinsberg;1 +7135;Brackenheim;1 +7136;Bad Friedrichshall;1 +7138;Schwaigern;1 +7139;Neuenstadt am Kocher;1 +7141;Ludwigsburg Württ;1 +7142;Bietigheim-Bissingen;1 +7143;Besigheim;1 +7144;Marbach am Neckar;1 +7145;Markgröningen;1 +7146;Remseck am Neckar;1 +7147;Sachsenheim Württ;1 +7148;Grossbottwar;1 +7150;Korntal-Münchingen;1 +7151;Waiblingen;1 +7152;Leonberg Württ;1 +7153;Plochingen;1 +7154;Kornwestheim;1 +7156;Ditzingen;1 +7157;Waldenbuch;1 +7158;Neuhausen auf den Fildern;1 +7159;Renningen;1 +7161;Göppingen;1 +7162;Süßen;1 +7163;Ebersbach an der Fils;1 +7164;Boll Kr Göppingen;1 +7165;Göppingen-Hohenstaufen;1 +7166;Adelberg;1 +7171;Schwäbisch Gmünd;1 +7172;Lorch Württ;1 +7173;Heubach;1 +7174;Mögglingen;1 +7175;Leinzell;1 +7176;Spraitbach;1 +7181;Schorndorf Württ;1 +7182;Welzheim;1 +7183;Rudersberg Württ;1 +7184;Kaisersbach;1 +7191;Backnang;1 +7192;Murrhardt;1 +7193;Sulzbach an der Murr;1 +7194;Spiegelberg;1 +7195;Winnenden;1 +7202;Karlsbad;1 +7203;Walzbachtal;1 +7204;Malsch-Völkersbach;1 +721;Karlsruhe;1 +7220;Forbach-Hundsbach;1 +7221;Baden-Baden;1 +7222;Rastatt;1 +7223;Bühl Baden;1 +7224;Gernsbach;1 +7225;Gaggenau;1 +7226;Bühl-Sand;1 +7227;Lichtenau Baden;1 +7228;Forbach;1 +7229;Iffezheim;1 +7231;Pforzheim;1 +7232;Königsbach-Stein;1 +7233;Niefern-Öschelbronn;1 +7234;Tiefenbronn;1 +7235;Unterreichenbach Kr Calw;1 +7236;Keltern;1 +7237;Neulingen Enzkreis;1 +7240;Pfinztal;1 +7242;Rheinstetten;1 +7243;Ettlingen;1 +7244;Weingarten Baden;1 +7245;Durmersheim;1 +7246;Malsch Kr Karlsruhe;1 +7247;Linkenheim-Hochstetten;1 +7248;Marxzell;1 +7249;Stutensee;1 +7250;Kraichtal;1 +7251;Bruchsal;1 +7252;Bretten;1 +7253;Bad Schönborn;1 +7254;Waghäusel;1 +7255;Graben-Neudorf;1 +7256;Philippsburg;1 +7257;Bruchsal-Untergrombach;1 +7258;Oberderdingen-Flehingen;1 +7259;Östringen-Odenheim;1 +7260;Sinsheim-Hilsbach;1 +7261;Sinsheim;1 +7262;Eppingen;1 +7263;Waibstadt;1 +7264;Bad Rappenau;1 +7265;Angelbachtal;1 +7266;Kirchardt;1 +7267;Gemmingen;1 +7268;Bad Rappenau-Obergimpern;1 +7269;Sulzfeld Baden;1 +7271;Wörth am Rhein;1 +7272;Rülzheim;1 +7273;Hagenbach Pfalz;1 +7274;Germersheim;1 +7275;Kandel;1 +7276;Herxheim bei Landau Pfalz;1 +7277;Wörth-Büchelberg;1 +7300;Roggenburg;1 +7302;Pfaffenhofen a d Roth;1 +7303;Illertissen;1 +7304;Blaustein Württ;1 +7305;Erbach Donau;1 +7306;Vöhringen Iller;1 +7307;Senden Iller;1 +7308;Nersingen;1 +7309;Weissenhorn;1 +731;Ulm Donau;1 +7321;Heidenheim a d Brenz;1 +7322;Giengen a d Brenz;1 +7323;Gerstetten;1 +7324;Herbrechtingen;1 +7325;Sontheim a d Brenz;1 +7326;Neresheim;1 +7327;Dischingen;1 +7328;Königsbronn;1 +7329;Steinheim am Albuch;1 +7331;Geislingen an der Steige;1 +7332;Lauterstein;1 +7333;Laichingen;1 +7334;Deggingen;1 +7335;Wiesensteig;1 +7336;Lonsee;1 +7337;Nellingen Alb;1 +7340;Neenstetten;1 +7343;Buch b Illertissen;1 +7344;Blaubeuren;1 +7345;Langenau Württ;1 +7346;Illerkirchberg;1 +7347;Dietenheim;1 +7348;Beimerstetten;1 +7351;Biberach an der Riß;1 +7352;Ochsenhausen;1 +7353;Schwendi;1 +7354;Erolzheim;1 +7355;Hochdorf Riß;1 +7356;Schemmerhofen;1 +7357;Attenweiler;1 +7358;Eberhardzell-Füramoos;1 +7361;Aalen;1 +7362;Bopfingen;1 +7363;Lauchheim;1 +7364;Oberkochen;1 +7365;Essingen Württ;1 +7366;Abtsgmünd;1 +7367;Aalen-Ebnat;1 +7371;Riedlingen Württ;1 +7373;Zwiefalten;1 +7374;Uttenweiler;1 +7375;Obermarchtal;1 +7376;Langenenslingen;1 +7381;Münsingen;1 +7382;Römerstein;1 +7383;Münsingen-Buttenhausen;1 +7384;Schelklingen-Hütten;1 +7385;Gomadingen;1 +7386;Hayingen;1 +7387;Hohenstein Württ;1 +7388;Pfronstetten;1 +7389;Heroldstatt;1 +7391;Ehingen Donau;1 +7392;Laupheim;1 +7393;Munderkingen;1 +7394;Schelklingen;1 +7395;Ehingen-Dächingen;1 +7402;Fluorn-Winzeln;1 +7403;Dunningen;1 +7404;Epfendorf;1 +741;Rottweil;1 +7420;Deisslingen;1 +7422;Schramberg;1 +7423;Oberndorf am Neckar;1 +7424;Spaichingen;1 +7425;Trossingen;1 +7426;Gosheim;1 +7427;Schömberg b Balingen;1 +7428;Rosenfeld;1 +7429;Egesheim;1 +7431;Albstadt-Ebingen;1 +7432;Albstadt-Tailfingen;1 +7433;Balingen;1 +7434;Winterlingen;1 +7435;Albstadt-Laufen;1 +7436;Messstetten-Oberdigisheim;1 +7440;Bad Rippoldsau;1 +7441;Freudenstadt;1 +7442;Baiersbronn;1 +7443;Dornstetten;1 +7444;Alpirsbach;1 +7445;Pfalzgrafenweiler;1 +7446;Lossburg;1 +7447;Baiersbronn-Schwarzenberg;1 +7448;Seewald;1 +7449;Baiersbronn-Obertal;1 +7451;Horb am Neckar;1 +7452;Nagold;1 +7453;Altensteig Württ;1 +7454;Sulz am Neckar;1 +7455;Dornhan;1 +7456;Haiterbach;1 +7457;Rottenburg-Ergenzingen;1 +7458;Ebhausen;1 +7459;Nagold-Hochdorf;1 +7461;Tuttlingen;1 +7462;Immendingen;1 +7463;Mühlheim an der Donau;1 +7464;Talheim Kr Tuttlingen;1 +7465;Emmingen-Liptingen;1 +7466;Beuron;1 +7467;Neuhausen ob Eck;1 +7471;Hechingen;1 +7472;Rottenburg am Neckar;1 +7473;Mössingen;1 +7474;Haigerloch;1 +7475;Burladingen;1 +7476;Bisingen;1 +7477;Jungingen b Hechingen;1 +7478;Hirrlingen;1 +7482;Horb-Dettingen;1 +7483;Horb-Mühringen;1 +7484;Simmersfeld;1 +7485;Empfingen;1 +7486;Horb-Altheim;1 +7502;Wolpertswende;1 +7503;Wilhelmsdorf Württ;1 +7504;Horgenzell;1 +7505;Fronreute;1 +7506;Wangen-Leupolz;1 +751;Ravensburg;1 +7520;Bodnegg;1 +7522;Wangen im Allgäu;1 +7524;Bad Waldsee;1 +7525;Aulendorf;1 +7527;Wolfegg;1 +7528;Neukirch b Tettnang;1 +7529;Waldburg Württ;1 +7531;Konstanz;1 +7532;Meersburg;1 +7533;Allensbach;1 +7534;Reichenau Baden;1 +7541;Friedrichshafen;1 +7542;Tettnang;1 +7543;Kressbronn am Bodensee;1 +7544;Markdorf;1 +7545;Immenstaad am Bodensee;1 +7546;Oberteuringen;1 +7551;Überlingen Bodensee;1 +7552;Pfullendorf;1 +7553;Salem Baden;1 +7554;Heiligenberg Baden;1 +7555;Deggenhausertal;1 +7556;Uhldingen-Mühlhofen;1 +7557;Herdwangen-Schönach;1 +7558;Illmensee;1 +7561;Leutkirch im Allgäu;1 +7562;Isny im Allgäu;1 +7563;Kisslegg;1 +7564;Bad Wurzach;1 +7565;Aichstetten Kr Ravensburg;1 +7566;Argenbühl;1 +7567;Leutkirch-Friesenhofen;1 +7568;Bad Wurzach-Hauerz;1 +7569;Isny-Eisenbach;1 +7570;Sigmaringen-Gutenstein;1 +7571;Sigmaringen;1 +7572;Mengen Württ;1 +7573;Stetten am kalten Markt;1 +7574;Gammertingen;1 +7575;Messkirch;1 +7576;Krauchenwies;1 +7577;Veringenstadt;1 +7578;Wald Hohenz;1 +7579;Schwenningen Baden;1 +7581;Saulgau;1 +7582;Bad Buchau;1 +7583;Bad Schussenried;1 +7584;Altshausen;1 +7585;Ostrach;1 +7586;Herbertingen;1 +7587;Hosskirch;1 +7602;Oberried Breisgau;1 +761;Freiburg im Breisgau;1 +7620;Schopfheim-Gersbach;1 +7621;Lörrach;1 +7622;Schopfheim;1 +7623;Rheinfelden Baden;1 +7624;Grenzach-Wyhlen;1 +7625;Zell im Wiesental;1 +7626;Kandern;1 +7627;Steinen Kr Lörrach;1 +7628;Efringen-Kirchen;1 +7629;Tegernau Baden;1 +7631;Müllheim Baden;1 +7632;Badenweiler;1 +7633;Staufen im Breisgau;1 +7634;Sulzburg;1 +7635;Schliengen;1 +7636;Münstertal Schwarzwald;1 +7641;Emmendingen;1 +7642;Endingen Kaiserstuhl;1 +7643;Herbolzheim Breisgau;1 +7644;Kenzingen;1 +7645;Freiamt;1 +7646;Weisweil Breisgau;1 +7651;Titisee-Neustadt;1 +7652;Hinterzarten;1 +7653;Lenzkirch;1 +7654;Löffingen;1 +7655;Feldberg-Altglashütten;1 +7656;Schluchsee;1 +7657;Eisenbach Hochschwarzwald;1 +7660;St Peter Schwarzw;1 +7661;Kirchzarten;1 +7662;Vogtsburg im Kaiserstuhl;1 +7663;Eichstetten;1 +7664;Freiburg-Tiengen;1 +7665;March Breisgau;1 +7666;Denzlingen;1 +7667;Breisach am Rhein;1 +7668;Ihringen;1 +7669;St Märgen;1 +7671;Todtnau;1 +7672;St Blasien;1 +7673;Schönau im Schwarzwald;1 +7674;Todtmoos;1 +7675;Bernau Baden;1 +7676;Feldberg Schwarzwald;1 +7681;Waldkirch Breisgau;1 +7682;Elzach;1 +7683;Simonswald;1 +7684;Glottertal;1 +7685;Gutach-Bleibach;1 +7702;Blumberg Baden;1 +7703;Bonndorf im Schwarzwald;1 +7704;Geisingen Baden;1 +7705;Wolterdingen Schwarzw;1 +7706;Oberbaldingen;1 +7707;Bräunlingen;1 +7708;Geisingen-Leipferdingen;1 +7709;Wutach;1 +771;Donaueschingen;1 +7720;Schwenningen a Neckar;1 +7721;Villingen i Schwarzw;1 +7722;Triberg im Schwarzwald;1 +7723;Furtwangen im Schwarzwald;1 +7724;St Georgen im Schwarzwald;1 +7725;Königsfeld im Schwarzwald;1 +7726;Bad Dürrheim;1 +7727;Vöhrenbach;1 +7728;Niedereschach;1 +7729;Tennenbronn;1 +7731;Singen Hohentwiel;1 +7732;Radolfzell am Bodensee;1 +7733;Engen Hegau;1 +7734;Gailingen;1 +7735;Öhningen;1 +7736;Tengen;1 +7738;Steisslingen;1 +7739;Hilzingen;1 +7741;Tiengen Hochrhein;1 +7742;Klettgau;1 +7743;Ühlingen-Birkendorf;1 +7744;Stühlingen;1 +7745;Jestetten;1 +7746;Wutöschingen;1 +7747;Berau;1 +7748;Grafenhausen Hochschwarzw;1 +7751;Waldshut;1 +7753;Albbruck;1 +7754;Görwihl;1 +7755;Weilheim Kr Waldshut;1 +7761;Bad Säckingen;1 +7762;Wehr Baden;1 +7763;Murg;1 +7764;Herrischried;1 +7765;Rickenbach Hotzenw;1 +7771;Stockach;1 +7773;Bodman-Ludwigshafen;1 +7774;Eigeltingen;1 +7775;Mühlingen;1 +7777;Sauldorf;1 +7802;Oberkirch Baden;1 +7803;Gengenbach;1 +7804;Oppenau;1 +7805;Appenweier;1 +7806;Bad Peterstal-Griesbach;1 +7807;Neuried Ortenaukreis;1 +7808;Hohberg b Offenburg;1 +781;Offenburg;1 +7821;Lahr Schwarzwald;1 +7822;Ettenheim;1 +7823;Seelbach Schutter;1 +7824;Schwanau;1 +7825;Kippenheim;1 +7826;Schuttertal;1 +7831;Hausach;1 +7832;Haslach im Kinzigtal;1 +7833;Hornberg Schwarzwaldbahn;1 +7834;Wolfach;1 +7835;Zell am Harmersbach;1 +7836;Schiltach;1 +7837;Oberharmersbach;1 +7838;Nordrach;1 +7839;Schapbach;1 +7841;Achern;1 +7842;Kappelrodeck;1 +7843;Renchen;1 +7844;Rheinau;1 +7851;Kehl;1 +7852;Willstätt;1 +7853;Kehl-Bodersweier;1 +7854;Kehl-Goldscheuer;1 +7903;Mainhardt;1 +7904;Ilshofen;1 +7905;Langenburg;1 +7906;Braunsbach;1 +7907;Schwäbisch Hall-Sulzdorf;1 +791;Schwäbisch Hall;1 +7930;Boxberg Baden;1 +7931;Bad Mergentheim;1 +7932;Niederstetten Württ;1 +7933;Creglingen;1 +7934;Weikersheim;1 +7935;Schrozberg;1 +7936;Schrozberg-Bartenstein;1 +7937;Dörzbach;1 +7938;Mulfingen Jagst;1 +7939;Schrozberg-Spielbach;1 +7940;Künzelsau;1 +7941;Öhringen;1 +7942;Neuenstein Württ;1 +7943;Schöntal Jagst;1 +7944;Kupferzell;1 +7945;Wüstenrot;1 +7946;Bretzfeld;1 +7947;Forchtenberg;1 +7948;Öhringen-Ohrnberg;1 +7949;Pfedelbach-Untersteinbach;1 +7950;Schnelldorf;1 +7951;Crailsheim;1 +7952;Gerabronn;1 +7953;Blaufelden;1 +7954;Kirchberg an der Jagst;1 +7955;Wallhausen Württ;1 +7957;Kressberg;1 +7958;Rot Am See-Brettheim;1 +7959;Frankenhardt;1 +7961;Ellwangen Jagst;1 +7962;Fichtenau;1 +7963;Adelmannsfelden;1 +7964;Stödtlen;1 +7965;Ellwangen-Röhlingen;1 +7966;Unterschneidheim;1 +7967;Jagstzell;1 +7971;Gaildorf;1 +7972;Gschwend b Gaildorf;1 +7973;Obersontheim;1 +7974;Bühlerzell;1 +7975;Untergröningen;1 +7976;Sulzbach-Laufen;1 +7977;Oberrot b Gaildorf;1 +8020;Weyarn;1 +8021;Waakirchen;1 +8022;Tegernsee;1 +8023;Bayrischzell;1 +8024;Holzkirchen;1 +8025;Miesbach;1 +8026;Hausham;1 +8027;Dietramszell;1 +8028;Fischbachau;1 +8029;Kreuth b Tegernsee;1 +8031;Rosenheim Oberbay;1 +8032;Rohrdorf Kr Rosenheim;1 +8033;Oberaudorf;1 +8034;Brannenburg;1 +8035;Raubling;1 +8036;Stephanskirchen Simssee;1 +8038;Vogtareuth;1 +8039;Rott a Inn;1 +8041;Bad Tölz;1 +8042;Lenggries;1 +8043;Jachenau;1 +8045;Lenggries-Fall;1 +8046;Bad Heilbrunn;1 +8051;Prien a Chiemsee;1 +8052;Aschau i Chiemgau;1 +8053;Bad Endorf;1 +8054;Breitbrunn a Chiemsee;1 +8055;Halfing;1 +8056;Eggstätt;1 +8057;Aschau-Sachrang;1 +8061;Bad Aibling;1 +8062;Bruckmühl Mangfall;1 +8063;Feldkirchen-Westerham;1 +8064;Au b Bad Aibling;1 +8065;Tuntenhausen-Schönau;1 +8066;Bad Feilnbach;1 +8067;Tuntenhausen;1 +8071;Wasserburg a Inn;1 +8072;Haag i OB;1 +8073;Gars a Inn;1 +8074;Schnaitsee;1 +8075;Amerang;1 +8076;Pfaffing;1 +8081;Dorfen Stadt;1 +8082;Schwindegg;1 +8083;Isen;1 +8084;Taufkirchen Vils;1 +8085;Sankt Wolfgang;1 +8086;Buchbach Oberbay;1 +8091;Kirchseeon;1 +8092;Grafing b München;1 +8093;Glonn Kr Ebersberg;1 +8094;Steinhöring;1 +8095;Aying;1 +8102;Höhenkirchen-Siegertsbrunn;1 +8104;Sauerlach;1 +8105;Gilching;1 +8106;Vaterstetten;1 +811;Hallbergmoos;1 +8121;Markt Schwaben;1 +8122;Erding;1 +8123;Moosinning;1 +8124;Forstern Oberbay;1 +8131;Dachau;1 +8133;Haimhausen Oberbay;1 +8134;Odelzhausen;1 +8135;Sulzemoos;1 +8136;Markt Indersdorf;1 +8137;Petershausen;1 +8138;Schwabhausen b Dachau;1 +8139;Röhrmoos;1 +8141;Fürstenfeldbruck;1 +8142;Olching;1 +8143;Inning a Ammersee;1 +8144;Grafrath;1 +8145;Mammendorf;1 +8146;Moorenweis;1 +8151;Starnberg;1 +8152;Herrsching a Ammersee;1 +8153;Wessling;1 +8157;Feldafing;1 +8158;Tutzing;1 +8161;Freising;1 +8165;Neufahrn b Freising;1 +8166;Allershausen Oberbay;1 +8167;Zolling;1 +8168;Attenkirchen;1 +8170;Straßlach-Dingharting;1 +8171;Wolfratshausen;1 +8176;Egling b Wolfratshausen;1 +8177;Münsing Starnberger See;1 +8178;Icking;1 +8179;Eurasburg a d Loisach;1 +8191;Landsberg a Lech;1 +8192;Schondorf a Ammersee;1 +8193;Geltendorf;1 +8194;Vilgertshofen;1 +8195;Weil Kr Landsberg a Lech;1 +8196;Pürgen;1 +8202;Althegnenberg;1 +8203;Grossaitingen;1 +8204;Mickhausen;1 +8205;Dasing;1 +8206;Egling a d Paar;1 +8207;Affing;1 +8208;Eurasburg b Augsburg;1 +821;Augsburg;1 +8221;Günzburg;1 +8222;Burgau Schwab;1 +8223;Ichenhausen;1 +8224;Offingen Donau;1 +8225;Jettingen-Scheppach;1 +8226;Bibertal;1 +8230;Gablingen;1 +8231;Königsbrunn b Augsburg;1 +8232;Schwabmünchen;1 +8233;Kissing;1 +8234;Bobingen;1 +8236;Fischach;1 +8237;Aindling;1 +8238;Gessertshausen;1 +8239;Langenneufnach;1 +8241;Buchloe;1 +8243;Fuchstal;1 +8245;Türkheim Wertach;1 +8246;Waal;1 +8247;Bad Wörishofen;1 +8248;Lamerdingen;1 +8249;Ettringen Wertach;1 +8250;Hilgertshausen-Tandern;1 +8251;Aichach;1 +8252;Schrobenhausen;1 +8253;Pöttmes;1 +8254;Altomünster;1 +8257;Inchenhofen;1 +8258;Sielenbach;1 +8259;Schiltberg;1 +8261;Mindelheim;1 +8262;Mittelneufnach;1 +8263;Breitenbrunn Schwab;1 +8265;Pfaffenhausen Schwab;1 +8266;Kirchheim i Schw;1 +8267;Dirlewang;1 +8268;Tussenhausen;1 +8269;Unteregg b Mindelheim;1 +8271;Meitingen;1 +8272;Wertingen;1 +8273;Nordendorf;1 +8274;Buttenwiesen;1 +8276;Baar Schwaben;1 +8281;Thannhausen Schwab;1 +8282;Krumbach Schwaben;1 +8283;Neuburg a d Kammel;1 +8284;Ziemetshausen;1 +8285;Burtenbach;1 +8291;Zusmarshausen;1 +8292;Dinkelscherben;1 +8293;Welden b Augsburg;1 +8294;Horgau;1 +8295;Altenmünster Schwab;1 +8296;Villenbach;1 +8302;Görisried;1 +8303;Waltenhofen;1 +8304;Wildpoldsried;1 +8306;Ronsberg;1 +831;Kempten Allgäu;1 +8320;Missen-Wilhams;1 +8321;Sonthofen;1 +8322;Oberstdorf;1 +8323;Immenstadt i Allgäu;1 +8324;Hindelang;1 +8325;Oberstaufen-Thalkirchdorf;1 +8326;Fischen i Allgäu;1 +8327;Rettenberg;1 +8328;Balderschwang;1 +8330;Legau;1 +8331;Memmingen;1 +8332;Ottobeuren;1 +8333;Babenhausen Schwab;1 +8334;Bad Grönenbach;1 +8335;Fellheim;1 +8336;Erkheim;1 +8337;Altenstadt Iller;1 +8338;Böhen;1 +8340;Baisweil;1 +8341;Kaufbeuren;1 +8342;Marktoberdorf;1 +8343;Aitrang;1 +8344;Westendorf b Kaufbeuren;1 +8345;Stöttwang;1 +8346;Pforzen;1 +8347;Friesenried;1 +8348;Bidingen;1 +8349;Stötten a Auerberg;1 +8361;Nesselwang;1 +8362;Füssen;1 +8363;Pfronten;1 +8364;Seeg;1 +8365;Wertach;1 +8366;Oy-Mittelberg;1 +8367;Roßhaupten Forggensee;1 +8368;Halblech;1 +8369;Rückholz;1 +8370;Wiggensbach;1 +8372;Obergünzburg;1 +8373;Altusried;1 +8374;Dietmannsried;1 +8375;Weitnau;1 +8376;Sulzberg Allgäu;1 +8377;Unterthingau;1 +8378;Buchenberg b Kempten;1 +8379;Waltenhofen-Oberdorf;1 +8380;Achberg;1 +8381;Lindenberg i Allgäu;1 +8382;Lindau Bodensee;1 +8383;Grünenbach Allgäu;1 +8384;Röthenbach Allgäu;1 +8385;Hergatz;1 +8386;Oberstaufen;1 +8387;Weiler-Simmerberg;1 +8388;Hergensweiler;1 +8389;Weissensberg;1 +8392;Markt Rettenbach;1 +8393;Holzgünz;1 +8394;Lautrach;1 +8395;Tannheim Württ;1 +8402;Münchsmünster;1 +8403;Pförring;1 +8404;Oberdolling;1 +8405;Stammham b Ingolstadt;1 +8406;Böhmfeld;1 +8407;Grossmehring;1 +841;Ingolstadt Donau;1 +8421;Eichstätt Bay;1 +8422;Dollnstein;1 +8423;Titting;1 +8424;Nassenfels;1 +8426;Walting Kr Eichstätt;1 +8427;Wellheim;1 +8431;Neuburg a d Donau;1 +8432;Burgheim;1 +8433;Königsmoos;1 +8434;Rennertshofen;1 +8435;Ehekirchen;1 +8441;Pfaffenhofen a d Ilm;1 +8442;Wolnzach;1 +8443;Hohenwart Paar;1 +8444;Schweitenkirchen;1 +8445;Gerolsbach;1 +8446;Pörnbach;1 +8450;Ingolstadt-Zuchering;1 +8452;Geisenfeld;1 +8453;Reichertshofen Oberbay;1 +8454;Karlshuld;1 +8456;Lenting;1 +8457;Vohburg a d Donau;1 +8458;Gaimersheim;1 +8459;Manching;1 +8460;Berching-Holnstein;1 +8461;Beilngries;1 +8462;Berching;1 +8463;Greding;1 +8464;Dietfurt a d Altmühl;1 +8465;Kipfenberg;1 +8466;Denkendorf Oberbay;1 +8467;Kinding;1 +8468;Altmannstein-Pondorf;1 +8469;Freystadt-Burggriesbach;1 +8501;Thyrnau;1 +8502;Fürstenzell;1 +8503;Neuhaus a Inn;1 +8504;Tittling;1 +8505;Hutthurm;1 +8506;Bad Höhenstadt;1 +8507;Neuburg a Inn;1 +8509;Ruderting;1 +851;Passau;1 +8531;Pocking;1 +8532;Griesbach i Rottal;1 +8533;Rotthalmünster;1 +8534;Tettenweis;1 +8535;Haarbach;1 +8536;Kößlarn;1 +8537;Bad Füssing-Aigen;1 +8538;Pocking-Hartkirchen;1 +8541;Vilshofen Niederbay;1 +8542;Ortenburg;1 +8543;Aidenbach;1 +8544;Eging a See;1 +8545;Hofkirchen Bay;1 +8546;Windorf-Otterskirchen;1 +8547;Osterhofen-Gergweis;1 +8548;Vilshofen-Sandbach;1 +8549;Vilshofen-Pleinting;1 +8550;Philippsreut;1 +8551;Freyung;1 +8552;Grafenau Niederbay;1 +8553;Spiegelau;1 +8554;Schönberg Niederbay;1 +8555;Perlesreut;1 +8556;Haidmühle;1 +8557;Mauth;1 +8558;Hohenau Niederbay;1 +8561;Pfarrkirchen Niederbay;1 +8562;Triftern;1 +8563;Bad Birnbach Rottal;1 +8564;Johanniskirchen;1 +8565;Dietersburg-Baumgarten;1 +8571;Simbach a Inn;1 +8572;Tann Niederbay;1 +8573;Ering;1 +8574;Wittibreut;1 +8581;Waldkirchen Niederbay;1 +8582;Röhrnbach;1 +8583;Neureichenau;1 +8584;Breitenberg Niederbay;1 +8585;Grainet;1 +8586;Hauzenberg;1 +8591;Obernzell;1 +8592;Wegscheid Niederbay;1 +8593;Untergriesbach;1 +861;Traunstein;1 +8621;Trostberg;1 +8622;Tacherting- Peterskirchen;1 +8623;Kirchweidach;1 +8624;Obing;1 +8628;Kienberg Oberbay;1 +8629;Palling;1 +8630;Oberneukirchen;1 +8631;Mühldorf a Inn;1 +8633;Tüßling;1 +8634;Garching a d Alz;1 +8635;Pleiskirchen;1 +8636;Ampfing;1 +8637;Lohkirchen;1 +8638;Waldkraiburg;1 +8639;Neumarkt-Sankt Veit;1 +8640;Reit Im Winkl;1 +8641;Grassau Kr Traunstein;1 +8642;Übersee;1 +8649;Schleching;1 +8650;Marktschellenberg;1 +8651;Bad Reichenhall;1 +8652;Berchtesgaden;1 +8654;Freilassing;1 +8656;Anger;1 +8657;Ramsau b Berchtesgaden;1 +8661;Grabenstätt Chiemsee;1 +8662;Siegsdorf Kr Traunstein;1 +8663;Ruhpolding;1 +8664;Chieming;1 +8665;Inzell;1 +8666;Teisendorf;1 +8667;Seeon-Seebruck;1 +8669;Traunreut;1 +8670;Reischach Kr Altötting;1 +8671;Altötting;1 +8677;Burghausen Salzach;1 +8678;Marktl;1 +8679;Burgkirchen a d Alz;1 +8681;Waging a See;1 +8682;Laufen Salzach;1 +8683;Tittmoning;1 +8684;Fridolfing;1 +8685;Kirchanschöring;1 +8686;Petting;1 +8687;Taching-Tengling;1 +8702;Wörth a d Isar;1 +8703;Essenbach;1 +8704;Altdorf-Pfettrach;1 +8705;Altfraunhofen;1 +8706;Vilsheim;1 +8707;Adlkofen;1 +8708;Weihmichl-Unterneuhausen;1 +8709;Eching Niederbay;1 +871;Landshut;1 +8721;Eggenfelden;1 +8722;Gangkofen;1 +8723;Arnstorf;1 +8724;Massing;1 +8725;Wurmannsquick;1 +8726;Schönau Niederbay;1 +8727;Falkenberg Niederbay;1 +8728;Geratskirchen;1 +8731;Dingolfing;1 +8732;Frontenhausen;1 +8733;Mengkofen;1 +8734;Reisbach Niederbay;1 +8735;Gangkofen-Kollbach;1 +8741;Vilsbiburg;1 +8742;Velden Vils;1 +8743;Geisenhausen;1 +8744;Gerzen;1 +8745;Bodenkirchen;1 +8751;Mainburg;1 +8752;Au i d Hallertau;1 +8753;Elsendorf Niederbay;1 +8754;Volkenschwand;1 +8756;Nandlstadt;1 +8761;Moosburg a d Isar;1 +8762;Wartenberg Oberbay;1 +8764;Mauern Kr Freising;1 +8765;Bruckberg Niederbay;1 +8766;Gammelsdorf;1 +8771;Ergoldsbach;1 +8772;Mallersdorf-Pfaffenberg;1 +8773;Neufahrn i NB;1 +8774;Bayerbach b Ergoldsbach;1 +8781;Rottenburg a d Laaber;1 +8782;Pfeffenhausen;1 +8783;Rohr i NB;1 +8784;Hohenthann;1 +8785;Rottenburg-Oberroning;1 +8801;Seeshaupt;1 +8802;Huglfing;1 +8803;Peissenberg;1 +8805;Hohenpeissenberg;1 +8806;Utting a Ammersee;1 +8807;Dießen a Ammersee;1 +8808;Pähl;1 +8809;Wessobrunn;1 +881;Weilheim i OB;1 +8821;Garmisch-Partenkirchen;1 +8822;Oberammergau;1 +8823;Mittenwald;1 +8824;Oberau Loisach;1 +8825;Krün;1 +8841;Murnau a Staffelsee;1 +8845;Bad Kohlgrub;1 +8846;Uffing a Staffelsee;1 +8847;Obersöchering;1 +8851;Kochel a See;1 +8856;Penzberg;1 +8857;Benediktbeuern;1 +8858;Kochel-Walchensee;1 +8860;Bernbeuren;1 +8861;Schongau;1 +8862;Steingaden Oberbay;1 +8867;Rottenbuch Oberbay;1 +8868;Schwabsoien;1 +8869;Kinsau;1 +89;München;1 +906;Donauwörth;1 +9070;Tapfheim;1 +9071;Dillingen a d Donau;1 +9072;Lauingen Donau;1 +9073;Gundelfingen a d Donau;1 +9074;Höchstädt a d Donau;1 +9075;Glött;1 +9076;Wittislingen;1 +9077;Bachhagel;1 +9078;Mertingen;1 +9080;Harburg Schwaben;1 +9081;Nördlingen;1 +9082;Oettingen i Bay;1 +9083;Möttingen;1 +9084;Bissingen Schwab;1 +9085;Alerheim;1 +9086;Fremdingen;1 +9087;Marktoffingen;1 +9088;Mönchsdeggingen;1 +9089;Bissingen-Unterringingen;1 +9090;Rain Lech;1 +9091;Monheim Schwab;1 +9092;Wemding;1 +9093;Polsingen;1 +9094;Tagmersheim;1 +9097;Marxheim;1 +9099;Kaisheim;1 +9101;Langenzenn;1 +9102;Wilhermsdorf;1 +9103;Cadolzburg;1 +9104;Emskirchen;1 +9105;Grosshabersdorf;1 +9106;Markt Erlbach;1 +9107;Trautskirchen;1 +911;Nürnberg;1 +9120;Leinburg;1 +9122;Schwabach;1 +9123;Lauf a d Pegnitz;1 +9126;Eckental;1 +9127;Rosstal Mittelfr;1 +9128;Feucht;1 +9129;Wendelstein;1 +9131;Erlangen;1 +9132;Herzogenaurach;1 +9133;Baiersdorf Mittelfr;1 +9134;Neunkirchen a Brand;1 +9135;Heßdorf Mittelfr;1 +9141;Weißenburg i Bay;1 +9142;Treuchtlingen;1 +9143;Pappenheim Mittelfr;1 +9144;Pleinfeld;1 +9145;Solnhofen;1 +9146;Markt Berolzheim;1 +9147;Nennslingen;1 +9148;Ettenstatt;1 +9149;Weissenburg-Suffersheim;1 +9151;Hersbruck;1 +9152;Hartenstein Mittelfr;1 +9153;Schnaittach;1 +9154;Pommelsbrunn;1 +9155;Simmelsdorf;1 +9156;Neuhaus a d Pegnitz;1 +9157;Alfeld Mittelfr;1 +9158;Offenhausen Mittelfr;1 +9161;Neustadt a d Aisch;1 +9162;Scheinfeld;1 +9163;Dachsbach;1 +9164;Langenfeld Mittelfr;1 +9165;Sugenheim;1 +9166;Münchsteinach;1 +9167;Oberscheinfeld;1 +9170;Schwanstetten;1 +9171;Roth Mittelfr;1 +9172;Georgensgmünd;1 +9173;Thalmässing;1 +9174;Hilpoltstein;1 +9175;Spalt;1 +9176;Allersberg;1 +9177;Heideck;1 +9178;Abenberg Mittelfr;1 +9179;Freystadt;1 +9180;Pyrbaum;1 +9181;Neumarkt i d Opf;1 +9182;Velburg;1 +9183;Burgthann;1 +9184;Deining Oberpf;1 +9185;Mühlhausen Oberpf;1 +9186;Lauterhofen Oberpf;1 +9187;Altdorf b Nürnberg;1 +9188;Postbauer-Heng;1 +9189;Berg b Neumarkt i d Opf;1 +9190;Heroldsbach;1 +9191;Forchheim Oberfr;1 +9192;Gräfenberg;1 +9193;Höchstadt a d Aisch;1 +9194;Ebermannstadt;1 +9195;Adelsdorf Mittelfr;1 +9196;Wiesenttal;1 +9197;Egloffstein;1 +9198;Heiligenstadt i Ofr;1 +9199;Kunreuth;1 +9201;Gesees;1 +9202;Waischenfeld;1 +9203;Neudrossenfeld;1 +9204;Plankenfels;1 +9205;Vorbach;1 +9206;Mistelgau-Obernsees;1 +9207;Königsfeld Oberfr;1 +9208;Bindlach;1 +9209;Emtmannsberg;1 +921;Bayreuth;1 +9220;Kasendorf-Azendorf;1 +9221;Kulmbach;1 +9222;Presseck;1 +9223;Rugendorf;1 +9225;Stadtsteinach;1 +9227;Neuenmarkt;1 +9228;Thurnau;1 +9229;Mainleus;1 +9231;Marktredwitz;1 +9232;Wunsiedel;1 +9233;Arzberg Oberfr;1 +9234;Neusorg;1 +9235;Thierstein;1 +9236;Nagel;1 +9238;Röslau;1 +9241;Pegnitz;1 +9242;Gößweinstein;1 +9243;Pottenstein;1 +9244;Betzenstein;1 +9245;Obertrubach;1 +9246;Pegnitz-Trockau;1 +9251;Münchberg;1 +9252;Helmbrechts;1 +9253;Weissenstadt;1 +9254;Gefrees;1 +9255;Marktleugast;1 +9256;Stammbach;1 +9257;Zell Oberfr;1 +9260;Wilhelmsthal Oberfr;1 +9261;Kronach;1 +9262;Wallenfels;1 +9263;Ludwigsstadt;1 +9264;Küps;1 +9265;Pressig;1 +9266;Mitwitz;1 +9267;Nordhalben;1 +9268;Teuschnitz;1 +9269;Tettau Kr Kronach;1 +9270;Creussen;1 +9271;Thurnau-Alladorf;1 +9272;Fichtelberg;1 +9273;Bad Berneck i Fichtelgebirge;1 +9274;Hollfeld;1 +9275;Speichersdorf;1 +9276;Bischofsgrün;1 +9277;Warmensteinach;1 +9278;Weidenberg;1 +9279;Mistelgau;1 +9280;Selbitz Oberfr;1 +9281;Hof Saale;1 +9282;Naila;1 +9283;Rehau;1 +9284;Schwarzenbach a d Saale;1 +9285;Kirchenlamitz;1 +9286;Oberkotzau;1 +9287;Selb;1 +9288;Bad Steben;1 +9289;Schwarzenbach a Wald;1 +9292;Konradsreuth;1 +9293;Berg Oberfr;1 +9294;Regnitzlosau;1 +9295;Töpen;1 +9302;Rottendorf Unterfr;1 +9303;Eibelstadt;1 +9305;Estenfeld;1 +9306;Kist;1 +9307;Altertheim;1 +931;Würzburg;1 +9321;Kitzingen;1 +9323;Iphofen;1 +9324;Dettelbach;1 +9325;Kleinlangheim;1 +9326;Markt Einersheim;1 +9331;Ochsenfurt;1 +9332;Marktbreit;1 +9333;Sommerhausen;1 +9334;Giebelstadt;1 +9335;Aub Kr Würzburg;1 +9336;Bütthard;1 +9337;Gaukönigshofen;1 +9338;Röttingen Unterfr;1 +9339;Ippesheim;1 +9340;Königheim-Brehmen;1 +9341;Tauberbischofsheim;1 +9342;Wertheim;1 +9343;Lauda-Königshofen;1 +9344;Gerchsheim;1 +9345;Külsheim Baden;1 +9346;Grünsfeld;1 +9347;Wittighausen;1 +9348;Werbach-Gamburg;1 +9349;Werbach-Wenkheim;1 +9350;Eussenheim-Hundsbach;1 +9351;Gemünden a Main;1 +9352;Lohr a Main;1 +9353;Karlstadt;1 +9354;Rieneck;1 +9355;Frammersbach;1 +9356;Burgsinn;1 +9357;Gräfendorf Bay;1 +9358;Gössenheim;1 +9359;Karlstadt-Wiesenfeld;1 +9360;Thüngen;1 +9363;Arnstein Unterfr;1 +9364;Zellingen;1 +9365;Rimpar;1 +9366;Geroldshausen Unterfr;1 +9367;Unterpleichfeld;1 +9369;Uettingen;1 +9371;Miltenberg;1 +9372;Klingenberg a Main;1 +9373;Amorbach;1 +9374;Eschau;1 +9375;Freudenberg Baden;1 +9376;Collenberg;1 +9377;Freudenberg-Boxtal;1 +9378;Eichenbühl-Riedern;1 +9381;Volkach;1 +9382;Gerolzhofen;1 +9383;Wiesentheid;1 +9384;Schwanfeld;1 +9385;Kolitzheim;1 +9386;Prosselsheim;1 +9391;Marktheidenfeld;1 +9392;Faulbach Unterfr;1 +9393;Rothenfels Unterfr;1 +9394;Esselbach;1 +9395;Triefenstein;1 +9396;Urspringen b Lohr;1 +9397;Wertheim-Dertingen;1 +9398;Birkenfeld b Würzburg;1 +9401;Neutraubling;1 +9402;Regenstauf;1 +9403;Donaustauf;1 +9404;Nittendorf;1 +9405;Bad Abbach;1 +9406;Mintraching;1 +9407;Wenzenbach;1 +9408;Altenthann;1 +9409;Pielenhofen;1 +941;Regensburg;1 +9420;Feldkirchen Niederbay;1 +9421;Straubing;1 +9422;Bogen Niederbay;1 +9423;Geiselhöring;1 +9424;Strasskirchen;1 +9426;Oberschneiding;1 +9427;Leiblfing;1 +9428;Kirchroth;1 +9429;Rain Niederbay;1 +9431;Schwandorf;1 +9433;Nabburg;1 +9434;Bodenwöhr;1 +9435;Schwarzenfeld;1 +9436;Nittenau;1 +9438;Fensterbach;1 +9439;Neunburg-Kemnath;1 +9441;Kelheim;1 +9442;Riedenburg;1 +9443;Abensberg;1 +9444;Siegenburg;1 +9445;Neustadt a d Donau;1 +9446;Altmannstein;1 +9447;Essing;1 +9448;Hausen Niederbay;1 +9451;Schierling;1 +9452;Langquaid;1 +9453;Thalmassing;1 +9454;Aufhausen Oberpf;1 +9461;Roding;1 +9462;Falkenstein Oberpf;1 +9463;Wald Oberpf;1 +9464;Walderbach;1 +9465;Neukirchen-Balbini;1 +9466;Stamsried;1 +9467;Michelsneukirchen;1 +9468;Zell Oberpf;1 +9469;Roding-Neubäu;1 +9471;Burglengenfeld;1 +9472;Hohenfels Oberpf;1 +9473;Kallmünz;1 +9474;Schmidmühlen;1 +9480;Sünching;1 +9481;Pfatter;1 +9482;Wörth a d Donau;1 +9484;Brennberg;1 +9491;Hemau;1 +9492;Parsberg;1 +9493;Beratzhausen;1 +9495;Breitenbrunn Oberpf;1 +9497;Seubersdorf i d Opf;1 +9498;Laaber;1 +9499;Painten;1 +9502;Frensdorf;1 +9503;Oberhaid Oberfr;1 +9504;Stadelhofen;1 +9505;Litzendorf;1 +951;Bamberg;1 +9521;Hassfurt;1 +9522;Eltmann;1 +9523;Hofheim i Ufr;1 +9524;Zeil a Main;1 +9525;Königsberg i Bay;1 +9526;Riedbach;1 +9527;Knetzgau;1 +9528;Donnersdorf;1 +9529;Oberaurach;1 +9531;Ebern;1 +9532;Maroldsweisach;1 +9533;Untermerzbach;1 +9534;Burgpreppach;1 +9535;Pfarrweisach;1 +9536;Kirchlauter;1 +9542;Schesslitz;1 +9543;Hirschaid;1 +9544;Baunach;1 +9545;Buttenheim;1 +9546;Burgebrach;1 +9547;Zapfendorf;1 +9548;Mühlhausen Mittelfr;1 +9549;Lisberg;1 +9551;Burgwindheim;1 +9552;Burghaslach;1 +9553;Ebrach Oberfr;1 +9554;Untersteinbach Unterfr;1 +9555;Schlüsselfeld-Aschbach;1 +9556;Geiselwind;1 +9560;Grub a Forst;1 +9561;Coburg;1 +9562;Sonnefeld;1 +9563;Rödental;1 +9564;Bad Rodach;1 +9565;Untersiemau;1 +9566;Meeder;1 +9567;Seßlach-Gemünda;1 +9568;Neustadt b Coburg;1 +9569;Sesslach;1 +9571;Lichtenfels Bay;1 +9572;Burgkunstadt;1 +9573;Staffelstein Oberfr;1 +9574;Marktzeuln;1 +9575;Weismain;1 +9576;Lichtenfels-Isling;1 +9602;Neustadt a d Waldnaab;1 +9603;Floss;1 +9604;Wernberg-Köblitz;1 +9605;Weiherhammer;1 +9606;Pfreimd;1 +9607;Luhe-Wildenau;1 +9608;Kohlberg Oberpf;1 +961;Weiden i d Opf;1 +9621;Amberg Oberpf;1 +9622;Hirschau Oberpf;1 +9624;Ensdorf Oberpf;1 +9625;Kastl b Amberg;1 +9626;Hohenburg;1 +9627;Freudenberg Oberpf;1 +9628;Ursensollen;1 +9631;Tirschenreuth;1 +9632;Waldsassen;1 +9633;Mitterteich;1 +9634;Wiesau;1 +9635;Bärnau;1 +9636;Plößberg;1 +9637;Falkenberg Oberpf;1 +9638;Neualbenreuth;1 +9639;Mähring;1 +9641;Grafenwöhr;1 +9642;Kemnath Stadt;1 +9643;Auerbach i d Opf;1 +9644;Pressath;1 +9645;Eschenbach i d Opf;1 +9646;Freihung;1 +9647;Kirchenthumbach;1 +9648;Neustadt a Kulm;1 +9651;Vohenstrauss;1 +9652;Waidhaus;1 +9653;Eslarn;1 +9654;Pleystein;1 +9655;Tännesberg;1 +9656;Moosbach b Vohenstrauß;1 +9657;Waldthurn;1 +9658;Georgenberg;1 +9659;Leuchtenberg;1 +9661;Sulzbach-Rosenberg;1 +9662;Vilseck;1 +9663;Neukirchen b Sulzbach-Rosenberg;1 +9664;Hahnbach;1 +9665;Königstein Oberpf;1 +9666;Illschwang;1 +9671;Oberviechtach;1 +9672;Neunburg vorm Wald;1 +9673;Tiefenbach Oberpf;1 +9674;Schönsee;1 +9675;Altendorf a Nabburg;1 +9676;Winklarn;1 +9677;Oberviechtach-Pullenried;1 +9681;Windischeschenbach;1 +9682;Erbendorf;1 +9683;Friedenfels;1 +9701;Sandberg Unterfr;1 +9704;Euerdorf;1 +9708;Bad Bocklet;1 +971;Bad Kissingen;1 +9720;Üchtelhausen;1 +9721;Schweinfurt;1 +9722;Werneck;1 +9723;Röthlein;1 +9724;Stadtlauringen;1 +9725;Poppenhausen Unterfr;1 +9726;Euerbach;1 +9727;Schonungen-Marktsteinach;1 +9728;Wülfershausen Unterfr;1 +9729;Grettstadt;1 +9732;Hammelburg;1 +9733;Münnerstadt;1 +9734;Burkardroth;1 +9735;Massbach;1 +9736;Oberthulba;1 +9737;Wartmannsroth;1 +9738;Rottershausen;1 +9741;Bad Brückenau;1 +9742;Kalbach Rhön;1 +9744;Zeitlofs-Detter;1 +9745;Wildflecken;1 +9746;Zeitlofs;1 +9747;Geroda Bay;1 +9748;Motten;1 +9749;Oberbach Unterfr;1 +9761;Bad Königshofen i Grabfeld;1 +9762;Saal a d Saale;1 +9763;Sulzdorf a d Lederhecke;1 +9764;Höchheim;1 +9765;Trappstadt;1 +9766;Grosswenkheim;1 +9771;Bad Neustadt a d Saale;1 +9772;Bischofsheim a d Rhön;1 +9773;Unsleben;1 +9774;Oberelsbach;1 +9775;Schönau a d Brend;1 +9776;Mellrichstadt;1 +9777;Ostheim v d Rhön;1 +9778;Fladungen;1 +9779;Nordheim v d Rhön;1 +9802;Ansbach-Katterbach;1 +9803;Colmberg;1 +9804;Aurach;1 +9805;Burgoberbach;1 +981;Ansbach;1 +9820;Lehrberg;1 +9822;Bechhofen a d Heide;1 +9823;Leutershausen;1 +9824;Dietenhofen;1 +9825;Herrieden;1 +9826;Weidenbach Mittelfr;1 +9827;Lichtenau Mittelfr;1 +9828;Rügland;1 +9829;Flachslanden;1 +9831;Gunzenhausen;1 +9832;Wassertrüdingen;1 +9833;Heidenheim Mittelfr;1 +9834;Theilenhofen;1 +9835;Ehingen Mittelfr;1 +9836;Gunzenhausen-Cronheim;1 +9837;Haundorf;1 +9841;Bad Windsheim;1 +9842;Uffenheim;1 +9843;Burgbernheim;1 +9844;Obernzenn;1 +9845;Oberdachstetten;1 +9846;Ipsheim;1 +9847;Ergersheim;1 +9848;Simmershofen;1 +9851;Dinkelsbühl;1 +9852;Feuchtwangen;1 +9853;Wilburgstetten;1 +9854;Wittelshofen;1 +9855;Dentlein a Forst;1 +9856;Dürrwangen;1 +9857;Schopfloch Mittelfr;1 +9861;Rothenburg ob der Tauber;1 +9865;Adelshofen Mittelfr;1 +9867;Geslau;1 +9868;Schillingsfürst;1 +9869;Wettringen Mittelfr;1 +9871;Windsbach;1 +9872;Heilsbronn;1 +9873;Abenberg-Wassermungenau;1 +9874;Neuendettelsau;1 +9875;Wolframs-Eschenbach;1 +9876;Rohr Mittelfr;1 +9901;Hengersberg Bay;1 +9903;Schöllnach;1 +9904;Lalling;1 +9905;Bernried Niederbay;1 +9906;Mariaposching;1 +9907;Zenting;1 +9908;Schöfweg;1 +991;Deggendorf;1 +9920;Bischofsmais;1 +9921;Regen;1 +9922;Zwiesel;1 +9923;Teisnach;1 +9924;Bodenmais;1 +9925;Bayerisch Eisenstein;1 +9926;Frauenau;1 +9927;Kirchberg Wald;1 +9928;Kirchdorf i Wald;1 +9929;Ruhmannsfelden;1 +9931;Plattling;1 +9932;Osterhofen;1 +9933;Wallersdorf;1 +9935;Stephansposching;1 +9936;Wallerfing;1 +9937;Oberpöring;1 +9938;Moos Niederbay;1 +9941;Kötzting;1 +9942;Viechtach;1 +9943;Lam Oberpf;1 +9944;Miltach;1 +9945;Arnbruck;1 +9946;Hohenwarth b Kötzing;1 +9947;Neukirchen b Hl Blut;1 +9948;Eschlkam;1 +9951;Landau a d Isar;1 +9952;Eichendorf;1 +9953;Pilsting;1 +9954;Simbach Niederbay;1 +9955;Mamming;1 +9956;Eichendorf-Aufhausen;1 +9961;Mitterfels;1 +9962;Schwarzach Niederbay;1 +9963;Konzell;1 +9964;Stallwang;1 +9965;Sankt Englmar;1 +9966;Wiesenfelden;1 +9971;Cham;1 +9972;Waldmünchen;1 +9973;Furth i Wald;1 +9974;Traitsching;1 +9975;Waldmünchen-Geigant;1 +9976;Rötz;1 +9977;Arnschwang;1 +9978;Schönthal Oberpf;1 + \ No newline at end of file diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py new file mode 100644 index 0000000..dabba83 --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -0,0 +1,82 @@ +import csv + + +def add(leaf, keypart, name): + if len(keypart) == 1: + leaf[keypart] = name + else: + if not keypart[0] in leaf: + leaf[keypart[0]] = {} + add(leaf[keypart[0]], keypart[1:], name) + + +def print_function(leaf, prefix): + if prefix == '': + java_visibility = 'public' + else: + java_visibility = 'private' + + print(' '+java_visibility+' static String fromNumber'+ prefix +'(String number) {') + print(' if ((number == null) || (number.length()<1)) {') + print(' return "";') + print(' }') + print('') + print(' switch (number.substring(0, 1)) {') + + if prefix == "": + # main function - need explicit reference to service and mobile function for starting numbers with 1 + print(' case "1":') + print(' return fromNumber1(number.substring(1));') + + for k in leaf: + print(' case "'+k+'":') + + if isinstance(leaf[k], dict): + print(' return fromNumber'+prefix+k+'(number.substring(1));') + else: + if (prefix+k) == "212": + print(' // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sach' + 'gebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBV' + 'erzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1') + print(' if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) {') + print(' return "2129"; // Haan Rheinland') + print(' }') + print(' return "'+prefix+k+'"; // '+ leaf[k]) + + print(' default:') + print(' return "";') + print(' }') + print(' }') + print('') + + for k in leaf: + if isinstance(leaf[k], dict): + print_function(leaf[k], prefix + k) + +# Start, creating a dictonary for placing the Numberplan as a tree +onkz = {} + +# Data from https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vorwahlverzeichnis_ONB.zip.zip?__blob=publicationFile&v=1 +# it is linked at https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/ONRufnr/Einteilung_ONB/start.html + +with open('NVONB.INTERNET.20220727.ONB.csv', newline='') as csvfile: + reader = csv.reader(csvfile, delimiter=';', quotechar='"') + for row in reader: + # remove first line: Ortsnetzkennzahl;Ortsnetzname;KennzeichenAktiv + if row == ['Ortsnetzkennzahl', 'Ortsnetzname', 'KennzeichenAktiv']: + continue + # remove line: 2129;Haan Rheinl;1 // because of overlapping, this is added explicitly, see above + if row == ['2129', 'Haan Rheinl', '1']: + continue + # remove last line:  + if row == ['\x1a']: + continue + add(onkz, row[0], row[1]) + +# print code from three +print_function(onkz, "") + + + + + diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java new file mode 100644 index 0000000..d3a0b27 --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -0,0 +1,21596 @@ +package de.telekom.phonenumbernormalizer.numberplans.constants; + +public class GermanAreaCodeExtractor { + + /* + The following Code is generated by the python script: src/generators/GermanAreaCodeExtractor/main.py + it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new + code and past it between the comments below. + + It only generates the code for geographical NDC starting with 2..9 for service and mobile numbers, starting one is + hard coded (reference is added into script automatically. + + */ + + private static String fromNumber1(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + // used mobile number blocks see: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html + switch (number.substring(0, 1)) { + case "5": + return fromNumber15(number.substring(1)); + case "6": + return fromNumber16(number.substring(1)); + case "7": + return fromNumber17(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber15(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber150(number.substring(1)); + case "1": + return fromNumber151(number.substring(1)); + case "2": + return fromNumber152(number.substring(1)); + case "3": + return fromNumber153(number.substring(1)); + case "5": + return fromNumber155(number.substring(1)); + case "6": + return fromNumber156(number.substring(1)); + case "7": + return fromNumber157(number.substring(1)); + case "8": + return fromNumber158(number.substring(1)); + case "9": + return fromNumber159(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber150(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1501(number.substring(1)); + case "2": + return fromNumber1502(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1501(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + // TODO: Replace all substring(0, 1) with chartAt(0) + if (number.charAt(0) == '9') { + return "15019"; // Tismi BV + } + return ""; + } + + private static String fromNumber1502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15020"; // Legos - Local Exchange Global Operation Services + } + return ""; + } + + private static String fromNumber151(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "1511"; // Telekom Deutschland GmbH + case "2": + return "1512"; // Telekom Deutschland GmbH + case "4": + return "1514"; // Telekom Deutschland GmbH + case "5": + return "1515"; // Telekom Deutschland GmbH + case "6": + return "1516"; // Telekom Deutschland GmbH + case "7": + return "1517"; // Telekom Deutschland GmbH + case "8": + return fromNumber1518(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1518(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15180"; // Telekom Deutschland GmbH + case "1": + return "15181"; // Telekom Deutschland GmbH + case "2": + return "15182"; // Telekom Deutschland GmbH + case "3": + return "15183"; // Telekom Deutschland GmbH + default: + return ""; + } + } + + private static String fromNumber152(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "1520"; // Vodafone GmbH + case "1": + return "1521"; // Lycamobile Europe Ltd. + case "2": + return "1522"; // Vodafone GmbH + case "3": + return "1523"; // Vodafone GmbH + case "5": + return "1525"; // Vodafone GmbH + case "6": + return "1526"; // Vodafone GmbH + case "9": + return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH) + default: + return ""; + } + } + + private static String fromNumber153(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '1') { + return fromNumber1531(number.substring(1)); + } + return ""; + } + + private static String fromNumber1531(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15310"; // MTEL Deutschland GmbH + } + return ""; + } + + private static String fromNumber155(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1551(number.substring(1)); + case "6": + return fromNumber1556(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1551(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15510"; // Lebara Limited + case "1": + return "15511"; // Lebara Limited + default: + return ""; + } + } + + private static String fromNumber1556(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15560"; // 1&1 Mobilfunk GmbH + case "1": + return "15561"; // 1&1 Mobilfunk GmbH + case "2": + return "15562"; // 1&1 Mobilfunk GmbH + case "3": + return "15563"; // 1&1 Mobilfunk GmbH + case "4": + return "15564"; // 1&1 Mobilfunk GmbH + case "5": + return "15565"; // 1&1 Mobilfunk GmbH + case "6": + return "15566"; // 1&1 Mobilfunk GmbH + case "7": + return "15567"; // 1&1 Mobilfunk GmbH + case "8": + return "15568"; // 1&1 Mobilfunk GmbH + case "9": + return "15569"; // 1&1 Mobilfunk GmbH + default: + return ""; + } + } + + private static String fromNumber156(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return fromNumber1563(number.substring(1)); + case "7": + return fromNumber1567(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1563(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15630"; // multiConnect GmbH + } + return ""; + } + + private static String fromNumber1567(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "8": + return "15678"; // Argon Networks UG + case "9": + return "15679"; // Argon Networks UG + default: + return ""; + } + } + + private static String fromNumber157(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber1570(number.substring(1)); + case "3": + return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "5": + return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "7": + return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "8": + return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "9": + return "1579"; // Telefónica Germany GmbH & Co. OHG (Netznutzungsvereinbarung mit Fa. Sipgate Wireless GmbH zuvor Fa. Vintage Wireless Networks Gesellschaft für Telekommunikation mbH), (ehem. E-Plus-Mobilfunk GmbH) + default: + return ""; + } + } + + private static String fromNumber1570(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15700"; // Telefónica Germany GmbH & Co. OHG + case "1": + return "15701"; // Telefónica Germany GmbH & Co. OHG + case "2": + return "15702"; // Telefónica Germany GmbH & Co. OHG + case "3": + return "15703"; // Telefónica Germany GmbH & Co. OHG + case "4": + return "15704"; // Telefónica Germany GmbH & Co. OHG + case "6": + return "15706"; // Telefónica Germany GmbH & Co. OHG + + default: + return ""; + } + } + + private static String fromNumber158(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '8') { + return fromNumber1588(number.substring(1)); + } + return ""; + } + + private static String fromNumber1588(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '8') { + return "15888"; // TelcoVillage GmbH + } + return ""; + } + + private static String fromNumber159(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "1590"; // Telefónica Germany GmbH & Co. OHG + } + return ""; + } + + private static String fromNumber16(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "160"; // Telekom Deutschland GmbH + case "2": + return "162"; // Vodafone GmbH + case "3": + return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + default: + return ""; + } + } + + private static String fromNumber17(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "170"; // Telekom Deutschland GmbH + case "1": + return "171"; // Telekom Deutschland GmbH + case "2": + return "172"; // Vodafone GmbH + case "3": + return "173"; // Vodafone GmbH + case "4": + return "174"; // Vodafone GmbH + case "5": + return "175"; // Telekom Deutschland GmbH + case "6": + return "176"; // Telefónica Germany GmbH & Co. OHG + case "7": + return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "8": + return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "9": + return "179"; // Telefónica Germany GmbH & Co. OHG + default: + return ""; + } + } + + /* + Start of generated code + */ + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1(number.substring(1)); + case "2": + return fromNumber2(number.substring(1)); + case "3": + return fromNumber3(number.substring(1)); + case "4": + return fromNumber4(number.substring(1)); + case "5": + return fromNumber5(number.substring(1)); + case "6": + return fromNumber6(number.substring(1)); + case "7": + return fromNumber7(number.substring(1)); + case "8": + return fromNumber8(number.substring(1)); + case "9": + return fromNumber9(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber2(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber20(number.substring(1)); + case "1": + return fromNumber21(number.substring(1)); + case "2": + return fromNumber22(number.substring(1)); + case "3": + return fromNumber23(number.substring(1)); + case "4": + return fromNumber24(number.substring(1)); + case "5": + return fromNumber25(number.substring(1)); + case "6": + return fromNumber26(number.substring(1)); + case "7": + return fromNumber27(number.substring(1)); + case "8": + return fromNumber28(number.substring(1)); + case "9": + return fromNumber29(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber20(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "201"; // Essen + case "2": + return "202"; // Wuppertal + case "3": + return "203"; // Duisburg + case "4": + return fromNumber204(number.substring(1)); + case "5": + return fromNumber205(number.substring(1)); + case "6": + return fromNumber206(number.substring(1)); + case "8": + return "208"; // Oberhausen Rheinl + case "9": + return "209"; // Gelsenkirchen + default: + return ""; + } + } + + private static String fromNumber204(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2041"; // Bottrop + case "3": + return "2043"; // Gladbeck + case "5": + return "2045"; // Bottrop-Kirchhellen + default: + return ""; + } + } + + private static String fromNumber205(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2051"; // Velbert + case "2": + return "2052"; // Velbert-Langenberg + case "3": + return "2053"; // Velbert-Neviges + case "4": + return "2054"; // Essen-Kettwig + case "6": + return "2056"; // Heiligenhaus + case "8": + return "2058"; // Wülfrath + default: + return ""; + } + } + + private static String fromNumber206(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "4": + return "2064"; // Dinslaken + case "5": + return "2065"; // Duisburg-Rheinhausen + case "6": + return "2066"; // Duisburg-Homberg + default: + return ""; + } + } + + private static String fromNumber21(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber210(number.substring(1)); + case "1": + return "211"; // Düsseldorf + case "2": + // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBVerzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1 + if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) { + return "2129"; // Haan Rheinland + } + return "212"; // Solingen + case "3": + return fromNumber213(number.substring(1)); + case "4": + return "214"; // Leverkusen + case "5": + return fromNumber215(number.substring(1)); + case "6": + return fromNumber216(number.substring(1)); + case "7": + return fromNumber217(number.substring(1)); + case "8": + return fromNumber218(number.substring(1)); + case "9": + return fromNumber219(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber210(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2102"; // Ratingen + case "3": + return "2103"; // Hilden + case "4": + return "2104"; // Mettmann + default: + return ""; + } + } + + private static String fromNumber213(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2131"; // Neuss + case "2": + return "2132"; // Meerbusch-Büderich + case "3": + return "2133"; // Dormagen + case "7": + return "2137"; // Neuss-Norf + default: + return ""; + } + } + + private static String fromNumber215(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2150"; // Meerbusch-Lank + case "1": + return "2151"; // Krefeld + case "2": + return "2152"; // Kempen + case "3": + return "2153"; // Nettetal-Lobberich + case "4": + return "2154"; // Willich + case "6": + return "2156"; // Willich-Anrath + case "7": + return "2157"; // Nettetal-Kaldenkirchen + case "8": + return "2158"; // Grefrath b Krefeld + case "9": + return "2159"; // Meerbusch-Osterath + default: + return ""; + } + } + + private static String fromNumber216(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2161"; // Mönchengladbach + case "2": + return "2162"; // Viersen + case "3": + return "2163"; // Schwalmtal Niederrhein + case "4": + return "2164"; // Jüchen-Otzenrath + case "5": + return "2165"; // Jüchen + case "6": + return "2166"; // Mönchengladbach-Rheydt + default: + return ""; + } + } + + private static String fromNumber217(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2171"; // Leverkusen-Opladen + case "3": + return "2173"; // Langenfeld Rheinland + case "4": + return "2174"; // Burscheid Rheinl + case "5": + return "2175"; // Leichlingen Rheinland + default: + return ""; + } + } + + private static String fromNumber218(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2181"; // Grevenbroich + case "2": + return "2182"; // Grevenbroich-Kapellen + case "3": + return "2183"; // Rommerskirchen + default: + return ""; + } + } + + private static String fromNumber219(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2191"; // Remscheid + case "2": + return "2192"; // Hückeswagen + case "3": + return "2193"; // Dabringhausen + case "5": + return "2195"; // Radevormwald + case "6": + return "2196"; // Wermelskirchen + default: + return ""; + } + } + + private static String fromNumber22(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber220(number.substring(1)); + case "1": + return "221"; // Köln + case "2": + return fromNumber222(number.substring(1)); + case "3": + return fromNumber223(number.substring(1)); + case "4": + return fromNumber224(number.substring(1)); + case "5": + return fromNumber225(number.substring(1)); + case "6": + return fromNumber226(number.substring(1)); + case "7": + return fromNumber227(number.substring(1)); + case "8": + return "228"; // Bonn + case "9": + return fromNumber229(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber220(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2202"; // Bergisch Gladbach + case "3": + return "2203"; // Köln-Porz + case "4": + return "2204"; // Bensberg + case "5": + return "2205"; // Rösrath + case "6": + return "2206"; // Overath + case "7": + return "2207"; // Kürten-Dürscheid + case "8": + return "2208"; // Niederkassel + default: + return ""; + } + } + + private static String fromNumber222(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2222"; // Bornheim Rheinl + case "3": + return "2223"; // Königswinter + case "4": + return "2224"; // Bad Honnef + case "5": + return "2225"; // Meckenheim Rheinl + case "6": + return "2226"; // Rheinbach + case "7": + return "2227"; // Bornheim-Merten + case "8": + return "2228"; // Remagen-Rolandseck + default: + return ""; + } + } + + private static String fromNumber223(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2232"; // Brühl Rheinl + case "3": + return "2233"; // Hürth Rheinl + case "4": + return "2234"; // Frechen + case "5": + return "2235"; // Erftstadt + case "6": + return "2236"; // Wesseling Rheinl + case "7": + return "2237"; // Kerpen Rheinl-Türnich + case "8": + return "2238"; // Pulheim + default: + return ""; + } + } + + private static String fromNumber224(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2241"; // Siegburg + case "2": + return "2242"; // Hennef Sieg + case "3": + return "2243"; // Eitorf + case "4": + return "2244"; // Königswinter-Oberpleis + case "5": + return "2245"; // Much + case "6": + return "2246"; // Lohmar Rheinland + case "7": + return "2247"; // Neunkirchen-Seelscheid + case "8": + return "2248"; // Hennef-Uckerath + default: + return ""; + } + } + + private static String fromNumber225(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2251"; // Euskirchen + case "2": + return "2252"; // Zülpich + case "3": + return "2253"; // Bad Münstereifel + case "4": + return "2254"; // Weilerswist + case "5": + return "2255"; // Euskirchen-Flamersheim + case "6": + return "2256"; // Mechernich-Satzvey + case "7": + return "2257"; // Reckerscheid + default: + return ""; + } + } + + private static String fromNumber226(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2261"; // Gummersbach + case "2": + return "2262"; // Wiehl + case "3": + return "2263"; // Engelskirchen + case "4": + return "2264"; // Marienheide + case "5": + return "2265"; // Reichshof-Eckenhagen + case "6": + return "2266"; // Lindlar + case "7": + return "2267"; // Wipperfürth + case "8": + return "2268"; // Kürten + case "9": + return "2269"; // Kierspe-Rönsahl + default: + return ""; + } + } + + private static String fromNumber227(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2271"; // Bergheim Erft + case "2": + return "2272"; // Bedburg Erft + case "3": + return "2273"; // Kerpen-Horrem + case "4": + return "2274"; // Elsdorf Rheinl + case "5": + return "2275"; // Kerpen-Buir + default: + return ""; + } + } + + private static String fromNumber229(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2291"; // Waldbröl + case "2": + return "2292"; // Windeck Sieg + case "3": + return "2293"; // Nümbrecht + case "4": + return "2294"; // Morsbach Sieg + case "5": + return "2295"; // Ruppichteroth + case "6": + return "2296"; // Reichshof-Brüchermühle + case "7": + return "2297"; // Wildbergerhütte + default: + return ""; + } + } + + private static String fromNumber23(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber230(number.substring(1)); + case "1": + return "231"; // Dortmund + case "2": + return fromNumber232(number.substring(1)); + case "3": + return fromNumber233(number.substring(1)); + case "4": + return "234"; // Bochum + case "5": + return fromNumber235(number.substring(1)); + case "6": + return fromNumber236(number.substring(1)); + case "7": + return fromNumber237(number.substring(1)); + case "8": + return fromNumber238(number.substring(1)); + case "9": + return fromNumber239(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber230(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2301"; // Holzwickede + case "2": + return "2302"; // Witten + case "3": + return "2303"; // Unna + case "4": + return "2304"; // Schwerte + case "5": + return "2305"; // Castrop-Rauxel + case "6": + return "2306"; // Lünen + case "7": + return "2307"; // Kamen + case "8": + return "2308"; // Unna-Hemmerde + case "9": + return "2309"; // Waltrop + default: + return ""; + } + } + + private static String fromNumber232(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "2323"; // Herne + case "4": + return "2324"; // Hattingen Ruhr + case "5": + return "2325"; // Wanne-Eickel + case "7": + return "2327"; // Bochum-Wattenscheid + default: + return ""; + } + } + + private static String fromNumber233(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2330"; // Herdecke + case "1": + return "2331"; // Hagen Westf + case "2": + return "2332"; // Gevelsberg + case "3": + return "2333"; // Ennepetal + case "4": + return "2334"; // Hagen-Hohenlimburg + case "5": + return "2335"; // Wetter Ruhr + case "6": + return "2336"; // Schwelm + case "7": + return "2337"; // Hagen-Dahl + case "8": + return "2338"; // Breckerfeld + case "9": + return "2339"; // Sprockhövel-Haßlinghausen + default: + return ""; + } + } + + private static String fromNumber235(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2351"; // Lüdenscheid + case "2": + return "2352"; // Altena Westf + case "3": + return "2353"; // Halver + case "4": + return "2354"; // Meinerzhagen + case "5": + return "2355"; // Schalksmühle + case "7": + return "2357"; // Herscheid Westf + case "8": + return "2358"; // Meinerzhagen-Valbert + case "9": + return "2359"; // Kierspe + default: + return ""; + } + } + + private static String fromNumber236(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2360"; // Haltern-Lippramsdorf + case "1": + return "2361"; // Recklinghausen + case "2": + return "2362"; // Dorsten + case "3": + return "2363"; // Datteln + case "4": + return "2364"; // Haltern Westf + case "5": + return "2365"; // Marl + case "6": + return "2366"; // Herten Westf + case "7": + return "2367"; // Henrichenburg + case "8": + return "2368"; // Oer-Erkenschwick + case "9": + return "2369"; // Dorsten-Wulfen + default: + return ""; + } + } + + private static String fromNumber237(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2371"; // Iserlohn + case "2": + return "2372"; // Hemer + case "3": + return "2373"; // Menden Sauerland + case "4": + return "2374"; // Iserlohn-Letmathe + case "5": + return "2375"; // Balve + case "7": + return "2377"; // Wickede Ruhr + case "8": + return "2378"; // Fröndenberg-Langschede + case "9": + return "2379"; // Menden-Asbeck + default: + return ""; + } + } + + private static String fromNumber238(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2381"; // Hamm Westf + case "2": + return "2382"; // Ahlen Westf + case "3": + return "2383"; // Bönen + case "4": + return "2384"; // Welver + case "5": + return "2385"; // Hamm-Rhynern + case "7": + return "2387"; // Drensteinfurt-Walstedde + case "8": + return "2388"; // Hamm-Uentrop + case "9": + return "2389"; // Werne + default: + return ""; + } + } + + private static String fromNumber239(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2391"; // Plettenberg + case "2": + return "2392"; // Werdohl + case "3": + return "2393"; // Sundern-Allendorf + case "4": + return "2394"; // Neuenrade-Affeln + case "5": + return "2395"; // Finnentrop-Rönkhausen + default: + return ""; + } + } + + private static String fromNumber24(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber240(number.substring(1)); + case "1": + return "241"; // Aachen + case "2": + return fromNumber242(number.substring(1)); + case "3": + return fromNumber243(number.substring(1)); + case "4": + return fromNumber244(number.substring(1)); + case "5": + return fromNumber245(number.substring(1)); + case "6": + return fromNumber246(number.substring(1)); + case "7": + return fromNumber247(number.substring(1)); + case "8": + return fromNumber248(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber240(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2401"; // Baesweiler + case "2": + return "2402"; // Stolberg Rheinl + case "3": + return "2403"; // Eschweiler Rheinl + case "4": + return "2404"; // Alsdorf Rheinl + case "5": + return "2405"; // Würselen + case "6": + return "2406"; // Herzogenrath + case "7": + return "2407"; // Herzogenrath-Kohlscheid + case "8": + return "2408"; // Aachen-Kornelimünster + case "9": + return "2409"; // Stolberg-Gressenich + default: + return ""; + } + } + + private static String fromNumber242(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2421"; // Düren + case "2": + return "2422"; // Kreuzau + case "3": + return "2423"; // Langerwehe + case "4": + return "2424"; // Vettweiss + case "5": + return "2425"; // Nideggen-Embken + case "6": + return "2426"; // Nörvenich + case "7": + return "2427"; // Nideggen + case "8": + return "2428"; // Niederzier + case "9": + return "2429"; // Hürtgenwald + default: + return ""; + } + } + + private static String fromNumber243(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2431"; // Erkelenz + case "2": + return "2432"; // Wassenberg + case "3": + return "2433"; // Hückelhoven + case "4": + return "2434"; // Wegberg + case "5": + return "2435"; // Erkelenz-Lövenich + case "6": + return "2436"; // Wegberg-Rödgen + default: + return ""; + } + } + + private static String fromNumber244(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2440"; // Nettersheim-Tondorf + case "1": + return "2441"; // Kall + case "3": + return "2443"; // Mechernich + case "4": + return "2444"; // Schleiden-Gemünd + case "5": + return "2445"; // Schleiden Eifel + case "6": + return "2446"; // Heimbach Eifel + case "7": + return "2447"; // Dahlem b Kall + case "8": + return "2448"; // Hellenthal-Rescheid + case "9": + return "2449"; // Blankenheim Ahr + default: + return ""; + } + } + + private static String fromNumber245(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2451"; // Geilenkirchen + case "2": + return "2452"; // Heinsberg Rheinl + case "3": + return "2453"; // Heinsberg-Randerath + case "4": + return "2454"; // Gangelt + case "5": + return "2455"; // Waldfeucht + case "6": + return "2456"; // Selfkant + default: + return ""; + } + } + + private static String fromNumber246(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2461"; // Jülich + case "2": + return "2462"; // Linnich + case "3": + return "2463"; // Titz + case "4": + return "2464"; // Aldenhoven b Jülich + case "5": + return "2465"; // Inden + default: + return ""; + } + } + + private static String fromNumber247(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2471"; // Roetgen Eifel + case "2": + return "2472"; // Monschau + case "3": + return "2473"; // Simmerath + case "4": + return "2474"; // Nideggen-Schmidt + default: + return ""; + } + } + + private static String fromNumber248(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2482"; // Hellenthal + case "4": + return "2484"; // Mechernich-Eiserfey + case "5": + return "2485"; // Schleiden-Dreiborn + case "6": + return "2486"; // Nettersheim + default: + return ""; + } + } + + private static String fromNumber25(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber250(number.substring(1)); + case "1": + return "251"; // Münster + case "2": + return fromNumber252(number.substring(1)); + case "3": + return fromNumber253(number.substring(1)); + case "4": + return fromNumber254(number.substring(1)); + case "5": + return fromNumber255(number.substring(1)); + case "6": + return fromNumber256(number.substring(1)); + case "7": + return fromNumber257(number.substring(1)); + case "8": + return fromNumber258(number.substring(1)); + case "9": + return fromNumber259(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber250(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2501"; // Münster-Hiltrup + case "2": + return "2502"; // Nottuln + case "4": + return "2504"; // Telgte + case "5": + return "2505"; // Altenberge Westf + case "6": + return "2506"; // Münster-Wolbeck + case "7": + return "2507"; // Havixbeck + case "8": + return "2508"; // Drensteinfurt + case "9": + return "2509"; // Nottuln-Appelhülsen + default: + return ""; + } + } + + private static String fromNumber252(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2520"; // Wadersloh-Diestedde + case "1": + return "2521"; // Beckum + case "2": + return "2522"; // Oelde + case "3": + return "2523"; // Wadersloh + case "4": + return "2524"; // Ennigerloh + case "5": + return "2525"; // Beckum-Neubeckum + case "6": + return "2526"; // Sendenhorst + case "7": + return "2527"; // Lippetal-Lippborg + case "8": + return "2528"; // Ennigerloh-Enniger + case "9": + return "2529"; // Oelde-Stromberg + default: + return ""; + } + } + + private static String fromNumber253(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2532"; // Ostbevern + case "3": + return "2533"; // Münster-Nienberge + case "4": + return "2534"; // Münster-Roxel + case "5": + return "2535"; // Sendenhorst-Albersloh + case "6": + return "2536"; // Münster-Albachten + case "8": + return "2538"; // Drensteinfurt-Rinkerode + default: + return ""; + } + } + + private static String fromNumber254(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2541"; // Coesfeld + case "2": + return "2542"; // Gescher + case "3": + return "2543"; // Billerbeck Westf + case "5": + return "2545"; // Rosendahl-Darfeld + case "6": + return "2546"; // Coesfeld-Lette + case "7": + return "2547"; // Rosendahl-Osterwick + case "8": + return "2548"; // Dülmen-Rorup + default: + return ""; + } + } + + private static String fromNumber255(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2551"; // Steinfurt-Burgsteinfurt + case "2": + return "2552"; // Steinfurt-Borghorst + case "3": + return "2553"; // Ochtrup + case "4": + return "2554"; // Laer Kr Steinfurt + case "5": + return "2555"; // Schöppingen + case "6": + return "2556"; // Metelen + case "7": + return "2557"; // Wettringen Kr Steinfurt + case "8": + return "2558"; // Horstmar + default: + return ""; + } + } + + private static String fromNumber256(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2561"; // Ahaus + case "2": + return "2562"; // Gronau Westfalen + case "3": + return "2563"; // Stadtlohn + case "4": + return "2564"; // Vreden + case "5": + return "2565"; // Gronau-Epe + case "6": + return "2566"; // Legden + case "7": + return "2567"; // Ahaus-Alstätte + case "8": + return "2568"; // Heek + default: + return ""; + } + } + + private static String fromNumber257(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2571"; // Greven Westf + case "2": + return "2572"; // Emsdetten + case "3": + return "2573"; // Nordwalde + case "4": + return "2574"; // Saerbeck + case "5": + return "2575"; // Greven-Reckenfeld + default: + return ""; + } + } + + private static String fromNumber258(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2581"; // Warendorf + case "2": + return "2582"; // Everswinkel + case "3": + return "2583"; // Sassenberg + case "4": + return "2584"; // Warendorf-Milte + case "5": + return "2585"; // Warendorf-Hoetmar + case "6": + return "2586"; // Beelen + case "7": + return "2587"; // Ennigerloh-Westkirchen + case "8": + return "2588"; // Harsewinkel-Greffen + default: + return ""; + } + } + + private static String fromNumber259(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2590"; // Dülmen-Buldern + case "1": + return "2591"; // Lüdinghausen + case "2": + return "2592"; // Selm + case "3": + return "2593"; // Ascheberg Westf + case "4": + return "2594"; // Dülmen + case "5": + return "2595"; // Olfen + case "6": + return "2596"; // Nordkirchen + case "7": + return "2597"; // Senden Westf + case "8": + return "2598"; // Senden-Ottmarsbocholt + case "9": + return "2599"; // Ascheberg-Herbern + default: + return ""; + } + } + + private static String fromNumber26(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber260(number.substring(1)); + case "1": + return "261"; // Koblenz a Rhein + case "2": + return fromNumber262(number.substring(1)); + case "3": + return fromNumber263(number.substring(1)); + case "4": + return fromNumber264(number.substring(1)); + case "5": + return fromNumber265(number.substring(1)); + case "6": + return fromNumber266(number.substring(1)); + case "7": + return fromNumber267(number.substring(1)); + case "8": + return fromNumber268(number.substring(1)); + case "9": + return fromNumber269(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber260(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2601"; // Nauort + case "2": + return "2602"; // Montabaur + case "3": + return "2603"; // Bad Ems + case "4": + return "2604"; // Nassau Lahn + case "5": + return "2605"; // Löf + case "6": + return "2606"; // Winningen Mosel + case "7": + return "2607"; // Kobern-Gondorf + case "8": + return "2608"; // Welschneudorf + default: + return ""; + } + } + + private static String fromNumber262(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2620"; // Neuhäusel Westerw + case "1": + return "2621"; // Lahnstein + case "2": + return "2622"; // Bendorf Rhein + case "3": + return "2623"; // Ransbach-Baumbach + case "4": + return "2624"; // Höhr-Grenzhausen + case "5": + return "2625"; // Ochtendung + case "6": + return "2626"; // Selters Westferwald + case "7": + return "2627"; // Braubach + case "8": + return "2628"; // Rhens + default: + return ""; + } + } + + private static String fromNumber263(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2630"; // Mülheim-Kärlich + case "1": + return "2631"; // Neuwied + case "2": + return "2632"; // Andernach + case "3": + return "2633"; // Brohl-Lützing + case "4": + return "2634"; // Rengsdorf + case "5": + return "2635"; // Rheinbrohl + case "6": + return "2636"; // Burgbrohl + case "7": + return "2637"; // Weissenthurm + case "8": + return "2638"; // Waldbreitbach + case "9": + return "2639"; // Anhausen Kr Neuwied + default: + return ""; + } + } + + private static String fromNumber264(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2641"; // Bad Neuenahr-Ahrweiler + case "2": + return "2642"; // Remagen + case "3": + return "2643"; // Altenahr + case "4": + return "2644"; // Linz am Rhein + case "5": + return "2645"; // Vettelschoss + case "6": + return "2646"; // Königsfeld Eifel + case "7": + return "2647"; // Kesseling + default: + return ""; + } + } + + private static String fromNumber265(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2651"; // Mayen + case "2": + return "2652"; // Mendig + case "3": + return "2653"; // Kaisersesch + case "4": + return "2654"; // Polch + case "5": + return "2655"; // Weibern + case "6": + return "2656"; // Virneburg + case "7": + return "2657"; // Uersfeld + default: + return ""; + } + } + + private static String fromNumber266(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2661"; // Bad Marienberg Westerwald + case "2": + return "2662"; // Hachenburg + case "3": + return "2663"; // Westerburg Westerw + case "4": + return "2664"; // Rennerod + case "6": + return "2666"; // Freilingen Westerw + case "7": + return "2667"; // Stein-Neukirch + default: + return ""; + } + } + + private static String fromNumber267(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2671"; // Cochem + case "2": + return "2672"; // Treis-Karden + case "3": + return "2673"; // Ellenz-Poltersdorf + case "4": + return "2674"; // Bad Bertrich + case "5": + return "2675"; // Ediger-Eller + case "6": + return "2676"; // Ulmen + case "7": + return "2677"; // Lutzerath + case "8": + return "2678"; // Büchel b Cochem + default: + return ""; + } + } + + private static String fromNumber268(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2680"; // Mündersbach + case "1": + return "2681"; // Altenkirchen Westerwald + case "2": + return "2682"; // Hamm Sieg + case "3": + return "2683"; // Asbach Westerw + case "4": + return "2684"; // Puderbach Westerw + case "5": + return "2685"; // Flammersfeld + case "6": + return "2686"; // Weyerbusch + case "7": + return "2687"; // Horhausen Westerwald + case "8": + return "2688"; // Kroppach + case "9": + return "2689"; // Dierdorf + default: + return ""; + } + } + + private static String fromNumber269(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2691"; // Adenau + case "2": + return "2692"; // Kelberg + case "3": + return "2693"; // Antweiler + case "4": + return "2694"; // Wershofen + case "5": + return "2695"; // Insul + case "6": + return "2696"; // Nohn Eifel + case "7": + return "2697"; // Blankenheim-Ahrhütte + default: + return ""; + } + } + + private static String fromNumber27(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "271"; // Siegen + case "2": + return fromNumber272(number.substring(1)); + case "3": + return fromNumber273(number.substring(1)); + case "4": + return fromNumber274(number.substring(1)); + case "5": + return fromNumber275(number.substring(1)); + case "6": + return fromNumber276(number.substring(1)); + case "7": + return fromNumber277(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber272(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2721"; // Lennestadt + case "2": + return "2722"; // Attendorn + case "3": + return "2723"; // Kirchhundem + case "4": + return "2724"; // Finnentrop-Serkenrode + case "5": + return "2725"; // Lennestadt-Oedingen + default: + return ""; + } + } + + private static String fromNumber273(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2732"; // Kreuztal + case "3": + return "2733"; // Hilchenbach + case "4": + return "2734"; // Freudenberg Westf + case "5": + return "2735"; // Neunkirchen Siegerl + case "6": + return "2736"; // Burbach Siegerl + case "7": + return "2737"; // Netphen-Deuz + case "8": + return "2738"; // Netphen + case "9": + return "2739"; // Wilnsdorf + default: + return ""; + } + } + + private static String fromNumber274(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2741"; // Betzdorf + case "2": + return "2742"; // Wissen + case "3": + return "2743"; // Daaden + case "4": + return "2744"; // Herdorf + case "5": + return "2745"; // Brachbach Sieg + case "7": + return "2747"; // Molzhain + default: + return ""; + } + } + + private static String fromNumber275(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2750"; // Diedenshausen + case "1": + return "2751"; // Bad Berleburg + case "2": + return "2752"; // Bad Laasphe + case "3": + return "2753"; // Erndtebrück + case "4": + return "2754"; // Bad Laasphe-Feudingen + case "5": + return "2755"; // Bad Berleburg-Schwarzenau + case "8": + return "2758"; // Bad Berleburg-Girkhausen + case "9": + return "2759"; // Bad Berleburg-Aue + default: + return ""; + } + } + + private static String fromNumber276(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2761"; // Olpe Biggesee + case "2": + return "2762"; // Wenden Südsauerland + case "3": + return "2763"; // Drolshagen-Bleche + case "4": + return "2764"; // Welschen Ennest + default: + return ""; + } + } + + private static String fromNumber277(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2770"; // Eschenburg + case "1": + return "2771"; // Dillenburg + case "2": + return "2772"; // Herborn Hess + case "3": + return "2773"; // Haiger + case "4": + return "2774"; // Dietzhölztal + case "5": + return "2775"; // Driedorf + case "6": + return "2776"; // Bad Endbach-Hartenrod + case "7": + return "2777"; // Breitscheid Hess + case "8": + return "2778"; // Siegbach + case "9": + return "2779"; // Greifenstein-Beilstein + default: + return ""; + } + } + + private static String fromNumber28(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber280(number.substring(1)); + case "1": + return "281"; // Wesel + case "2": + return fromNumber282(number.substring(1)); + case "3": + return fromNumber283(number.substring(1)); + case "4": + return fromNumber284(number.substring(1)); + case "5": + return fromNumber285(number.substring(1)); + case "6": + return fromNumber286(number.substring(1)); + case "7": + return fromNumber287(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber280(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2801"; // Xanten + case "2": + return "2802"; // Alpen + case "3": + return "2803"; // Wesel-Büderich + case "4": + return "2804"; // Xanten-Marienbaum + default: + return ""; + } + } + + private static String fromNumber282(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2821"; // Kleve Niederrhein + case "2": + return "2822"; // Emmerich + case "3": + return "2823"; // Goch + case "4": + return "2824"; // Kalkar + case "5": + return "2825"; // Uedem + case "6": + return "2826"; // Kranenburg Niederrhein + case "7": + return "2827"; // Goch-Hassum + case "8": + return "2828"; // Emmerich-Elten + default: + return ""; + } + } + + private static String fromNumber283(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2831"; // Geldern + case "2": + return "2832"; // Kevelaer + case "3": + return "2833"; // Kerken + case "4": + return "2834"; // Straelen + case "5": + return "2835"; // Issum + case "6": + return "2836"; // Wachtendonk + case "7": + return "2837"; // Weeze + case "8": + return "2838"; // Sonsbeck + case "9": + return "2839"; // Straelen-Herongen + default: + return ""; + } + } + + private static String fromNumber284(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2841"; // Moers + case "2": + return "2842"; // Kamp-Lintfort + case "3": + return "2843"; // Rheinberg + case "4": + return "2844"; // Rheinberg-Orsoy + case "5": + return "2845"; // Neukirchen-Vluyn + default: + return ""; + } + } + + private static String fromNumber285(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2850"; // Rees-Haldern + case "1": + return "2851"; // Rees + case "2": + return "2852"; // Hamminkeln + case "3": + return "2853"; // Schermbeck + case "5": + return "2855"; // Voerde Niederrhein + case "6": + return "2856"; // Hamminkeln-Brünen + case "7": + return "2857"; // Rees-Mehr + case "8": + return "2858"; // Hünxe + case "9": + return "2859"; // Wesel-Bislich + default: + return ""; + } + } + + private static String fromNumber286(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2861"; // Borken Westf + case "2": + return "2862"; // Südlohn + case "3": + return "2863"; // Velen + case "4": + return "2864"; // Reken + case "5": + return "2865"; // Raesfeld + case "6": + return "2866"; // Dorsten-Rhade + case "7": + return "2867"; // Heiden Kr Borken + default: + return ""; + } + } + + private static String fromNumber287(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2871"; // Bocholt + case "2": + return "2872"; // Rhede Westf + case "3": + return "2873"; // Isselburg-Werth + case "4": + return "2874"; // Isselburg + default: + return ""; + } + } + + private static String fromNumber29(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber290(number.substring(1)); + case "1": + return "291"; // Meschede + case "2": + return fromNumber292(number.substring(1)); + case "3": + return fromNumber293(number.substring(1)); + case "4": + return fromNumber294(number.substring(1)); + case "5": + return fromNumber295(number.substring(1)); + case "6": + return fromNumber296(number.substring(1)); + case "7": + return fromNumber297(number.substring(1)); + case "8": + return fromNumber298(number.substring(1)); + case "9": + return fromNumber299(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber290(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2902"; // Warstein + case "3": + return "2903"; // Meschede-Freienohl + case "4": + return "2904"; // Bestwig + case "5": + return "2905"; // Bestwig-Ramsbeck + default: + return ""; + } + } + + private static String fromNumber292(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2921"; // Soest + case "2": + return "2922"; // Werl + case "3": + return "2923"; // Lippetal-Herzfeld + case "4": + return "2924"; // Möhnesee + case "5": + return "2925"; // Warstein-Allagen + case "7": + return "2927"; // Neuengeseke + case "8": + return "2928"; // Soest-Ostönnen + default: + return ""; + } + } + + private static String fromNumber293(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2931"; // Arnsberg + case "2": + return "2932"; // Neheim-Hüsten + case "3": + return "2933"; // Sundern Sauerland + case "4": + return "2934"; // Sundern-Altenhellefeld + case "5": + return "2935"; // Sundern-Hachen + case "7": + return "2937"; // Arnsberg-Oeventrop + case "8": + return "2938"; // Ense + default: + return ""; + } + } + + private static String fromNumber294(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2941"; // Lippstadt + case "2": + return "2942"; // Geseke + case "3": + return "2943"; // Erwitte + case "4": + return "2944"; // Rietberg-Mastholte + case "5": + return "2945"; // Lippstadt-Benninghausen + case "7": + return "2947"; // Anröchte + case "8": + return "2948"; // Lippstadt-Rebbeke + default: + return ""; + } + } + + private static String fromNumber295(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2951"; // Büren + case "2": + return "2952"; // Rüthen + case "3": + return "2953"; // Wünnenberg + case "4": + return "2954"; // Rüthen-Oestereiden + case "5": + return "2955"; // Büren-Wewelsburg + case "7": + return "2957"; // Wünnenberg-Haaren + case "8": + return "2958"; // Büren-Harth + default: + return ""; + } + } + + private static String fromNumber296(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2961"; // Brilon + case "2": + return "2962"; // Olsberg + case "3": + return "2963"; // Brilon-Messinghausen + case "4": + return "2964"; // Brilon-Alme + default: + return ""; + } + } + + private static String fromNumber297(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2971"; // Schmallenberg-Dorlar + case "2": + return "2972"; // Schmallenberg + case "3": + return "2973"; // Eslohe Sauerland + case "4": + return "2974"; // Schmallenberg-Fredeburg + case "5": + return "2975"; // Schmallenberg-Oberkirchen + case "7": + return "2977"; // Schmallenberg-Bödefeld + default: + return ""; + } + } + + private static String fromNumber298(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2981"; // Winterberg Westf + case "2": + return "2982"; // Medebach + case "3": + return "2983"; // Winterberg-Siedlinghausen + case "4": + return "2984"; // Hallenberg + case "5": + return "2985"; // Winterberg-Niedersfeld + default: + return ""; + } + } + + private static String fromNumber299(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2991"; // Marsberg-Bredelar + case "2": + return "2992"; // Marsberg + case "3": + return "2993"; // Marsberg-Canstein + case "4": + return "2994"; // Marsberg-Westheim + default: + return ""; + } + } + + private static String fromNumber3(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "30"; // Berlin + case "3": + return fromNumber33(number.substring(1)); + case "4": + return fromNumber34(number.substring(1)); + case "5": + return fromNumber35(number.substring(1)); + case "6": + return fromNumber36(number.substring(1)); + case "7": + return fromNumber37(number.substring(1)); + case "8": + return fromNumber38(number.substring(1)); + case "9": + return fromNumber39(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber33(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber330(number.substring(1)); + case "1": + return "331"; // Potsdam + case "2": + return fromNumber332(number.substring(1)); + case "3": + return fromNumber333(number.substring(1)); + case "4": + return fromNumber334(number.substring(1)); + case "5": + return "335"; // Frankfurt (Oder) + case "6": + return fromNumber336(number.substring(1)); + case "7": + return fromNumber337(number.substring(1)); + case "8": + return fromNumber338(number.substring(1)); + case "9": + return fromNumber339(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber330(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3301"; // Oranienburg + case "2": + return "3302"; // Hennigsdorf + case "3": + return "3303"; // Birkenwerder + case "4": + return "3304"; // Velten + case "5": + return fromNumber3305(number.substring(1)); + case "6": + return "3306"; // Gransee + case "7": + return "3307"; // Zehdenick + case "8": + return fromNumber3308(number.substring(1)); + case "9": + return fromNumber3309(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3305(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33051"; // Nassenheide + case "2": + return "33052"; // Leegebruch + case "3": + return "33053"; // Zehlendorf Kr Oberhavel + case "4": + return "33054"; // Liebenwalde + case "5": + return "33055"; // Kremmen + case "6": + return "33056"; // Mühlenbeck Kr Oberhavel + default: + return ""; + } + } + + private static String fromNumber3308(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33080"; // Marienthal Kr Oberhavel + case "2": + return "33082"; // Menz Kr Oberhavel + case "3": + return "33083"; // Schulzendorf Kr Oberhavel + case "4": + return "33084"; // Gutengermendorf + case "5": + return "33085"; // Seilershof + case "6": + return "33086"; // Grieben Kr Oberhavel + case "7": + return "33087"; // Bredereiche + case "8": + return "33088"; // Falkenthal + case "9": + return "33089"; // Himmelpfort + default: + return ""; + } + } + + private static String fromNumber3309(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "33093"; // Fürstenberg Havel + case "4": + return "33094"; // Löwenberg + default: + return ""; + } + } + + private static String fromNumber332(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3320(number.substring(1)); + case "1": + return "3321"; // Nauen Brandenb + case "2": + return "3322"; // Falkensee + case "3": + return fromNumber3323(number.substring(1)); + case "7": + return "3327"; // Werder Havel + case "8": + return "3328"; // Teltow + case "9": + return "3329"; // Stahnsdorf + default: + return ""; + } + } + + private static String fromNumber3320(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33200"; // Bergholz-Rehbrücke + case "1": + return "33201"; // Gross Glienicke + case "2": + return "33202"; // Töplitz + case "3": + return "33203"; // Kleinmachnow + case "4": + return "33204"; // Beelitz Mark + case "5": + return "33205"; // Michendorf + case "6": + return "33206"; // Fichtenwalde + case "7": + return "33207"; // Gross Kreutz + case "8": + return "33208"; // Fahrland + case "9": + return "33209"; // Caputh + default: + return ""; + } + } + + private static String fromNumber3323(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33230"; // Börnicke Kr Havelland + case "1": + return "33231"; // Pausin + case "2": + return "33232"; // Brieselang + case "3": + return "33233"; // Ketzin + case "4": + return "33234"; // Wustermark + case "5": + return "33235"; // Friesack + case "7": + return "33237"; // Paulinenaue + case "8": + return "33238"; // Senzke + case "9": + return "33239"; // Gross Behnitz + default: + return ""; + } + } + + private static String fromNumber333(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3331"; // Angermünde + case "2": + return "3332"; // Schwedt/Oder + case "3": + return fromNumber3333(number.substring(1)); + case "4": + return "3334"; // Eberswalde + case "5": + return "3335"; // Finowfurt + case "6": + return fromNumber3336(number.substring(1)); + case "7": + return "3337"; // Biesenthal Brandenb + case "8": + return "3338"; // Bernau Brandenb + case "9": + return fromNumber3339(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3333(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33331"; // Casekow + case "2": + return "33332"; // Gartz Oder + case "3": + return "33333"; // Tantow + case "4": + return "33334"; // Greiffenberg + case "5": + return "33335"; // Pinnow Kr Uckermark + case "6": + return "33336"; // Passow Kr Uckermark + case "7": + return "33337"; // Altkünkendorf + case "8": + return "33338"; // Stolpe/Oder + default: + return ""; + } + } + + private static String fromNumber3336(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33361"; // Joachimsthal + case "2": + return "33362"; // Liepe Kr Barnim + case "3": + return "33363"; // Altenhof Kr Barnim + case "4": + return "33364"; // Gross Ziethen Kr Barnim + case "5": + return "33365"; // Lüdersdorf Kr Barnim + case "6": + return "33366"; // Chorin + case "7": + return "33367"; // Friedrichswalde Brandenb + case "8": + return "33368"; // Hohensaaten + case "9": + return "33369"; // Oderberg + default: + return ""; + } + } + + private static String fromNumber3339(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "33393"; // Gross Schönebeck Kr Barnim + case "4": + return "33394"; // Blumberg Kr Barnim + case "5": + return "33395"; // Zerpenschleuse + case "6": + return "33396"; // Klosterfelde + case "7": + return "33397"; // Wandlitz + case "8": + return "33398"; // Werneuchen + default: + return ""; + } + } + + private static String fromNumber334(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3341"; // Strausberg + case "2": + return "3342"; // Neuenhagen b Berlin + case "3": + return fromNumber3343(number.substring(1)); + case "4": + return "3344"; // Bad Freienwalde + case "5": + return fromNumber3345(number.substring(1)); + case "6": + return "3346"; // Seelow + case "7": + return fromNumber3347(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3343(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33432"; // Müncheberg + case "3": + return "33433"; // Buckow Märk Schweiz + case "4": + return "33434"; // Herzfelde b Strausberg + case "5": + return "33435"; // Rehfelde + case "6": + return "33436"; // Prötzel + case "7": + return "33437"; // Reichenberg b Strausberg + case "8": + return "33438"; // Altlandsberg + case "9": + return "33439"; // Fredersdorf-Vogelsdorf + default: + return ""; + } + } + + private static String fromNumber3345(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33451"; // Heckelberg + case "2": + return "33452"; // Neulewin + case "4": + return "33454"; // Wölsickendorf/Wollenberg + case "6": + return "33456"; // Wriezen + case "7": + return "33457"; // Altreetz + case "8": + return "33458"; // Falkenberg Mark + default: + return ""; + } + } + + private static String fromNumber3347(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33470"; // Lietzen + case "2": + return "33472"; // Golzow b Seelow + case "3": + return "33473"; // Zechin + case "4": + return "33474"; // Neutrebbin + case "5": + return "33475"; // Letschin + case "6": + return "33476"; // Neuhardenberg + case "7": + return "33477"; // Trebnitz b Müncheberg + case "8": + return "33478"; // Gross Neuendorf + case "9": + return "33479"; // Küstrin-Kietz + default: + return ""; + } + } + + private static String fromNumber336(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3360(number.substring(1)); + case "1": + return "3361"; // Fürstenwalde Spree + case "2": + return "3362"; // Erkner + case "3": + return fromNumber3363(number.substring(1)); + case "4": + return "3364"; // Eisenhüttenstadt + case "5": + return fromNumber3365(number.substring(1)); + case "6": + return "3366"; // Beeskow + case "7": + return fromNumber3367(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3360(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33601"; // Podelzig + case "2": + return "33602"; // Alt Zeschdorf + case "3": + return "33603"; // Falkenhagen b Seelow + case "4": + return "33604"; // Lebus + case "5": + return "33605"; // Boossen + case "6": + return "33606"; // Müllrose + case "7": + return "33607"; // Briesen Mark + case "8": + return "33608"; // Jacobsdorf Mark + case "9": + return "33609"; // Brieskow-Finkenheerd + default: + return ""; + } + } + + private static String fromNumber3363(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33631"; // Bad Saarow-Pieskow + case "2": + return "33632"; // Hangelsberg + case "3": + return "33633"; // Spreenhagen + case "4": + return "33634"; // Berkenbrück Kr Oder-Spree + case "5": + return "33635"; // Arensdorf Kr Oder-Spree + case "6": + return "33636"; // Steinhöfel Kr Oder-Spree + case "7": + return "33637"; // Beerfelde + case "8": + return "33638"; // Rüdersdorf b Berlin + default: + return ""; + } + } + + private static String fromNumber3365(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33652"; // Neuzelle + case "3": + return "33653"; // Ziltendorf + case "4": + return "33654"; // Fünfeichen + case "5": + return "33655"; // Grunow Kr Oder-Spree + case "6": + return "33656"; // Bahro + case "7": + return "33657"; // Steinsdorf Brandenb + default: + return ""; + } + } + + private static String fromNumber3367(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33671"; // Lieberose + case "2": + return "33672"; // Pfaffendorfb Beeskow + case "3": + return "33673"; // Weichensdorf + case "4": + return "33674"; // Trebatsch + case "5": + return "33675"; // Tauche + case "6": + return "33676"; // Friedland b Beeskow + case "7": + return "33677"; // Glienicke b Beeskow + case "8": + return "33678"; // Storkow Mark + case "9": + return "33679"; // Wendisch Rietz + default: + return ""; + } + } + + private static String fromNumber337(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3370(number.substring(1)); + case "1": + return "3371"; // Luckenwalde + case "2": + return "3372"; // Jüterbog + case "3": + return fromNumber3373(number.substring(1)); + case "4": + return fromNumber3374(number.substring(1)); + case "5": + return "3375"; // Königs Wusterhausen + case "6": + return fromNumber3376(number.substring(1)); + case "7": + return "3377"; // Zossen Brandenb + case "8": + return "3378"; // Ludwigsfelde + case "9": + return "3379"; // Mahlow + default: + return ""; + } + } + + private static String fromNumber3370(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33701"; // Grossbeeren + case "2": + return "33702"; // Wünsdorf + case "3": + return "33703"; // Sperenberg + case "4": + return "33704"; // Baruth Mark + case "8": + return "33708"; // Rangsdorf + default: + return ""; + } + } + + private static String fromNumber3373(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33731"; // Trebbin + case "2": + return "33732"; // Hennickendorf b Luckenwalde + case "3": + return "33733"; // Stülpe + case "4": + return "33734"; // Felgentreu + default: + return ""; + } + } + + private static String fromNumber3374(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33741"; // Niedergörsdorf + case "2": + return "33742"; // Oehna Brandenb + case "3": + return "33743"; // Blönsdorf + case "4": + return "33744"; // Hohenseefeld + case "5": + return "33745"; // Petkus + case "6": + return "33746"; // Werbig b Jüterbog + case "7": + return "33747"; // Marzahna + case "8": + return "33748"; // Treuenbrietzen + default: + return ""; + } + } + + private static String fromNumber3376(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33760"; // Münchehofe Kr Dahme-Spreewald + case "2": + return "33762"; // Zeuthen + case "3": + return "33763"; // Bestensee + case "4": + return "33764"; // Mittenwalde Mark + case "5": + return "33765"; // Märkisch Buchholz + case "6": + return "33766"; // Teupitz + case "7": + return "33767"; // Friedersdorf b Berlin + case "8": + return "33768"; // Prieros + case "9": + return "33769"; // Töpchin + default: + return ""; + } + } + + private static String fromNumber338(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3381"; // Brandenburg an der Havel + case "2": + return "3382"; // Lehnin + case "3": + return fromNumber3383(number.substring(1)); + case "4": + return fromNumber3384(number.substring(1)); + case "5": + return "3385"; // Rathenow + case "6": + return "3386"; // Premnitz + case "7": + return fromNumber3387(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3383(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33830"; // Ziesar + case "1": + return "33831"; // Weseram + case "2": + return "33832"; // Rogäsen + case "3": + return "33833"; // Wollin b Brandenburg + case "4": + return "33834"; // Pritzerbe + case "5": + return "33835"; // Golzow b Brandenburg + case "6": + return "33836"; // Butzow b Brandenburg + case "7": + return "33837"; // Brielow + case "8": + return "33838"; // Päwesin + case "9": + return "33839"; // Wusterwitz + default: + return ""; + } + } + + private static String fromNumber3384(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33841"; // Belzig + case "3": + return "33843"; // Niemegk + case "4": + return "33844"; // Brück Brandenb + case "5": + return "33845"; // Borkheide + case "6": + return "33846"; // Dippmannsdorf + case "7": + return "33847"; // Görzke + case "8": + return "33848"; // Raben + case "9": + return "33849"; // Wiesenburg Mark + default: + return ""; + } + } + + private static String fromNumber3387(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33870"; // Zollchow b Rathenow + case "2": + return "33872"; // Hohennauen + case "3": + return "33873"; // Grosswudicke + case "4": + return "33874"; // Stechow Brandenb + case "5": + return "33875"; // Rhinow + case "6": + return "33876"; // Buschow + case "7": + return "33877"; // Nitzahn + case "8": + return "33878"; // Nennhausen + default: + return ""; + } + } + + private static String fromNumber339(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3391"; // Neuruppin + case "2": + return fromNumber3392(number.substring(1)); + case "3": + return fromNumber3393(number.substring(1)); + case "4": + return "3394"; // Wittstock Dosse + case "5": + return "3395"; // Pritzwalk + case "6": + return fromNumber3396(number.substring(1)); + case "7": + return fromNumber3397(number.substring(1)); + case "8": + return fromNumber3398(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3392(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33920"; // Walsleben b Neuruppin + case "1": + return "33921"; // Zechlinerhütte + case "2": + return "33922"; // Karwesee + case "3": + return "33923"; // Flecken Zechlin + case "4": + return "33924"; // Rägelin + case "5": + return "33925"; // Wustrau-Altfriesack + case "6": + return "33926"; // Herzberg Mark + case "7": + return "33927"; // Linum + case "8": + return "33928"; // Wildberg Brandenb + case "9": + return "33929"; // Gühlen-Glienicke + default: + return ""; + } + } + + private static String fromNumber3393(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33931"; // Rheinsberg Mark + case "2": + return "33932"; // Fehrbellin + case "3": + return "33933"; // Lindow Mark + default: + return ""; + } + } + + private static String fromNumber3396(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33962"; // Heiligengrabe + case "3": + return "33963"; // Wulfersdorf b Wittstock + case "4": + return "33964"; // Fretzdorf + case "5": + return "33965"; // Herzsprung b Wittstock + case "6": + return "33966"; // Dranse + case "7": + return "33967"; // Freyenstein + case "8": + return "33968"; // Meyenburg Kr Prignitz + case "9": + return "33969"; // Stepenitz + default: + return ""; + } + } + + private static String fromNumber3397(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33970"; // Neustadt Dosse + case "1": + return "33971"; // Kyritz Brandenb + case "2": + return "33972"; // Breddin + case "3": + return "33973"; // Zernitz b Neustadt Dosse + case "4": + return "33974"; // Dessow + case "5": + return "33975"; // Dannenwalde Kr Prignitz + case "6": + return "33976"; // Wutike + case "7": + return "33977"; // Gumtow + case "8": + return "33978"; // Segeletz + case "9": + return "33979"; // Wusterhausen Dosse + default: + return ""; + } + } + + private static String fromNumber3398(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33981"; // Putlitz + case "2": + return "33982"; // Hoppenrade Kr Prignitz + case "3": + return "33983"; // Gross Pankow Kr Prignitz + case "4": + return "33984"; // Blumenthal b Pritzwalk + case "6": + return "33986"; // Falkenhagen Kr Prignitz + case "9": + return "33989"; // Sadenbeck + default: + return ""; + } + } + + private static String fromNumber34(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "340"; // Dessau Anh + case "1": + return "341"; // Leipzig + case "2": + return fromNumber342(number.substring(1)); + case "3": + return fromNumber343(number.substring(1)); + case "4": + return fromNumber344(number.substring(1)); + case "5": + return "345"; // Halle Saale + case "6": + return fromNumber346(number.substring(1)); + case "7": + return fromNumber347(number.substring(1)); + case "9": + return fromNumber349(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber342(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3420(number.substring(1)); + case "1": + return "3421"; // Torgau + case "2": + return fromNumber3422(number.substring(1)); + case "3": + return "3423"; // Eilenburg + case "4": + return fromNumber3424(number.substring(1)); + case "5": + return "3425"; // Wurzen + case "6": + return fromNumber3426(number.substring(1)); + case "9": + return fromNumber3429(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3420(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34202"; // Delitzsch + case "3": + return "34203"; // Zwenkau + case "4": + return "34204"; // Schkeuditz + case "5": + return "34205"; // Markranstädt + case "6": + return "34206"; // Rötha + case "7": + return "34207"; // Zwochau + case "8": + return "34208"; // Löbnitz B Delitzsch + default: + return ""; + } + } + + private static String fromNumber3422(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34221"; // Schildau Gneisenaustadt + case "2": + return "34222"; // Arzberg b Torgau + case "3": + return "34223"; // Dommitzsch + case "4": + return "34224"; // Belgern Sachs + default: + return ""; + } + } + + private static String fromNumber3424(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34241"; // Jesewitz + case "2": + return "34242"; // Hohenpriessnitz + case "3": + return "34243"; // Bad Düben + case "4": + return "34244"; // Mockrehna + default: + return ""; + } + } + + private static String fromNumber3426(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34261"; // Kühren b Wurzen + case "2": + return "34262"; // Falkenhain b Wurzen + case "3": + return "34263"; // Hohburg + default: + return ""; + } + } + + private static String fromNumber3429(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34291"; // Borsdorf + case "2": + return "34292"; // Brandis b Wurzen + case "3": + return "34293"; // Naunhof b Grimma + case "4": + return "34294"; // Rackwitz + case "5": + return "34295"; // Krensitz + case "6": + return "34296"; // Groitzsch b Pegau + case "7": + return "34297"; // Liebertwolkwitz + case "8": + return "34298"; // Taucha b Leipzig + case "9": + return "34299"; // Gaschwitz + default: + return ""; + } + } + + private static String fromNumber343(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3431"; // Döbeln + case "2": + return fromNumber3432(number.substring(1)); + case "3": + return "3433"; // Borna Stadt + case "4": + return fromNumber3434(number.substring(1)); + case "5": + return "3435"; // Oschatz + case "6": + return fromNumber3436(number.substring(1)); + case "7": + return "3437"; // Grimma + case "8": + return fromNumber3438(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3432(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34321"; // Leisnig + case "2": + return "34322"; // Rosswein + case "4": + return "34324"; // Ostrau Sachs + case "5": + return "34325"; // Mochau-Lüttewitz + case "7": + return "34327"; // Waldheim Sachs + case "8": + return "34328"; // Hartha b Döbeln + default: + return ""; + } + } + + private static String fromNumber3434(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34341"; // Geithain + case "2": + return "34342"; // Neukieritzsch + case "3": + return "34343"; // Regis-Breitingen + case "4": + return "34344"; // Kohren-Sahlis + case "5": + return "34345"; // Bad Lausick + case "6": + return "34346"; // Narsdorf + case "7": + return "34347"; // Oelzschau b Borna + case "8": + return "34348"; // Frohburg + default: + return ""; + } + } + + private static String fromNumber3436(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34361"; // Dahlen Sachs + case "2": + return "34362"; // Mügeln b Oschatz + case "3": + return "34363"; // Cavertitz + case "4": + return "34364"; // Wermsdorf + default: + return ""; + } + } + + private static String fromNumber3438(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34381"; // Colditz + case "2": + return "34382"; // Nerchau + case "3": + return "34383"; // Trebsen Mulde + case "4": + return "34384"; // Grossbothen + case "5": + return "34385"; // Mutzschen + case "6": + return "34386"; // Dürrweitzschen B Grimma + default: + return ""; + } + } + + private static String fromNumber344(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3441"; // Zeitz + case "2": + return fromNumber3442(number.substring(1)); + case "3": + return "3443"; // Weissenfels Sachs-Anh + case "4": + return fromNumber3444(number.substring(1)); + case "5": + return "3445"; // Naumburg Saale + case "6": + return fromNumber3446(number.substring(1)); + case "7": + return "3447"; // Altenburg Thür + case "8": + return "3448"; // Meuselwitz Thür + case "9": + return fromNumber3449(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3442(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34422"; // Osterfeld + case "3": + return "34423"; // Heuckewalde + case "4": + return "34424"; // Reuden b Zeitz + case "5": + return "34425"; // Droyssig + case "6": + return "34426"; // Kayna + default: + return ""; + } + } + + private static String fromNumber3444(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34441"; // Hohenmölsen + case "3": + return "34443"; // Teuchern + case "4": + return "34444"; // Lützen + case "5": + return "34445"; // Stößen + case "6": + return "34446"; // Grosskorbetha + default: + return ""; + } + } + + private static String fromNumber3446(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34461"; // Nebra Unstrut + case "2": + return "34462"; // Laucha Unstrut + case "3": + return "34463"; // Bad Kösen + case "4": + return "34464"; // Freyburg Unstrut + case "5": + return "34465"; // Bad Bibra + case "6": + return "34466"; // Janisroda + case "7": + return "34467"; // Eckartsberga + default: + return ""; + } + } + + private static String fromNumber3449(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34491"; // Schmölln Thür + case "2": + return "34492"; // Lucka + case "3": + return "34493"; // Gößnitz Thür + case "4": + return "34494"; // Ehrenhain + case "5": + return "34495"; // Dobitschen + case "6": + return "34496"; // Nöbdenitz + case "7": + return "34497"; // Langenleuba-Niederhain + case "8": + return "34498"; // Rositz + default: + return ""; + } + } + + private static String fromNumber346(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3460(number.substring(1)); + case "1": + return "3461"; // Merseburg Saale + case "2": + return "3462"; // Bad Dürrenberg + case "3": + return fromNumber3463(number.substring(1)); + case "4": + return "3464"; // Sangerhausen + case "5": + return fromNumber3465(number.substring(1)); + case "6": + return "3466"; // Artern Unstrut + case "7": + return fromNumber3467(number.substring(1)); + case "9": + return fromNumber3469(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3460(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "34600"; // Ostrau Saalkreis + case "1": + return "34601"; // Teutschenthal + case "2": + return "34602"; // Landsberg Sachs-Anh + case "3": + return "34603"; // Nauendorf Sachs-Anh + case "4": + return "34604"; // Niemberg + case "5": + return "34605"; // Gröbers + case "6": + return "34606"; // Teicha Sachs-Anh + case "7": + return "34607"; // Wettin + case "9": + return "34609"; // Salzmünde + default: + return ""; + } + } + + private static String fromNumber3463(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34632"; // Mücheln Geiseltal + case "3": + return "34633"; // Braunsbedra + case "5": + return "34635"; // Bad Lauchstädt + case "6": + return "34636"; // Schafstädt + case "7": + return "34637"; // Frankleben + case "8": + return "34638"; // Zöschen + case "9": + return "34639"; // Wallendorf Luppe + default: + return ""; + } + } + + private static String fromNumber3465(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34651"; // Rossla + case "2": + return "34652"; // Allstedt + case "3": + return "34653"; // Rottleberode + case "4": + return "34654"; // Stolberg Harz + case "6": + return "34656"; // Wallhausen Sachs-Anh + case "8": + return "34658"; // Hayn Harz + case "9": + return "34659"; // Blankenheim b Sangerhausen + default: + return ""; + } + } + + private static String fromNumber3467(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34671"; // Bad Frankenhausen Kyffhäuser + case "2": + return "34672"; // Rossleben + case "3": + return "34673"; // Heldrungen + default: + return ""; + } + } + + private static String fromNumber3469(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34691"; // Könnern + case "2": + return "34692"; // Alsleben Saale + default: + return ""; + } + } + + private static String fromNumber347(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3471"; // Bernburg Saale + case "2": + return fromNumber3472(number.substring(1)); + case "3": + return "3473"; // Aschersleben Sachs-Anh + case "4": + return fromNumber3474(number.substring(1)); + case "5": + return "3475"; // Lutherstadt Eisleben + case "6": + return "3476"; // Hettstedt Sachs-Anh + case "7": + return fromNumber3477(number.substring(1)); + case "8": + return fromNumber3478(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3472(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34721"; // Nienburg Saale + case "2": + return "34722"; // Preusslitz + default: + return ""; + } + } + + private static String fromNumber3474(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34741"; // Frose + case "2": + return "34742"; // Sylda + case "3": + return "34743"; // Ermsleben + case "5": + return "34745"; // Winningen Sachs-Anh + case "6": + return "34746"; // Giersleben + default: + return ""; + } + } + + private static String fromNumber3477(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34771"; // Querfurt + case "2": + return "34772"; // Helbra + case "3": + return "34773"; // Schwittersdorf + case "4": + return "34774"; // Röblingen am See + case "5": + return "34775"; // Wippra + case "6": + return "34776"; // Rothenschirmbach + case "9": + return "34779"; // Abberode + default: + return ""; + } + } + + private static String fromNumber3478(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34781"; // Greifenhagen + case "2": + return "34782"; // Mansfeld Südharz + case "3": + return "34783"; // Gerbstedt + case "5": + return "34785"; // Sandersleben + default: + return ""; + } + } + + private static String fromNumber349(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3490(number.substring(1)); + case "1": + return "3491"; // Lutherstadt Wittenberg + case "2": + return fromNumber3492(number.substring(1)); + case "3": + return "3493"; // Bitterfeld + case "4": + return "3494"; // Wolfen + case "5": + return fromNumber3495(number.substring(1)); + case "6": + return "3496"; // Köthen Anhalt + case "7": + return fromNumber3497(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3490(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34901"; // Roßlau Elbe + case "3": + return "34903"; // Coswig Anhalt + case "4": + return "34904"; // Oranienbaum + case "5": + return "34905"; // Wörlitz + case "6": + return "34906"; // Raguhn + case "7": + return "34907"; // Jeber-Bergfrieden + case "9": + return "34909"; // Aken Elbe + default: + return ""; + } + } + + private static String fromNumber3492(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "34920"; // Kropstädt + case "1": + return "34921"; // Kemberg + case "2": + return "34922"; // Mühlanger + case "3": + return "34923"; // Cobbelsdorf + case "4": + return "34924"; // Zahna + case "5": + return "34925"; // Bad Schmiedeberg + case "6": + return "34926"; // Pretzsch Elbe + case "7": + return "34927"; // Globig-Bleddin + case "8": + return "34928"; // Seegrehna + case "9": + return "34929"; // Straach + default: + return ""; + } + } + + private static String fromNumber3495(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "34953"; // Gräfenhainichen + case "4": + return "34954"; // Roitzsch b Bitterfeld + case "5": + return "34955"; // Gossa + case "6": + return "34956"; // Zörbig + default: + return ""; + } + } + + private static String fromNumber3497(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "34973"; // Osternienburg + case "5": + return "34975"; // Görzig Kr Köthen + case "6": + return "34976"; // Gröbzig + case "7": + return "34977"; // Quellendorf + case "8": + return "34978"; // Radegast Kr Köthen + case "9": + return "34979"; // Wulfen Sachs-Anh + default: + return ""; + } + } + + private static String fromNumber35(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber350(number.substring(1)); + case "1": + return "351"; // Dresden + case "2": + return fromNumber352(number.substring(1)); + case "3": + return fromNumber353(number.substring(1)); + case "4": + return fromNumber354(number.substring(1)); + case "5": + return "355"; // Cottbus + case "6": + return fromNumber356(number.substring(1)); + case "7": + return fromNumber357(number.substring(1)); + case "8": + return fromNumber358(number.substring(1)); + case "9": + return fromNumber359(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber350(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3501"; // Pirna + case "2": + return fromNumber3502(number.substring(1)); + case "3": + return fromNumber3503(number.substring(1)); + case "4": + return "3504"; // Dippoldiswalde + case "5": + return fromNumber3505(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35020"; // Struppen + case "1": + return "35021"; // Königstein Sächs Schweiz + case "2": + return "35022"; // Bad Schandau + case "3": + return "35023"; // Bad Gottleuba + case "4": + return "35024"; // Stadt Wehlen + case "5": + return "35025"; // Liebstadt + case "6": + return "35026"; // Dürrröhrsdorf-Dittersbach + case "7": + return "35027"; // Weesenstein + case "8": + return "35028"; // Krippen + default: + return ""; + } + } + + private static String fromNumber3503(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35032"; // Langenhennersdorf + case "3": + return "35033"; // Rosenthal Sächs Schweiz + default: + return ""; + } + } + + private static String fromNumber3505(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35052"; // Kipsdorf Kurort + case "3": + return "35053"; // Glashütte Sachs + case "4": + return "35054"; // Lauenstein Sachs + case "5": + return "35055"; // Höckendorf b Dippoldiswalde + case "6": + return "35056"; // Altenberg Sachs + case "7": + return "35057"; // Hermsdorf Erzgeb + case "8": + return "35058"; // Pretzschendorf + default: + return ""; + } + } + + private static String fromNumber352(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3520(number.substring(1)); + case "1": + return "3521"; // Meissen + case "2": + return "3522"; // Grossenhain Sachs + case "3": + return "3523"; // Coswig b Dresden + case "4": + return fromNumber3524(number.substring(1)); + case "5": + return "3525"; // Riesa + case "6": + return fromNumber3526(number.substring(1)); + case "8": + return "3528"; // Radeberg + case "9": + return "3529"; // Heidenau Sachs + default: + return ""; + } + } + + private static String fromNumber3520(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35200"; // Arnsdorf b Dresden + case "1": + return "35201"; // Langebrück + case "2": + return "35202"; // Klingenberg Sachs + case "3": + return "35203"; // Tharandt + case "4": + return "35204"; // Wilsdruff + case "5": + return "35205"; // Ottendorf-Okrilla + case "6": + return "35206"; // Kreischa b Dresden + case "7": + return "35207"; // Moritzburg + case "8": + return "35208"; // Radeburg + case "9": + return "35209"; // Mohorn + default: + return ""; + } + } + + private static String fromNumber3524(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35240"; // Tauscha b Großenhain + case "1": + return "35241"; // Lommatzsch + case "2": + return "35242"; // Nossen + case "3": + return "35243"; // Weinböhla + case "4": + return "35244"; // Krögis + case "5": + return "35245"; // Burkhardswalde-Munzig + case "6": + return "35246"; // Ziegenhain Sachs + case "7": + return "35247"; // Zehren Sachs + case "8": + return "35248"; // Schönfeld b Großenhain + case "9": + return "35249"; // Basslitz + default: + return ""; + } + } + + private static String fromNumber3526(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35263"; // Gröditz b Riesa + case "4": + return "35264"; // Strehla + case "5": + return "35265"; // Glaubitz + case "6": + return "35266"; // Heyda b Riesa + case "7": + return "35267"; // Diesbar-Seusslitz + case "8": + return "35268"; // Stauchitz + default: + return ""; + } + } + + private static String fromNumber353(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3531"; // Finsterwalde + case "2": + return fromNumber3532(number.substring(1)); + case "3": + return "3533"; // Elsterwerda + case "4": + return fromNumber3534(number.substring(1)); + case "5": + return "3535"; // Herzberg Elster + case "6": + return fromNumber3536(number.substring(1)); + case "7": + return "3537"; // Jessen Elster + case "8": + return fromNumber3538(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3532(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35322"; // Doberlug-Kirchhain + case "3": + return "35323"; // Sonnewalde + case "4": + return "35324"; // Crinitz + case "5": + return "35325"; // Rückersdorf b Finsterwalde + case "6": + return "35326"; // Schönborn Kr Elbe-Elster + case "7": + return "35327"; // Priessen + case "9": + return "35329"; // Dollenchen + default: + return ""; + } + } + + private static String fromNumber3534(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35341"; // Bad Liebenwerda + case "2": + return "35342"; // Mühlberg Elbe + case "3": + return "35343"; // Hirschfeld b Elsterwerda + default: + return ""; + } + } + + private static String fromNumber3536(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35361"; // Schlieben + case "2": + return "35362"; // Schönewalde b Herzberg + case "3": + return "35363"; // Fermerswalde + case "4": + return "35364"; // Lebusa + case "5": + return "35365"; // Falkenberg Elster + default: + return ""; + } + } + + private static String fromNumber3538(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35383"; // Elster Elbe + case "4": + return "35384"; // Steinsdorf b Jessen + case "5": + return "35385"; // Annaburg + case "6": + return "35386"; // Prettin + case "7": + return "35387"; // Seyda + case "8": + return "35388"; // Klöden + case "9": + return "35389"; // Holzdorf Elster + default: + return ""; + } + } + + private static String fromNumber354(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3541"; // Calau + case "2": + return "3542"; // Lübbenau Spreewald + case "3": + return fromNumber3543(number.substring(1)); + case "4": + return "3544"; // Luckau Brandenb + case "5": + return fromNumber3545(number.substring(1)); + case "6": + return "3546"; // Lübben Spreewald + case "7": + return fromNumber3547(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3543(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35433"; // Vetschau + case "4": + return "35434"; // Altdöbern + case "5": + return "35435"; // Gollmitz b Calau + case "6": + return "35436"; // Laasow b Calau + case "9": + return "35439"; // Zinnitz + default: + return ""; + } + } + + private static String fromNumber3545(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35451"; // Dahme Brandenb + case "2": + return "35452"; // Golssen + case "3": + return "35453"; // Drahnsdorf + case "4": + return "35454"; // Uckro + case "5": + return "35455"; // Walddrehna + case "6": + return "35456"; // Terpt + default: + return ""; + } + } + + private static String fromNumber3547(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35471"; // Birkenhainchen + case "2": + return "35472"; // Schlepzig + case "3": + return "35473"; // Neu Lübbenau + case "4": + return "35474"; // Schönwalde b Lübben + case "5": + return "35475"; // Straupitz + case "6": + return "35476"; // Wittmannsdorf-Bückchen + case "7": + return "35477"; // Rietzneuendorf-Friedrichshof + case "8": + return "35478"; // Goyatz + default: + return ""; + } + } + + private static String fromNumber356(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3560(number.substring(1)); + case "1": + return "3561"; // Guben + case "2": + return "3562"; // Forst Lausitz + case "3": + return "3563"; // Spremberg + case "4": + return "3564"; // Schwarze Pumpe + case "9": + return fromNumber3569(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3560(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35600"; // Döbern NL + case "1": + return "35601"; // Peitz + case "2": + return "35602"; // Drebkau + case "3": + return "35603"; // Burg Spreewald + case "4": + return "35604"; // Krieschow + case "5": + return "35605"; // Komptendorf + case "6": + return "35606"; // Briesen b Cottbus + case "7": + return "35607"; // Jänschwalde + case "8": + return "35608"; // Gross Ossnig + case "9": + return "35609"; // Drachhausen + default: + return ""; + } + } + + private static String fromNumber3569(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35691"; // Bärenklau NL + case "2": + return "35692"; // Kerkwitz + case "3": + return "35693"; // Lauschütz + case "4": + return "35694"; // Gosda b Klinge + case "5": + return "35695"; // Simmersdorf + case "6": + return "35696"; // Briesnig + case "7": + return "35697"; // Bagenz + case "8": + return "35698"; // Hornow + default: + return ""; + } + } + + private static String fromNumber357(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3571"; // Hoyerswerda + case "2": + return fromNumber3572(number.substring(1)); + case "3": + return "3573"; // Senftenberg + case "4": + return "3574"; // Lauchhammer + case "5": + return fromNumber3575(number.substring(1)); + case "6": + return "3576"; // Weisswasser + case "7": + return fromNumber3577(number.substring(1)); + case "8": + return "3578"; // Kamenz + case "9": + return fromNumber3579(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3572(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35722"; // Lauta b Hoyerswerda + case "3": + return "35723"; // Bernsdorf OL + case "4": + return "35724"; // Lohsa + case "5": + return "35725"; // Wittichenau + case "6": + return "35726"; // Groß Särchen + case "7": + return "35727"; // Burghammer + case "8": + return "35728"; // Uhyst Spree + default: + return ""; + } + } + + private static String fromNumber3575(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35751"; // Welzow + case "2": + return "35752"; // Ruhland + case "3": + return "35753"; // Großräschen + case "4": + return "35754"; // Klettwitz + case "5": + return "35755"; // Ortrand + case "6": + return "35756"; // Hosena + default: + return ""; + } + } + + private static String fromNumber3577(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35771"; // Bad Muskau + case "2": + return "35772"; // Rietschen + case "3": + return "35773"; // Schleife + case "4": + return "35774"; // Boxberg Sachs + case "5": + return "35775"; // Pechern + default: + return ""; + } + } + + private static String fromNumber3579(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35792"; // Ossling + case "3": + return "35793"; // Elstra + case "5": + return "35795"; // Königsbrück + case "6": + return "35796"; // Panschwitz-Kuckau + case "7": + return "35797"; // Schwepnitz + default: + return ""; + } + } + + private static String fromNumber358(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3581"; // Görlitz + case "2": + return fromNumber3582(number.substring(1)); + case "3": + return "3583"; // Zittau + case "4": + return fromNumber3584(number.substring(1)); + case "5": + return "3585"; // Löbau + case "6": + return "3586"; // Neugersdorf Sachs + case "7": + return fromNumber3587(number.substring(1)); + case "8": + return "3588"; // Niesky + case "9": + return fromNumber3589(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3582(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35820"; // Zodel + case "2": + return "35822"; // Hagenwerder + case "3": + return "35823"; // Ostritz + case "5": + return "35825"; // Kodersdorf + case "6": + return "35826"; // Königshain b Görlitz + case "7": + return "35827"; // Nieder-Seifersdorf + case "8": + return "35828"; // Reichenbach OL + case "9": + return "35829"; // Gersdorf b Görlitz + default: + return ""; + } + } + + private static String fromNumber3584(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35841"; // Großschönau Sachs + case "2": + return "35842"; // Oderwitz + case "3": + return "35843"; // Hirschfelde b Zittau + case "4": + return "35844"; // Oybin Kurort + default: + return ""; + } + } + + private static String fromNumber3587(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35872"; // Neusalza-Spremberg + case "3": + return "35873"; // Herrnhut + case "4": + return "35874"; // Bernstadt a d Eigen + case "5": + return "35875"; // Obercunnersdorf b Löbau + case "6": + return "35876"; // Weissenberg Sachs + case "7": + return "35877"; // Cunewalde + default: + return ""; + } + } + + private static String fromNumber3589(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35891"; // Rothenburg OL + case "2": + return "35892"; // Horka OL + case "3": + return "35893"; // Mücka + case "4": + return "35894"; // Hähnichen + case "5": + return "35895"; // Klitten + default: + return ""; + } + } + + private static String fromNumber359(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3591"; // Bautzen + case "2": + return "3592"; // Kirschau + case "3": + return fromNumber3593(number.substring(1)); + case "4": + return "3594"; // Bischofswerda + case "5": + return fromNumber3595(number.substring(1)); + case "6": + return "3596"; // Neustadt i Sa + case "7": + return fromNumber3597(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3593(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35930"; // Seitschen + case "1": + return "35931"; // Königswartha + case "2": + return "35932"; // Guttau + case "3": + return "35933"; // Neschwitz + case "4": + return "35934"; // Grossdubrau + case "5": + return "35935"; // Kleinwelka + case "6": + return "35936"; // Sohland Spree + case "7": + return "35937"; // Prischwitz + case "8": + return "35938"; // Großpostwitz OL + case "9": + return "35939"; // Hochkirch + default: + return ""; + } + } + + private static String fromNumber3595(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35951"; // Neukirch Lausitz + case "2": + return "35952"; // Großröhrsdorf OL + case "3": + return "35953"; // Burkau + case "4": + return "35954"; // Grossharthau + case "5": + return "35955"; // Pulsnitz + default: + return ""; + } + } + + private static String fromNumber3597(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35971"; // Sebnitz + case "3": + return "35973"; // Stolpen + case "4": + return "35974"; // Hinterhermsdorf + case "5": + return "35975"; // Hohnstein + default: + return ""; + } + } + + private static String fromNumber36(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber360(number.substring(1)); + case "1": + return "361"; // Erfurt + case "2": + return fromNumber362(number.substring(1)); + case "3": + return fromNumber363(number.substring(1)); + case "4": + return fromNumber364(number.substring(1)); + case "5": + return "365"; // Gera + case "6": + return fromNumber366(number.substring(1)); + case "7": + return fromNumber367(number.substring(1)); + case "8": + return fromNumber368(number.substring(1)); + case "9": + return fromNumber369(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber360(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3601"; // Mühlhausen Thür + case "2": + return fromNumber3602(number.substring(1)); + case "3": + return "3603"; // Bad Langensalza + case "4": + return fromNumber3604(number.substring(1)); + case "5": + return "3605"; // Leinefelde + case "6": + return "3606"; // Heiligenstadt Heilbad + case "7": + return fromNumber3607(number.substring(1)); + case "8": + return fromNumber3608(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3602(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36020"; // Ebeleben + case "1": + return "36021"; // Schlotheim + case "2": + return "36022"; // Grossengottern + case "3": + return "36023"; // Horsmar + case "4": + return "36024"; // Diedorf b Mühlhausen Thür + case "5": + return "36025"; // Körner + case "6": + return "36026"; // Struth b Mühlhausen Thür + case "7": + return "36027"; // Lengenfeld Unterm Stein + case "8": + return "36028"; // Kammerforst Thür + case "9": + return "36029"; // Menteroda + default: + return ""; + } + } + + private static String fromNumber3604(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36041"; // Bad Tennstedt + case "2": + return "36042"; // Tonna + case "3": + return "36043"; // Kirchheilingen + default: + return ""; + } + } + + private static String fromNumber3607(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36071"; // Teistungen + case "2": + return "36072"; // Weißenborn-Lüderode + case "4": + return "36074"; // Worbis + case "5": + return "36075"; // Dingelstädt Eichsfeld + case "6": + return "36076"; // Niederorschel + case "7": + return "36077"; // Grossbodungen + default: + return ""; + } + } + + private static String fromNumber3608(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36081"; // Arenshausen + case "2": + return "36082"; // Ershausen + case "3": + return "36083"; // Uder + case "4": + return "36084"; // Heuthen + case "5": + return "36085"; // Reinholterode + case "7": + return "36087"; // Wüstheuterode + default: + return ""; + } + } + + private static String fromNumber362(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3620(number.substring(1)); + case "1": + return "3621"; // Gotha Thür + case "2": + return "3622"; // Waltershausen Thür + case "3": + return "3623"; // Friedrichroda + case "4": + return "3624"; // Ohrdruf + case "5": + return fromNumber3625(number.substring(1)); + case "8": + return "3628"; // Arnstadt + case "9": + return "3629"; // Stadtilm + default: + return ""; + } + } + + private static String fromNumber3620(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36200"; // Elxleben b Arnstadt + case "1": + return "36201"; // Walschleben + case "2": + return "36202"; // Neudietendorf + case "3": + return "36203"; // Vieselbach + case "4": + return "36204"; // Stotternheim + case "5": + return "36205"; // Gräfenroda + case "6": + return "36206"; // Grossfahner + case "7": + return "36207"; // Plaue Thür + case "8": + return "36208"; // Ermstedt + case "9": + return "36209"; // Klettbach + default: + return ""; + } + } + + private static String fromNumber3625(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "36252"; // Tambach-Dietharz Thür Wald + case "3": + return "36253"; // Georgenthal Thür Wald + case "4": + return "36254"; // Friedrichswerth + case "5": + return "36255"; // Goldbach b Gotha + case "6": + return "36256"; // Wechmar + case "7": + return "36257"; // Luisenthal Thür + case "8": + return "36258"; // Friemar + case "9": + return "36259"; // Tabarz Thür Wald + default: + return ""; + } + } + + private static String fromNumber363(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3631"; // Nordhausen Thür + case "2": + return "3632"; // Sondershausen + case "3": + return fromNumber3633(number.substring(1)); + case "4": + return "3634"; // Sömmerda + case "5": + return "3635"; // Kölleda + case "6": + return "3636"; // Greussen + case "7": + return fromNumber3637(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3633(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36330"; // Grossberndten + case "1": + return "36331"; // Ilfeld + case "2": + return "36332"; // Ellrich + case "3": + return "36333"; // Heringen Helme + case "4": + return "36334"; // Wolkramshausen + case "5": + return "36335"; // Grosswechsungen + case "6": + return "36336"; // Klettenberg + case "7": + return "36337"; // Schiedungen + case "8": + return "36338"; // Bleicherode + default: + return ""; + } + } + + private static String fromNumber3637(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36370"; // Grossenehrich + case "1": + return "36371"; // Schlossvippach + case "2": + return "36372"; // Kleinneuhausen + case "3": + return "36373"; // Buttstädt + case "4": + return "36374"; // Weissensee + case "5": + return "36375"; // Kindelbrück + case "6": + return "36376"; // Straussfurt + case "7": + return "36377"; // Rastenberg + case "8": + return "36378"; // Ostramondra + case "9": + return "36379"; // Holzengel + default: + return ""; + } + } + + private static String fromNumber364(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3641"; // Jena + case "2": + return fromNumber3642(number.substring(1)); + case "3": + return "3643"; // Weimar Thür + case "4": + return "3644"; // Apolda + case "5": + return fromNumber3645(number.substring(1)); + case "6": + return fromNumber3646(number.substring(1)); + case "7": + return "3647"; // Pößneck + case "8": + return fromNumber3648(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3642(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36421"; // Camburg + case "2": + return "36422"; // Reinstädt Thür + case "3": + return "36423"; // Orlamünde + case "4": + return "36424"; // Kahla Thür + case "5": + return "36425"; // Isserstedt + case "6": + return "36426"; // Ottendorf b Stadtroda + case "7": + return "36427"; // Dornburg Saale + case "8": + return "36428"; // Stadtroda + default: + return ""; + } + } + + private static String fromNumber3645(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36450"; // Kranichfeld + case "1": + return "36451"; // Buttelstedt + case "2": + return "36452"; // Berlstedt + case "3": + return "36453"; // Mellingen + case "4": + return "36454"; // Magdala + case "8": + return "36458"; // Bad Berka + case "9": + return "36459"; // Blankenhain Thür + default: + return ""; + } + } + + private static String fromNumber3646(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36461"; // Bad Sulza + case "2": + return "36462"; // Ossmannstedt + case "3": + return "36463"; // Gebstedt + case "4": + return "36464"; // Wormstedt + case "5": + return "36465"; // Oberndorf b Apolda + default: + return ""; + } + } + + private static String fromNumber3648(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36481"; // Neustadt an der Orla + case "2": + return "36482"; // Triptis + case "3": + return "36483"; // Ziegenrück + case "4": + return "36484"; // Knau b Pößneck + default: + return ""; + } + } + + private static String fromNumber366(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3660(number.substring(1)); + case "1": + return "3661"; // Greiz + case "2": + return fromNumber3662(number.substring(1)); + case "3": + return "3663"; // Schleiz + case "4": + return fromNumber3664(number.substring(1)); + case "5": + return fromNumber3665(number.substring(1)); + case "9": + return fromNumber3669(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3660(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36601"; // Hermsdorf Thür + case "2": + return "36602"; // Ronneburg Thür + case "3": + return "36603"; // Weida + case "4": + return "36604"; // Münchenbernsdorf + case "5": + return "36605"; // Bad Köstritz + case "6": + return "36606"; // Kraftsdorf + case "7": + return "36607"; // Niederpöllnitz + case "8": + return "36608"; // Seelingstädt b Gera + default: + return ""; + } + } + + private static String fromNumber3662(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36621"; // Elsterberg b Plauen + case "2": + return "36622"; // Triebes + case "3": + return "36623"; // Berga Elster + case "4": + return "36624"; // Teichwolframsdorf + case "5": + return "36625"; // Langenwetzendorf + case "6": + return "36626"; // Auma + case "8": + return "36628"; // Zeulenroda + default: + return ""; + } + } + + private static String fromNumber3664(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36640"; // Remptendorf + case "2": + return "36642"; // Harra + case "3": + return "36643"; // Thimmendorf + case "4": + return "36644"; // Hirschberg Saale + case "5": + return "36645"; // Mühltroff + case "6": + return "36646"; // Tanna b Schleiz + case "7": + return "36647"; // Saalburg Thür + case "8": + return "36648"; // Dittersdorf b Schleiz + case "9": + return "36649"; // Gefell b Schleiz + default: + return ""; + } + } + + private static String fromNumber3665(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36651"; // Lobenstein + case "2": + return "36652"; // Wurzbach + case "3": + return "36653"; // Lehesten Thür Wald + default: + return ""; + } + } + + private static String fromNumber3669(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36691"; // Eisenberg Thür + case "2": + return "36692"; // Bürgel + case "3": + return "36693"; // Crossen an der Elster + case "4": + return "36694"; // Schkölen Thür + case "5": + return "36695"; // Söllmnitz + default: + return ""; + } + } + + private static String fromNumber367(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3670(number.substring(1)); + case "1": + return "3671"; // Saalfeld Saale + case "2": + return "3672"; // Rudolstadt + case "3": + return fromNumber3673(number.substring(1)); + case "4": + return fromNumber3674(number.substring(1)); + case "5": + return "3675"; // Sonneberg Thür + case "6": + return fromNumber3676(number.substring(1)); + case "7": + return "3677"; // Ilmenau Thür + case "8": + return fromNumber3678(number.substring(1)); + case "9": + return "3679"; // Neuhaus a Rennweg + default: + return ""; + } + } + + private static String fromNumber3670(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36701"; // Lichte + case "2": + return "36702"; // Lauscha + case "3": + return "36703"; // Gräfenthal + case "4": + return "36704"; // Steinheid + case "5": + return "36705"; // Oberweißbach Thür Wald + default: + return ""; + } + } + + private static String fromNumber3673(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36730"; // Sitzendorf + case "1": + return "36731"; // Unterloquitz + case "2": + return "36732"; // Könitz + case "3": + return "36733"; // Kaulsdorf + case "4": + return "36734"; // Leutenberg + case "5": + return "36735"; // Probstzella + case "6": + return "36736"; // Arnsgereuth + case "7": + return "36737"; // Drognitz + case "8": + return "36738"; // Königsee + case "9": + return "36739"; // Rottenbach + default: + return ""; + } + } + + private static String fromNumber3674(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36741"; // Bad Blankenburg + case "2": + return "36742"; // Uhlstädt + case "3": + return "36743"; // Teichel + case "4": + return "36744"; // Remda + default: + return ""; + } + } + + private static String fromNumber3676(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36761"; // Heubisch + case "2": + return "36762"; // Steinach Thür + case "4": + return "36764"; // Neuhaus-Schierschnitz + case "6": + return "36766"; // Schalkau + default: + return ""; + } + } + + private static String fromNumber3678(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36781"; // Grossbreitenbach + case "2": + return "36782"; // Schmiedefeld a Rennsteig + case "3": + return "36783"; // Gehren Thür + case "4": + return "36784"; // Stützerbach + case "5": + return "36785"; // Gräfinau-Angstedt + default: + return ""; + } + } + + private static String fromNumber368(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3681"; // Suhl + case "2": + return "3682"; // Zella-Mehlis + case "3": + return "3683"; // Schmalkalden + case "4": + return fromNumber3684(number.substring(1)); + case "5": + return "3685"; // Hildburghausen + case "6": + return "3686"; // Eisfeld + case "7": + return fromNumber3687(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3684(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36840"; // Trusetal + case "1": + return "36841"; // Schleusingen + case "2": + return "36842"; // Oberhof Thür + case "3": + return "36843"; // Benshausen + case "4": + return "36844"; // Rohr Thür + case "5": + return "36845"; // Gehlberg + case "6": + return "36846"; // Suhl-Dietzhausen + case "7": + return "36847"; // Steinbach-Hallenberg + case "8": + return "36848"; // Wernshausen + case "9": + return "36849"; // Kleinschmalkalden + default: + return ""; + } + } + + private static String fromNumber3687(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36870"; // Masserberg + case "1": + return "36871"; // Bad Colberg-Heldburg + case "3": + return "36873"; // Themar + case "4": + return "36874"; // Schönbrunn b Hildburghaus + case "5": + return "36875"; // Straufhain-Streufdorf + case "8": + return "36878"; // Oberland + default: + return ""; + } + } + + private static String fromNumber369(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3691"; // Eisenach Thür + case "2": + return fromNumber3692(number.substring(1)); + case "3": + return "3693"; // Meiningen + case "4": + return fromNumber3694(number.substring(1)); + case "5": + return "3695"; // Bad Salzungen + case "6": + return fromNumber3696(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3692(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36920"; // Grossenlupnitz + case "1": + return "36921"; // Wutha-Farnroda + case "2": + return "36922"; // Gerstungen + case "3": + return "36923"; // Treffurt + case "4": + return "36924"; // Mihla + case "5": + return "36925"; // Marksuhl + case "6": + return "36926"; // Creuzburg + case "7": + return "36927"; // Unterellen + case "8": + return "36928"; // Neuenhof Thür + case "9": + return "36929"; // Ruhla + default: + return ""; + } + } + + private static String fromNumber3694(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36940"; // Oepfershausen + case "1": + return "36941"; // Wasungen + case "3": + return "36943"; // Bettenhausen Thür + case "4": + return "36944"; // Rentwertshausen + case "5": + return "36945"; // Henneberg + case "6": + return "36946"; // Erbenhausen Thür + case "7": + return "36947"; // Jüchsen + case "8": + return "36948"; // Römhild + case "9": + return "36949"; // Obermaßfeld-Grimmenthal + default: + return ""; + } + } + + private static String fromNumber3696(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36961"; // Bad Liebenstein + case "2": + return "36962"; // Vacha + case "3": + return "36963"; // Dorndorf Rhön + case "4": + return "36964"; // Dermbach Rhön + case "5": + return "36965"; // Stadtlengsfeld + case "6": + return "36966"; // Kaltennordheim + case "7": + return "36967"; // Geisa + case "8": + return "36968"; // Rossdorf Rhön + case "9": + return "36969"; // Merkers + default: + return ""; + } + } + + private static String fromNumber37(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "371"; // Chemnitz Sachs + case "2": + return fromNumber372(number.substring(1)); + case "3": + return fromNumber373(number.substring(1)); + case "4": + return fromNumber374(number.substring(1)); + case "5": + return "375"; // Zwickau + case "6": + return fromNumber376(number.substring(1)); + case "7": + return fromNumber377(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber372(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3720(number.substring(1)); + case "1": + return "3721"; // Meinersdorf + case "2": + return "3722"; // Limbach-Oberfrohna + case "3": + return "3723"; // Hohenstein-Ernstthal + case "4": + return "3724"; // Burgstädt + case "5": + return "3725"; // Zschopau + case "6": + return "3726"; // Flöha + case "7": + return "3727"; // Mittweida + case "9": + return fromNumber3729(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3720(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37200"; // Wittgensdorf b Chemnitz + case "2": + return "37202"; // Claussnitz b Chemnitz + case "3": + return "37203"; // Gersdorf b Chemnitz + case "4": + return "37204"; // Lichtenstein Sachs + case "6": + return "37206"; // Frankenberg Sachs + case "7": + return "37207"; // Hainichen Sachs + case "8": + return "37208"; // Auerswalde + case "9": + return "37209"; // Einsiedel b Chemnitz + default: + return ""; + } + } + + private static String fromNumber3729(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37291"; // Augustusburg + case "2": + return "37292"; // Oederan + case "3": + return "37293"; // Eppendorf Sachs + case "4": + return "37294"; // Grünhainichen + case "5": + return "37295"; // Lugau Erzgeb + case "6": + return "37296"; // Stollberg Erzgeb + case "7": + return "37297"; // Thum Sachs + case "8": + return "37298"; // Oelsnitz Erzgeb + default: + return ""; + } + } + + private static String fromNumber373(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3731"; // Freiberg Sachs + case "2": + return fromNumber3732(number.substring(1)); + case "3": + return "3733"; // Annaberg-Buchholz + case "4": + return fromNumber3734(number.substring(1)); + case "5": + return "3735"; // Marienberg Sachs + case "6": + return fromNumber3736(number.substring(1)); + case "7": + return "3737"; // Rochlitz + case "8": + return fromNumber3738(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3732(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37320"; // Mulda Sachs + case "1": + return "37321"; // Frankenstein Sachs + case "2": + return "37322"; // Brand-Erbisdorf + case "3": + return "37323"; // Lichtenberg Erzgeb + case "4": + return "37324"; // Reinsberg Sachs + case "5": + return "37325"; // Niederbobritzsch + case "6": + return "37326"; // Frauenstein Sachs + case "7": + return "37327"; // Rechenberg-Bienenmühle + case "8": + return "37328"; // Grossschirma + case "9": + return "37329"; // Grosshartmannsdorf + default: + return ""; + } + } + + private static String fromNumber3734(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37341"; // Ehrenfriedersdorf + case "2": + return "37342"; // Cranzahl + case "3": + return "37343"; // Jöhstadt + case "4": + return "37344"; // Crottendorf Sachs + case "6": + return "37346"; // Geyer + case "7": + return "37347"; // Bärenstein Kr Annaberg + case "8": + return "37348"; // Oberwiesenthal Kurort + case "9": + return "37349"; // Scheibenberg + default: + return ""; + } + } + + private static String fromNumber3736(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37360"; // Olbernhau + case "1": + return "37361"; // Neuhausen Erzgeb + case "2": + return "37362"; // Seiffen Erzgeb + case "3": + return "37363"; // Zöblitz + case "4": + return "37364"; // Reitzenhain Erzgeb + case "5": + return "37365"; // Sayda + case "6": + return "37366"; // Rübenau + case "7": + return "37367"; // Lengefeld Erzgeb + case "8": + return "37368"; // Deutschneudorf + case "9": + return "37369"; // Wolkenstein + default: + return ""; + } + } + + private static String fromNumber3738(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37381"; // Penig + case "2": + return "37382"; // Geringswalde + case "3": + return "37383"; // Lunzenau + case "4": + return "37384"; // Wechselburg + default: + return ""; + } + } + + private static String fromNumber374(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3741"; // Plauen + case "2": + return fromNumber3742(number.substring(1)); + case "3": + return fromNumber3743(number.substring(1)); + case "4": + return "3744"; // Auerbach Vogtl + case "5": + return "3745"; // Falkenstein Vogtl + case "6": + return fromNumber3746(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3742(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37421"; // Oelsnitz Vogtl + case "2": + return "37422"; // Markneukirchen + case "3": + return "37423"; // Adorf Vogtl + default: + return ""; + } + } + + private static String fromNumber3743(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37430"; // Eichigt + case "1": + return "37431"; // Mehltheuer Vogtl + case "2": + return "37432"; // Pausa Vogtl + case "3": + return "37433"; // Gutenfürst + case "4": + return "37434"; // Bobenneukirchen + case "5": + return "37435"; // Reuth b Plauen + case "6": + return "37436"; // Weischlitz + case "7": + return "37437"; // Bad Elster + case "8": + return "37438"; // Bad Brambach + case "9": + return "37439"; // Jocketa + default: + return ""; + } + } + + private static String fromNumber3746(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "37462"; // Rothenkirchen Vogtl + case "3": + return "37463"; // Bergen Vogtl + case "4": + return "37464"; // Schöneck Vogtl + case "5": + return "37465"; // Tannenbergsthal Vogtl + case "7": + return "37467"; // Klingenthal Sachs + case "8": + return "37468"; // Treuen Vogtl + default: + return ""; + } + } + + private static String fromNumber376(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3760(number.substring(1)); + case "1": + return "3761"; // Werdau Sachs + case "2": + return "3762"; // Crimmitschau + case "3": + return "3763"; // Glauchau + case "4": + return "3764"; // Meerane + case "5": + return "3765"; // Reichenbach Vogtl + default: + return ""; + } + } + + private static String fromNumber3760(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37600"; // Neumark Sachs + case "1": + return "37601"; // Mülsen Skt Jacob + case "2": + return "37602"; // Kirchberg Sachs + case "3": + return "37603"; // Wildenfels + case "4": + return "37604"; // Mosel + case "5": + return "37605"; // Hartenstein Sachs + case "6": + return "37606"; // Lengenfeld Vogtl + case "7": + return "37607"; // Ebersbrunn Sachs + case "8": + return "37608"; // Waldenburg Sachs + case "9": + return "37609"; // Wolkenburg Mulde + default: + return ""; + } + } + + private static String fromNumber377(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3771"; // Aue Sachs + case "2": + return "3772"; // Schneeberg Erzgeb + case "3": + return "3773"; // Johanngeorgenstadt + case "4": + return "3774"; // Schwarzenberg + case "5": + return fromNumber3775(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3775(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "37752"; // Eibenstock + case "4": + return "37754"; // Zwönitz + case "5": + return "37755"; // Schönheide Erzgeb + case "6": + return "37756"; // Breitenbrunn Erzgeb + case "7": + return "37757"; // Rittersgrün + default: + return ""; + } + } + + private static String fromNumber38(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "381"; // Rostock + case "2": + return fromNumber382(number.substring(1)); + case "3": + return fromNumber383(number.substring(1)); + case "4": + return fromNumber384(number.substring(1)); + case "5": + return "385"; // Schwerin Meckl + case "6": + return fromNumber386(number.substring(1)); + case "7": + return fromNumber387(number.substring(1)); + case "8": + return fromNumber388(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber382(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3820(number.substring(1)); + case "1": + return "3821"; // Ribnitz-Damgarten + case "2": + return fromNumber3822(number.substring(1)); + case "3": + return fromNumber3823(number.substring(1)); + case "9": + return fromNumber3829(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3820(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38201"; // Gelbensande + case "2": + return "38202"; // Volkenshagen + case "3": + return "38203"; // Bad Doberan + case "4": + return "38204"; // Broderstorf + case "5": + return "38205"; // Tessin b Rostock + case "6": + return "38206"; // Graal-Müritz Seeheilbad + case "7": + return "38207"; // Stäbelow + case "8": + return "38208"; // Kavelstorf + case "9": + return "38209"; // Sanitz b Rostock + default: + return ""; + } + } + + private static String fromNumber3822(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38220"; // Wustrow Ostseebad + case "1": + return "38221"; // Marlow + case "2": + return "38222"; // Semlow + case "3": + return "38223"; // Saal Vorpom + case "4": + return "38224"; // Gresenhorst + case "5": + return "38225"; // Trinwillershagen + case "6": + return "38226"; // Dierhagen Ostseebad + case "7": + return "38227"; // Lüdershagen b Barth + case "8": + return "38228"; // Dettmannsdorf-Kölzow + case "9": + return "38229"; // Bad Sülze + default: + return ""; + } + } + + private static String fromNumber3823(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38231"; // Barth + case "2": + return "38232"; // Zingst Ostseebad + case "3": + return "38233"; // Prerow Ostseebad + case "4": + return "38234"; // Born a Darß + default: + return ""; + } + } + + private static String fromNumber3829(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "38292"; // Kröpelin + case "3": + return "38293"; // Kühlungsborn Ostseebad + case "4": + return "38294"; // Neubukow + case "5": + return "38295"; // Satow b Bad Doberan + case "6": + return "38296"; // Rerik Ostseebad + case "7": + return "38297"; // Moitin + default: + return ""; + } + } + + private static String fromNumber383(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3830(number.substring(1)); + case "1": + return "3831"; // Stralsund + case "2": + return fromNumber3832(number.substring(1)); + case "3": + return fromNumber3833(number.substring(1)); + case "4": + return "3834"; // Greifswald + case "5": + return fromNumber3835(number.substring(1)); + case "6": + return "3836"; // Wolgast + case "7": + return fromNumber3837(number.substring(1)); + case "8": + return "3838"; // Bergen auf Rügen + case "9": + return fromNumber3839(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3830(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38300"; // Insel Hiddensee + case "1": + return "38301"; // Putbus + case "2": + return "38302"; // Sagard + case "3": + return "38303"; // Sellin Ostseebad + case "4": + return "38304"; // Garz Rügen + case "5": + return "38305"; // Gingst + case "6": + return "38306"; // Samtens + case "7": + return "38307"; // Poseritz + case "8": + return "38308"; // Göhren Rügen + case "9": + return "38309"; // Trent + default: + return ""; + } + } + + private static String fromNumber3832(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38320"; // Tribsees + case "1": + return "38321"; // Martensdorf b Stralsund + case "2": + return "38322"; // Richtenberg + case "3": + return "38323"; // Prohn + case "4": + return "38324"; // Velgast + case "5": + return "38325"; // Rolofshagen + case "6": + return "38326"; // Grimmen + case "7": + return "38327"; // Elmenhorst Vorpom + case "8": + return "38328"; // Miltzow + default: + return ""; + } + } + + private static String fromNumber3833(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38331"; // Rakow Vorpom + case "2": + return "38332"; // Gross Bisdorf + case "3": + return "38333"; // Horst b Grimmen + case "4": + return "38334"; // Grammendorf + default: + return ""; + } + } + + private static String fromNumber3835(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38351"; // Mesekenhagen + case "2": + return "38352"; // Kemnitz b Greifswald + case "3": + return "38353"; // Gützkow b Greifswald + case "4": + return "38354"; // Wusterhusen + case "5": + return "38355"; // Züssow + case "6": + return "38356"; // Behrenhoff + default: + return ""; + } + } + + private static String fromNumber3837(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38370"; // Kröslin + case "1": + return "38371"; // Karlshagen + case "2": + return "38372"; // Usedom + case "3": + return "38373"; // Katzow + case "4": + return "38374"; // Lassan b Wolgast + case "5": + return "38375"; // Koserow + case "6": + return "38376"; // Zirchow + case "7": + return "38377"; // Zinnowitz + case "8": + return "38378"; // Heringsdorf Seebad + case "9": + return "38379"; // Benz Usedom + default: + return ""; + } + } + + private static String fromNumber3839(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38391"; // Altenkirchen Rügen + case "2": + return "38392"; // Sassnitz + case "3": + return "38393"; // Binz Ostseebad + default: + return ""; + } + } + + private static String fromNumber384(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3841"; // Wismar Meckl + case "2": + return fromNumber3842(number.substring(1)); + case "3": + return "3843"; // Güstrow + case "4": + return "3844"; // Schwaan + case "5": + return fromNumber3845(number.substring(1)); + case "6": + return fromNumber3846(number.substring(1)); + case "7": + return "3847"; // Sternberg + case "8": + return fromNumber3848(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3842(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "38422"; // Neukloster + case "3": + return "38423"; // Bad Kleinen + case "4": + return "38424"; // Bobitz + case "5": + return "38425"; // Kirchdorf Poel + case "6": + return "38426"; // Neuburg-Steinhausen + case "7": + return "38427"; // Blowatz + case "8": + return "38428"; // Hohenkirchen b Wismar + case "9": + return "38429"; // Glasin + default: + return ""; + } + } + + private static String fromNumber3845(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38450"; // Tarnow b Bützow + case "1": + return "38451"; // Hoppenrade b Güstrow + case "2": + return "38452"; // Lalendorf + case "3": + return "38453"; // Mistorf + case "4": + return "38454"; // Kritzkow + case "5": + return "38455"; // Plaaz + case "6": + return "38456"; // Langhagen b Güstrow + case "7": + return "38457"; // Krakow am See + case "8": + return "38458"; // Zehna + case "9": + return "38459"; // Laage + default: + return ""; + } + } + + private static String fromNumber3846(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38461"; // Bützow + case "2": + return "38462"; // Baumgarten Meckl + case "4": + return "38464"; // Bernitt + case "6": + return "38466"; // Jürgenshagen + default: + return ""; + } + } + + private static String fromNumber3848(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38481"; // Witzin + case "2": + return "38482"; // Warin + case "3": + return "38483"; // Brüel + case "4": + return "38484"; // Ventschow + case "5": + return "38485"; // Dabel + case "6": + return "38486"; // Gustävel + case "8": + return "38488"; // Demen + default: + return ""; + } + } + + private static String fromNumber386(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "3860"; // Raben Steinfeld + case "1": + return "3861"; // Plate + case "3": + return "3863"; // Crivitz + case "5": + return "3865"; // Holthusen + case "6": + return "3866"; // Cambs + case "7": + return "3867"; // Lübstorf + case "8": + return "3868"; // Rastow + case "9": + return "3869"; // Dümmer + default: + return ""; + } + } + + private static String fromNumber387(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3871"; // Parchim + case "2": + return fromNumber3872(number.substring(1)); + case "3": + return fromNumber3873(number.substring(1)); + case "4": + return "3874"; // Ludwigslust Meckl + case "5": + return fromNumber3875(number.substring(1)); + case "6": + return "3876"; // Perleberg + case "7": + return "3877"; // Wittenberge + case "8": + return fromNumber3878(number.substring(1)); + case "9": + return fromNumber3879(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3872(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38720"; // Grebbin + case "1": + return "38721"; // Ziegendorf + case "2": + return "38722"; // Raduhn + case "3": + return "38723"; // Kladrum + case "4": + return "38724"; // Siggelkow + case "5": + return "38725"; // Gross Godems + case "6": + return "38726"; // Spornitz + case "7": + return "38727"; // Mestlin + case "8": + return "38728"; // Domsühl + case "9": + return "38729"; // Marnitz + default: + return ""; + } + } + + private static String fromNumber3873(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38731"; // Lübz + case "2": + return "38732"; // Gallin b Lübz + case "3": + return "38733"; // Karbow-Vietlübbe + case "5": + return "38735"; // Plau am See + case "6": + return "38736"; // Goldberg Meckl + case "7": + return "38737"; // Ganzlin + case "8": + return "38738"; // Karow b Lübz + default: + return ""; + } + } + + private static String fromNumber3875(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38750"; // Malliss + case "1": + return "38751"; // Picher + case "2": + return "38752"; // Zierzow b Ludwigslust + case "3": + return "38753"; // Wöbbelin + case "4": + return "38754"; // Leussow b Ludwigslust + case "5": + return "38755"; // Eldena + case "6": + return "38756"; // Grabow Meckl + case "7": + return "38757"; // Neustadt-Glewe + case "8": + return "38758"; // Dömitz + case "9": + return "38759"; // Tewswoos + default: + return ""; + } + } + + private static String fromNumber3878(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38780"; // Lanz Brandenb + case "1": + return "38781"; // Mellen + case "2": + return "38782"; // Reetz b Perleberg + case "3": + return "38783"; // Dallmin + case "4": + return "38784"; // Kleinow Kr Prignitz + case "5": + return "38785"; // Berge b Perleberg + case "7": + return "38787"; // Glöwen + case "8": + return "38788"; // Gross Warnow + case "9": + return "38789"; // Wolfshagen b Perleberg + default: + return ""; + } + } + + private static String fromNumber3879(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38791"; // Bad Wilsnack + case "2": + return "38792"; // Lenzen (Elbe) + case "3": + return "38793"; // Dergenthin + case "4": + return "38794"; // Cumlosen + case "6": + return "38796"; // Viesecke + case "7": + return "38797"; // Karstädt Kr Prignitz + default: + return ""; + } + } + + private static String fromNumber388(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3881"; // Grevesmühlen + case "2": + return fromNumber3882(number.substring(1)); + case "3": + return "3883"; // Hagenow + case "4": + return fromNumber3884(number.substring(1)); + case "5": + return fromNumber3885(number.substring(1)); + case "6": + return "3886"; // Gadebusch + case "7": + return fromNumber3887(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3882(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38821"; // Lüdersdorf Meckl + case "2": + return "38822"; // Diedrichshagen b Grevesmühlen + case "3": + return "38823"; // Selmsdorf + case "4": + return "38824"; // Mallentin + case "5": + return "38825"; // Klütz + case "6": + return "38826"; // Dassow + case "7": + return "38827"; // Kalkhorst + case "8": + return "38828"; // Schönberg Meckl + default: + return ""; + } + } + + private static String fromNumber3884(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38841"; // Neuhaus Elbe + case "2": + return "38842"; // Lüttenmark + case "3": + return "38843"; // Bennin + case "4": + return "38844"; // Gülze + case "5": + return "38845"; // Kaarssen + case "7": + return "38847"; // Boizenburg Elbe + case "8": + return "38848"; // Vellahn + default: + return ""; + } + } + + private static String fromNumber3885(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38850"; // Gammelin + case "1": + return "38851"; // Zarrentin Meckl + case "2": + return "38852"; // Wittenburg + case "3": + return "38853"; // Drönnewitz b Hagenow + case "4": + return "38854"; // Redefin + case "5": + return "38855"; // Lübtheen + case "6": + return "38856"; // Pritzier b Hagenow + case "8": + return "38858"; // Lassahn + case "9": + return "38859"; // Alt Zachun + default: + return ""; + } + } + + private static String fromNumber3887(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38871"; // Mühlen Eichsen + case "2": + return "38872"; // Rehna + case "3": + return "38873"; // Carlow + case "4": + return "38874"; // Lützow + case "5": + return "38875"; // Schlagsdorf b Gadebusch + case "6": + return "38876"; // Roggendorf + default: + return ""; + } + } + + private static String fromNumber39(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber390(number.substring(1)); + case "1": + return "391"; // Magdeburg + case "2": + return fromNumber392(number.substring(1)); + case "3": + return fromNumber393(number.substring(1)); + case "4": + return fromNumber394(number.substring(1)); + case "5": + return "395"; // Neubrandenburg + case "6": + return fromNumber396(number.substring(1)); + case "7": + return fromNumber397(number.substring(1)); + case "8": + return fromNumber398(number.substring(1)); + case "9": + return fromNumber399(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber390(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3900(number.substring(1)); + case "1": + return "3901"; // Salzwedel + case "2": + return "3902"; // Diesdorf Altm + case "3": + return fromNumber3903(number.substring(1)); + case "4": + return "3904"; // Haldensleben + case "5": + return fromNumber3905(number.substring(1)); + case "6": + return fromNumber3906(number.substring(1)); + case "7": + return "3907"; // Gardelegen + case "8": + return fromNumber3908(number.substring(1)); + case "9": + return "3909"; // Klötze Altmark + default: + return ""; + } + } + + private static String fromNumber3900(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39000"; // Beetzendorf + case "1": + return "39001"; // Apenburg + case "2": + return "39002"; // Oebisfelde + case "3": + return "39003"; // Jübar + case "4": + return "39004"; // Köckte b Gardelegen + case "5": + return "39005"; // Kusey + case "6": + return "39006"; // Miesterhorst + case "7": + return "39007"; // Tangeln + case "8": + return "39008"; // Kunrau + case "9": + return "39009"; // Badel + default: + return ""; + } + } + + private static String fromNumber3903(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39030"; // Brunau + case "1": + return "39031"; // Dähre + case "2": + return "39032"; // Mahlsdorf b Salzwedel + case "3": + return "39033"; // Wallstawe + case "4": + return "39034"; // Fleetmark + case "5": + return "39035"; // Kuhfelde + case "6": + return "39036"; // Binde + case "7": + return "39037"; // Pretzier + case "8": + return "39038"; // Henningen + case "9": + return "39039"; // Bonese + default: + return ""; + } + } + + private static String fromNumber3905(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39050"; // Bartensleben + case "1": + return "39051"; // Calvörde + case "2": + return "39052"; // Erxleben b Haldensleben + case "3": + return "39053"; // Süplingen + case "4": + return "39054"; // Flechtingen + case "5": + return "39055"; // Hörsingen + case "6": + return "39056"; // Klüden + case "7": + return "39057"; // Rätzlingen Sachs-Anh + case "8": + return "39058"; // Uthmöden + case "9": + return "39059"; // Wegenstedt + default: + return ""; + } + } + + private static String fromNumber3906(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39061"; // Weferlingen + case "2": + return "39062"; // Bebertal + default: + return ""; + } + } + + private static String fromNumber3908(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39080"; // Kalbe Milde + case "1": + return "39081"; // Kakerbeck Sachs-Anh + case "2": + return "39082"; // Mieste + case "3": + return "39083"; // Messdorf + case "4": + return "39084"; // Lindstedt + case "5": + return "39085"; // Zichtau + case "6": + return "39086"; // Jävenitz + case "7": + return "39087"; // Jerchel Altmark + case "8": + return "39088"; // Letzlingen + case "9": + return "39089"; // Bismark Altmark + default: + return ""; + } + } + + private static String fromNumber392(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3920(number.substring(1)); + case "1": + return "3921"; // Burg b Magdeburg + case "2": + return fromNumber3922(number.substring(1)); + case "3": + return "3923"; // Zerbst + case "4": + return fromNumber3924(number.substring(1)); + case "5": + return "3925"; // Stassfurt + case "6": + return fromNumber3926(number.substring(1)); + case "8": + return "3928"; // Schönebeck Elbe + case "9": + return fromNumber3929(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3920(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39200"; // Gommern + case "1": + return "39201"; // Wolmirstedt + case "2": + return "39202"; // Gross Ammensleben + case "3": + return "39203"; // Barleben + case "4": + return "39204"; // Niederndodeleben + case "5": + return "39205"; // Langenweddingen + case "6": + return "39206"; // Eichenbarleben + case "7": + return "39207"; // Colbitz + case "8": + return "39208"; // Loitsche + case "9": + return "39209"; // Wanzleben + default: + return ""; + } + } + + private static String fromNumber3922(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39221"; // Möckern b Magdeburg + case "2": + return "39222"; // Möser + case "3": + return "39223"; // Theessen + case "4": + return "39224"; // Büden + case "5": + return "39225"; // Altengrabow + case "6": + return "39226"; // Hohenziatz + default: + return ""; + } + } + + private static String fromNumber3924(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39241"; // Leitzkau + case "2": + return "39242"; // Prödel + case "3": + return "39243"; // Nedlitz b Zerbst + case "4": + return "39244"; // Steutz + case "5": + return "39245"; // Loburg + case "6": + return "39246"; // Lindau Anh + case "7": + return "39247"; // Güterglück + case "8": + return "39248"; // Dobritz + default: + return ""; + } + } + + private static String fromNumber3926(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "39262"; // Güsten Anh + case "3": + return "39263"; // Unseburg + case "4": + return "39264"; // Kroppenstedt + case "5": + return "39265"; // Löderburg + case "6": + return "39266"; // Förderstedt + case "7": + return "39267"; // Schneidlingen + case "8": + return "39268"; // Egeln + default: + return ""; + } + } + + private static String fromNumber3929(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39291"; // Calbe Saale + case "2": + return "39292"; // Biederitz + case "3": + return "39293"; // Dreileben + case "4": + return "39294"; // Gross Rosenburg + case "5": + return "39295"; // Zuchau + case "6": + return "39296"; // Welsleben + case "7": + return "39297"; // Eickendorf Kr Schönebeck + case "8": + return "39298"; // Barby Elbe + default: + return ""; + } + } + + private static String fromNumber393(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3931"; // Stendal + case "2": + return fromNumber3932(number.substring(1)); + case "3": + return "3933"; // Genthin + case "4": + return fromNumber3934(number.substring(1)); + case "5": + return "3935"; // Tangerhütte + case "6": + return fromNumber3936(number.substring(1)); + case "7": + return "3937"; // Osterburg Altmark + case "8": + return fromNumber3938(number.substring(1)); + case "9": + return fromNumber3939(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3932(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39320"; // Schinne + case "1": + return "39321"; // Arneburg + case "2": + return "39322"; // Tangermünde + case "3": + return "39323"; // Schönhausen Elbe + case "4": + return "39324"; // Kläden b Stendal + case "5": + return "39325"; // Vinzelberg + case "7": + return "39327"; // Klietz + case "8": + return "39328"; // Rochau + case "9": + return "39329"; // Möringen + default: + return ""; + } + } + + private static String fromNumber3934(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39341"; // Redekin + case "2": + return "39342"; // Gladau + case "3": + return "39343"; // Jerichow + case "4": + return "39344"; // Güsen + case "5": + return "39345"; // Parchen + case "6": + return "39346"; // Tucheim + case "7": + return "39347"; // Kade + case "8": + return "39348"; // Klitsche + case "9": + return "39349"; // Parey Elbe + default: + return ""; + } + } + + private static String fromNumber3936(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39361"; // Lüderitz + case "2": + return "39362"; // Grieben b Tangerhütte + case "3": + return "39363"; // Angern + case "4": + return "39364"; // Dolle + case "5": + return "39365"; // Bellingen b Stendal + case "6": + return "39366"; // Kehnert + default: + return ""; + } + } + + private static String fromNumber3938(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "39382"; // Kamern + case "3": + return "39383"; // Sandau Elbe + case "4": + return "39384"; // Arendsee Altmark + case "6": + return "39386"; // Seehausen Altmark + case "7": + return "39387"; // Havelberg + case "8": + return "39388"; // Goldbeck Altm + case "9": + return "39389"; // Schollene + default: + return ""; + } + } + + private static String fromNumber3939(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39390"; // Iden + case "1": + return "39391"; // Lückstedt + case "2": + return "39392"; // Rönnebeck Sachs-Ahn + case "3": + return "39393"; // Werben Elbe + case "4": + return "39394"; // Hohenberg-Krusemark + case "5": + return "39395"; // Wanzer + case "6": + return "39396"; // Neukirchen Altmark + case "7": + return "39397"; // Geestgottberg + case "8": + return "39398"; // Gross Garz + case "9": + return "39399"; // Kleinau + default: + return ""; + } + } + + private static String fromNumber394(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3940(number.substring(1)); + case "1": + return "3941"; // Halberstadt + case "2": + return fromNumber3942(number.substring(1)); + case "3": + return "3943"; // Wernigerode + case "4": + return "3944"; // Blankenburg Harz + case "5": + return fromNumber3945(number.substring(1)); + case "6": + return "3946"; // Quedlinburg + case "7": + return "3947"; // Thale + case "8": + return fromNumber3948(number.substring(1)); + case "9": + return "3949"; // Oschersleben Bode + default: + return ""; + } + } + + private static String fromNumber3940(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39400"; // Wefensleben + case "1": + return "39401"; // Neuwegersleben + case "2": + return "39402"; // Völpke + case "3": + return "39403"; // Gröningen Sachs-Ahn + case "4": + return "39404"; // Ausleben + case "5": + return "39405"; // Hötensleben + case "6": + return "39406"; // Harbke + case "7": + return "39407"; // Seehausen Börde + case "8": + return "39408"; // Hadmersleben + case "9": + return "39409"; // Eilsleben + default: + return ""; + } + } + + private static String fromNumber3942(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39421"; // Osterwieck + case "2": + return "39422"; // Badersleben + case "3": + return "39423"; // Wegeleben + case "4": + return "39424"; // Schwanebeck Sachs-Anh + case "5": + return "39425"; // Dingelstedt a Huy + case "6": + return "39426"; // Hessen + case "7": + return "39427"; // Ströbeck + case "8": + return "39428"; // Pabstorf + default: + return ""; + } + } + + private static String fromNumber3945(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39451"; // Wasserleben + case "2": + return "39452"; // Ilsenburg + case "3": + return "39453"; // Derenburg + case "4": + return "39454"; // Elbingerode Harz + case "5": + return "39455"; // Schierke + case "6": + return "39456"; // Altenbrak + case "7": + return "39457"; // Benneckenstein Harz + case "8": + return "39458"; // Heudeber + case "9": + return "39459"; // Hasselfelde + default: + return ""; + } + } + + private static String fromNumber3948(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39481"; // Hedersleben b Aschersleben + case "2": + return "39482"; // Gatersleben + case "3": + return "39483"; // Ballenstedt + case "4": + return "39484"; // Harzgerode + case "5": + return "39485"; // Gernrode Harz + case "7": + return "39487"; // Friedrichsbrunn + case "8": + return "39488"; // Güntersberge + case "9": + return "39489"; // Strassberg Harz + default: + return ""; + } + } + + private static String fromNumber396(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3960(number.substring(1)); + case "1": + return "3961"; // Altentreptow + case "2": + return "3962"; // Penzlin b Waren + case "3": + return "3963"; // Woldegk + case "4": + return "3964"; // Bredenfelde b Strasburg + case "5": + return "3965"; // Burow b Altentreptow + case "6": + return "3966"; // Cölpin + case "7": + return "3967"; // Oertzenhof b Strasburg + case "8": + return "3968"; // Schönbeck Meckl + case "9": + return "3969"; // Siedenbollentin + default: + return ""; + } + } + + private static String fromNumber3960(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39600"; // Zwiedorf + case "1": + return "39601"; // Friedland Meckl + case "2": + return "39602"; // Kleeth + case "3": + return "39603"; // Burg Stargard + case "4": + return "39604"; // Wildberg b Altentreptow + case "5": + return "39605"; // Gross Nemerow + case "6": + return "39606"; // Glienke + case "7": + return "39607"; // Kotelow + case "8": + return "39608"; // Staven + default: + return ""; + } + } + + private static String fromNumber397(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3971"; // Anklam + case "2": + return fromNumber3972(number.substring(1)); + case "3": + return "3973"; // Pasewalk + case "4": + return fromNumber3974(number.substring(1)); + case "5": + return fromNumber3975(number.substring(1)); + case "6": + return "3976"; // Torgelow b Ueckermünde + case "7": + return fromNumber3977(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3972(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39721"; // Liepen b Anklam + case "2": + return "39722"; // Sarnow b Anklam + case "3": + return "39723"; // Krien + case "4": + return "39724"; // Klein Bünzow + case "6": + return "39726"; // Ducherow + case "7": + return "39727"; // Spantekow + case "8": + return "39728"; // Medow b Anklam + default: + return ""; + } + } + + private static String fromNumber3974(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39740"; // Nechlin + case "1": + return "39741"; // Jatznick + case "2": + return "39742"; // Brüssow b Pasewalk + case "3": + return "39743"; // Zerrenthin + case "4": + return "39744"; // Rothenklempenow + case "5": + return "39745"; // Hetzdorf b Strasburg + case "6": + return "39746"; // Krackow + case "7": + return "39747"; // Züsedom + case "8": + return "39748"; // Viereck + case "9": + return "39749"; // Grambow b Pasewalk + default: + return ""; + } + } + + private static String fromNumber3975(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39751"; // Penkun + case "2": + return "39752"; // Blumenhagen b Strasburg + case "3": + return "39753"; // Strasburg + case "4": + return "39754"; // Löcknitz Vorpom + default: + return ""; + } + } + + private static String fromNumber3977(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39771"; // Ueckermünde + case "2": + return "39772"; // Rothemühl + case "3": + return "39773"; // Altwarp + case "4": + return "39774"; // Mönkebude + case "5": + return "39775"; // Ahlbeck b Torgelow + case "6": + return "39776"; // Hintersee + case "7": + return "39777"; // Borkenfriede + case "8": + return "39778"; // Ferdinandshof b Torgelow + case "9": + return "39779"; // Eggesin + default: + return ""; + } + } + + private static String fromNumber398(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3981"; // Neustrelitz + case "2": + return fromNumber3982(number.substring(1)); + case "3": + return fromNumber3983(number.substring(1)); + case "4": + return "3984"; // Prenzlau + case "5": + return fromNumber3985(number.substring(1)); + case "6": + return fromNumber3986(number.substring(1)); + case "7": + return "3987"; // Templin + case "8": + return fromNumber3988(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3982(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39820"; // Triepkendorf + case "1": + return "39821"; // Carpin + case "2": + return "39822"; // Kratzeburg + case "3": + return "39823"; // Rechlin + case "4": + return "39824"; // Hohenzieritz + case "5": + return "39825"; // Wokuhl + case "6": + return "39826"; // Blankensee b Neustrelitz + case "7": + return "39827"; // Schwarz b Neustrelitz + case "8": + return "39828"; // Wustrow Kr Mecklenburg-Strelitz + case "9": + return "39829"; // Blankenförde + default: + return ""; + } + } + + private static String fromNumber3983(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39831"; // Feldberg Meckl + case "2": + return "39832"; // Wesenberg Meckl + case "3": + return "39833"; // Mirow Kr Neustrelitz + default: + return ""; + } + } + + private static String fromNumber3985(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39851"; // Göritz b Prenzlau + case "2": + return "39852"; // Schönermark b Prenzlau + case "3": + return "39853"; // Holzendorf b Prenzlau + case "4": + return "39854"; // Kleptow + case "5": + return "39855"; // Parmen-Weggun + case "6": + return "39856"; // Beenz b Prenzlau + case "7": + return "39857"; // Drense + case "8": + return "39858"; // Bietikow + case "9": + return "39859"; // Fürstenwerder + default: + return ""; + } + } + + private static String fromNumber3986(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39861"; // Gramzow b Prenzlau + case "2": + return "39862"; // Schmölln b Prenzlau + case "3": + return "39863"; // Seehausen b Prenzlau + default: + return ""; + } + } + + private static String fromNumber3988(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39881"; // Ringenwalde b Templin + case "2": + return "39882"; // Gollin + case "3": + return "39883"; // Groß Dölln + case "4": + return "39884"; // Hassleben b Prenzlau + case "5": + return "39885"; // Jakobshagen + case "6": + return "39886"; // Milmersdorf + case "7": + return "39887"; // Gerswalde + case "8": + return "39888"; // Lychen + case "9": + return "39889"; // Boitzenburg + default: + return ""; + } + } + + private static String fromNumber399(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3991"; // Waren Müritz + case "2": + return fromNumber3992(number.substring(1)); + case "3": + return fromNumber3993(number.substring(1)); + case "4": + return "3994"; // Malchin + case "5": + return fromNumber3995(number.substring(1)); + case "6": + return "3996"; // Teterow + case "7": + return fromNumber3997(number.substring(1)); + case "8": + return "3998"; // Demmin + case "9": + return fromNumber3999(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3992(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39921"; // Ankershagen + case "2": + return "39922"; // Dambeck b Röbel + case "3": + return "39923"; // Priborn + case "4": + return "39924"; // Stuer + case "5": + return "39925"; // Wredenhagen + case "6": + return "39926"; // Grabowhöfe + case "7": + return "39927"; // Nossentiner Hütte + case "8": + return "39928"; // Möllenhagen + case "9": + return "39929"; // Jabel b Waren + default: + return ""; + } + } + + private static String fromNumber3993(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39931"; // Röbel Müritz + case "2": + return "39932"; // Malchow b Waren + case "3": + return "39933"; // Vollrathsruhe + case "4": + return "39934"; // Groß Plasten + default: + return ""; + } + } + + private static String fromNumber3995(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39951"; // Faulenrost + case "2": + return "39952"; // Grammentin + case "3": + return "39953"; // Schwinkendorf + case "4": + return "39954"; // Stavenhagen Reuterstadt + case "5": + return "39955"; // Jürgenstorf Meckl + case "6": + return "39956"; // Neukalen + case "7": + return "39957"; // Gielow + case "9": + return "39959"; // Dargun + default: + return ""; + } + } + + private static String fromNumber3997(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39971"; // Gnoien + case "2": + return "39972"; // Walkendorf + case "3": + return "39973"; // Altkalen + case "5": + return "39975"; // Thürkow + case "6": + return "39976"; // Groß Bützin + case "7": + return "39977"; // Jördenstorf + case "8": + return "39978"; // Gross Roge + default: + return ""; + } + } + + private static String fromNumber3999(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39991"; // Daberkow + case "2": + return "39992"; // Görmin + case "3": + return "39993"; // Hohenmocker + case "4": + return "39994"; // Metschow + case "5": + return "39995"; // Nossendorf + case "6": + return "39996"; // Törpin + case "7": + return "39997"; // Jarmen + case "8": + return "39998"; // Loitz b Demmin + case "9": + return "39999"; // Tutow + default: + return ""; + } + } + + private static String fromNumber4(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "40"; // Hamburg + case "1": + return fromNumber41(number.substring(1)); + case "2": + return fromNumber42(number.substring(1)); + case "3": + return fromNumber43(number.substring(1)); + case "4": + return fromNumber44(number.substring(1)); + case "5": + return fromNumber45(number.substring(1)); + case "6": + return fromNumber46(number.substring(1)); + case "7": + return fromNumber47(number.substring(1)); + case "8": + return fromNumber48(number.substring(1)); + case "9": + return fromNumber49(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber41(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber410(number.substring(1)); + case "2": + return fromNumber412(number.substring(1)); + case "3": + return fromNumber413(number.substring(1)); + case "4": + return fromNumber414(number.substring(1)); + case "5": + return fromNumber415(number.substring(1)); + case "6": + return fromNumber416(number.substring(1)); + case "7": + return fromNumber417(number.substring(1)); + case "8": + return fromNumber418(number.substring(1)); + case "9": + return fromNumber419(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber410(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4101"; // Pinneberg + case "2": + return "4102"; // Ahrensburg + case "3": + return "4103"; // Wedel + case "4": + return "4104"; // Aumühle b Hamburg + case "5": + return "4105"; // Seevetal + case "6": + return "4106"; // Quickborn Kr Pinneberg + case "7": + return "4107"; // Siek Kr Stormarn + case "8": + return "4108"; // Rosengarten Kr Harburg + case "9": + return "4109"; // Tangstedt Bz Hamburg + default: + return ""; + } + } + + private static String fromNumber412(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4120"; // Ellerhoop + case "1": + return "4121"; // Elmshorn + case "2": + return "4122"; // Uetersen + case "3": + return "4123"; // Barmstedt + case "4": + return "4124"; // Glückstadt + case "5": + return "4125"; // Seestermühe + case "6": + return "4126"; // Horst Holstein + case "7": + return "4127"; // Westerhorn + case "8": + return "4128"; // Kollmar + case "9": + return "4129"; // Haseldorf + default: + return ""; + } + } + + private static String fromNumber413(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4131"; // Lüneburg + case "2": + return "4132"; // Amelinghausen + case "3": + return "4133"; // Wittorf Kr Lünebeburg + case "4": + return "4134"; // Embsen Kr Lünebeburg + case "5": + return "4135"; // Kirchgellersen + case "6": + return "4136"; // Scharnebeck + case "7": + return "4137"; // Barendorf + case "8": + return "4138"; // Betzendorf Kr Lünebeburg + case "9": + return "4139"; // Hohnstorf Elbe + default: + return ""; + } + } + + private static String fromNumber414(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4140"; // Estorf Kr Stade + case "1": + return "4141"; // Stade + case "2": + return "4142"; // Steinkirchen Kr Stade + case "3": + return "4143"; // Drochtersen + case "4": + return "4144"; // Himmelpforten + case "6": + return "4146"; // Stade-Bützfleth + case "8": + return "4148"; // Drochtersen-Assel + case "9": + return "4149"; // Fredenbeck + default: + return ""; + } + } + + private static String fromNumber415(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4151"; // Schwarzenbek + case "2": + return "4152"; // Geesthacht + case "3": + return "4153"; // Lauenburg Elbe + case "4": + return "4154"; // Trittau + case "5": + return "4155"; // Büchen + case "6": + return "4156"; // Talkau + case "8": + return "4158"; // Roseburg + case "9": + return "4159"; // Basthorst + default: + return ""; + } + } + + private static String fromNumber416(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4161"; // Buxtehude + case "2": + return "4162"; // Jork + case "3": + return "4163"; // Horneburg Niederelbe + case "4": + return "4164"; // Harsefeld + case "5": + return "4165"; // Hollenstedt Nordheide + case "6": + return "4166"; // Ahlerstedt + case "7": + return "4167"; // Apensen + case "8": + return "4168"; // Neu Wulmstorf-Elstorf + case "9": + return "4169"; // Sauensiek + default: + return ""; + } + } + + private static String fromNumber417(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4171"; // Winsen Luhe + case "2": + return "4172"; // Salzhausen + case "3": + return "4173"; // Wulfsen + case "4": + return "4174"; // Stelle Kr Harburg + case "5": + return "4175"; // Egestorf Nordheide + case "6": + return "4176"; // Marschacht + case "7": + return "4177"; // Drage Elbe + case "8": + return "4178"; // Radbruch + case "9": + return "4179"; // Winsen-Tönnhausen + default: + return ""; + } + } + + private static String fromNumber418(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4180"; // Königsmoor + case "1": + return "4181"; // Buchholz in der Nordheide + case "2": + return "4182"; // Tostedt + case "3": + return "4183"; // Jesteburg + case "4": + return "4184"; // Hanstedt Nordheide + case "5": + return "4185"; // Marxen Auetal + case "6": + return "4186"; // Buchholz-Trelde + case "7": + return "4187"; // Holm-Seppensen + case "8": + return "4188"; // Welle Nordheide + case "9": + return "4189"; // Undeloh + default: + return ""; + } + } + + private static String fromNumber419(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4191"; // Kaltenkirchen Holst + case "2": + return "4192"; // Bad Bramstedt + case "3": + return "4193"; // Henstedt-Ulzburg + case "4": + return "4194"; // Sievershütten + case "5": + return "4195"; // Hartenholm + default: + return ""; + } + } + + private static String fromNumber42(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber420(number.substring(1)); + case "1": + return "421"; // Bremen + case "2": + return fromNumber422(number.substring(1)); + case "3": + return fromNumber423(number.substring(1)); + case "4": + return fromNumber424(number.substring(1)); + case "5": + return fromNumber425(number.substring(1)); + case "6": + return fromNumber426(number.substring(1)); + case "7": + return fromNumber427(number.substring(1)); + case "8": + return fromNumber428(number.substring(1)); + case "9": + return fromNumber429(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber420(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4202"; // Achim b Bremen + case "3": + return "4203"; // Weyhe b Bremen + case "4": + return "4204"; // Thedinghausen + case "5": + return "4205"; // Ottersberg + case "6": + return "4206"; // Stuhr-Heiligenrode + case "7": + return "4207"; // Oyten + case "8": + return "4208"; // Grasberg + case "9": + return "4209"; // Schwanewede + default: + return ""; + } + } + + private static String fromNumber422(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4221"; // Delmenhorst + case "2": + return "4222"; // Ganderkesee + case "3": + return "4223"; // Ganderkesee-Bookholzberg + case "4": + return "4224"; // Gross Ippener + default: + return ""; + } + } + + private static String fromNumber423(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4230"; // Verden-Walle + case "1": + return "4231"; // Verden Aller + case "2": + return "4232"; // Langwedel Kr Verden + case "3": + return "4233"; // Blender + case "4": + return "4234"; // Dörverden + case "5": + return "4235"; // Langwedel-Etelsen + case "6": + return "4236"; // Kirchlinteln + case "7": + return "4237"; // Bendingbostel + case "8": + return "4238"; // Neddenaverbergen + case "9": + return "4239"; // Dörverden-Westen + default: + return ""; + } + } + + private static String fromNumber424(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4240"; // Syke-Heiligenfelde + case "1": + return "4241"; // Bassum + case "2": + return "4242"; // Syke + case "3": + return "4243"; // Twistringen + case "4": + return "4244"; // Harpstedt + case "5": + return "4245"; // Neuenkirchen b Bassum + case "6": + return "4246"; // Twistringen-Heiligenloh + case "7": + return "4247"; // Affinghausen + case "8": + return "4248"; // Bassum-Neubruchhausen + case "9": + return "4249"; // Bassum-Nordwohlde + default: + return ""; + } + } + + private static String fromNumber425(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4251"; // Hoya + case "2": + return "4252"; // Bruchhausen-Vilsen + case "3": + return "4253"; // Asendorf Kr Diepholz + case "4": + return "4254"; // Eystrup + case "5": + return "4255"; // Martfeld + case "6": + return "4256"; // Hilgermissen + case "7": + return "4257"; // Schweringen + case "8": + return "4258"; // Schwarme + default: + return ""; + } + } + + private static String fromNumber426(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4260"; // Visselhövede-Wittorf + case "1": + return "4261"; // Rotenburg Wümme + case "2": + return "4262"; // Visselhövede + case "3": + return "4263"; // Scheessel + case "4": + return "4264"; // Sottrum Kr Rotenburg + case "5": + return "4265"; // Fintel + case "6": + return "4266"; // Brockel + case "7": + return "4267"; // Lauenbrück + case "8": + return "4268"; // Bötersen + case "9": + return "4269"; // Ahausen-Kirchwalsede + default: + return ""; + } + } + + private static String fromNumber427(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4271"; // Sulingen + case "2": + return "4272"; // Siedenburg + case "3": + return "4273"; // Kirchdorf b Sulingen + case "4": + return "4274"; // Varrel b Sulingen + case "5": + return "4275"; // Ehrenburg + case "6": + return "4276"; // Borstel b Sulingen + case "7": + return "4277"; // Schwaförden + default: + return ""; + } + } + + private static String fromNumber428(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4281"; // Zeven + case "2": + return "4282"; // Sittensen + case "3": + return "4283"; // Tarmstedt + case "4": + return "4284"; // Selsingen + case "5": + return "4285"; // Rhade b Zeven + case "6": + return "4286"; // Gyhum + case "7": + return "4287"; // Heeslingen-Boitzen + case "8": + return "4288"; // Horstedt Kr Rotenburg + case "9": + return "4289"; // Kirchtimke + default: + return ""; + } + } + + private static String fromNumber429(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4292"; // Ritterhude + case "3": + return "4293"; // Ottersberg-Fischerhude + case "4": + return "4294"; // Riede Kr Verden + case "5": + return "4295"; // Emtinghausen + case "6": + return "4296"; // Schwanewede-Aschwarden + case "7": + return "4297"; // Ottersberg-Posthausen + case "8": + return "4298"; // Lilienthal + default: + return ""; + } + } + + private static String fromNumber43(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber430(number.substring(1)); + case "1": + return "431"; // Kiel + case "2": + return fromNumber432(number.substring(1)); + case "3": + return fromNumber433(number.substring(1)); + case "4": + return fromNumber434(number.substring(1)); + case "5": + return fromNumber435(number.substring(1)); + case "6": + return fromNumber436(number.substring(1)); + case "7": + return fromNumber437(number.substring(1)); + case "8": + return fromNumber438(number.substring(1)); + case "9": + return fromNumber439(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber430(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4302"; // Kirchbarkau + case "3": + return "4303"; // Schlesen + case "5": + return "4305"; // Westensee + case "7": + return "4307"; // Raisdorf + case "8": + return "4308"; // Schwedeneck + default: + return ""; + } + } + + private static String fromNumber432(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4320"; // Heidmühlen + case "1": + return "4321"; // Neumünster + case "2": + return "4322"; // Bordesholm + case "3": + return "4323"; // Bornhöved + case "4": + return "4324"; // Brokstedt + case "6": + return "4326"; // Wankendorf + case "7": + return "4327"; // Grossenaspe + case "8": + return "4328"; // Rickling + case "9": + return "4329"; // Langwedel Holst + default: + return ""; + } + } + + private static String fromNumber433(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4330"; // Emkendorf + case "1": + return "4331"; // Rendsburg + case "2": + return "4332"; // Hamdorf b Rendsburg + case "3": + return "4333"; // Erfde + case "4": + return "4334"; // Bredenbek b Rendsburg + case "5": + return "4335"; // Hohn b Rendsburg + case "6": + return "4336"; // Owschlag + case "7": + return "4337"; // Jevenstedt + case "8": + return "4338"; // Alt Duvenstedt + case "9": + return "4339"; // Christiansholm + default: + return ""; + } + } + + private static String fromNumber434(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4340"; // Achterwehr + case "2": + return "4342"; // Preetz Kr Plön + case "3": + return "4343"; // Laboe + case "4": + return "4344"; // Schönberg Holstein + case "6": + return "4346"; // Gettorf + case "7": + return "4347"; // Flintbek + case "8": + return "4348"; // Schönkirchen + case "9": + return "4349"; // Dänischenhagen + default: + return ""; + } + } + + private static String fromNumber435(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4351"; // Eckernförde + case "2": + return "4352"; // Damp + case "3": + return "4353"; // Ascheffel + case "4": + return "4354"; // Fleckeby + case "5": + return "4355"; // Rieseby + case "6": + return "4356"; // Gross Wittensee + case "7": + return "4357"; // Sehestedt Eider + case "8": + return "4358"; // Loose b Eckernförde + default: + return ""; + } + } + + private static String fromNumber436(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4361"; // Oldenburg in Holstein + case "2": + return "4362"; // Heiligenhafen + case "3": + return "4363"; // Lensahn + case "4": + return "4364"; // Dahme Kr Ostholstein + case "5": + return "4365"; // Heringsdorf Holst + case "6": + return "4366"; // Grömitz-Cismar + case "7": + return "4367"; // Grossenbrode + default: + return ""; + } + } + + private static String fromNumber437(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4371"; // Burg auf Fehmarn + case "2": + return "4372"; // Westfehmarn + default: + return ""; + } + } + + private static String fromNumber438(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4381"; // Lütjenburg + case "2": + return "4382"; // Wangels + case "3": + return "4383"; // Grebin + case "4": + return "4384"; // Selent + case "5": + return "4385"; // Hohenfelde b Kiel + default: + return ""; + } + } + + private static String fromNumber439(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4392"; // Nortorf b Neumünster + case "3": + return "4393"; // Boostedt + case "4": + return "4394"; // Bokhorst + default: + return ""; + } + } + + private static String fromNumber44(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber440(number.substring(1)); + case "1": + return "441"; // Oldenburg (Oldb) + case "2": + return fromNumber442(number.substring(1)); + case "3": + return fromNumber443(number.substring(1)); + case "4": + return fromNumber444(number.substring(1)); + case "5": + return fromNumber445(number.substring(1)); + case "6": + return fromNumber446(number.substring(1)); + case "7": + return fromNumber447(number.substring(1)); + case "8": + return fromNumber448(number.substring(1)); + case "9": + return fromNumber449(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber440(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4401"; // Brake Unterweser + case "2": + return "4402"; // Rastede + case "3": + return "4403"; // Bad Zwischenahn + case "4": + return "4404"; // Elsfleth + case "5": + return "4405"; // Edewecht + case "6": + return "4406"; // Berne + case "7": + return "4407"; // Wardenburg + case "8": + return "4408"; // Hude Oldenburg + case "9": + return "4409"; // Westerstede-Ocholt + default: + return ""; + } + } + + private static String fromNumber442(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4421"; // Wilhelmshaven + case "2": + return "4422"; // Sande Kr Friesl + case "3": + return "4423"; // Fedderwarden + case "5": + return "4425"; // Wangerland-Hooksiel + case "6": + return "4426"; // Wangerland-Horumersiel + default: + return ""; + } + } + + private static String fromNumber443(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4431"; // Wildeshausen + case "2": + return "4432"; // Dötlingen-Brettorf + case "3": + return "4433"; // Dötlingen + case "4": + return "4434"; // Colnrade + case "5": + return "4435"; // Grossenkneten + default: + return ""; + } + } + + private static String fromNumber444(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4441"; // Vechta + case "2": + return "4442"; // Lohne Oldenburg + case "3": + return "4443"; // Dinklage + case "4": + return "4444"; // Goldenstedt + case "5": + return "4445"; // Visbek Kr Vechta + case "6": + return "4446"; // Bakum Kr Vechta + case "7": + return "4447"; // Vechta-Langförden + default: + return ""; + } + } + + private static String fromNumber445(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4451"; // Varel Jadebusen + case "2": + return "4452"; // Zetel-Neuenburg + case "3": + return "4453"; // Zetel + case "4": + return "4454"; // Jade + case "5": + return "4455"; // Jade-Schweiburg + case "6": + return "4456"; // Varel-Altjührden + case "8": + return "4458"; // Wiefelstede-Spohle + default: + return ""; + } + } + + private static String fromNumber446(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4461"; // Jever + case "2": + return "4462"; // Wittmund + case "3": + return "4463"; // Wangerland + case "4": + return "4464"; // Wittmund-Carolinensiel + case "5": + return "4465"; // Friedeburg Ostfriesl + case "6": + return "4466"; // Wittmund-Ardorf + case "7": + return "4467"; // Wittmund-Funnix + case "8": + return "4468"; // Friedeburg-Reepsholt + case "9": + return "4469"; // Wangerooge + default: + return ""; + } + } + + private static String fromNumber447(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4471"; // Cloppenburg + case "2": + return "4472"; // Lastrup + case "3": + return "4473"; // Emstek + case "4": + return "4474"; // Garrel + case "5": + return "4475"; // Molbergen + case "7": + return "4477"; // Lastrup-Hemmelte + case "8": + return "4478"; // Cappeln Oldenburg + case "9": + return "4479"; // Molbergen-Peheim + default: + return ""; + } + } + + private static String fromNumber448(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4480"; // Ovelgönne-Strückhausen + case "1": + return "4481"; // Hatten-Sandkrug + case "2": + return "4482"; // Hatten + case "3": + return "4483"; // Ovelgönne-Großenmeer + case "4": + return "4484"; // Hude-Wüsting + case "5": + return "4485"; // Elsfleth-Huntorf + case "6": + return "4486"; // Edewecht-Friedrichsfehn + case "7": + return "4487"; // Grossenkneten-Huntlosen + case "8": + return "4488"; // Westerstede + case "9": + return "4489"; // Apen + default: + return ""; + } + } + + private static String fromNumber449(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4491"; // Friesoythe + case "2": + return "4492"; // Saterland + case "3": + return "4493"; // Friesoythe-Gehlenberg + case "4": + return "4494"; // Bösel Oldenburg + case "5": + return "4495"; // Friesoythe-Thüle + case "6": + return "4496"; // Friesoythe-Markhausen + case "7": + return "4497"; // Barßel-Harkebrügge + case "8": + return "4498"; // Saterland-Ramsloh + case "9": + return "4499"; // Barssel + default: + return ""; + } + } + + private static String fromNumber45(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber450(number.substring(1)); + case "1": + return "451"; // Lübeck + case "2": + return fromNumber452(number.substring(1)); + case "3": + return fromNumber453(number.substring(1)); + case "4": + return fromNumber454(number.substring(1)); + case "5": + return fromNumber455(number.substring(1)); + case "6": + return fromNumber456(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber450(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4501"; // Kastorf Holst + case "2": + return "4502"; // Lübeck-Travemünde + case "3": + return "4503"; // Timmendorfer Strand + case "4": + return "4504"; // Ratekau + case "5": + return "4505"; // Stockelsdorf-Curau + case "6": + return "4506"; // Stockelsdorf-Krumbeck + case "8": + return "4508"; // Krummesse + case "9": + return "4509"; // Groß Grönau + default: + return ""; + } + } + + private static String fromNumber452(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4521"; // Eutin + case "2": + return "4522"; // Plön + case "3": + return "4523"; // Malente + case "4": + return "4524"; // Scharbeutz-Pönitz + case "5": + return "4525"; // Ahrensbök + case "6": + return "4526"; // Ascheberg Holstein + case "7": + return "4527"; // Bosau + case "8": + return "4528"; // Schönwalde am Bungsberg + case "9": + return "4529"; // Süsel-Bujendorf + default: + return ""; + } + } + + private static String fromNumber453(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4531"; // Bad Oldesloe + case "2": + return "4532"; // Bargteheide + case "3": + return "4533"; // Reinfeld Holstein + case "4": + return "4534"; // Steinburg Kr Storman + case "5": + return "4535"; // Nahe + case "6": + return "4536"; // Steinhorst Lauenb + case "7": + return "4537"; // Sülfeld Holst + case "9": + return "4539"; // Westerau + default: + return ""; + } + } + + private static String fromNumber454(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4541"; // Ratzeburg + case "2": + return "4542"; // Mölln Lauenb + case "3": + return "4543"; // Nusse + case "4": + return "4544"; // Berkenthin + case "5": + return "4545"; // Seedorf Lauenb + case "6": + return "4546"; // Mustin Lauenburg + case "7": + return "4547"; // Gudow Lauenb + default: + return ""; + } + } + + private static String fromNumber455(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4550"; // Bühnsdorf + case "1": + return "4551"; // Bad Segeberg + case "2": + return "4552"; // Leezen + case "3": + return "4553"; // Geschendorf + case "4": + return "4554"; // Wahlstedt + case "5": + return "4555"; // Seedorf b Bad Segeberg + case "6": + return "4556"; // Ahrensbök-Gnissau + case "7": + return "4557"; // Blunk + case "8": + return "4558"; // Todesfelde + case "9": + return "4559"; // Wensin + default: + return ""; + } + } + + private static String fromNumber456(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4561"; // Neustadt in Holstein + case "2": + return "4562"; // Grömitz + case "3": + return "4563"; // Scharbeutz-Haffkrug + case "4": + return "4564"; // Schashagen + default: + return ""; + } + } + + private static String fromNumber46(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber460(number.substring(1)); + case "1": + return "461"; // Flensburg + case "2": + return fromNumber462(number.substring(1)); + case "3": + return fromNumber463(number.substring(1)); + case "4": + return fromNumber464(number.substring(1)); + case "5": + return fromNumber465(number.substring(1)); + case "6": + return fromNumber466(number.substring(1)); + case "7": + return fromNumber467(number.substring(1)); + case "8": + return fromNumber468(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber460(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4602"; // Freienwill + case "3": + return "4603"; // Havetoft + case "4": + return "4604"; // Grossenwiehe + case "5": + return "4605"; // Medelby + case "6": + return "4606"; // Wanderup + case "7": + return "4607"; // Janneby + case "8": + return "4608"; // Handewitt + case "9": + return "4609"; // Eggebek + default: + return ""; + } + } + + private static String fromNumber462(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4621"; // Schleswig + case "2": + return "4622"; // Taarstedt + case "3": + return "4623"; // Böklund + case "4": + return "4624"; // Kropp + case "5": + return "4625"; // Jübek + case "6": + return "4626"; // Treia + case "7": + return "4627"; // Dörpstedt + default: + return ""; + } + } + + private static String fromNumber463(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4630"; // Barderup + case "1": + return "4631"; // Glücksburg Ostsee + case "2": + return "4632"; // Steinbergkirche + case "3": + return "4633"; // Satrup + case "4": + return "4634"; // Husby + case "5": + return "4635"; // Sörup + case "6": + return "4636"; // Langballig + case "7": + return "4637"; // Sterup + case "8": + return "4638"; // Tarp + case "9": + return "4639"; // Schafflund + default: + return ""; + } + } + + private static String fromNumber464(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4641"; // Süderbrarup + case "2": + return "4642"; // Kappeln Schlei + case "3": + return "4643"; // Gelting Angeln + case "4": + return "4644"; // Karby + case "6": + return "4646"; // Mohrkirch + default: + return ""; + } + } + + private static String fromNumber465(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4651"; // Sylt + default: + return ""; + } + } + + private static String fromNumber466(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4661"; // Niebüll + case "2": + return "4662"; // Leck + case "3": + return "4663"; // Süderlügum + case "4": + return "4664"; // Neukirchen b Niebüll + case "5": + return "4665"; // Emmelsbüll-Horsbüll + case "6": + return "4666"; // Ladelund + case "7": + return "4667"; // Dagebüll + case "8": + return "4668"; // Klanxbüll + default: + return ""; + } + } + + private static String fromNumber467(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4671"; // Bredstedt + case "2": + return "4672"; // Langenhorn + case "3": + return "4673"; // Joldelund + case "4": + return "4674"; // Ockholm + default: + return ""; + } + } + + private static String fromNumber468(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4681"; // Wyk auf Föhr + case "2": + return "4682"; // Amrum + case "3": + return "4683"; // Oldsum + case "4": + return "4684"; // Langeneß Hallig + default: + return ""; + } + } + + private static String fromNumber47(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber470(number.substring(1)); + case "1": + return "471"; // Bremerhaven + case "2": + return fromNumber472(number.substring(1)); + case "3": + return fromNumber473(number.substring(1)); + case "4": + return fromNumber474(number.substring(1)); + case "5": + return fromNumber475(number.substring(1)); + case "6": + return fromNumber476(number.substring(1)); + case "7": + return fromNumber477(number.substring(1)); + case "9": + return fromNumber479(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber470(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4702"; // Sandstedt + case "3": + return "4703"; // Loxstedt-Donnern + case "4": + return "4704"; // Drangstedt + case "5": + return "4705"; // Wremen + case "6": + return "4706"; // Schiffdorf + case "7": + return "4707"; // Langen-Neuenwalde + case "8": + return "4708"; // Ringstedt + default: + return ""; + } + } + + private static String fromNumber472(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4721"; // Cuxhaven + case "2": + return "4722"; // Cuxhaven-Altenbruch + case "3": + return "4723"; // Cuxhaven-Altenwalde + case "4": + return "4724"; // Cuxhaven-Lüdingworth + case "5": + return "4725"; // Helgoland + default: + return ""; + } + } + + private static String fromNumber473(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4731"; // Nordenham + case "2": + return "4732"; // Stadland-Rodenkirchen + case "3": + return "4733"; // Butjadingen-Burhave + case "4": + return "4734"; // Stadland-Seefeld + case "5": + return "4735"; // Butjadingen-Stollhamm + case "6": + return "4736"; // Butjadingen-Tossens + case "7": + return "4737"; // Stadland-Schwei + default: + return ""; + } + } + + private static String fromNumber474(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4740"; // Loxstedt-Dedesdorf + case "1": + return "4741"; // Nordholz b Bremerhaven + case "2": + return "4742"; // Dorum + case "3": + return "4743"; // Langen b Bremerhaven + case "4": + return "4744"; // Loxstedt + case "5": + return "4745"; // Bad Bederkesa + case "6": + return "4746"; // Hagen b Bremerhaven + case "7": + return "4747"; // Beverstedt + case "8": + return "4748"; // Stubben b Bremerhaven + case "9": + return "4749"; // Schiffdorf-Geestenseth + default: + return ""; + } + } + + private static String fromNumber475(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4751"; // Otterndorf + case "2": + return "4752"; // Neuhaus Oste + case "3": + return "4753"; // Balje + case "4": + return "4754"; // Bülkau + case "5": + return "4755"; // Ihlienworth + case "6": + return "4756"; // Odisheim + case "7": + return "4757"; // Wanna + case "8": + return "4758"; // Nordleda + default: + return ""; + } + } + + private static String fromNumber476(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4761"; // Bremervörde + case "2": + return "4762"; // Kutenholz + case "3": + return "4763"; // Gnarrenburg + case "4": + return "4764"; // Gnarrenburg-Klenkendorf + case "5": + return "4765"; // Ebersdorf b Bremervörde + case "6": + return "4766"; // Basdahl + case "7": + return "4767"; // Bremervörde-Bevern + case "8": + return "4768"; // Hipstedt + case "9": + return "4769"; // Bremervörde-Iselersheim + default: + return ""; + } + } + + private static String fromNumber477(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4770"; // Wischhafen + case "1": + return "4771"; // Hemmoor + case "2": + return "4772"; // Oberndorf Oste + case "3": + return "4773"; // Lamstedt + case "4": + return "4774"; // Hechthausen + case "5": + return "4775"; // Grossenwörden + case "6": + return "4776"; // Osten-Altendorf + case "7": + return "4777"; // Cadenberge + case "8": + return "4778"; // Wingst + case "9": + return "4779"; // Freiburg Elbe + default: + return ""; + } + } + + private static String fromNumber479(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4791"; // Osterholz-Scharmbeck + case "2": + return "4792"; // Worpswede + case "3": + return "4793"; // Hambergen + case "4": + return "4794"; // Worpswede-Ostersode + case "5": + return "4795"; // Garlstedt + case "6": + return "4796"; // Teufelsmoor + default: + return ""; + } + } + + private static String fromNumber48(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber480(number.substring(1)); + case "1": + return "481"; // Heide Holst + case "2": + return fromNumber482(number.substring(1)); + case "3": + return fromNumber483(number.substring(1)); + case "4": + return fromNumber484(number.substring(1)); + case "5": + return fromNumber485(number.substring(1)); + case "6": + return fromNumber486(number.substring(1)); + case "7": + return fromNumber487(number.substring(1)); + case "8": + return fromNumber488(number.substring(1)); + case "9": + return fromNumber489(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber480(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4802"; // Wrohm + case "3": + return "4803"; // Pahlen + case "4": + return "4804"; // Nordhastedt + case "5": + return "4805"; // Schafstedt + case "6": + return "4806"; // Sarzbüttel + default: + return ""; + } + } + + private static String fromNumber482(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4821"; // Itzehoe + case "2": + return "4822"; // Kellinghusen + case "3": + return "4823"; // Wilster + case "4": + return "4824"; // Krempe + case "5": + return "4825"; // Burg Dithmarschen + case "6": + return "4826"; // Hohenlockstedt + case "7": + return "4827"; // Wacken + case "8": + return "4828"; // Lägerdorf + case "9": + return "4829"; // Wewelsfleth + default: + return ""; + } + } + + private static String fromNumber483(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4830"; // Süderhastedt + case "2": + return "4832"; // Meldorf + case "3": + return "4833"; // Wesselburen + case "4": + return "4834"; // Büsum + case "5": + return "4835"; // Albersdorf Holst + case "6": + return "4836"; // Hennstedt Dithm + case "7": + return "4837"; // Neuenkirchen Dithm + case "8": + return "4838"; // Tellingstedt + case "9": + return "4839"; // Wöhrden Dithm + default: + return ""; + } + } + + private static String fromNumber484(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4841"; // Husum Nordsee + case "2": + return "4842"; // Nordstrand + case "3": + return "4843"; // Viöl + case "4": + return "4844"; // Pellworm + case "5": + return "4845"; // Ostenfeld Husum + case "6": + return "4846"; // Hattstedt + case "7": + return "4847"; // Oster-Ohrstedt + case "8": + return "4848"; // Rantrum + case "9": + return "4849"; // Hooge + default: + return ""; + } + } + + private static String fromNumber485(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4851"; // Marne + case "2": + return "4852"; // Brunsbüttel + case "3": + return "4853"; // Sankt Michaelisdonn + case "4": + return "4854"; // Friedrichskoog + case "5": + return "4855"; // Eddelak + case "6": + return "4856"; // Kronprinzenkoog + case "7": + return "4857"; // Barlt + case "8": + return "4858"; // Sankt Margarethen Holst + case "9": + return "4859"; // Windbergen + default: + return ""; + } + } + + private static String fromNumber486(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4861"; // Tönning + case "2": + return "4862"; // Garding + case "3": + return "4863"; // Sankt Peter-Ording + case "4": + return "4864"; // Oldenswort + case "5": + return "4865"; // Osterhever + default: + return ""; + } + } + + private static String fromNumber487(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4871"; // Hohenwestedt + case "2": + return "4872"; // Hanerau-Hademarschen + case "3": + return "4873"; // Aukrug + case "4": + return "4874"; // Todenbüttel + case "5": + return "4875"; // Stafstedt + case "6": + return "4876"; // Reher Holst + case "7": + return "4877"; // Hennstedt b Itzehoe + default: + return ""; + } + } + + private static String fromNumber488(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4881"; // Friedrichstadt + case "2": + return "4882"; // Lunden + case "3": + return "4883"; // Süderstapel + case "4": + return "4884"; // Schwabstedt + case "5": + return "4885"; // Bergenhusen + default: + return ""; + } + } + + private static String fromNumber489(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4892"; // Schenefeld Mittelholst + case "3": + return "4893"; // Hohenaspe + default: + return ""; + } + } + + private static String fromNumber49(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber490(number.substring(1)); + case "1": + return "491"; // Leer Ostfriesland + case "2": + return fromNumber492(number.substring(1)); + case "3": + return fromNumber493(number.substring(1)); + case "4": + return fromNumber494(number.substring(1)); + case "5": + return fromNumber495(number.substring(1)); + case "6": + return fromNumber496(number.substring(1)); + case "7": + return fromNumber497(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber490(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4902"; // Jemgum-Ditzum + case "3": + return "4903"; // Wymeer + default: + return ""; + } + } + + private static String fromNumber492(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4920"; // Wirdum + case "1": + return "4921"; // Emden Stadt + case "2": + return "4922"; // Borkum + case "3": + return "4923"; // Krummhörn-Pewsum + case "4": + return "4924"; // Moormerland-Oldersum + case "5": + return "4925"; // Hinte + case "6": + return "4926"; // Krummhörn-Greetsiel + case "7": + return "4927"; // Krummhörn-Loquard + case "8": + return "4928"; // Ihlow-Riepe + case "9": + return "4929"; // Ihlow Kr Aurich + default: + return ""; + } + } + + private static String fromNumber493(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4931"; // Norden + case "2": + return "4932"; // Norderney + case "3": + return "4933"; // Dornum Ostfriesl + case "4": + return "4934"; // Marienhafe + case "5": + return "4935"; // Juist + case "6": + return "4936"; // Grossheide + case "8": + return "4938"; // Hagermarsch + case "9": + return "4939"; // Baltrum + default: + return ""; + } + } + + private static String fromNumber494(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4941"; // Aurich + case "2": + return "4942"; // Südbrookmerland + case "3": + return "4943"; // Grossefehn + case "4": + return "4944"; // Wiesmoor + case "5": + return "4945"; // Grossefehn-Timmel + case "6": + return "4946"; // Grossefehn-Bagband + case "7": + return "4947"; // Aurich-Ogenbargen + case "8": + return "4948"; // Wiesmoor-Marcardsmoor + default: + return ""; + } + } + + private static String fromNumber495(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4950"; // Holtland + case "1": + return "4951"; // Weener + case "2": + return "4952"; // Rhauderfehn + case "3": + return "4953"; // Bunde + case "4": + return "4954"; // Moormerland + case "5": + return "4955"; // Westoverledingen + case "6": + return "4956"; // Uplengen + case "7": + return "4957"; // Detern + case "8": + return "4958"; // Jemgum + case "9": + return "4959"; // Dollart + default: + return ""; + } + } + + private static String fromNumber496(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4961"; // Papenburg + case "2": + return "4962"; // Papenburg-Aschendorf + case "3": + return "4963"; // Dörpen + case "4": + return "4964"; // Rhede Ems + case "5": + return "4965"; // Surwold + case "6": + return "4966"; // Neubörger + case "7": + return "4967"; // Rhauderfehn-Burlage + case "8": + return "4968"; // Neulehe + default: + return ""; + } + } + + private static String fromNumber497(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4971"; // Esens + case "2": + return "4972"; // Langeoog + case "3": + return "4973"; // Wittmund-Burhafe + case "4": + return "4974"; // Neuharlingersiel + case "5": + return "4975"; // Westerholt Ostfriesl + case "6": + return "4976"; // Spiekeroog + case "7": + return "4977"; // Blomberg Ostfriesl + default: + return ""; + } + } + + private static String fromNumber5(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber50(number.substring(1)); + case "1": + return fromNumber51(number.substring(1)); + case "2": + return fromNumber52(number.substring(1)); + case "3": + return fromNumber53(number.substring(1)); + case "4": + return fromNumber54(number.substring(1)); + case "5": + return fromNumber55(number.substring(1)); + case "6": + return fromNumber56(number.substring(1)); + case "7": + return fromNumber57(number.substring(1)); + case "8": + return fromNumber58(number.substring(1)); + case "9": + return fromNumber59(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber50(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber502(number.substring(1)); + case "3": + return fromNumber503(number.substring(1)); + case "4": + return fromNumber504(number.substring(1)); + case "5": + return fromNumber505(number.substring(1)); + case "6": + return fromNumber506(number.substring(1)); + case "7": + return fromNumber507(number.substring(1)); + case "8": + return fromNumber508(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5021"; // Nienburg Weser + case "2": + return "5022"; // Wietzen + case "3": + return "5023"; // Liebenau Kr Nieburg Weser + case "4": + return "5024"; // Rohrsen Kr Nienburg Weser + case "5": + return "5025"; // Estorf Weser + case "6": + return "5026"; // Steimbke + case "7": + return "5027"; // Linsburg + case "8": + return "5028"; // Pennigsehl + default: + return ""; + } + } + + private static String fromNumber503(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5031"; // Wunstorf + case "2": + return "5032"; // Neustadt am Rübenberge + case "3": + return "5033"; // Wunstorf-Grossenheidorn + case "4": + return "5034"; // Neustadt-Hagen + case "5": + return "5035"; // Gross Munzel + case "6": + return "5036"; // Neustadt-Schneeren + case "7": + return "5037"; // Bad Rehburg + default: + return ""; + } + } + + private static String fromNumber504(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5041"; // Springe Deister + case "2": + return "5042"; // Bad Münder am Deister + case "3": + return "5043"; // Lauenau + case "4": + return "5044"; // Springe-Eldagsen + case "5": + return "5045"; // Springe-Bennigsen + default: + return ""; + } + } + + private static String fromNumber505(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5051"; // Bergen Kr Celle + case "2": + return "5052"; // Hermannsburg + case "3": + return "5053"; // Faßberg-Müden + case "4": + return "5054"; // Bergen-Sülze + case "5": + return "5055"; // Fassberg + case "6": + return "5056"; // Winsen-Meissendorf + default: + return ""; + } + } + + private static String fromNumber506(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5060"; // Bodenburg + case "2": + return "5062"; // Holle b Hildesheim + case "3": + return "5063"; // Bad Salzdetfurth + case "4": + return "5064"; // Groß Düngen + case "5": + return "5065"; // Sibbesse + case "6": + return "5066"; // Sarstedt + case "7": + return "5067"; // Bockenem + case "8": + return "5068"; // Elze Leine + case "9": + return "5069"; // Nordstemmen + default: + return ""; + } + } + + private static String fromNumber507(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5071"; // Schwarmstedt + case "2": + return "5072"; // Neustadt-Mandelsloh + case "3": + return "5073"; // Neustadt-Esperke + case "4": + return "5074"; // Rodewald + default: + return ""; + } + } + + private static String fromNumber508(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5082"; // Langlingen + case "3": + return "5083"; // Hohne b Celle + case "4": + return "5084"; // Hambühren + case "5": + return "5085"; // Burgdorf-Ehlershausen + case "6": + return "5086"; // Celle-Scheuen + default: + return ""; + } + } + + private static String fromNumber51(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber510(number.substring(1)); + case "1": + return "511"; // Hannover + case "2": + return fromNumber512(number.substring(1)); + case "3": + return fromNumber513(number.substring(1)); + case "4": + return fromNumber514(number.substring(1)); + case "5": + return fromNumber515(number.substring(1)); + case "6": + return fromNumber516(number.substring(1)); + case "7": + return fromNumber517(number.substring(1)); + case "8": + return fromNumber518(number.substring(1)); + case "9": + return fromNumber519(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber510(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5101"; // Pattensen + case "2": + return "5102"; // Laatzen + case "3": + return "5103"; // Wennigsen Deister + case "5": + return "5105"; // Barsinghausen + case "8": + return "5108"; // Gehrden Han + case "9": + return "5109"; // Ronnenberg + default: + return ""; + } + } + + private static String fromNumber512(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5121"; // Hildesheim + case "3": + return "5123"; // Schellerten + case "6": + return "5126"; // Algermissen + case "7": + return "5127"; // Harsum + case "8": + return "5128"; // Hohenhameln + case "9": + return "5129"; // Söhlde + default: + return ""; + } + } + + private static String fromNumber513(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5130"; // Wedemark + case "1": + return "5131"; // Garbsen + case "2": + return "5132"; // Lehrte + case "5": + return "5135"; // Burgwedel-Fuhrberg + case "6": + return "5136"; // Burgdorf Kr Hannover + case "7": + return "5137"; // Seelze + case "8": + return "5138"; // Sehnde + case "9": + return "5139"; // Burgwedel + default: + return ""; + } + } + + private static String fromNumber514(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5141"; // Celle + case "2": + return "5142"; // Eschede + case "3": + return "5143"; // Winsen Aller + case "4": + return "5144"; // Wathlingen + case "5": + return "5145"; // Beedenbostel + case "6": + return "5146"; // Wietze + case "7": + return "5147"; // Uetze-Hänigsen + case "8": + return "5148"; // Steinhorst Niedersachs + case "9": + return "5149"; // Wienhausen + default: + return ""; + } + } + + private static String fromNumber515(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5151"; // Hameln + case "2": + return "5152"; // Hessisch Oldendorf + case "3": + return "5153"; // Salzhemmendorf + case "4": + return "5154"; // Aerzen + case "5": + return "5155"; // Emmerthal + case "6": + return "5156"; // Coppenbrügge + case "7": + return "5157"; // Emmerthal-Börry + case "8": + return "5158"; // Hemeringen + case "9": + return "5159"; // Coppenbrügge-Bisperode + default: + return ""; + } + } + + private static String fromNumber516(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5161"; // Walsrode + case "2": + return "5162"; // Fallingbostel + case "3": + return "5163"; // Fallingbostel-Dorfmark + case "4": + return "5164"; // Hodenhagen + case "5": + return "5165"; // Rethem Aller + case "6": + return "5166"; // Walsrode-Kirchboitzen + case "7": + return "5167"; // Walsrode-Westenholz + case "8": + return "5168"; // Walsrode-Stellichte + default: + return ""; + } + } + + private static String fromNumber517(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5171"; // Peine + case "2": + return "5172"; // Ilsede + case "3": + return "5173"; // Uetze + case "4": + return "5174"; // Lahstedt + case "5": + return "5175"; // Lehrte-Arpke + case "6": + return "5176"; // Edemissen + case "7": + return "5177"; // Edemissen-Abbensen + default: + return ""; + } + } + + private static String fromNumber518(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5181"; // Alfeld Leine + case "2": + return "5182"; // Gronau Leine + case "3": + return "5183"; // Lamspringe + case "4": + return "5184"; // Freden Leine + case "5": + return "5185"; // Duingen + case "6": + return "5186"; // Salzhemmendorf-Wallensen + case "7": + return "5187"; // Delligsen + default: + return ""; + } + } + + private static String fromNumber519(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5190"; // Soltau-Emmingen + case "1": + return "5191"; // Soltau + case "2": + return "5192"; // Munster + case "3": + return "5193"; // Schneverdingen + case "4": + return "5194"; // Bispingen + case "5": + return "5195"; // Neuenkirchen b Soltau + case "6": + return "5196"; // Wietzendorf + case "7": + return "5197"; // Soltau-Frielingen + case "8": + return "5198"; // Schneverdingen-Wintermoor + case "9": + return "5199"; // Schneverdingen-Heber + default: + return ""; + } + } + + private static String fromNumber52(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber520(number.substring(1)); + case "1": + return "521"; // Bielefeld + case "2": + return fromNumber522(number.substring(1)); + case "3": + return fromNumber523(number.substring(1)); + case "4": + return fromNumber524(number.substring(1)); + case "5": + return fromNumber525(number.substring(1)); + case "6": + return fromNumber526(number.substring(1)); + case "7": + return fromNumber527(number.substring(1)); + case "8": + return fromNumber528(number.substring(1)); + case "9": + return fromNumber529(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber520(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5201"; // Halle Westf + case "2": + return "5202"; // Oerlinghausen + case "3": + return "5203"; // Werther Westf + case "4": + return "5204"; // Steinhagen Westf + case "5": + return "5205"; // Bielefeld-Sennestadt + case "6": + return "5206"; // Bielefeld-Jöllenbeck + case "7": + return "5207"; // Schloss Holte-Stukenbrock + case "8": + return "5208"; // Leopoldshöhe + case "9": + return "5209"; // Gütersloh-Friedrichsdorf + default: + return ""; + } + } + + private static String fromNumber522(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5221"; // Herford + case "2": + return "5222"; // Bad Salzuflen + case "3": + return "5223"; // Bünde + case "4": + return "5224"; // Enger Westf + case "5": + return "5225"; // Spenge + case "6": + return "5226"; // Bruchmühlen Westf + case "8": + return "5228"; // Vlotho-Exter + default: + return ""; + } + } + + private static String fromNumber523(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5231"; // Detmold + case "2": + return "5232"; // Lage Lippe + case "3": + return "5233"; // Steinheim Westf + case "4": + return "5234"; // Horn-Bad Meinberg + case "5": + return "5235"; // Blomberg Lippe + case "6": + return "5236"; // Blomberg-Grossenmarpe + case "7": + return "5237"; // Augustdorf + case "8": + return "5238"; // Nieheim-Himmighausen + default: + return ""; + } + } + + private static String fromNumber524(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5241"; // Gütersloh + case "2": + return "5242"; // Rheda-Wiedenbrück + case "4": + return "5244"; // Rietberg + case "5": + return "5245"; // Herzebrock-Clarholz + case "6": + return "5246"; // Verl + case "7": + return "5247"; // Harsewinkel + case "8": + return "5248"; // Langenberg Kr Gütersloh + default: + return ""; + } + } + + private static String fromNumber525(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5250"; // Delbrück Westf + case "1": + return "5251"; // Paderborn + case "2": + return "5252"; // Bad Lippspringe + case "3": + return "5253"; // Bad Driburg + case "4": + return "5254"; // Paderborn-Schloss Neuhaus + case "5": + return "5255"; // Altenbeken + case "7": + return "5257"; // Hövelhof + case "8": + return "5258"; // Salzkotten + case "9": + return "5259"; // Bad Driburg-Neuenheerse + default: + return ""; + } + } + + private static String fromNumber526(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5261"; // Lemgo + case "2": + return "5262"; // Extertal + case "3": + return "5263"; // Barntrup + case "4": + return "5264"; // Kalletal + case "5": + return "5265"; // Dörentrup + case "6": + return "5266"; // Lemgo-Kirchheide + default: + return ""; + } + } + + private static String fromNumber527(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5271"; // Höxter + case "2": + return "5272"; // Brakel Westf + case "3": + return "5273"; // Beverungen + case "4": + return "5274"; // Nieheim + case "5": + return "5275"; // Höxter-Ottbergen + case "6": + return "5276"; // Marienmünster + case "7": + return "5277"; // Höxter-Fürstenau + case "8": + return "5278"; // Höxter-Ovenhausen + default: + return ""; + } + } + + private static String fromNumber528(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5281"; // Bad Pyrmont + case "2": + return "5282"; // Schieder-Schwalenberg + case "3": + return "5283"; // Lügde-Rischenau + case "4": + return "5284"; // Schwalenberg + case "5": + return "5285"; // Bad Pyrmont-Kleinenberg + case "6": + return "5286"; // Ottenstein Niedersachs + default: + return ""; + } + } + + private static String fromNumber529(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5292"; // Lichtenau-Atteln + case "3": + return "5293"; // Paderborn-Dahl + case "4": + return "5294"; // Hövelhof-Espeln + case "5": + return "5295"; // Lichtenau Westf + default: + return ""; + } + } + + private static String fromNumber53(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber530(number.substring(1)); + case "1": + return "531"; // Braunschweig + case "2": + return fromNumber532(number.substring(1)); + case "3": + return fromNumber533(number.substring(1)); + case "4": + return fromNumber534(number.substring(1)); + case "5": + return fromNumber535(number.substring(1)); + case "6": + return fromNumber536(number.substring(1)); + case "7": + return fromNumber537(number.substring(1)); + case "8": + return fromNumber538(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber530(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5300"; // Salzgitter-Üfingen + case "1": + return "5301"; // Lehre-Essenrode + case "2": + return "5302"; // Vechelde + case "3": + return "5303"; // Wendeburg + case "4": + return "5304"; // Meine + case "5": + return "5305"; // Sickte + case "6": + return "5306"; // Cremlingen + case "7": + return "5307"; // Braunschweig-Wenden + case "8": + return "5308"; // Lehre + case "9": + return "5309"; // Lehre-Wendhausen + default: + return ""; + } + } + + private static String fromNumber532(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5320"; // Torfhaus + case "1": + return "5321"; // Goslar + case "2": + return "5322"; // Bad Harzburg + case "3": + return "5323"; // Clausthal-Zellerfeld + case "4": + return "5324"; // Vienenburg + case "5": + return "5325"; // Goslar-Hahnenklee + case "6": + return "5326"; // Langelsheim + case "7": + return "5327"; // Bad Grund Harz + case "8": + return "5328"; // Altenau Harz + case "9": + return "5329"; // Schulenberg im Oberharz + default: + return ""; + } + } + + private static String fromNumber533(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5331"; // Wolfenbüttel + case "2": + return "5332"; // Schöppenstedt + case "3": + return "5333"; // Dettum + case "4": + return "5334"; // Hornburg Kr Wolfenbüttel + case "5": + return "5335"; // Schladen + case "6": + return "5336"; // Semmenstedt + case "7": + return "5337"; // Kissenbrück + case "9": + return "5339"; // Gielde + default: + return ""; + } + } + + private static String fromNumber534(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5341"; // Salzgitter + case "4": + return "5344"; // Lengede + case "5": + return "5345"; // Baddeckenstedt + case "6": + return "5346"; // Liebenburg + case "7": + return "5347"; // Burgdorf b Salzgitter + default: + return ""; + } + } + + private static String fromNumber535(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5351"; // Helmstedt + case "2": + return "5352"; // Schöningen + case "3": + return "5353"; // Königslutter am Elm + case "4": + return "5354"; // Jerxheim + case "5": + return "5355"; // Frellstedt + case "6": + return "5356"; // Helmstedt-Barmke + case "7": + return "5357"; // Grasleben + case "8": + return "5358"; // Bahrdorf-Mackendorf + default: + return ""; + } + } + + private static String fromNumber536(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5361"; // Wolfsburg + case "2": + return "5362"; // Wolfsburg-Fallersleben + case "3": + return "5363"; // Wolfsburg-Vorsfelde + case "4": + return "5364"; // Velpke + case "5": + return "5365"; // Wolfsburg-Neindorf + case "6": + return "5366"; // Jembke + case "7": + return "5367"; // Rühen + case "8": + return "5368"; // Parsau + default: + return ""; + } + } + + private static String fromNumber537(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5371"; // Gifhorn + case "2": + return "5372"; // Meinersen + case "3": + return "5373"; // Hillerse Kr Gifhorn + case "4": + return "5374"; // Isenbüttel + case "5": + return "5375"; // Müden Aller + case "6": + return "5376"; // Wesendorf Kr Gifhorn + case "7": + return "5377"; // Ehra-Lessien + case "8": + return "5378"; // Sassenburg-Platendorf + case "9": + return "5379"; // Sassenburg-Grussendorf + default: + return ""; + } + } + + private static String fromNumber538(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5381"; // Seesen + case "2": + return "5382"; // Bad Gandersheim + case "3": + return "5383"; // Lutter am Barenberge + case "4": + return "5384"; // Seesen-Groß Rhüden + default: + return ""; + } + } + + private static String fromNumber54(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber540(number.substring(1)); + case "1": + return "541"; // Osnabrück + case "2": + return fromNumber542(number.substring(1)); + case "3": + return fromNumber543(number.substring(1)); + case "4": + return fromNumber544(number.substring(1)); + case "5": + return fromNumber545(number.substring(1)); + case "6": + return fromNumber546(number.substring(1)); + case "7": + return fromNumber547(number.substring(1)); + case "8": + return fromNumber548(number.substring(1)); + case "9": + return fromNumber549(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber540(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5401"; // Georgsmarienhütte + case "2": + return "5402"; // Bissendorf Kr Osnabrück + case "3": + return "5403"; // Bad Iburg + case "4": + return "5404"; // Westerkappeln + case "5": + return "5405"; // Hasbergen Kr Osnabrück + case "6": + return "5406"; // Belm + case "7": + return "5407"; // Wallenhorst + case "9": + return "5409"; // Hilter am Teutoburger Wald + default: + return ""; + } + } + + private static String fromNumber542(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5421"; // Dissen am Teutoburger Wald + case "2": + return "5422"; // Melle + case "3": + return "5423"; // Versmold + case "4": + return "5424"; // Bad Rothenfelde + case "5": + return "5425"; // Borgholzhausen + case "6": + return "5426"; // Glandorf + case "7": + return "5427"; // Melle-Buer + case "8": + return "5428"; // Melle-Neuenkirchen + case "9": + return "5429"; // Melle-Wellingholzhausen + default: + return ""; + } + } + + private static String fromNumber543(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5431"; // Quakenbrück + case "2": + return "5432"; // Löningen + case "3": + return "5433"; // Badbergen + case "4": + return "5434"; // Essen Oldenburg + case "5": + return "5435"; // Berge b Quakenbrück + case "6": + return "5436"; // Nortrup + case "7": + return "5437"; // Menslage + case "8": + return "5438"; // Bakum-Lüsche + case "9": + return "5439"; // Bersenbrück + default: + return ""; + } + } + + private static String fromNumber544(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5441"; // Diepholz + case "2": + return "5442"; // Barnstorf Kr Diepholz + case "3": + return "5443"; // Lemförde + case "4": + return "5444"; // Wagenfeld + case "5": + return "5445"; // Drebber + case "6": + return "5446"; // Rehden + case "7": + return "5447"; // Lembruch + case "8": + return "5448"; // Barver + default: + return ""; + } + } + + private static String fromNumber545(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5451"; // Ibbenbüren + case "2": + return "5452"; // Mettingen Westf + case "3": + return "5453"; // Recke + case "4": + return "5454"; // Hörstel-Riesenbeck + case "5": + return "5455"; // Tecklenburg-Brochterbeck + case "6": + return "5456"; // Westerkappeln-Velpe + case "7": + return "5457"; // Hopsten-Schale + case "8": + return "5458"; // Hopsten + case "9": + return "5459"; // Hörstel + default: + return ""; + } + } + + private static String fromNumber546(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5461"; // Bramsche Hase + case "2": + return "5462"; // Ankum + case "4": + return "5464"; // Alfhausen + case "5": + return "5465"; // Neuenkirchen b Bramsche + case "6": + return "5466"; // Merzen + case "7": + return "5467"; // Voltlage + case "8": + return "5468"; // Bramsche-Engter + default: + return ""; + } + } + + private static String fromNumber547(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5471"; // Bohmte + case "2": + return "5472"; // Bad Essen + case "3": + return "5473"; // Ostercappeln + case "4": + return "5474"; // Stemwede-Dielingen + case "5": + return "5475"; // Bohmte-Hunteburg + case "6": + return "5476"; // Ostercappeln-Venne + default: + return ""; + } + } + + private static String fromNumber548(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5481"; // Lengerich Westf + case "2": + return "5482"; // Tecklenburg + case "3": + return "5483"; // Lienen + case "4": + return "5484"; // Lienen-Kattenvenne + case "5": + return "5485"; // Ladbergen + default: + return ""; + } + } + + private static String fromNumber549(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5491"; // Damme Dümmer + case "2": + return "5492"; // Steinfeld Oldenburg + case "3": + return "5493"; // Neuenkirchen Kr Vechta + case "4": + return "5494"; // Holdorf Niedersachs + case "5": + return "5495"; // Vörden Kr Vechta + default: + return ""; + } + } + + private static String fromNumber55(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber550(number.substring(1)); + case "1": + return "551"; // Göttingen + case "2": + return fromNumber552(number.substring(1)); + case "3": + return fromNumber553(number.substring(1)); + case "4": + return fromNumber554(number.substring(1)); + case "5": + return fromNumber555(number.substring(1)); + case "6": + return fromNumber556(number.substring(1)); + case "7": + return fromNumber557(number.substring(1)); + case "8": + return fromNumber558(number.substring(1)); + case "9": + return fromNumber559(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber550(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5502"; // Dransfeld + case "3": + return "5503"; // Nörten-Hardenberg + case "4": + return "5504"; // Friedland Kr Göttingen + case "5": + return "5505"; // Hardegsen + case "6": + return "5506"; // Adelebsen + case "7": + return "5507"; // Ebergötzen + case "8": + return "5508"; // Gleichen-Rittmarshausen + case "9": + return "5509"; // Rosdorf Kr Göttingen + default: + return ""; + } + } + + private static String fromNumber552(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5520"; // Braunlage + case "1": + return "5521"; // Herzberg am Harz + case "2": + return "5522"; // Osterode am Harz + case "3": + return "5523"; // Bad Sachsa + case "4": + return "5524"; // Bad Lauterberg im Harz + case "5": + return "5525"; // Walkenried + case "7": + return "5527"; // Duderstadt + case "8": + return "5528"; // Gieboldehausen + case "9": + return "5529"; // Rhumspringe + default: + return ""; + } + } + + private static String fromNumber553(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5531"; // Holzminden + case "2": + return "5532"; // Stadtoldendorf + case "3": + return "5533"; // Bodenwerder + case "4": + return "5534"; // Eschershausen a d Lenne + case "5": + return "5535"; // Polle + case "6": + return "5536"; // Holzminden-Neuhaus + default: + return ""; + } + } + + private static String fromNumber554(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5541"; // Hann. Münden + case "2": + return "5542"; // Witzenhausen + case "3": + return "5543"; // Staufenberg Niedersachs + case "4": + return "5544"; // Reinhardshagen + case "5": + return "5545"; // Hedemünden + case "6": + return "5546"; // Scheden + default: + return ""; + } + } + + private static String fromNumber555(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5551"; // Northeim + case "2": + return "5552"; // Katlenburg + case "3": + return "5553"; // Kalefeld + case "4": + return "5554"; // Moringen + case "5": + return "5555"; // Moringen-Fredelsloh + case "6": + return "5556"; // Lindau Harz + default: + return ""; + } + } + + private static String fromNumber556(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5561"; // Einbeck + case "2": + return "5562"; // Dassel-Markoldendorf + case "3": + return "5563"; // Kreiensen + case "4": + return "5564"; // Dassel + case "5": + return "5565"; // Einbeck-Wenzen + default: + return ""; + } + } + + private static String fromNumber557(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5571"; // Uslar + case "2": + return "5572"; // Bodenfelde + case "3": + return "5573"; // Uslar-Volpriehausen + case "4": + return "5574"; // Oberweser + default: + return ""; + } + } + + private static String fromNumber558(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5582"; // Sankt Andreasberg + case "3": + return "5583"; // Braunlage-Hohegeiss + case "4": + return "5584"; // Hattorf am Harz + case "5": + return "5585"; // Herzberg-Sieber + case "6": + return "5586"; // Wieda + default: + return ""; + } + } + + private static String fromNumber559(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5592"; // Gleichen-Bremke + case "3": + return "5593"; // Bovenden-Lenglern + case "4": + return "5594"; // Bovenden-Reyershausen + default: + return ""; + } + } + + private static String fromNumber56(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber560(number.substring(1)); + case "1": + return "561"; // Kassel + case "2": + return fromNumber562(number.substring(1)); + case "3": + return fromNumber563(number.substring(1)); + case "4": + return fromNumber564(number.substring(1)); + case "5": + return fromNumber565(number.substring(1)); + case "6": + return fromNumber566(number.substring(1)); + case "7": + return fromNumber567(number.substring(1)); + case "8": + return fromNumber568(number.substring(1)); + case "9": + return fromNumber569(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber560(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5601"; // Schauenburg + case "2": + return "5602"; // Hessisch Lichtenau + case "3": + return "5603"; // Gudensberg + case "4": + return "5604"; // Grossalmerode + case "5": + return "5605"; // Kaufungen Hess + case "6": + return "5606"; // Zierenberg + case "7": + return "5607"; // Fuldatal + case "8": + return "5608"; // Söhrewald + case "9": + return "5609"; // Ahnatal + default: + return ""; + } + } + + private static String fromNumber562(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5621"; // Bad Wildungen + case "2": + return "5622"; // Fritzlar + case "3": + return "5623"; // Edertal + case "4": + return "5624"; // Bad Emstal + case "5": + return "5625"; // Naumburg Hess + case "6": + return "5626"; // Bad Zwesten + default: + return ""; + } + } + + private static String fromNumber563(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5631"; // Korbach + case "2": + return "5632"; // Willingen Upland + case "3": + return "5633"; // Diemelsee + case "4": + return "5634"; // Waldeck-Sachsenhausen + case "5": + return "5635"; // Vöhl + case "6": + return "5636"; // Lichtenfels-Goddelsheim + default: + return ""; + } + } + + private static String fromNumber564(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5641"; // Warburg + case "2": + return "5642"; // Warburg-Scherfede + case "3": + return "5643"; // Borgentreich + case "4": + return "5644"; // Willebadessen-Peckelsheim + case "5": + return "5645"; // Borgentreich-Borgholz + case "6": + return "5646"; // Willebadessen + case "7": + return "5647"; // Lichtenau-Kleinenberg + case "8": + return "5648"; // Brakel-Gehrden + default: + return ""; + } + } + + private static String fromNumber565(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5650"; // Cornberg + case "1": + return "5651"; // Eschwege + case "2": + return "5652"; // Bad Sooden-Allendorf + case "3": + return "5653"; // Sontra + case "4": + return "5654"; // Herleshausen + case "5": + return "5655"; // Wanfried + case "6": + return "5656"; // Waldkappel + case "7": + return "5657"; // Meissner + case "8": + return "5658"; // Wehretal + case "9": + return "5659"; // Ringgau + default: + return ""; + } + } + + private static String fromNumber566(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5661"; // Melsungen + case "2": + return "5662"; // Felsberg Hess + case "3": + return "5663"; // Spangenberg + case "4": + return "5664"; // Morschen + case "5": + return "5665"; // Guxhagen + default: + return ""; + } + } + + private static String fromNumber567(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5671"; // Hofgeismar + case "2": + return "5672"; // Bad Karlshafen + case "3": + return "5673"; // Immenhausen Hess + case "4": + return "5674"; // Grebenstein + case "5": + return "5675"; // Trendelburg + case "6": + return "5676"; // Liebenau Hess + case "7": + return "5677"; // Calden-Westuffeln + default: + return ""; + } + } + + private static String fromNumber568(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5681"; // Homberg Efze + case "2": + return "5682"; // Borken Hessen + case "3": + return "5683"; // Wabern Hess + case "4": + return "5684"; // Frielendorf + case "5": + return "5685"; // Knüllwald + case "6": + return "5686"; // Schwarzenborn Knüll + default: + return ""; + } + } + + private static String fromNumber569(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5691"; // Bad Arolsen + case "2": + return "5692"; // Wolfhagen + case "3": + return "5693"; // Volkmarsen + case "4": + return "5694"; // Diemelstadt + case "5": + return "5695"; // Twistetal + case "6": + return "5696"; // Bad Arolsen-Landau + default: + return ""; + } + } + + private static String fromNumber57(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber570(number.substring(1)); + case "1": + return "571"; // Minden Westf + case "2": + return fromNumber572(number.substring(1)); + case "3": + return fromNumber573(number.substring(1)); + case "4": + return fromNumber574(number.substring(1)); + case "5": + return fromNumber575(number.substring(1)); + case "6": + return fromNumber576(number.substring(1)); + case "7": + return fromNumber577(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber570(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5702"; // Petershagen-Lahde + case "3": + return "5703"; // Hille + case "4": + return "5704"; // Petershagen-Friedewalde + case "5": + return "5705"; // Petershagen-Windheim + case "6": + return "5706"; // Porta Westfalica + case "7": + return "5707"; // Petershagen Weser + default: + return ""; + } + } + + private static String fromNumber572(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5721"; // Stadthagen + case "2": + return "5722"; // Bückeburg + case "3": + return "5723"; // Bad Nenndorf + case "4": + return "5724"; // Obernkirchen + case "5": + return "5725"; // Lindhorst b Stadthagen + case "6": + return "5726"; // Wiedensahl + default: + return ""; + } + } + + private static String fromNumber573(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5731"; // Bad Oeynhausen + case "2": + return "5732"; // Löhne + case "3": + return "5733"; // Vlotho + case "4": + return "5734"; // Bergkirchen Westf + default: + return ""; + } + } + + private static String fromNumber574(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5741"; // Lübbecke + case "2": + return "5742"; // Preussisch Oldendorf + case "3": + return "5743"; // Espelkamp-Gestringen + case "4": + return "5744"; // Hüllhorst + case "5": + return "5745"; // Stemwede-Levern + case "6": + return "5746"; // Rödinghausen + default: + return ""; + } + } + + private static String fromNumber575(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5751"; // Rinteln + case "2": + return "5752"; // Auetal-Hattendorf + case "3": + return "5753"; // Auetal-Bernsen + case "4": + return "5754"; // Extertal-Bremke + case "5": + return "5755"; // Kalletal-Varenholz + default: + return ""; + } + } + + private static String fromNumber576(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5761"; // Stolzenau + case "3": + return "5763"; // Uchte + case "4": + return "5764"; // Steyerberg + case "5": + return "5765"; // Raddestorf + case "6": + return "5766"; // Rehburg-Loccum + case "7": + return "5767"; // Warmsen + case "8": + return "5768"; // Petershagen-Heimsen + case "9": + return "5769"; // Steyerberg-Voigtei + default: + return ""; + } + } + + private static String fromNumber577(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5771"; // Rahden Westf + case "2": + return "5772"; // Espelkamp + case "3": + return "5773"; // Stemwede-Wehdem + case "4": + return "5774"; // Wagenfeld-Ströhen + case "5": + return "5775"; // Diepenau + case "6": + return "5776"; // Preussisch Ströhen + case "7": + return "5777"; // Diepenau-Essern + default: + return ""; + } + } + + private static String fromNumber58(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber580(number.substring(1)); + case "1": + return "581"; // Uelzen + case "2": + return fromNumber582(number.substring(1)); + case "3": + return fromNumber583(number.substring(1)); + case "4": + return fromNumber584(number.substring(1)); + case "5": + return fromNumber585(number.substring(1)); + case "6": + return fromNumber586(number.substring(1)); + case "7": + return fromNumber587(number.substring(1)); + case "8": + return fromNumber588(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber580(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5802"; // Wrestedt + case "3": + return "5803"; // Rosche + case "4": + return "5804"; // Rätzlingen Kr Uelzen + case "5": + return "5805"; // Oetzen + case "6": + return "5806"; // Barum b Bad Bevensen + case "7": + return "5807"; // Altenmedingen + case "8": + return "5808"; // Gerdau + default: + return ""; + } + } + + private static String fromNumber582(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5820"; // Suhlendorf + case "1": + return "5821"; // Bad Bevensen + case "2": + return "5822"; // Ebstorf + case "3": + return "5823"; // Bienenbüttel + case "4": + return "5824"; // Bad Bodenteich + case "5": + return "5825"; // Wieren + case "6": + return "5826"; // Suderburg + case "7": + return "5827"; // Unterlüß + case "8": + return "5828"; // Himbergen + case "9": + return "5829"; // Wriedel + default: + return ""; + } + } + + private static String fromNumber583(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5831"; // Wittingen + case "2": + return "5832"; // Hankensbüttel + case "3": + return "5833"; // Brome + case "4": + return "5834"; // Wittingen-Knesebeck + case "5": + return "5835"; // Wahrenholz + case "6": + return "5836"; // Wittingen-Radenbeck + case "7": + return "5837"; // Sprakensehl + case "8": + return "5838"; // Gross Oesingen + case "9": + return "5839"; // Wittingen-Ohrdorf + default: + return ""; + } + } + + private static String fromNumber584(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5840"; // Schnackenburg + case "1": + return "5841"; // Lüchow Wendland + case "2": + return "5842"; // Schnega + case "3": + return "5843"; // Wustrow Wendland + case "4": + return "5844"; // Clenze + case "5": + return "5845"; // Bergen Dumme + case "6": + return "5846"; // Gartow Niedersachs + case "8": + return "5848"; // Trebel + case "9": + return "5849"; // Waddeweitz + default: + return ""; + } + } + + private static String fromNumber585(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5850"; // Neetze + case "1": + return "5851"; // Dahlenburg + case "2": + return "5852"; // Bleckede + case "3": + return "5853"; // Neu Darchau + case "4": + return "5854"; // Bleckede-Barskamp + case "5": + return "5855"; // Nahrendorf + case "7": + return "5857"; // Bleckede-Brackede + case "8": + return "5858"; // Hitzacker-Wietzetze + case "9": + return "5859"; // Thomasburg + default: + return ""; + } + } + + private static String fromNumber586(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5861"; // Dannenberg Elbe + case "2": + return "5862"; // Hitzacker Elbe + case "3": + return "5863"; // Zernien + case "4": + return "5864"; // Jameln + case "5": + return "5865"; // Gusborn + default: + return ""; + } + } + + private static String fromNumber587(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5872"; // Stoetze + case "3": + return "5873"; // Eimke + case "4": + return "5874"; // Soltendieck + case "5": + return "5875"; // Emmendorf + default: + return ""; + } + } + + private static String fromNumber588(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5882"; // Gorleben + case "3": + return "5883"; // Lemgow + default: + return ""; + } + } + + private static String fromNumber59(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber590(number.substring(1)); + case "1": + return "591"; // Lingen (Ems) + case "2": + return fromNumber592(number.substring(1)); + case "3": + return fromNumber593(number.substring(1)); + case "4": + return fromNumber594(number.substring(1)); + case "5": + return fromNumber595(number.substring(1)); + case "6": + return fromNumber596(number.substring(1)); + case "7": + return fromNumber597(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber590(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5901"; // Fürstenau b Bramsche + case "2": + return "5902"; // Freren + case "3": + return "5903"; // Emsbüren + case "4": + return "5904"; // Lengerich Emsl + case "5": + return "5905"; // Beesten + case "6": + return "5906"; // Lünne + case "7": + return "5907"; // Geeste + case "8": + return "5908"; // Wietmarschen-Lohne + case "9": + return "5909"; // Wettrup + default: + return ""; + } + } + + private static String fromNumber592(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5921"; // Nordhorn + case "2": + return "5922"; // Bad Bentheim + case "3": + return "5923"; // Schüttorf + case "4": + return "5924"; // Bad Bentheim-Gildehaus + case "5": + return "5925"; // Wietmarschen + case "6": + return "5926"; // Engden + default: + return ""; + } + } + + private static String fromNumber593(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5931"; // Meppen + case "2": + return "5932"; // Haren Ems + case "3": + return "5933"; // Lathen + case "4": + return "5934"; // Haren-Rütenbrock + case "5": + return "5935"; // Twist-Schöninghsdorf + case "6": + return "5936"; // Twist + case "7": + return "5937"; // Geeste-Gross Hesepe + case "9": + return "5939"; // Sustrum + default: + return ""; + } + } + + private static String fromNumber594(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5941"; // Neuenhaus Dinkel + case "2": + return "5942"; // Uelsen + case "3": + return "5943"; // Emlichheim + case "4": + return "5944"; // Hoogstede + case "5": + return "5945"; // Wilsum + case "6": + return "5946"; // Georgsdorf + case "7": + return "5947"; // Laar Vechte + case "8": + return "5948"; // Itterbeck + default: + return ""; + } + } + + private static String fromNumber595(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5951"; // Werlte + case "2": + return "5952"; // Sögel + case "3": + return "5953"; // Börger + case "4": + return "5954"; // Lorup + case "5": + return "5955"; // Esterwegen + case "6": + return "5956"; // Rastdorf + case "7": + return "5957"; // Lindern Oldenburg + default: + return ""; + } + } + + private static String fromNumber596(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5961"; // Haselünne + case "2": + return "5962"; // Herzlake + case "3": + return "5963"; // Bawinkel + case "4": + return "5964"; // Lähden + case "5": + return "5965"; // Klein Berssen + case "6": + return "5966"; // Meppen-Apeldorn + default: + return ""; + } + } + + private static String fromNumber597(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5971"; // Rheine + case "3": + return "5973"; // Neuenkirchen Kr Steinfurt + case "5": + return "5975"; // Rheine-Mesum + case "6": + return "5976"; // Salzbergen + case "7": + return "5977"; // Spelle + case "8": + return "5978"; // Hörstel-Dreierwalde + default: + return ""; + } + } + + private static String fromNumber6(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber60(number.substring(1)); + case "1": + return fromNumber61(number.substring(1)); + case "2": + return fromNumber62(number.substring(1)); + case "3": + return fromNumber63(number.substring(1)); + case "4": + return fromNumber64(number.substring(1)); + case "5": + return fromNumber65(number.substring(1)); + case "6": + return fromNumber66(number.substring(1)); + case "7": + return fromNumber67(number.substring(1)); + case "8": + return fromNumber68(number.substring(1)); + case "9": + return "69"; // Frankfurt am Main + default: + return ""; + } + } + + private static String fromNumber60(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber600(number.substring(1)); + case "2": + return fromNumber602(number.substring(1)); + case "3": + return fromNumber603(number.substring(1)); + case "4": + return fromNumber604(number.substring(1)); + case "5": + return fromNumber605(number.substring(1)); + case "6": + return fromNumber606(number.substring(1)); + case "7": + return fromNumber607(number.substring(1)); + case "8": + return fromNumber608(number.substring(1)); + case "9": + return fromNumber609(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber600(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6002"; // Ober-Mörlen + case "3": + return "6003"; // Rosbach v d Höhe + case "4": + return "6004"; // Lich-Eberstadt + case "7": + return "6007"; // Rosbach-Rodheim + case "8": + return "6008"; // Echzell + default: + return ""; + } + } + + private static String fromNumber602(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6020"; // Heigenbrücken + case "1": + return "6021"; // Aschaffenburg + case "2": + return "6022"; // Obernburg a Main + case "3": + return "6023"; // Alzenau i Ufr + case "4": + return "6024"; // Schöllkrippen + case "6": + return "6026"; // Grossostheim + case "7": + return "6027"; // Stockstadt a Main + case "8": + return "6028"; // Sulzbach a Main + case "9": + return "6029"; // Mömbris + default: + return ""; + } + } + + private static String fromNumber603(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6031"; // Friedberg Hess + case "2": + return "6032"; // Bad Nauheim + case "3": + return "6033"; // Butzbach + case "4": + return "6034"; // Wöllstadt + case "5": + return "6035"; // Reichelsheim Wetterau + case "6": + return "6036"; // Wölfersheim + case "9": + return "6039"; // Karben + default: + return ""; + } + } + + private static String fromNumber604(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6041"; // Glauburg + case "2": + return "6042"; // Büdingen Hess + case "3": + return "6043"; // Nidda + case "4": + return "6044"; // Schotten Hess + case "5": + return "6045"; // Gedern + case "6": + return "6046"; // Ortenberg Hess + case "7": + return "6047"; // Altenstadt Hess + case "8": + return "6048"; // Büdingen-Eckartshausen + case "9": + return "6049"; // Kefenrod + default: + return ""; + } + } + + private static String fromNumber605(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6050"; // Biebergemünd + case "1": + return "6051"; // Gelnhausen + case "2": + return "6052"; // Bad Orb + case "3": + return "6053"; // Wächtersbach + case "4": + return "6054"; // Birstein + case "5": + return "6055"; // Freigericht + case "6": + return "6056"; // Bad Soden-Salmünster + case "7": + return "6057"; // Flörsbachtal + case "8": + return "6058"; // Gründau + case "9": + return "6059"; // Jossgrund + default: + return ""; + } + } + + private static String fromNumber606(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6061"; // Michelstadt + case "2": + return "6062"; // Erbach Odenw + case "3": + return "6063"; // Bad König + case "6": + return "6066"; // Michelstadt-Vielbrunn + case "8": + return "6068"; // Beerfelden + default: + return ""; + } + } + + private static String fromNumber607(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6071"; // Dieburg + case "3": + return "6073"; // Babenhausen Hess + case "4": + return "6074"; // Rödermark + case "8": + return "6078"; // Gross-Umstadt + default: + return ""; + } + } + + private static String fromNumber608(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6081"; // Usingen + case "2": + return "6082"; // Niederreifenberg + case "3": + return "6083"; // Weilrod + case "4": + return "6084"; // Schmitten Taunus + case "5": + return "6085"; // Waldsolms + case "6": + return "6086"; // Grävenwiesbach + case "7": + return "6087"; // Waldems + default: + return ""; + } + } + + private static String fromNumber609(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6092"; // Heimbuchenthal + case "3": + return "6093"; // Laufach + case "4": + return "6094"; // Weibersbrunn + case "5": + return "6095"; // Bessenbach + case "6": + return "6096"; // Wiesen Unterfr + default: + return ""; + } + } + + private static String fromNumber61(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber610(number.substring(1)); + case "1": + return "611"; // Wiesbaden + case "2": + return fromNumber612(number.substring(1)); + case "3": + return fromNumber613(number.substring(1)); + case "4": + return fromNumber614(number.substring(1)); + case "5": + return fromNumber615(number.substring(1)); + case "6": + return fromNumber616(number.substring(1)); + case "7": + return fromNumber617(number.substring(1)); + case "8": + return fromNumber618(number.substring(1)); + case "9": + return fromNumber619(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber610(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6101"; // Bad Vilbel + case "2": + return "6102"; // Neu-Isenburg + case "3": + return "6103"; // Langen Hess + case "4": + return "6104"; // Heusenstamm + case "5": + return "6105"; // Mörfelden-Walldorf + case "6": + return "6106"; // Rodgau + case "7": + return "6107"; // Kelsterbach + case "8": + return "6108"; // Mühlheim am Main + case "9": + return "6109"; // Frankfurt-Bergen-Enkheim + default: + return ""; + } + } + + private static String fromNumber612(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6120"; // Aarbergen + case "2": + return "6122"; // Hofheim-Wallau + case "3": + return "6123"; // Eltville am Rhein + case "4": + return "6124"; // Bad Schwalbach + case "6": + return "6126"; // Idstein + case "7": + return "6127"; // Niedernhausen Taunus + case "8": + return "6128"; // Taunusstein + case "9": + return "6129"; // Schlangenbad + default: + return ""; + } + } + + private static String fromNumber613(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6130"; // Schwabenheim an der Selz + case "1": + return "6131"; // Mainz + case "2": + return "6132"; // Ingelheim am Rhein + case "3": + return "6133"; // Oppenheim + case "4": + return "6134"; // Mainz-Kastel + case "5": + return "6135"; // Bodenheim Rhein + case "6": + return "6136"; // Nieder-Olm + case "8": + return "6138"; // Mommenheim + case "9": + return "6139"; // Budenheim + default: + return ""; + } + } + + private static String fromNumber614(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6142"; // Rüsselsheim + case "4": + return "6144"; // Bischofsheim b Rüsselsheim + case "5": + return "6145"; // Flörsheim am Main + case "6": + return "6146"; // Hochheim am Main + case "7": + return "6147"; // Trebur + default: + return ""; + } + } + + private static String fromNumber615(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6150"; // Weiterstadt + case "1": + return "6151"; // Darmstadt + case "2": + return "6152"; // Gross-Gerau + case "4": + return "6154"; // Ober-Ramstadt + case "5": + return "6155"; // Griesheim Hess + case "7": + return "6157"; // Pfungstadt + case "8": + return "6158"; // Riedstadt + case "9": + return "6159"; // Messel + default: + return ""; + } + } + + private static String fromNumber616(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6161"; // Brensbach + case "2": + return "6162"; // Reinheim Odenw + case "3": + return "6163"; // Höchst i Odw + case "4": + return "6164"; // Reichelsheim Odenwald + case "5": + return "6165"; // Breuberg + case "6": + return "6166"; // Fischbachtal + case "7": + return "6167"; // Modautal + default: + return ""; + } + } + + private static String fromNumber617(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6171"; // Oberursel Taunus + case "2": + return "6172"; // Bad Homburg v d Höhe + case "3": + return "6173"; // Kronberg im Taunus + case "4": + return "6174"; // Königstein im Taunus + case "5": + return "6175"; // Friedrichsdorf Taunus + default: + return ""; + } + } + + private static String fromNumber618(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6181"; // Hanau + case "2": + return "6182"; // Seligenstadt + case "3": + return "6183"; // Erlensee + case "4": + return "6184"; // Langenselbold + case "5": + return "6185"; // Hammersbach Hess + case "6": + return "6186"; // Grosskrotzenburg + case "7": + return "6187"; // Schöneck + case "8": + return "6188"; // Kahl a Main + default: + return ""; + } + } + + private static String fromNumber619(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6190"; // Hattersheim a Main + case "2": + return "6192"; // Hofheim am Taunus + case "5": + return "6195"; // Kelkheim Taunus + case "6": + return "6196"; // Bad Soden am Taunus + case "8": + return "6198"; // Eppstein + default: + return ""; + } + } + + private static String fromNumber62(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber620(number.substring(1)); + case "1": + return "621"; // Mannheim + case "2": + return fromNumber622(number.substring(1)); + case "3": + return fromNumber623(number.substring(1)); + case "4": + return fromNumber624(number.substring(1)); + case "5": + return fromNumber625(number.substring(1)); + case "6": + return fromNumber626(number.substring(1)); + case "7": + return fromNumber627(number.substring(1)); + case "8": + return fromNumber628(number.substring(1)); + case "9": + return fromNumber629(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber620(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6201"; // Weinheim Bergstr + case "2": + return "6202"; // Schwetzingen + case "3": + return "6203"; // Ladenburg + case "4": + return "6204"; // Viernheim + case "5": + return "6205"; // Hockenheim + case "6": + return "6206"; // Lampertheim + case "7": + return "6207"; // Wald-Michelbach + case "9": + return "6209"; // Mörlenbach + default: + return ""; + } + } + + private static String fromNumber622(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6220"; // Wilhelmsfeld + case "1": + return "6221"; // Heidelberg + case "2": + return "6222"; // Wiesloch + case "3": + return "6223"; // Neckargemünd + case "4": + return "6224"; // Sandhausen Baden + case "6": + return "6226"; // Meckesheim + case "7": + return "6227"; // Walldorf Baden + case "8": + return "6228"; // Schönau Odenw + case "9": + return "6229"; // Neckarsteinach + default: + return ""; + } + } + + private static String fromNumber623(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6231"; // Hochdorf-Assenheim + case "2": + return "6232"; // Speyer + case "3": + return "6233"; // Frankenthal Pfalz + case "4": + return "6234"; // Mutterstadt + case "5": + return "6235"; // Schifferstadt + case "6": + return "6236"; // Neuhofen Pfalz + case "7": + return "6237"; // Maxdorf + case "8": + return "6238"; // Dirmstein + case "9": + return "6239"; // Bobenheim-Roxheim + default: + return ""; + } + } + + private static String fromNumber624(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6241"; // Worms + case "2": + return "6242"; // Osthofen + case "3": + return "6243"; // Monsheim + case "4": + return "6244"; // Westhofen Rheinhess + case "5": + return "6245"; // Biblis + case "6": + return "6246"; // Eich Rheinhess + case "7": + return "6247"; // Worms-Pfeddersheim + case "9": + return "6249"; // Guntersblum + default: + return ""; + } + } + + private static String fromNumber625(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6251"; // Bensheim + case "2": + return "6252"; // Heppenheim Bergstraße + case "3": + return "6253"; // Fürth Odenw + case "4": + return "6254"; // Lautertal Odenwald + case "5": + return "6255"; // Lindenfels + case "6": + return "6256"; // Lampertheim-Hüttenfeld + case "7": + return "6257"; // Seeheim-Jugenheim + case "8": + return "6258"; // Gernsheim + default: + return ""; + } + } + + private static String fromNumber626(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6261"; // Mosbach Baden + case "2": + return "6262"; // Aglasterhausen + case "3": + return "6263"; // Neckargerach + case "4": + return "6264"; // Neudenau + case "5": + return "6265"; // Billigheim Baden + case "6": + return "6266"; // Hassmersheim + case "7": + return "6267"; // Fahrenbach Baden + case "8": + return "6268"; // Hüffenhardt + case "9": + return "6269"; // Gundelsheim Württ + default: + return ""; + } + } + + private static String fromNumber627(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6271"; // Eberbach Baden + case "2": + return "6272"; // Hirschhorn Neckar + case "4": + return "6274"; // Waldbrunn Odenw + case "5": + return "6275"; // Rothenberg Odenw + case "6": + return "6276"; // Hesseneck + default: + return ""; + } + } + + private static String fromNumber628(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6281"; // Buchen Odenwald + case "2": + return "6282"; // Walldürn + case "3": + return "6283"; // Hardheim Odenw + case "4": + return "6284"; // Mudau + case "5": + return "6285"; // Walldürn-Altheim + case "6": + return "6286"; // Walldürn-Rippberg + case "7": + return "6287"; // Limbach Baden + default: + return ""; + } + } + + private static String fromNumber629(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6291"; // Adelsheim + case "2": + return "6292"; // Seckach + case "3": + return "6293"; // Schefflenz + case "4": + return "6294"; // Krautheim Jagst + case "5": + return "6295"; // Rosenberg Baden + case "6": + return "6296"; // Ahorn Baden + case "7": + return "6297"; // Ravenstein Baden + case "8": + return "6298"; // Möckmühl + default: + return ""; + } + } + + private static String fromNumber63(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber630(number.substring(1)); + case "1": + return "631"; // Kaiserslautern + case "2": + return fromNumber632(number.substring(1)); + case "3": + return fromNumber633(number.substring(1)); + case "4": + return fromNumber634(number.substring(1)); + case "5": + return fromNumber635(number.substring(1)); + case "6": + return fromNumber636(number.substring(1)); + case "7": + return fromNumber637(number.substring(1)); + case "8": + return fromNumber638(number.substring(1)); + case "9": + return fromNumber639(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber630(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6301"; // Otterbach Pfalz + case "2": + return "6302"; // Winnweiler + case "3": + return "6303"; // Enkenbach-Alsenborn + case "4": + return "6304"; // Wolfstein Pfalz + case "5": + return "6305"; // Hochspeyer + case "6": + return "6306"; // Trippstadt + case "7": + return "6307"; // Schopp + case "8": + return "6308"; // Olsbrücken + default: + return ""; + } + } + + private static String fromNumber632(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6321"; // Neustadt an der Weinstraße + case "2": + return "6322"; // Bad Dürkheim + case "3": + return "6323"; // Edenkoben + case "4": + return "6324"; // Hassloch + case "5": + return "6325"; // Lambrecht Pfalz + case "6": + return "6326"; // Deidesheim + case "7": + return "6327"; // Neustadt-Lachen + case "8": + return "6328"; // Elmstein + case "9": + return "6329"; // Weidenthal Pfalz + default: + return ""; + } + } + + private static String fromNumber633(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6331"; // Pirmasens + case "2": + return "6332"; // Zweibrücken + case "3": + return "6333"; // Waldfischbach-Burgalben + case "4": + return "6334"; // Thaleischweiler-Fröschen + case "5": + return "6335"; // Trulben + case "6": + return "6336"; // Dellfeld + case "7": + return "6337"; // Grossbundenbach + case "8": + return "6338"; // Hornbach Pfalz + case "9": + return "6339"; // Grosssteinhausen + default: + return ""; + } + } + + private static String fromNumber634(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6340"; // Wörth-Schaidt + case "1": + return "6341"; // Landau in der Pfalz + case "2": + return "6342"; // Schweigen-Rechtenbach + case "3": + return "6343"; // Bad Bergzabern + case "4": + return "6344"; // Schwegenheim + case "5": + return "6345"; // Albersweiler + case "6": + return "6346"; // Annweiler am Trifels + case "7": + return "6347"; // Hochstadt Pfalz + case "8": + return "6348"; // Offenbach an der Queich + case "9": + return "6349"; // Billigheim-Ingenheim + default: + return ""; + } + } + + private static String fromNumber635(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6351"; // Eisenberg Pfalz + case "2": + return "6352"; // Kirchheimbolanden + case "3": + return "6353"; // Freinsheim + case "5": + return "6355"; // Albisheim Pfrimm + case "6": + return "6356"; // Carlsberg Pfalz + case "7": + return "6357"; // Standenbühl + case "8": + return "6358"; // Kriegsfeld + case "9": + return "6359"; // Grünstadt + default: + return ""; + } + } + + private static String fromNumber636(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6361"; // Rockenhausen + case "2": + return "6362"; // Alsenz + case "3": + return "6363"; // Niederkirchen + case "4": + return "6364"; // Nußbach Pfalz + default: + return ""; + } + } + + private static String fromNumber637(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6371"; // Landstuhl + case "2": + return "6372"; // Bruchmühlbach-Miesau + case "3": + return "6373"; // Schönenberg-Kübelberg + case "4": + return "6374"; // Weilerbach + case "5": + return "6375"; // Wallhalben + default: + return ""; + } + } + + private static String fromNumber638(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6381"; // Kusel + case "2": + return "6382"; // Lauterecken + case "3": + return "6383"; // Glan-Münchweiler + case "4": + return "6384"; // Konken + case "5": + return "6385"; // Reichenbach-Steegen + case "6": + return "6386"; // Altenkirchen Pfalz + case "7": + return "6387"; // Sankt Julian + default: + return ""; + } + } + + private static String fromNumber639(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6391"; // Dahn + case "2": + return "6392"; // Hauenstein Pfalz + case "3": + return "6393"; // Fischbach bei Dahn + case "4": + return "6394"; // Bundenthal + case "5": + return "6395"; // Münchweiler an der Rodalb + case "6": + return "6396"; // Hinterweidenthal + case "7": + return "6397"; // Leimen Pfalz + case "8": + return "6398"; // Vorderweidenthal + default: + return ""; + } + } + + private static String fromNumber64(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber640(number.substring(1)); + case "1": + return "641"; // Giessen + case "2": + return fromNumber642(number.substring(1)); + case "3": + return fromNumber643(number.substring(1)); + case "4": + return fromNumber644(number.substring(1)); + case "5": + return fromNumber645(number.substring(1)); + case "6": + return fromNumber646(number.substring(1)); + case "7": + return fromNumber647(number.substring(1)); + case "8": + return fromNumber648(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber640(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6400"; // Mücke + case "1": + return "6401"; // Grünberg Hess + case "2": + return "6402"; // Hungen + case "3": + return "6403"; // Linden Hess + case "4": + return "6404"; // Lich Hess + case "5": + return "6405"; // Laubach Hess + case "6": + return "6406"; // Lollar + case "7": + return "6407"; // Rabenau Hess + case "8": + return "6408"; // Buseck + case "9": + return "6409"; // Biebertal + default: + return ""; + } + } + + private static String fromNumber642(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6420"; // Lahntal + case "1": + return "6421"; // Marburg + case "2": + return "6422"; // Kirchhain + case "3": + return "6423"; // Wetter Hessen + case "4": + return "6424"; // Ebsdorfergrund + case "5": + return "6425"; // Rauschenberg Hess + case "6": + return "6426"; // Fronhausen + case "7": + return "6427"; // Cölbe-Schönstadt + case "8": + return "6428"; // Stadtallendorf + case "9": + return "6429"; // Schweinsberg Hess + default: + return ""; + } + } + + private static String fromNumber643(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6430"; // Hahnstätten + case "1": + return "6431"; // Limburg a d Lahn + case "2": + return "6432"; // Diez + case "3": + return "6433"; // Hadamar + case "4": + return "6434"; // Bad Camberg + case "5": + return "6435"; // Wallmerod + case "6": + return "6436"; // Dornburg Hess + case "8": + return "6438"; // Hünfelden + case "9": + return "6439"; // Holzappel + default: + return ""; + } + } + + private static String fromNumber644(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6440"; // Kölschhausen + case "1": + return "6441"; // Wetzlar + case "2": + return "6442"; // Braunfels + case "3": + return "6443"; // Ehringshausen Dill + case "4": + return "6444"; // Bischoffen + case "5": + return "6445"; // Schöffengrund + case "6": + return "6446"; // Hohenahr + case "7": + return "6447"; // Langgöns-Niederkleen + case "9": + return "6449"; // Ehringshausen-Katzenfurt + default: + return ""; + } + } + + private static String fromNumber645(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6451"; // Frankenberg Eder + case "2": + return "6452"; // Battenberg Eder + case "3": + return "6453"; // Gemünden Wohra + case "4": + return "6454"; // Lichtenfels-Sachsenberg + case "5": + return "6455"; // Frankenau Hess + case "6": + return "6456"; // Haina Kloster + case "7": + return "6457"; // Burgwald Eder + case "8": + return "6458"; // Rosenthal Hess + default: + return ""; + } + } + + private static String fromNumber646(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6461"; // Biedenkopf + case "2": + return "6462"; // Gladenbach + case "4": + return "6464"; // Angelburg + case "5": + return "6465"; // Breidenbach b Biedenkopf + case "6": + return "6466"; // Dautphetal-Friedensdorf + case "7": + return "6467"; // Hatzfeld Eder + case "8": + return "6468"; // Dautphetal-Mornshausen + default: + return ""; + } + } + + private static String fromNumber647(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6471"; // Weilburg + case "2": + return "6472"; // Weilmünster + case "3": + return "6473"; // Leun + case "4": + return "6474"; // Villmar-Aumenau + case "5": + return "6475"; // Weilmünster-Wolfenhausen + case "6": + return "6476"; // Mengerskirchen + case "7": + return "6477"; // Greifenstein-Nenderoth + case "8": + return "6478"; // Greifenstein-Ulm + case "9": + return "6479"; // Waldbrunn Westerwald + default: + return ""; + } + } + + private static String fromNumber648(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6482"; // Runkel + case "3": + return "6483"; // Selters Taunus + case "4": + return "6484"; // Beselich + case "5": + return "6485"; // Nentershausen Westerw + case "6": + return "6486"; // Katzenelnbogen + default: + return ""; + } + } + + private static String fromNumber65(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber650(number.substring(1)); + case "1": + return "651"; // Trier + case "2": + return fromNumber652(number.substring(1)); + case "3": + return fromNumber653(number.substring(1)); + case "4": + return fromNumber654(number.substring(1)); + case "5": + return fromNumber655(number.substring(1)); + case "6": + return fromNumber656(number.substring(1)); + case "7": + return fromNumber657(number.substring(1)); + case "8": + return fromNumber658(number.substring(1)); + case "9": + return fromNumber659(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber650(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6500"; // Waldrach + case "1": + return "6501"; // Konz + case "2": + return "6502"; // Schweich + case "3": + return "6503"; // Hermeskeil + case "4": + return "6504"; // Thalfang + case "5": + return "6505"; // Kordel + case "6": + return "6506"; // Welschbillig + case "7": + return "6507"; // Neumagen-Dhron + case "8": + return "6508"; // Hetzerath Mosel + case "9": + return "6509"; // Büdlich + default: + return ""; + } + } + + private static String fromNumber652(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6522"; // Mettendorf + case "3": + return "6523"; // Holsthum + case "4": + return "6524"; // Rodershausen + case "5": + return "6525"; // Irrel + case "6": + return "6526"; // Bollendorf + case "7": + return "6527"; // Oberweis + default: + return ""; + } + } + + private static String fromNumber653(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6531"; // Bernkastel-Kues + case "2": + return "6532"; // Zeltingen-Rachtig + case "3": + return "6533"; // Morbach Hunsrück + case "4": + return "6534"; // Mülheim Mosel + case "5": + return "6535"; // Osann-Monzel + case "6": + return "6536"; // Kleinich + default: + return ""; + } + } + + private static String fromNumber654(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6541"; // Traben-Trarbach + case "2": + return "6542"; // Bullay + case "3": + return "6543"; // Büchenbeuren + case "4": + return "6544"; // Rhaunen + case "5": + return "6545"; // Blankenrath + default: + return ""; + } + } + + private static String fromNumber655(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6550"; // Irrhausen + case "1": + return "6551"; // Prüm + case "2": + return "6552"; // Olzheim + case "3": + return "6553"; // Schönecken + case "4": + return "6554"; // Waxweiler + case "5": + return "6555"; // Bleialf + case "6": + return "6556"; // Pronsfeld + case "7": + return "6557"; // Hallschlag + case "8": + return "6558"; // Büdesheim Eifel + case "9": + return "6559"; // Leidenborn + default: + return ""; + } + } + + private static String fromNumber656(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6561"; // Bitburg + case "2": + return "6562"; // Speicher + case "3": + return "6563"; // Kyllburg + case "4": + return "6564"; // Neuerburg Eifel + case "5": + return "6565"; // Dudeldorf + case "6": + return "6566"; // Körperich + case "7": + return "6567"; // Oberkail + case "8": + return "6568"; // Wolsfeld + case "9": + return "6569"; // Bickendorf + default: + return ""; + } + } + + private static String fromNumber657(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6571"; // Wittlich + case "2": + return "6572"; // Manderscheid Eifel + case "3": + return "6573"; // Gillenfeld + case "4": + return "6574"; // Hasborn + case "5": + return "6575"; // Landscheid + case "8": + return "6578"; // Salmtal + default: + return ""; + } + } + + private static String fromNumber658(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6580"; // Zemmer + case "1": + return "6581"; // Saarburg + case "2": + return "6582"; // Freudenburg + case "3": + return "6583"; // Palzem + case "4": + return "6584"; // Wellen Mosel + case "5": + return "6585"; // Ralingen + case "6": + return "6586"; // Beuren Hochwald + case "7": + return "6587"; // Zerf + case "8": + return "6588"; // Pluwig + case "9": + return "6589"; // Kell am See + default: + return ""; + } + } + + private static String fromNumber659(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6591"; // Gerolstein + case "2": + return "6592"; // Daun + case "3": + return "6593"; // Hillesheim Eifel + case "4": + return "6594"; // Birresborn + case "5": + return "6595"; // Dockweiler + case "6": + return "6596"; // Üdersdorf + case "7": + return "6597"; // Jünkerath + case "9": + return "6599"; // Weidenbach b Gerolstein + default: + return ""; + } + } + + private static String fromNumber66(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "661"; // Fulda + case "2": + return fromNumber662(number.substring(1)); + case "3": + return fromNumber663(number.substring(1)); + case "4": + return fromNumber664(number.substring(1)); + case "5": + return fromNumber665(number.substring(1)); + case "6": + return fromNumber666(number.substring(1)); + case "7": + return fromNumber667(number.substring(1)); + case "8": + return fromNumber668(number.substring(1)); + case "9": + return fromNumber669(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber662(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6620"; // Philippsthal Werra + case "1": + return "6621"; // Bad Hersfeld + case "2": + return "6622"; // Bebra + case "3": + return "6623"; // Rotenburg a d Fulda + case "4": + return "6624"; // Heringen Werra + case "5": + return "6625"; // Niederaula + case "6": + return "6626"; // Wildeck-Obersuhl + case "7": + return "6627"; // Nentershausen Hess + case "8": + return "6628"; // Oberaula + case "9": + return "6629"; // Schenklengsfeld + default: + return ""; + } + } + + private static String fromNumber663(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6630"; // Schwalmtal-Storndorf + case "1": + return "6631"; // Alsfeld + case "3": + return "6633"; // Homberg Ohm + case "4": + return "6634"; // Gemünden Felda + case "5": + return "6635"; // Kirtorf + case "6": + return "6636"; // Romrod + case "7": + return "6637"; // Feldatal + case "8": + return "6638"; // Schwalmtal-Renzendorf + case "9": + return "6639"; // Ottrau + default: + return ""; + } + } + + private static String fromNumber664(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6641"; // Lauterbach Hessen + case "2": + return "6642"; // Schlitz + case "3": + return "6643"; // Herbstein + case "4": + return "6644"; // Grebenhain + case "5": + return "6645"; // Ulrichstein + case "6": + return "6646"; // Grebenau + case "7": + return "6647"; // Herbstein-Stockhausen + case "8": + return "6648"; // Bad Salzschlirf + default: + return ""; + } + } + + private static String fromNumber665(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6650"; // Hosenfeld + case "1": + return "6651"; // Rasdorf + case "2": + return "6652"; // Hünfeld + case "3": + return "6653"; // Burghaun + case "4": + return "6654"; // Gersfeld Rhön + case "5": + return "6655"; // Neuhof Kr Fulda + case "6": + return "6656"; // Ebersburg + case "7": + return "6657"; // Hofbieber + case "8": + return "6658"; // Poppenhausen Wasserkuppe + case "9": + return "6659"; // Eichenzell + default: + return ""; + } + } + + private static String fromNumber666(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6660"; // Steinau-Marjoss + case "1": + return "6661"; // Schlüchtern + case "3": + return "6663"; // Steinau an der Straße + case "4": + return "6664"; // Sinntal-Sterbfritz + case "5": + return "6665"; // Sinntal-Altengronau + case "6": + return "6666"; // Freiensteinau + case "7": + return "6667"; // Steinau-Ulmbach + case "8": + return "6668"; // Birstein-Lichenroth + case "9": + return "6669"; // Neuhof-Hauswurz + default: + return ""; + } + } + + private static String fromNumber667(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6670"; // Ludwigsau Hess + case "2": + return "6672"; // Eiterfeld + case "3": + return "6673"; // Haunetal + case "4": + return "6674"; // Friedewald Hess + case "5": + return "6675"; // Breitenbach a Herzberg + case "6": + return "6676"; // Hohenroda Hess + case "7": + return "6677"; // Neuenstein Hess + case "8": + return "6678"; // Wildeck-Hönebach + default: + return ""; + } + } + + private static String fromNumber668(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6681"; // Hilders + case "2": + return "6682"; // Tann Rhön + case "3": + return "6683"; // Ehrenberg Rhön + case "4": + return "6684"; // Hofbieber-Schwarzbach + default: + return ""; + } + } + + private static String fromNumber669(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6691"; // Schwalmstadt + case "2": + return "6692"; // Neustadt Hessen + case "3": + return "6693"; // Neuental + case "4": + return "6694"; // Neukirchen Knüll + case "5": + return "6695"; // Jesberg + case "6": + return "6696"; // Gilserberg + case "7": + return "6697"; // Willingshausen + case "8": + return "6698"; // Schrecksbach + default: + return ""; + } + } + + private static String fromNumber67(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber670(number.substring(1)); + case "1": + return "671"; // Bad Kreuznach + case "2": + return fromNumber672(number.substring(1)); + case "3": + return fromNumber673(number.substring(1)); + case "4": + return fromNumber674(number.substring(1)); + case "5": + return fromNumber675(number.substring(1)); + case "6": + return fromNumber676(number.substring(1)); + case "7": + return fromNumber677(number.substring(1)); + case "8": + return fromNumber678(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber670(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6701"; // Sprendlingen Rheinhess + case "3": + return "6703"; // Wöllstein Rheinhess + case "4": + return "6704"; // Langenlonsheim + case "6": + return "6706"; // Wallhausen Nahe + case "7": + return "6707"; // Windesheim + case "8": + return "6708"; // Bad Münster am Stein-Ebernburg + case "9": + return "6709"; // Fürfeld Kr Bad Kreuznach + default: + return ""; + } + } + + private static String fromNumber672(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6721"; // Bingen am Rhein + case "2": + return "6722"; // Rüdesheim am Rhein + case "3": + return "6723"; // Oestrich-Winkel + case "4": + return "6724"; // Stromberg Hunsrück + case "5": + return "6725"; // Gau-Algesheim + case "6": + return "6726"; // Lorch Rheingau + case "7": + return "6727"; // Gensingen + case "8": + return "6728"; // Ober-Hilbersheim + default: + return ""; + } + } + + private static String fromNumber673(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6731"; // Alzey + case "2": + return "6732"; // Wörrstadt + case "3": + return "6733"; // Gau-Odernheim + case "4": + return "6734"; // Flonheim + case "5": + return "6735"; // Eppelsheim + case "6": + return "6736"; // Bechenheim + case "7": + return "6737"; // Köngernheim + default: + return ""; + } + } + + private static String fromNumber674(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6741"; // St Goar + case "2": + return "6742"; // Boppard + case "3": + return "6743"; // Bacharach + case "4": + return "6744"; // Oberwesel + case "5": + return "6745"; // Gondershausen + case "6": + return "6746"; // Pfalzfeld + case "7": + return "6747"; // Emmelshausen + default: + return ""; + } + } + + private static String fromNumber675(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6751"; // Bad Sobernheim + case "2": + return "6752"; // Kirn Nahe + case "3": + return "6753"; // Meisenheim + case "4": + return "6754"; // Martinstein + case "5": + return "6755"; // Odernheim am Glan + case "6": + return "6756"; // Winterbach Soonwald + case "7": + return "6757"; // Becherbach bei Kirn + case "8": + return "6758"; // Waldböckelheim + default: + return ""; + } + } + + private static String fromNumber676(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6761"; // Simmern Hunsrück + case "2": + return "6762"; // Kastellaun + case "3": + return "6763"; // Kirchberg Hunsrück + case "4": + return "6764"; // Rheinböllen + case "5": + return "6765"; // Gemünden Hunsrück + case "6": + return "6766"; // Kisselbach + default: + return ""; + } + } + + private static String fromNumber677(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6771"; // St Goarshausen + case "2": + return "6772"; // Nastätten + case "3": + return "6773"; // Kamp-Bornhofen + case "4": + return "6774"; // Kaub + case "5": + return "6775"; // Strüth Taunus + case "6": + return "6776"; // Dachsenhausen + default: + return ""; + } + } + + private static String fromNumber678(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6781"; // Idar-Oberstein + case "2": + return "6782"; // Birkenfeld Nahe + case "3": + return "6783"; // Baumholder + case "4": + return "6784"; // Weierbach + case "5": + return "6785"; // Herrstein + case "6": + return "6786"; // Kempfeld + case "7": + return "6787"; // Niederbrombach + case "8": + return "6788"; // Sien + case "9": + return "6789"; // Heimbach Nahe + default: + return ""; + } + } + + private static String fromNumber68(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber680(number.substring(1)); + case "1": + return "681"; // Saarbrücken + case "2": + return fromNumber682(number.substring(1)); + case "3": + return fromNumber683(number.substring(1)); + case "4": + return fromNumber684(number.substring(1)); + case "5": + return fromNumber685(number.substring(1)); + case "6": + return fromNumber686(number.substring(1)); + case "7": + return fromNumber687(number.substring(1)); + case "8": + return fromNumber688(number.substring(1)); + case "9": + return fromNumber689(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber680(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6802"; // Völklingen-Lauterbach + case "3": + return "6803"; // Mandelbachtal-Ommersheim + case "4": + return "6804"; // Mandelbachtal + case "5": + return "6805"; // Kleinblittersdorf + case "6": + return "6806"; // Heusweiler + case "9": + return "6809"; // Grossrosseln + default: + return ""; + } + } + + private static String fromNumber682(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6821"; // Neunkirchen Saar + case "4": + return "6824"; // Ottweiler + case "5": + return "6825"; // Illingen Saar + case "6": + return "6826"; // Bexbach + case "7": + return "6827"; // Eppelborn + default: + return ""; + } + } + + private static String fromNumber683(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6831"; // Saarlouis + case "2": + return "6832"; // Beckingen-Reimsbach + case "3": + return "6833"; // Rehlingen-Siersburg + case "4": + return "6834"; // Bous + case "5": + return "6835"; // Beckingen + case "6": + return "6836"; // Überherrn + case "7": + return "6837"; // Wallerfangen + case "8": + return "6838"; // Saarwellingen + default: + return ""; + } + } + + private static String fromNumber684(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6841"; // Homburg Saar + case "2": + return "6842"; // Blieskastel + case "3": + return "6843"; // Gersheim + case "4": + return "6844"; // Blieskastel-Altheim + case "8": + return "6848"; // Homburg-Einöd + case "9": + return "6849"; // Kirkel + default: + return ""; + } + } + + private static String fromNumber685(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6851"; // St Wendel + case "2": + return "6852"; // Nohfelden + case "3": + return "6853"; // Marpingen + case "4": + return "6854"; // Oberthal Saar + case "5": + return "6855"; // Freisen + case "6": + return "6856"; // St Wendel-Niederkirchen + case "7": + return "6857"; // Namborn + case "8": + return "6858"; // Ottweiler-Fürth + default: + return ""; + } + } + + private static String fromNumber686(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6861"; // Merzig + case "4": + return "6864"; // Mettlach + case "5": + return "6865"; // Mettlach-Orscholz + case "6": + return "6866"; // Perl-Nennig + case "7": + return "6867"; // Perl + case "8": + return "6868"; // Mettlach-Tünsdorf + case "9": + return "6869"; // Merzig-Silwingen + default: + return ""; + } + } + + private static String fromNumber687(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6871"; // Wadern + case "2": + return "6872"; // Losheim am See + case "3": + return "6873"; // Nonnweiler + case "4": + return "6874"; // Wadern-Nunkirchen + case "5": + return "6875"; // Nonnweiler-Primstal + case "6": + return "6876"; // Weiskirchen Saar + default: + return ""; + } + } + + private static String fromNumber688(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6881"; // Lebach + case "7": + return "6887"; // Schmelz Saar + case "8": + return "6888"; // Lebach-Steinbach + default: + return ""; + } + } + + private static String fromNumber689(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "6893"; // Saarbrücken-Ensheim + case "4": + return "6894"; // St Ingbert + case "7": + return "6897"; // Sulzbach Saar + case "8": + return "6898"; // Völklingen + default: + return ""; + } + } + + private static String fromNumber7(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber70(number.substring(1)); + case "1": + return fromNumber71(number.substring(1)); + case "2": + return fromNumber72(number.substring(1)); + case "3": + return fromNumber73(number.substring(1)); + case "4": + return fromNumber74(number.substring(1)); + case "5": + return fromNumber75(number.substring(1)); + case "6": + return fromNumber76(number.substring(1)); + case "7": + return fromNumber77(number.substring(1)); + case "8": + return fromNumber78(number.substring(1)); + case "9": + return fromNumber79(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber70(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber702(number.substring(1)); + case "3": + return fromNumber703(number.substring(1)); + case "4": + return fromNumber704(number.substring(1)); + case "5": + return fromNumber705(number.substring(1)); + case "6": + return fromNumber706(number.substring(1)); + case "7": + return fromNumber707(number.substring(1)); + case "8": + return fromNumber708(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber702(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7021"; // Kirchheim unter Teck + case "2": + return "7022"; // Nürtingen + case "3": + return "7023"; // Weilheim an der Teck + case "4": + return "7024"; // Wendlingen am Neckar + case "5": + return "7025"; // Neuffen + case "6": + return "7026"; // Lenningen + default: + return ""; + } + } + + private static String fromNumber703(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7031"; // Böblingen + case "2": + return "7032"; // Herrenberg + case "3": + return "7033"; // Weil Der Stadt + case "4": + return "7034"; // Ehningen + default: + return ""; + } + } + + private static String fromNumber704(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7041"; // Mühlacker + case "2": + return "7042"; // Vaihingen an der Enz + case "3": + return "7043"; // Maulbronn + case "4": + return "7044"; // Mönsheim + case "5": + return "7045"; // Oberderdingen + case "6": + return "7046"; // Zaberfeld + default: + return ""; + } + } + + private static String fromNumber705(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7051"; // Calw + case "2": + return "7052"; // Bad Liebenzell + case "3": + return "7053"; // Bad Teinach-Zavelstein + case "4": + return "7054"; // Wildberg Württ + case "5": + return "7055"; // Neuweiler Kr Calw + case "6": + return "7056"; // Gechingen + default: + return ""; + } + } + + private static String fromNumber706(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7062"; // Beilstein Württ + case "3": + return "7063"; // Bad Wimpfen + case "6": + return "7066"; // Bad Rappenau-Bonfeld + default: + return ""; + } + } + + private static String fromNumber707(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7071"; // Tübingen + case "2": + return "7072"; // Gomaringen + case "3": + return "7073"; // Ammerbuch + default: + return ""; + } + } + + private static String fromNumber708(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7081"; // Bad Wildbad + case "2": + return "7082"; // Neuenbürg Württ + case "3": + return "7083"; // Bad Herrenalb + case "4": + return "7084"; // Schömberg b Neuenbürg + case "5": + return "7085"; // Enzklösterle + default: + return ""; + } + } + + private static String fromNumber71(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "711"; // Stuttgart + case "2": + return fromNumber712(number.substring(1)); + case "3": + return fromNumber713(number.substring(1)); + case "4": + return fromNumber714(number.substring(1)); + case "5": + return fromNumber715(number.substring(1)); + case "6": + return fromNumber716(number.substring(1)); + case "7": + return fromNumber717(number.substring(1)); + case "8": + return fromNumber718(number.substring(1)); + case "9": + return fromNumber719(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber712(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7121"; // Reutlingen + case "2": + return "7122"; // St Johann Württ + case "3": + return "7123"; // Metzingen Württ + case "4": + return "7124"; // Trochtelfingen Hohenz + case "5": + return "7125"; // Bad Urach + case "6": + return "7126"; // Burladingen-Melchingen + case "7": + return "7127"; // Neckartenzlingen + case "8": + return "7128"; // Sonnenbühl + case "9": + return "7129"; // Lichtenstein Württ + default: + return ""; + } + } + + private static String fromNumber713(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7130"; // Löwenstein Württ + case "1": + return "7131"; // Heilbronn Neckar + case "2": + return "7132"; // Neckarsulm + case "3": + return "7133"; // Lauffen am Neckar + case "4": + return "7134"; // Weinsberg + case "5": + return "7135"; // Brackenheim + case "6": + return "7136"; // Bad Friedrichshall + case "8": + return "7138"; // Schwaigern + case "9": + return "7139"; // Neuenstadt am Kocher + default: + return ""; + } + } + + private static String fromNumber714(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7141"; // Ludwigsburg Württ + case "2": + return "7142"; // Bietigheim-Bissingen + case "3": + return "7143"; // Besigheim + case "4": + return "7144"; // Marbach am Neckar + case "5": + return "7145"; // Markgröningen + case "6": + return "7146"; // Remseck am Neckar + case "7": + return "7147"; // Sachsenheim Württ + case "8": + return "7148"; // Grossbottwar + default: + return ""; + } + } + + private static String fromNumber715(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7150"; // Korntal-Münchingen + case "1": + return "7151"; // Waiblingen + case "2": + return "7152"; // Leonberg Württ + case "3": + return "7153"; // Plochingen + case "4": + return "7154"; // Kornwestheim + case "6": + return "7156"; // Ditzingen + case "7": + return "7157"; // Waldenbuch + case "8": + return "7158"; // Neuhausen auf den Fildern + case "9": + return "7159"; // Renningen + default: + return ""; + } + } + + private static String fromNumber716(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7161"; // Göppingen + case "2": + return "7162"; // Süßen + case "3": + return "7163"; // Ebersbach an der Fils + case "4": + return "7164"; // Boll Kr Göppingen + case "5": + return "7165"; // Göppingen-Hohenstaufen + case "6": + return "7166"; // Adelberg + default: + return ""; + } + } + + private static String fromNumber717(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7171"; // Schwäbisch Gmünd + case "2": + return "7172"; // Lorch Württ + case "3": + return "7173"; // Heubach + case "4": + return "7174"; // Mögglingen + case "5": + return "7175"; // Leinzell + case "6": + return "7176"; // Spraitbach + default: + return ""; + } + } + + private static String fromNumber718(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7181"; // Schorndorf Württ + case "2": + return "7182"; // Welzheim + case "3": + return "7183"; // Rudersberg Württ + case "4": + return "7184"; // Kaisersbach + default: + return ""; + } + } + + private static String fromNumber719(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7191"; // Backnang + case "2": + return "7192"; // Murrhardt + case "3": + return "7193"; // Sulzbach an der Murr + case "4": + return "7194"; // Spiegelberg + case "5": + return "7195"; // Winnenden + default: + return ""; + } + } + + private static String fromNumber72(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber720(number.substring(1)); + case "1": + return "721"; // Karlsruhe + case "2": + return fromNumber722(number.substring(1)); + case "3": + return fromNumber723(number.substring(1)); + case "4": + return fromNumber724(number.substring(1)); + case "5": + return fromNumber725(number.substring(1)); + case "6": + return fromNumber726(number.substring(1)); + case "7": + return fromNumber727(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber720(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7202"; // Karlsbad + case "3": + return "7203"; // Walzbachtal + case "4": + return "7204"; // Malsch-Völkersbach + default: + return ""; + } + } + + private static String fromNumber722(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7220"; // Forbach-Hundsbach + case "1": + return "7221"; // Baden-Baden + case "2": + return "7222"; // Rastatt + case "3": + return "7223"; // Bühl Baden + case "4": + return "7224"; // Gernsbach + case "5": + return "7225"; // Gaggenau + case "6": + return "7226"; // Bühl-Sand + case "7": + return "7227"; // Lichtenau Baden + case "8": + return "7228"; // Forbach + case "9": + return "7229"; // Iffezheim + default: + return ""; + } + } + + private static String fromNumber723(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7231"; // Pforzheim + case "2": + return "7232"; // Königsbach-Stein + case "3": + return "7233"; // Niefern-Öschelbronn + case "4": + return "7234"; // Tiefenbronn + case "5": + return "7235"; // Unterreichenbach Kr Calw + case "6": + return "7236"; // Keltern + case "7": + return "7237"; // Neulingen Enzkreis + default: + return ""; + } + } + + private static String fromNumber724(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7240"; // Pfinztal + case "2": + return "7242"; // Rheinstetten + case "3": + return "7243"; // Ettlingen + case "4": + return "7244"; // Weingarten Baden + case "5": + return "7245"; // Durmersheim + case "6": + return "7246"; // Malsch Kr Karlsruhe + case "7": + return "7247"; // Linkenheim-Hochstetten + case "8": + return "7248"; // Marxzell + case "9": + return "7249"; // Stutensee + default: + return ""; + } + } + + private static String fromNumber725(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7250"; // Kraichtal + case "1": + return "7251"; // Bruchsal + case "2": + return "7252"; // Bretten + case "3": + return "7253"; // Bad Schönborn + case "4": + return "7254"; // Waghäusel + case "5": + return "7255"; // Graben-Neudorf + case "6": + return "7256"; // Philippsburg + case "7": + return "7257"; // Bruchsal-Untergrombach + case "8": + return "7258"; // Oberderdingen-Flehingen + case "9": + return "7259"; // Östringen-Odenheim + default: + return ""; + } + } + + private static String fromNumber726(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7260"; // Sinsheim-Hilsbach + case "1": + return "7261"; // Sinsheim + case "2": + return "7262"; // Eppingen + case "3": + return "7263"; // Waibstadt + case "4": + return "7264"; // Bad Rappenau + case "5": + return "7265"; // Angelbachtal + case "6": + return "7266"; // Kirchardt + case "7": + return "7267"; // Gemmingen + case "8": + return "7268"; // Bad Rappenau-Obergimpern + case "9": + return "7269"; // Sulzfeld Baden + default: + return ""; + } + } + + private static String fromNumber727(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7271"; // Wörth am Rhein + case "2": + return "7272"; // Rülzheim + case "3": + return "7273"; // Hagenbach Pfalz + case "4": + return "7274"; // Germersheim + case "5": + return "7275"; // Kandel + case "6": + return "7276"; // Herxheim bei Landau Pfalz + case "7": + return "7277"; // Wörth-Büchelberg + default: + return ""; + } + } + + private static String fromNumber73(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber730(number.substring(1)); + case "1": + return "731"; // Ulm Donau + case "2": + return fromNumber732(number.substring(1)); + case "3": + return fromNumber733(number.substring(1)); + case "4": + return fromNumber734(number.substring(1)); + case "5": + return fromNumber735(number.substring(1)); + case "6": + return fromNumber736(number.substring(1)); + case "7": + return fromNumber737(number.substring(1)); + case "8": + return fromNumber738(number.substring(1)); + case "9": + return fromNumber739(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber730(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7300"; // Roggenburg + case "2": + return "7302"; // Pfaffenhofen a d Roth + case "3": + return "7303"; // Illertissen + case "4": + return "7304"; // Blaustein Württ + case "5": + return "7305"; // Erbach Donau + case "6": + return "7306"; // Vöhringen Iller + case "7": + return "7307"; // Senden Iller + case "8": + return "7308"; // Nersingen + case "9": + return "7309"; // Weissenhorn + default: + return ""; + } + } + + private static String fromNumber732(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7321"; // Heidenheim a d Brenz + case "2": + return "7322"; // Giengen a d Brenz + case "3": + return "7323"; // Gerstetten + case "4": + return "7324"; // Herbrechtingen + case "5": + return "7325"; // Sontheim a d Brenz + case "6": + return "7326"; // Neresheim + case "7": + return "7327"; // Dischingen + case "8": + return "7328"; // Königsbronn + case "9": + return "7329"; // Steinheim am Albuch + default: + return ""; + } + } + + private static String fromNumber733(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7331"; // Geislingen an der Steige + case "2": + return "7332"; // Lauterstein + case "3": + return "7333"; // Laichingen + case "4": + return "7334"; // Deggingen + case "5": + return "7335"; // Wiesensteig + case "6": + return "7336"; // Lonsee + case "7": + return "7337"; // Nellingen Alb + default: + return ""; + } + } + + private static String fromNumber734(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7340"; // Neenstetten + case "3": + return "7343"; // Buch b Illertissen + case "4": + return "7344"; // Blaubeuren + case "5": + return "7345"; // Langenau Württ + case "6": + return "7346"; // Illerkirchberg + case "7": + return "7347"; // Dietenheim + case "8": + return "7348"; // Beimerstetten + default: + return ""; + } + } + + private static String fromNumber735(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7351"; // Biberach an der Riß + case "2": + return "7352"; // Ochsenhausen + case "3": + return "7353"; // Schwendi + case "4": + return "7354"; // Erolzheim + case "5": + return "7355"; // Hochdorf Riß + case "6": + return "7356"; // Schemmerhofen + case "7": + return "7357"; // Attenweiler + case "8": + return "7358"; // Eberhardzell-Füramoos + default: + return ""; + } + } + + private static String fromNumber736(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7361"; // Aalen + case "2": + return "7362"; // Bopfingen + case "3": + return "7363"; // Lauchheim + case "4": + return "7364"; // Oberkochen + case "5": + return "7365"; // Essingen Württ + case "6": + return "7366"; // Abtsgmünd + case "7": + return "7367"; // Aalen-Ebnat + default: + return ""; + } + } + + private static String fromNumber737(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7371"; // Riedlingen Württ + case "3": + return "7373"; // Zwiefalten + case "4": + return "7374"; // Uttenweiler + case "5": + return "7375"; // Obermarchtal + case "6": + return "7376"; // Langenenslingen + default: + return ""; + } + } + + private static String fromNumber738(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7381"; // Münsingen + case "2": + return "7382"; // Römerstein + case "3": + return "7383"; // Münsingen-Buttenhausen + case "4": + return "7384"; // Schelklingen-Hütten + case "5": + return "7385"; // Gomadingen + case "6": + return "7386"; // Hayingen + case "7": + return "7387"; // Hohenstein Württ + case "8": + return "7388"; // Pfronstetten + case "9": + return "7389"; // Heroldstatt + default: + return ""; + } + } + + private static String fromNumber739(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7391"; // Ehingen Donau + case "2": + return "7392"; // Laupheim + case "3": + return "7393"; // Munderkingen + case "4": + return "7394"; // Schelklingen + case "5": + return "7395"; // Ehingen-Dächingen + default: + return ""; + } + } + + private static String fromNumber74(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber740(number.substring(1)); + case "1": + return "741"; // Rottweil + case "2": + return fromNumber742(number.substring(1)); + case "3": + return fromNumber743(number.substring(1)); + case "4": + return fromNumber744(number.substring(1)); + case "5": + return fromNumber745(number.substring(1)); + case "6": + return fromNumber746(number.substring(1)); + case "7": + return fromNumber747(number.substring(1)); + case "8": + return fromNumber748(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber740(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7402"; // Fluorn-Winzeln + case "3": + return "7403"; // Dunningen + case "4": + return "7404"; // Epfendorf + default: + return ""; + } + } + + private static String fromNumber742(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7420"; // Deisslingen + case "2": + return "7422"; // Schramberg + case "3": + return "7423"; // Oberndorf am Neckar + case "4": + return "7424"; // Spaichingen + case "5": + return "7425"; // Trossingen + case "6": + return "7426"; // Gosheim + case "7": + return "7427"; // Schömberg b Balingen + case "8": + return "7428"; // Rosenfeld + case "9": + return "7429"; // Egesheim + default: + return ""; + } + } + + private static String fromNumber743(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7431"; // Albstadt-Ebingen + case "2": + return "7432"; // Albstadt-Tailfingen + case "3": + return "7433"; // Balingen + case "4": + return "7434"; // Winterlingen + case "5": + return "7435"; // Albstadt-Laufen + case "6": + return "7436"; // Messstetten-Oberdigisheim + default: + return ""; + } + } + + private static String fromNumber744(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7440"; // Bad Rippoldsau + case "1": + return "7441"; // Freudenstadt + case "2": + return "7442"; // Baiersbronn + case "3": + return "7443"; // Dornstetten + case "4": + return "7444"; // Alpirsbach + case "5": + return "7445"; // Pfalzgrafenweiler + case "6": + return "7446"; // Lossburg + case "7": + return "7447"; // Baiersbronn-Schwarzenberg + case "8": + return "7448"; // Seewald + case "9": + return "7449"; // Baiersbronn-Obertal + default: + return ""; + } + } + + private static String fromNumber745(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7451"; // Horb am Neckar + case "2": + return "7452"; // Nagold + case "3": + return "7453"; // Altensteig Württ + case "4": + return "7454"; // Sulz am Neckar + case "5": + return "7455"; // Dornhan + case "6": + return "7456"; // Haiterbach + case "7": + return "7457"; // Rottenburg-Ergenzingen + case "8": + return "7458"; // Ebhausen + case "9": + return "7459"; // Nagold-Hochdorf + default: + return ""; + } + } + + private static String fromNumber746(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7461"; // Tuttlingen + case "2": + return "7462"; // Immendingen + case "3": + return "7463"; // Mühlheim an der Donau + case "4": + return "7464"; // Talheim Kr Tuttlingen + case "5": + return "7465"; // Emmingen-Liptingen + case "6": + return "7466"; // Beuron + case "7": + return "7467"; // Neuhausen ob Eck + default: + return ""; + } + } + + private static String fromNumber747(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7471"; // Hechingen + case "2": + return "7472"; // Rottenburg am Neckar + case "3": + return "7473"; // Mössingen + case "4": + return "7474"; // Haigerloch + case "5": + return "7475"; // Burladingen + case "6": + return "7476"; // Bisingen + case "7": + return "7477"; // Jungingen b Hechingen + case "8": + return "7478"; // Hirrlingen + default: + return ""; + } + } + + private static String fromNumber748(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7482"; // Horb-Dettingen + case "3": + return "7483"; // Horb-Mühringen + case "4": + return "7484"; // Simmersfeld + case "5": + return "7485"; // Empfingen + case "6": + return "7486"; // Horb-Altheim + default: + return ""; + } + } + + private static String fromNumber75(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber750(number.substring(1)); + case "1": + return "751"; // Ravensburg + case "2": + return fromNumber752(number.substring(1)); + case "3": + return fromNumber753(number.substring(1)); + case "4": + return fromNumber754(number.substring(1)); + case "5": + return fromNumber755(number.substring(1)); + case "6": + return fromNumber756(number.substring(1)); + case "7": + return fromNumber757(number.substring(1)); + case "8": + return fromNumber758(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber750(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7502"; // Wolpertswende + case "3": + return "7503"; // Wilhelmsdorf Württ + case "4": + return "7504"; // Horgenzell + case "5": + return "7505"; // Fronreute + case "6": + return "7506"; // Wangen-Leupolz + default: + return ""; + } + } + + private static String fromNumber752(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7520"; // Bodnegg + case "2": + return "7522"; // Wangen im Allgäu + case "4": + return "7524"; // Bad Waldsee + case "5": + return "7525"; // Aulendorf + case "7": + return "7527"; // Wolfegg + case "8": + return "7528"; // Neukirch b Tettnang + case "9": + return "7529"; // Waldburg Württ + default: + return ""; + } + } + + private static String fromNumber753(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7531"; // Konstanz + case "2": + return "7532"; // Meersburg + case "3": + return "7533"; // Allensbach + case "4": + return "7534"; // Reichenau Baden + default: + return ""; + } + } + + private static String fromNumber754(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7541"; // Friedrichshafen + case "2": + return "7542"; // Tettnang + case "3": + return "7543"; // Kressbronn am Bodensee + case "4": + return "7544"; // Markdorf + case "5": + return "7545"; // Immenstaad am Bodensee + case "6": + return "7546"; // Oberteuringen + default: + return ""; + } + } + + private static String fromNumber755(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7551"; // Überlingen Bodensee + case "2": + return "7552"; // Pfullendorf + case "3": + return "7553"; // Salem Baden + case "4": + return "7554"; // Heiligenberg Baden + case "5": + return "7555"; // Deggenhausertal + case "6": + return "7556"; // Uhldingen-Mühlhofen + case "7": + return "7557"; // Herdwangen-Schönach + case "8": + return "7558"; // Illmensee + default: + return ""; + } + } + + private static String fromNumber756(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7561"; // Leutkirch im Allgäu + case "2": + return "7562"; // Isny im Allgäu + case "3": + return "7563"; // Kisslegg + case "4": + return "7564"; // Bad Wurzach + case "5": + return "7565"; // Aichstetten Kr Ravensburg + case "6": + return "7566"; // Argenbühl + case "7": + return "7567"; // Leutkirch-Friesenhofen + case "8": + return "7568"; // Bad Wurzach-Hauerz + case "9": + return "7569"; // Isny-Eisenbach + default: + return ""; + } + } + + private static String fromNumber757(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7570"; // Sigmaringen-Gutenstein + case "1": + return "7571"; // Sigmaringen + case "2": + return "7572"; // Mengen Württ + case "3": + return "7573"; // Stetten am kalten Markt + case "4": + return "7574"; // Gammertingen + case "5": + return "7575"; // Messkirch + case "6": + return "7576"; // Krauchenwies + case "7": + return "7577"; // Veringenstadt + case "8": + return "7578"; // Wald Hohenz + case "9": + return "7579"; // Schwenningen Baden + default: + return ""; + } + } + + private static String fromNumber758(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7581"; // Saulgau + case "2": + return "7582"; // Bad Buchau + case "3": + return "7583"; // Bad Schussenried + case "4": + return "7584"; // Altshausen + case "5": + return "7585"; // Ostrach + case "6": + return "7586"; // Herbertingen + case "7": + return "7587"; // Hosskirch + default: + return ""; + } + } + + private static String fromNumber76(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber760(number.substring(1)); + case "1": + return "761"; // Freiburg im Breisgau + case "2": + return fromNumber762(number.substring(1)); + case "3": + return fromNumber763(number.substring(1)); + case "4": + return fromNumber764(number.substring(1)); + case "5": + return fromNumber765(number.substring(1)); + case "6": + return fromNumber766(number.substring(1)); + case "7": + return fromNumber767(number.substring(1)); + case "8": + return fromNumber768(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber760(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7602"; // Oberried Breisgau + default: + return ""; + } + } + + private static String fromNumber762(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7620"; // Schopfheim-Gersbach + case "1": + return "7621"; // Lörrach + case "2": + return "7622"; // Schopfheim + case "3": + return "7623"; // Rheinfelden Baden + case "4": + return "7624"; // Grenzach-Wyhlen + case "5": + return "7625"; // Zell im Wiesental + case "6": + return "7626"; // Kandern + case "7": + return "7627"; // Steinen Kr Lörrach + case "8": + return "7628"; // Efringen-Kirchen + case "9": + return "7629"; // Tegernau Baden + default: + return ""; + } + } + + private static String fromNumber763(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7631"; // Müllheim Baden + case "2": + return "7632"; // Badenweiler + case "3": + return "7633"; // Staufen im Breisgau + case "4": + return "7634"; // Sulzburg + case "5": + return "7635"; // Schliengen + case "6": + return "7636"; // Münstertal Schwarzwald + default: + return ""; + } + } + + private static String fromNumber764(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7641"; // Emmendingen + case "2": + return "7642"; // Endingen Kaiserstuhl + case "3": + return "7643"; // Herbolzheim Breisgau + case "4": + return "7644"; // Kenzingen + case "5": + return "7645"; // Freiamt + case "6": + return "7646"; // Weisweil Breisgau + default: + return ""; + } + } + + private static String fromNumber765(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7651"; // Titisee-Neustadt + case "2": + return "7652"; // Hinterzarten + case "3": + return "7653"; // Lenzkirch + case "4": + return "7654"; // Löffingen + case "5": + return "7655"; // Feldberg-Altglashütten + case "6": + return "7656"; // Schluchsee + case "7": + return "7657"; // Eisenbach Hochschwarzwald + default: + return ""; + } + } + + private static String fromNumber766(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7660"; // St Peter Schwarzw + case "1": + return "7661"; // Kirchzarten + case "2": + return "7662"; // Vogtsburg im Kaiserstuhl + case "3": + return "7663"; // Eichstetten + case "4": + return "7664"; // Freiburg-Tiengen + case "5": + return "7665"; // March Breisgau + case "6": + return "7666"; // Denzlingen + case "7": + return "7667"; // Breisach am Rhein + case "8": + return "7668"; // Ihringen + case "9": + return "7669"; // St Märgen + default: + return ""; + } + } + + private static String fromNumber767(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7671"; // Todtnau + case "2": + return "7672"; // St Blasien + case "3": + return "7673"; // Schönau im Schwarzwald + case "4": + return "7674"; // Todtmoos + case "5": + return "7675"; // Bernau Baden + case "6": + return "7676"; // Feldberg Schwarzwald + default: + return ""; + } + } + + private static String fromNumber768(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7681"; // Waldkirch Breisgau + case "2": + return "7682"; // Elzach + case "3": + return "7683"; // Simonswald + case "4": + return "7684"; // Glottertal + case "5": + return "7685"; // Gutach-Bleibach + default: + return ""; + } + } + + private static String fromNumber77(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber770(number.substring(1)); + case "1": + return "771"; // Donaueschingen + case "2": + return fromNumber772(number.substring(1)); + case "3": + return fromNumber773(number.substring(1)); + case "4": + return fromNumber774(number.substring(1)); + case "5": + return fromNumber775(number.substring(1)); + case "6": + return fromNumber776(number.substring(1)); + case "7": + return fromNumber777(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber770(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7702"; // Blumberg Baden + case "3": + return "7703"; // Bonndorf im Schwarzwald + case "4": + return "7704"; // Geisingen Baden + case "5": + return "7705"; // Wolterdingen Schwarzw + case "6": + return "7706"; // Oberbaldingen + case "7": + return "7707"; // Bräunlingen + case "8": + return "7708"; // Geisingen-Leipferdingen + case "9": + return "7709"; // Wutach + default: + return ""; + } + } + + private static String fromNumber772(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7720"; // Schwenningen a Neckar + case "1": + return "7721"; // Villingen i Schwarzw + case "2": + return "7722"; // Triberg im Schwarzwald + case "3": + return "7723"; // Furtwangen im Schwarzwald + case "4": + return "7724"; // St Georgen im Schwarzwald + case "5": + return "7725"; // Königsfeld im Schwarzwald + case "6": + return "7726"; // Bad Dürrheim + case "7": + return "7727"; // Vöhrenbach + case "8": + return "7728"; // Niedereschach + case "9": + return "7729"; // Tennenbronn + default: + return ""; + } + } + + private static String fromNumber773(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7731"; // Singen Hohentwiel + case "2": + return "7732"; // Radolfzell am Bodensee + case "3": + return "7733"; // Engen Hegau + case "4": + return "7734"; // Gailingen + case "5": + return "7735"; // Öhningen + case "6": + return "7736"; // Tengen + case "8": + return "7738"; // Steisslingen + case "9": + return "7739"; // Hilzingen + default: + return ""; + } + } + + private static String fromNumber774(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7741"; // Tiengen Hochrhein + case "2": + return "7742"; // Klettgau + case "3": + return "7743"; // Ühlingen-Birkendorf + case "4": + return "7744"; // Stühlingen + case "5": + return "7745"; // Jestetten + case "6": + return "7746"; // Wutöschingen + case "7": + return "7747"; // Berau + case "8": + return "7748"; // Grafenhausen Hochschwarzw + default: + return ""; + } + } + + private static String fromNumber775(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7751"; // Waldshut + case "3": + return "7753"; // Albbruck + case "4": + return "7754"; // Görwihl + case "5": + return "7755"; // Weilheim Kr Waldshut + default: + return ""; + } + } + + private static String fromNumber776(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7761"; // Bad Säckingen + case "2": + return "7762"; // Wehr Baden + case "3": + return "7763"; // Murg + case "4": + return "7764"; // Herrischried + case "5": + return "7765"; // Rickenbach Hotzenw + default: + return ""; + } + } + + private static String fromNumber777(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7771"; // Stockach + case "3": + return "7773"; // Bodman-Ludwigshafen + case "4": + return "7774"; // Eigeltingen + case "5": + return "7775"; // Mühlingen + case "7": + return "7777"; // Sauldorf + default: + return ""; + } + } + + private static String fromNumber78(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber780(number.substring(1)); + case "1": + return "781"; // Offenburg + case "2": + return fromNumber782(number.substring(1)); + case "3": + return fromNumber783(number.substring(1)); + case "4": + return fromNumber784(number.substring(1)); + case "5": + return fromNumber785(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber780(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7802"; // Oberkirch Baden + case "3": + return "7803"; // Gengenbach + case "4": + return "7804"; // Oppenau + case "5": + return "7805"; // Appenweier + case "6": + return "7806"; // Bad Peterstal-Griesbach + case "7": + return "7807"; // Neuried Ortenaukreis + case "8": + return "7808"; // Hohberg b Offenburg + default: + return ""; + } + } + + private static String fromNumber782(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7821"; // Lahr Schwarzwald + case "2": + return "7822"; // Ettenheim + case "3": + return "7823"; // Seelbach Schutter + case "4": + return "7824"; // Schwanau + case "5": + return "7825"; // Kippenheim + case "6": + return "7826"; // Schuttertal + default: + return ""; + } + } + + private static String fromNumber783(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7831"; // Hausach + case "2": + return "7832"; // Haslach im Kinzigtal + case "3": + return "7833"; // Hornberg Schwarzwaldbahn + case "4": + return "7834"; // Wolfach + case "5": + return "7835"; // Zell am Harmersbach + case "6": + return "7836"; // Schiltach + case "7": + return "7837"; // Oberharmersbach + case "8": + return "7838"; // Nordrach + case "9": + return "7839"; // Schapbach + default: + return ""; + } + } + + private static String fromNumber784(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7841"; // Achern + case "2": + return "7842"; // Kappelrodeck + case "3": + return "7843"; // Renchen + case "4": + return "7844"; // Rheinau + default: + return ""; + } + } + + private static String fromNumber785(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7851"; // Kehl + case "2": + return "7852"; // Willstätt + case "3": + return "7853"; // Kehl-Bodersweier + case "4": + return "7854"; // Kehl-Goldscheuer + default: + return ""; + } + } + + private static String fromNumber79(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber790(number.substring(1)); + case "1": + return "791"; // Schwäbisch Hall + case "3": + return fromNumber793(number.substring(1)); + case "4": + return fromNumber794(number.substring(1)); + case "5": + return fromNumber795(number.substring(1)); + case "6": + return fromNumber796(number.substring(1)); + case "7": + return fromNumber797(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber790(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "7903"; // Mainhardt + case "4": + return "7904"; // Ilshofen + case "5": + return "7905"; // Langenburg + case "6": + return "7906"; // Braunsbach + case "7": + return "7907"; // Schwäbisch Hall-Sulzdorf + default: + return ""; + } + } + + private static String fromNumber793(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7930"; // Boxberg Baden + case "1": + return "7931"; // Bad Mergentheim + case "2": + return "7932"; // Niederstetten Württ + case "3": + return "7933"; // Creglingen + case "4": + return "7934"; // Weikersheim + case "5": + return "7935"; // Schrozberg + case "6": + return "7936"; // Schrozberg-Bartenstein + case "7": + return "7937"; // Dörzbach + case "8": + return "7938"; // Mulfingen Jagst + case "9": + return "7939"; // Schrozberg-Spielbach + default: + return ""; + } + } + + private static String fromNumber794(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7940"; // Künzelsau + case "1": + return "7941"; // Öhringen + case "2": + return "7942"; // Neuenstein Württ + case "3": + return "7943"; // Schöntal Jagst + case "4": + return "7944"; // Kupferzell + case "5": + return "7945"; // Wüstenrot + case "6": + return "7946"; // Bretzfeld + case "7": + return "7947"; // Forchtenberg + case "8": + return "7948"; // Öhringen-Ohrnberg + case "9": + return "7949"; // Pfedelbach-Untersteinbach + default: + return ""; + } + } + + private static String fromNumber795(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7950"; // Schnelldorf + case "1": + return "7951"; // Crailsheim + case "2": + return "7952"; // Gerabronn + case "3": + return "7953"; // Blaufelden + case "4": + return "7954"; // Kirchberg an der Jagst + case "5": + return "7955"; // Wallhausen Württ + case "7": + return "7957"; // Kressberg + case "8": + return "7958"; // Rot Am See-Brettheim + case "9": + return "7959"; // Frankenhardt + default: + return ""; + } + } + + private static String fromNumber796(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7961"; // Ellwangen Jagst + case "2": + return "7962"; // Fichtenau + case "3": + return "7963"; // Adelmannsfelden + case "4": + return "7964"; // Stödtlen + case "5": + return "7965"; // Ellwangen-Röhlingen + case "6": + return "7966"; // Unterschneidheim + case "7": + return "7967"; // Jagstzell + default: + return ""; + } + } + + private static String fromNumber797(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7971"; // Gaildorf + case "2": + return "7972"; // Gschwend b Gaildorf + case "3": + return "7973"; // Obersontheim + case "4": + return "7974"; // Bühlerzell + case "5": + return "7975"; // Untergröningen + case "6": + return "7976"; // Sulzbach-Laufen + case "7": + return "7977"; // Oberrot b Gaildorf + default: + return ""; + } + } + + private static String fromNumber8(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber80(number.substring(1)); + case "1": + return fromNumber81(number.substring(1)); + case "2": + return fromNumber82(number.substring(1)); + case "3": + return fromNumber83(number.substring(1)); + case "4": + return fromNumber84(number.substring(1)); + case "5": + return fromNumber85(number.substring(1)); + case "6": + return fromNumber86(number.substring(1)); + case "7": + return fromNumber87(number.substring(1)); + case "8": + return fromNumber88(number.substring(1)); + case "9": + return "89"; // München + default: + return ""; + } + } + + private static String fromNumber80(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber802(number.substring(1)); + case "3": + return fromNumber803(number.substring(1)); + case "4": + return fromNumber804(number.substring(1)); + case "5": + return fromNumber805(number.substring(1)); + case "6": + return fromNumber806(number.substring(1)); + case "7": + return fromNumber807(number.substring(1)); + case "8": + return fromNumber808(number.substring(1)); + case "9": + return fromNumber809(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber802(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8020"; // Weyarn + case "1": + return "8021"; // Waakirchen + case "2": + return "8022"; // Tegernsee + case "3": + return "8023"; // Bayrischzell + case "4": + return "8024"; // Holzkirchen + case "5": + return "8025"; // Miesbach + case "6": + return "8026"; // Hausham + case "7": + return "8027"; // Dietramszell + case "8": + return "8028"; // Fischbachau + case "9": + return "8029"; // Kreuth b Tegernsee + default: + return ""; + } + } + + private static String fromNumber803(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8031"; // Rosenheim Oberbay + case "2": + return "8032"; // Rohrdorf Kr Rosenheim + case "3": + return "8033"; // Oberaudorf + case "4": + return "8034"; // Brannenburg + case "5": + return "8035"; // Raubling + case "6": + return "8036"; // Stephanskirchen Simssee + case "8": + return "8038"; // Vogtareuth + case "9": + return "8039"; // Rott a Inn + default: + return ""; + } + } + + private static String fromNumber804(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8041"; // Bad Tölz + case "2": + return "8042"; // Lenggries + case "3": + return "8043"; // Jachenau + case "5": + return "8045"; // Lenggries-Fall + case "6": + return "8046"; // Bad Heilbrunn + default: + return ""; + } + } + + private static String fromNumber805(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8051"; // Prien a Chiemsee + case "2": + return "8052"; // Aschau i Chiemgau + case "3": + return "8053"; // Bad Endorf + case "4": + return "8054"; // Breitbrunn a Chiemsee + case "5": + return "8055"; // Halfing + case "6": + return "8056"; // Eggstätt + case "7": + return "8057"; // Aschau-Sachrang + default: + return ""; + } + } + + private static String fromNumber806(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8061"; // Bad Aibling + case "2": + return "8062"; // Bruckmühl Mangfall + case "3": + return "8063"; // Feldkirchen-Westerham + case "4": + return "8064"; // Au b Bad Aibling + case "5": + return "8065"; // Tuntenhausen-Schönau + case "6": + return "8066"; // Bad Feilnbach + case "7": + return "8067"; // Tuntenhausen + default: + return ""; + } + } + + private static String fromNumber807(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8071"; // Wasserburg a Inn + case "2": + return "8072"; // Haag i OB + case "3": + return "8073"; // Gars a Inn + case "4": + return "8074"; // Schnaitsee + case "5": + return "8075"; // Amerang + case "6": + return "8076"; // Pfaffing + default: + return ""; + } + } + + private static String fromNumber808(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8081"; // Dorfen Stadt + case "2": + return "8082"; // Schwindegg + case "3": + return "8083"; // Isen + case "4": + return "8084"; // Taufkirchen Vils + case "5": + return "8085"; // Sankt Wolfgang + case "6": + return "8086"; // Buchbach Oberbay + default: + return ""; + } + } + + private static String fromNumber809(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8091"; // Kirchseeon + case "2": + return "8092"; // Grafing b München + case "3": + return "8093"; // Glonn Kr Ebersberg + case "4": + return "8094"; // Steinhöring + case "5": + return "8095"; // Aying + default: + return ""; + } + } + + private static String fromNumber81(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber810(number.substring(1)); + case "1": + return "811"; // Hallbergmoos + case "2": + return fromNumber812(number.substring(1)); + case "3": + return fromNumber813(number.substring(1)); + case "4": + return fromNumber814(number.substring(1)); + case "5": + return fromNumber815(number.substring(1)); + case "6": + return fromNumber816(number.substring(1)); + case "7": + return fromNumber817(number.substring(1)); + case "9": + return fromNumber819(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber810(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8102"; // Höhenkirchen-Siegertsbrunn + case "4": + return "8104"; // Sauerlach + case "5": + return "8105"; // Gilching + case "6": + return "8106"; // Vaterstetten + default: + return ""; + } + } + + private static String fromNumber812(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8121"; // Markt Schwaben + case "2": + return "8122"; // Erding + case "3": + return "8123"; // Moosinning + case "4": + return "8124"; // Forstern Oberbay + default: + return ""; + } + } + + private static String fromNumber813(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8131"; // Dachau + case "3": + return "8133"; // Haimhausen Oberbay + case "4": + return "8134"; // Odelzhausen + case "5": + return "8135"; // Sulzemoos + case "6": + return "8136"; // Markt Indersdorf + case "7": + return "8137"; // Petershausen + case "8": + return "8138"; // Schwabhausen b Dachau + case "9": + return "8139"; // Röhrmoos + default: + return ""; + } + } + + private static String fromNumber814(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8141"; // Fürstenfeldbruck + case "2": + return "8142"; // Olching + case "3": + return "8143"; // Inning a Ammersee + case "4": + return "8144"; // Grafrath + case "5": + return "8145"; // Mammendorf + case "6": + return "8146"; // Moorenweis + default: + return ""; + } + } + + private static String fromNumber815(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8151"; // Starnberg + case "2": + return "8152"; // Herrsching a Ammersee + case "3": + return "8153"; // Wessling + case "7": + return "8157"; // Feldafing + case "8": + return "8158"; // Tutzing + default: + return ""; + } + } + + private static String fromNumber816(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8161"; // Freising + case "5": + return "8165"; // Neufahrn b Freising + case "6": + return "8166"; // Allershausen Oberbay + case "7": + return "8167"; // Zolling + case "8": + return "8168"; // Attenkirchen + default: + return ""; + } + } + + private static String fromNumber817(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8170"; // Straßlach-Dingharting + case "1": + return "8171"; // Wolfratshausen + case "6": + return "8176"; // Egling b Wolfratshausen + case "7": + return "8177"; // Münsing Starnberger See + case "8": + return "8178"; // Icking + case "9": + return "8179"; // Eurasburg a d Loisach + default: + return ""; + } + } + + private static String fromNumber819(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8191"; // Landsberg a Lech + case "2": + return "8192"; // Schondorf a Ammersee + case "3": + return "8193"; // Geltendorf + case "4": + return "8194"; // Vilgertshofen + case "5": + return "8195"; // Weil Kr Landsberg a Lech + case "6": + return "8196"; // Pürgen + default: + return ""; + } + } + + private static String fromNumber82(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber820(number.substring(1)); + case "1": + return "821"; // Augsburg + case "2": + return fromNumber822(number.substring(1)); + case "3": + return fromNumber823(number.substring(1)); + case "4": + return fromNumber824(number.substring(1)); + case "5": + return fromNumber825(number.substring(1)); + case "6": + return fromNumber826(number.substring(1)); + case "7": + return fromNumber827(number.substring(1)); + case "8": + return fromNumber828(number.substring(1)); + case "9": + return fromNumber829(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber820(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8202"; // Althegnenberg + case "3": + return "8203"; // Grossaitingen + case "4": + return "8204"; // Mickhausen + case "5": + return "8205"; // Dasing + case "6": + return "8206"; // Egling a d Paar + case "7": + return "8207"; // Affing + case "8": + return "8208"; // Eurasburg b Augsburg + default: + return ""; + } + } + + private static String fromNumber822(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8221"; // Günzburg + case "2": + return "8222"; // Burgau Schwab + case "3": + return "8223"; // Ichenhausen + case "4": + return "8224"; // Offingen Donau + case "5": + return "8225"; // Jettingen-Scheppach + case "6": + return "8226"; // Bibertal + default: + return ""; + } + } + + private static String fromNumber823(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8230"; // Gablingen + case "1": + return "8231"; // Königsbrunn b Augsburg + case "2": + return "8232"; // Schwabmünchen + case "3": + return "8233"; // Kissing + case "4": + return "8234"; // Bobingen + case "6": + return "8236"; // Fischach + case "7": + return "8237"; // Aindling + case "8": + return "8238"; // Gessertshausen + case "9": + return "8239"; // Langenneufnach + default: + return ""; + } + } + + private static String fromNumber824(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8241"; // Buchloe + case "3": + return "8243"; // Fuchstal + case "5": + return "8245"; // Türkheim Wertach + case "6": + return "8246"; // Waal + case "7": + return "8247"; // Bad Wörishofen + case "8": + return "8248"; // Lamerdingen + case "9": + return "8249"; // Ettringen Wertach + default: + return ""; + } + } + + private static String fromNumber825(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8250"; // Hilgertshausen-Tandern + case "1": + return "8251"; // Aichach + case "2": + return "8252"; // Schrobenhausen + case "3": + return "8253"; // Pöttmes + case "4": + return "8254"; // Altomünster + case "7": + return "8257"; // Inchenhofen + case "8": + return "8258"; // Sielenbach + case "9": + return "8259"; // Schiltberg + default: + return ""; + } + } + + private static String fromNumber826(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8261"; // Mindelheim + case "2": + return "8262"; // Mittelneufnach + case "3": + return "8263"; // Breitenbrunn Schwab + case "5": + return "8265"; // Pfaffenhausen Schwab + case "6": + return "8266"; // Kirchheim i Schw + case "7": + return "8267"; // Dirlewang + case "8": + return "8268"; // Tussenhausen + case "9": + return "8269"; // Unteregg b Mindelheim + default: + return ""; + } + } + + private static String fromNumber827(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8271"; // Meitingen + case "2": + return "8272"; // Wertingen + case "3": + return "8273"; // Nordendorf + case "4": + return "8274"; // Buttenwiesen + case "6": + return "8276"; // Baar Schwaben + default: + return ""; + } + } + + private static String fromNumber828(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8281"; // Thannhausen Schwab + case "2": + return "8282"; // Krumbach Schwaben + case "3": + return "8283"; // Neuburg a d Kammel + case "4": + return "8284"; // Ziemetshausen + case "5": + return "8285"; // Burtenbach + default: + return ""; + } + } + + private static String fromNumber829(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8291"; // Zusmarshausen + case "2": + return "8292"; // Dinkelscherben + case "3": + return "8293"; // Welden b Augsburg + case "4": + return "8294"; // Horgau + case "5": + return "8295"; // Altenmünster Schwab + case "6": + return "8296"; // Villenbach + default: + return ""; + } + } + + private static String fromNumber83(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber830(number.substring(1)); + case "1": + return "831"; // Kempten Allgäu + case "2": + return fromNumber832(number.substring(1)); + case "3": + return fromNumber833(number.substring(1)); + case "4": + return fromNumber834(number.substring(1)); + case "6": + return fromNumber836(number.substring(1)); + case "7": + return fromNumber837(number.substring(1)); + case "8": + return fromNumber838(number.substring(1)); + case "9": + return fromNumber839(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber830(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8302"; // Görisried + case "3": + return "8303"; // Waltenhofen + case "4": + return "8304"; // Wildpoldsried + case "6": + return "8306"; // Ronsberg + default: + return ""; + } + } + + private static String fromNumber832(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8320"; // Missen-Wilhams + case "1": + return "8321"; // Sonthofen + case "2": + return "8322"; // Oberstdorf + case "3": + return "8323"; // Immenstadt i Allgäu + case "4": + return "8324"; // Hindelang + case "5": + return "8325"; // Oberstaufen-Thalkirchdorf + case "6": + return "8326"; // Fischen i Allgäu + case "7": + return "8327"; // Rettenberg + case "8": + return "8328"; // Balderschwang + default: + return ""; + } + } + + private static String fromNumber833(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8330"; // Legau + case "1": + return "8331"; // Memmingen + case "2": + return "8332"; // Ottobeuren + case "3": + return "8333"; // Babenhausen Schwab + case "4": + return "8334"; // Bad Grönenbach + case "5": + return "8335"; // Fellheim + case "6": + return "8336"; // Erkheim + case "7": + return "8337"; // Altenstadt Iller + case "8": + return "8338"; // Böhen + default: + return ""; + } + } + + private static String fromNumber834(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8340"; // Baisweil + case "1": + return "8341"; // Kaufbeuren + case "2": + return "8342"; // Marktoberdorf + case "3": + return "8343"; // Aitrang + case "4": + return "8344"; // Westendorf b Kaufbeuren + case "5": + return "8345"; // Stöttwang + case "6": + return "8346"; // Pforzen + case "7": + return "8347"; // Friesenried + case "8": + return "8348"; // Bidingen + case "9": + return "8349"; // Stötten a Auerberg + default: + return ""; + } + } + + private static String fromNumber836(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8361"; // Nesselwang + case "2": + return "8362"; // Füssen + case "3": + return "8363"; // Pfronten + case "4": + return "8364"; // Seeg + case "5": + return "8365"; // Wertach + case "6": + return "8366"; // Oy-Mittelberg + case "7": + return "8367"; // Roßhaupten Forggensee + case "8": + return "8368"; // Halblech + case "9": + return "8369"; // Rückholz + default: + return ""; + } + } + + private static String fromNumber837(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8370"; // Wiggensbach + case "2": + return "8372"; // Obergünzburg + case "3": + return "8373"; // Altusried + case "4": + return "8374"; // Dietmannsried + case "5": + return "8375"; // Weitnau + case "6": + return "8376"; // Sulzberg Allgäu + case "7": + return "8377"; // Unterthingau + case "8": + return "8378"; // Buchenberg b Kempten + case "9": + return "8379"; // Waltenhofen-Oberdorf + default: + return ""; + } + } + + private static String fromNumber838(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8380"; // Achberg + case "1": + return "8381"; // Lindenberg i Allgäu + case "2": + return "8382"; // Lindau Bodensee + case "3": + return "8383"; // Grünenbach Allgäu + case "4": + return "8384"; // Röthenbach Allgäu + case "5": + return "8385"; // Hergatz + case "6": + return "8386"; // Oberstaufen + case "7": + return "8387"; // Weiler-Simmerberg + case "8": + return "8388"; // Hergensweiler + case "9": + return "8389"; // Weissensberg + default: + return ""; + } + } + + private static String fromNumber839(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8392"; // Markt Rettenbach + case "3": + return "8393"; // Holzgünz + case "4": + return "8394"; // Lautrach + case "5": + return "8395"; // Tannheim Württ + default: + return ""; + } + } + + private static String fromNumber84(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber840(number.substring(1)); + case "1": + return "841"; // Ingolstadt Donau + case "2": + return fromNumber842(number.substring(1)); + case "3": + return fromNumber843(number.substring(1)); + case "4": + return fromNumber844(number.substring(1)); + case "5": + return fromNumber845(number.substring(1)); + case "6": + return fromNumber846(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber840(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8402"; // Münchsmünster + case "3": + return "8403"; // Pförring + case "4": + return "8404"; // Oberdolling + case "5": + return "8405"; // Stammham b Ingolstadt + case "6": + return "8406"; // Böhmfeld + case "7": + return "8407"; // Grossmehring + default: + return ""; + } + } + + private static String fromNumber842(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8421"; // Eichstätt Bay + case "2": + return "8422"; // Dollnstein + case "3": + return "8423"; // Titting + case "4": + return "8424"; // Nassenfels + case "6": + return "8426"; // Walting Kr Eichstätt + case "7": + return "8427"; // Wellheim + default: + return ""; + } + } + + private static String fromNumber843(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8431"; // Neuburg a d Donau + case "2": + return "8432"; // Burgheim + case "3": + return "8433"; // Königsmoos + case "4": + return "8434"; // Rennertshofen + case "5": + return "8435"; // Ehekirchen + default: + return ""; + } + } + + private static String fromNumber844(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8441"; // Pfaffenhofen a d Ilm + case "2": + return "8442"; // Wolnzach + case "3": + return "8443"; // Hohenwart Paar + case "4": + return "8444"; // Schweitenkirchen + case "5": + return "8445"; // Gerolsbach + case "6": + return "8446"; // Pörnbach + default: + return ""; + } + } + + private static String fromNumber845(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8450"; // Ingolstadt-Zuchering + case "2": + return "8452"; // Geisenfeld + case "3": + return "8453"; // Reichertshofen Oberbay + case "4": + return "8454"; // Karlshuld + case "6": + return "8456"; // Lenting + case "7": + return "8457"; // Vohburg a d Donau + case "8": + return "8458"; // Gaimersheim + case "9": + return "8459"; // Manching + default: + return ""; + } + } + + private static String fromNumber846(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8460"; // Berching-Holnstein + case "1": + return "8461"; // Beilngries + case "2": + return "8462"; // Berching + case "3": + return "8463"; // Greding + case "4": + return "8464"; // Dietfurt a d Altmühl + case "5": + return "8465"; // Kipfenberg + case "6": + return "8466"; // Denkendorf Oberbay + case "7": + return "8467"; // Kinding + case "8": + return "8468"; // Altmannstein-Pondorf + case "9": + return "8469"; // Freystadt-Burggriesbach + default: + return ""; + } + } + + private static String fromNumber85(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber850(number.substring(1)); + case "1": + return "851"; // Passau + case "3": + return fromNumber853(number.substring(1)); + case "4": + return fromNumber854(number.substring(1)); + case "5": + return fromNumber855(number.substring(1)); + case "6": + return fromNumber856(number.substring(1)); + case "7": + return fromNumber857(number.substring(1)); + case "8": + return fromNumber858(number.substring(1)); + case "9": + return fromNumber859(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber850(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8501"; // Thyrnau + case "2": + return "8502"; // Fürstenzell + case "3": + return "8503"; // Neuhaus a Inn + case "4": + return "8504"; // Tittling + case "5": + return "8505"; // Hutthurm + case "6": + return "8506"; // Bad Höhenstadt + case "7": + return "8507"; // Neuburg a Inn + case "9": + return "8509"; // Ruderting + default: + return ""; + } + } + + private static String fromNumber853(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8531"; // Pocking + case "2": + return "8532"; // Griesbach i Rottal + case "3": + return "8533"; // Rotthalmünster + case "4": + return "8534"; // Tettenweis + case "5": + return "8535"; // Haarbach + case "6": + return "8536"; // Kößlarn + case "7": + return "8537"; // Bad Füssing-Aigen + case "8": + return "8538"; // Pocking-Hartkirchen + default: + return ""; + } + } + + private static String fromNumber854(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8541"; // Vilshofen Niederbay + case "2": + return "8542"; // Ortenburg + case "3": + return "8543"; // Aidenbach + case "4": + return "8544"; // Eging a See + case "5": + return "8545"; // Hofkirchen Bay + case "6": + return "8546"; // Windorf-Otterskirchen + case "7": + return "8547"; // Osterhofen-Gergweis + case "8": + return "8548"; // Vilshofen-Sandbach + case "9": + return "8549"; // Vilshofen-Pleinting + default: + return ""; + } + } + + private static String fromNumber855(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8550"; // Philippsreut + case "1": + return "8551"; // Freyung + case "2": + return "8552"; // Grafenau Niederbay + case "3": + return "8553"; // Spiegelau + case "4": + return "8554"; // Schönberg Niederbay + case "5": + return "8555"; // Perlesreut + case "6": + return "8556"; // Haidmühle + case "7": + return "8557"; // Mauth + case "8": + return "8558"; // Hohenau Niederbay + default: + return ""; + } + } + + private static String fromNumber856(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8561"; // Pfarrkirchen Niederbay + case "2": + return "8562"; // Triftern + case "3": + return "8563"; // Bad Birnbach Rottal + case "4": + return "8564"; // Johanniskirchen + case "5": + return "8565"; // Dietersburg-Baumgarten + default: + return ""; + } + } + + private static String fromNumber857(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8571"; // Simbach a Inn + case "2": + return "8572"; // Tann Niederbay + case "3": + return "8573"; // Ering + case "4": + return "8574"; // Wittibreut + default: + return ""; + } + } + + private static String fromNumber858(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8581"; // Waldkirchen Niederbay + case "2": + return "8582"; // Röhrnbach + case "3": + return "8583"; // Neureichenau + case "4": + return "8584"; // Breitenberg Niederbay + case "5": + return "8585"; // Grainet + case "6": + return "8586"; // Hauzenberg + default: + return ""; + } + } + + private static String fromNumber859(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8591"; // Obernzell + case "2": + return "8592"; // Wegscheid Niederbay + case "3": + return "8593"; // Untergriesbach + default: + return ""; + } + } + + private static String fromNumber86(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "861"; // Traunstein + case "2": + return fromNumber862(number.substring(1)); + case "3": + return fromNumber863(number.substring(1)); + case "4": + return fromNumber864(number.substring(1)); + case "5": + return fromNumber865(number.substring(1)); + case "6": + return fromNumber866(number.substring(1)); + case "7": + return fromNumber867(number.substring(1)); + case "8": + return fromNumber868(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber862(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8621"; // Trostberg + case "2": + return "8622"; // Tacherting- Peterskirchen + case "3": + return "8623"; // Kirchweidach + case "4": + return "8624"; // Obing + case "8": + return "8628"; // Kienberg Oberbay + case "9": + return "8629"; // Palling + default: + return ""; + } + } + + private static String fromNumber863(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8630"; // Oberneukirchen + case "1": + return "8631"; // Mühldorf a Inn + case "3": + return "8633"; // Tüßling + case "4": + return "8634"; // Garching a d Alz + case "5": + return "8635"; // Pleiskirchen + case "6": + return "8636"; // Ampfing + case "7": + return "8637"; // Lohkirchen + case "8": + return "8638"; // Waldkraiburg + case "9": + return "8639"; // Neumarkt-Sankt Veit + default: + return ""; + } + } + + private static String fromNumber864(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8640"; // Reit Im Winkl + case "1": + return "8641"; // Grassau Kr Traunstein + case "2": + return "8642"; // Übersee + case "9": + return "8649"; // Schleching + default: + return ""; + } + } + + private static String fromNumber865(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8650"; // Marktschellenberg + case "1": + return "8651"; // Bad Reichenhall + case "2": + return "8652"; // Berchtesgaden + case "4": + return "8654"; // Freilassing + case "6": + return "8656"; // Anger + case "7": + return "8657"; // Ramsau b Berchtesgaden + default: + return ""; + } + } + + private static String fromNumber866(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8661"; // Grabenstätt Chiemsee + case "2": + return "8662"; // Siegsdorf Kr Traunstein + case "3": + return "8663"; // Ruhpolding + case "4": + return "8664"; // Chieming + case "5": + return "8665"; // Inzell + case "6": + return "8666"; // Teisendorf + case "7": + return "8667"; // Seeon-Seebruck + case "9": + return "8669"; // Traunreut + default: + return ""; + } + } + + private static String fromNumber867(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8670"; // Reischach Kr Altötting + case "1": + return "8671"; // Altötting + case "7": + return "8677"; // Burghausen Salzach + case "8": + return "8678"; // Marktl + case "9": + return "8679"; // Burgkirchen a d Alz + default: + return ""; + } + } + + private static String fromNumber868(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8681"; // Waging a See + case "2": + return "8682"; // Laufen Salzach + case "3": + return "8683"; // Tittmoning + case "4": + return "8684"; // Fridolfing + case "5": + return "8685"; // Kirchanschöring + case "6": + return "8686"; // Petting + case "7": + return "8687"; // Taching-Tengling + default: + return ""; + } + } + + private static String fromNumber87(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber870(number.substring(1)); + case "1": + return "871"; // Landshut + case "2": + return fromNumber872(number.substring(1)); + case "3": + return fromNumber873(number.substring(1)); + case "4": + return fromNumber874(number.substring(1)); + case "5": + return fromNumber875(number.substring(1)); + case "6": + return fromNumber876(number.substring(1)); + case "7": + return fromNumber877(number.substring(1)); + case "8": + return fromNumber878(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber870(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8702"; // Wörth a d Isar + case "3": + return "8703"; // Essenbach + case "4": + return "8704"; // Altdorf-Pfettrach + case "5": + return "8705"; // Altfraunhofen + case "6": + return "8706"; // Vilsheim + case "7": + return "8707"; // Adlkofen + case "8": + return "8708"; // Weihmichl-Unterneuhausen + case "9": + return "8709"; // Eching Niederbay + default: + return ""; + } + } + + private static String fromNumber872(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8721"; // Eggenfelden + case "2": + return "8722"; // Gangkofen + case "3": + return "8723"; // Arnstorf + case "4": + return "8724"; // Massing + case "5": + return "8725"; // Wurmannsquick + case "6": + return "8726"; // Schönau Niederbay + case "7": + return "8727"; // Falkenberg Niederbay + case "8": + return "8728"; // Geratskirchen + default: + return ""; + } + } + + private static String fromNumber873(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8731"; // Dingolfing + case "2": + return "8732"; // Frontenhausen + case "3": + return "8733"; // Mengkofen + case "4": + return "8734"; // Reisbach Niederbay + case "5": + return "8735"; // Gangkofen-Kollbach + default: + return ""; + } + } + + private static String fromNumber874(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8741"; // Vilsbiburg + case "2": + return "8742"; // Velden Vils + case "3": + return "8743"; // Geisenhausen + case "4": + return "8744"; // Gerzen + case "5": + return "8745"; // Bodenkirchen + default: + return ""; + } + } + + private static String fromNumber875(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8751"; // Mainburg + case "2": + return "8752"; // Au i d Hallertau + case "3": + return "8753"; // Elsendorf Niederbay + case "4": + return "8754"; // Volkenschwand + case "6": + return "8756"; // Nandlstadt + default: + return ""; + } + } + + private static String fromNumber876(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8761"; // Moosburg a d Isar + case "2": + return "8762"; // Wartenberg Oberbay + case "4": + return "8764"; // Mauern Kr Freising + case "5": + return "8765"; // Bruckberg Niederbay + case "6": + return "8766"; // Gammelsdorf + default: + return ""; + } + } + + private static String fromNumber877(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8771"; // Ergoldsbach + case "2": + return "8772"; // Mallersdorf-Pfaffenberg + case "3": + return "8773"; // Neufahrn i NB + case "4": + return "8774"; // Bayerbach b Ergoldsbach + default: + return ""; + } + } + + private static String fromNumber878(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8781"; // Rottenburg a d Laaber + case "2": + return "8782"; // Pfeffenhausen + case "3": + return "8783"; // Rohr i NB + case "4": + return "8784"; // Hohenthann + case "5": + return "8785"; // Rottenburg-Oberroning + default: + return ""; + } + } + + private static String fromNumber88(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber880(number.substring(1)); + case "1": + return "881"; // Weilheim i OB + case "2": + return fromNumber882(number.substring(1)); + case "4": + return fromNumber884(number.substring(1)); + case "5": + return fromNumber885(number.substring(1)); + case "6": + return fromNumber886(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber880(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8801"; // Seeshaupt + case "2": + return "8802"; // Huglfing + case "3": + return "8803"; // Peissenberg + case "5": + return "8805"; // Hohenpeissenberg + case "6": + return "8806"; // Utting a Ammersee + case "7": + return "8807"; // Dießen a Ammersee + case "8": + return "8808"; // Pähl + case "9": + return "8809"; // Wessobrunn + default: + return ""; + } + } + + private static String fromNumber882(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8821"; // Garmisch-Partenkirchen + case "2": + return "8822"; // Oberammergau + case "3": + return "8823"; // Mittenwald + case "4": + return "8824"; // Oberau Loisach + case "5": + return "8825"; // Krün + default: + return ""; + } + } + + private static String fromNumber884(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8841"; // Murnau a Staffelsee + case "5": + return "8845"; // Bad Kohlgrub + case "6": + return "8846"; // Uffing a Staffelsee + case "7": + return "8847"; // Obersöchering + default: + return ""; + } + } + + private static String fromNumber885(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8851"; // Kochel a See + case "6": + return "8856"; // Penzberg + case "7": + return "8857"; // Benediktbeuern + case "8": + return "8858"; // Kochel-Walchensee + default: + return ""; + } + } + + private static String fromNumber886(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8860"; // Bernbeuren + case "1": + return "8861"; // Schongau + case "2": + return "8862"; // Steingaden Oberbay + case "7": + return "8867"; // Rottenbuch Oberbay + case "8": + return "8868"; // Schwabsoien + case "9": + return "8869"; // Kinsau + default: + return ""; + } + } + + private static String fromNumber9(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber90(number.substring(1)); + case "1": + return fromNumber91(number.substring(1)); + case "2": + return fromNumber92(number.substring(1)); + case "3": + return fromNumber93(number.substring(1)); + case "4": + return fromNumber94(number.substring(1)); + case "5": + return fromNumber95(number.substring(1)); + case "6": + return fromNumber96(number.substring(1)); + case "7": + return fromNumber97(number.substring(1)); + case "8": + return fromNumber98(number.substring(1)); + case "9": + return fromNumber99(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber90(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "6": + return "906"; // Donauwörth + case "7": + return fromNumber907(number.substring(1)); + case "8": + return fromNumber908(number.substring(1)); + case "9": + return fromNumber909(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber907(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9070"; // Tapfheim + case "1": + return "9071"; // Dillingen a d Donau + case "2": + return "9072"; // Lauingen Donau + case "3": + return "9073"; // Gundelfingen a d Donau + case "4": + return "9074"; // Höchstädt a d Donau + case "5": + return "9075"; // Glött + case "6": + return "9076"; // Wittislingen + case "7": + return "9077"; // Bachhagel + case "8": + return "9078"; // Mertingen + default: + return ""; + } + } + + private static String fromNumber908(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9080"; // Harburg Schwaben + case "1": + return "9081"; // Nördlingen + case "2": + return "9082"; // Oettingen i Bay + case "3": + return "9083"; // Möttingen + case "4": + return "9084"; // Bissingen Schwab + case "5": + return "9085"; // Alerheim + case "6": + return "9086"; // Fremdingen + case "7": + return "9087"; // Marktoffingen + case "8": + return "9088"; // Mönchsdeggingen + case "9": + return "9089"; // Bissingen-Unterringingen + default: + return ""; + } + } + + private static String fromNumber909(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9090"; // Rain Lech + case "1": + return "9091"; // Monheim Schwab + case "2": + return "9092"; // Wemding + case "3": + return "9093"; // Polsingen + case "4": + return "9094"; // Tagmersheim + case "7": + return "9097"; // Marxheim + case "9": + return "9099"; // Kaisheim + default: + return ""; + } + } + + private static String fromNumber91(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber910(number.substring(1)); + case "1": + return "911"; // Nürnberg + case "2": + return fromNumber912(number.substring(1)); + case "3": + return fromNumber913(number.substring(1)); + case "4": + return fromNumber914(number.substring(1)); + case "5": + return fromNumber915(number.substring(1)); + case "6": + return fromNumber916(number.substring(1)); + case "7": + return fromNumber917(number.substring(1)); + case "8": + return fromNumber918(number.substring(1)); + case "9": + return fromNumber919(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber910(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9101"; // Langenzenn + case "2": + return "9102"; // Wilhermsdorf + case "3": + return "9103"; // Cadolzburg + case "4": + return "9104"; // Emskirchen + case "5": + return "9105"; // Grosshabersdorf + case "6": + return "9106"; // Markt Erlbach + case "7": + return "9107"; // Trautskirchen + default: + return ""; + } + } + + private static String fromNumber912(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9120"; // Leinburg + case "2": + return "9122"; // Schwabach + case "3": + return "9123"; // Lauf a d Pegnitz + case "6": + return "9126"; // Eckental + case "7": + return "9127"; // Rosstal Mittelfr + case "8": + return "9128"; // Feucht + case "9": + return "9129"; // Wendelstein + default: + return ""; + } + } + + private static String fromNumber913(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9131"; // Erlangen + case "2": + return "9132"; // Herzogenaurach + case "3": + return "9133"; // Baiersdorf Mittelfr + case "4": + return "9134"; // Neunkirchen a Brand + case "5": + return "9135"; // Heßdorf Mittelfr + default: + return ""; + } + } + + private static String fromNumber914(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9141"; // Weißenburg i Bay + case "2": + return "9142"; // Treuchtlingen + case "3": + return "9143"; // Pappenheim Mittelfr + case "4": + return "9144"; // Pleinfeld + case "5": + return "9145"; // Solnhofen + case "6": + return "9146"; // Markt Berolzheim + case "7": + return "9147"; // Nennslingen + case "8": + return "9148"; // Ettenstatt + case "9": + return "9149"; // Weissenburg-Suffersheim + default: + return ""; + } + } + + private static String fromNumber915(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9151"; // Hersbruck + case "2": + return "9152"; // Hartenstein Mittelfr + case "3": + return "9153"; // Schnaittach + case "4": + return "9154"; // Pommelsbrunn + case "5": + return "9155"; // Simmelsdorf + case "6": + return "9156"; // Neuhaus a d Pegnitz + case "7": + return "9157"; // Alfeld Mittelfr + case "8": + return "9158"; // Offenhausen Mittelfr + default: + return ""; + } + } + + private static String fromNumber916(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9161"; // Neustadt a d Aisch + case "2": + return "9162"; // Scheinfeld + case "3": + return "9163"; // Dachsbach + case "4": + return "9164"; // Langenfeld Mittelfr + case "5": + return "9165"; // Sugenheim + case "6": + return "9166"; // Münchsteinach + case "7": + return "9167"; // Oberscheinfeld + default: + return ""; + } + } + + private static String fromNumber917(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9170"; // Schwanstetten + case "1": + return "9171"; // Roth Mittelfr + case "2": + return "9172"; // Georgensgmünd + case "3": + return "9173"; // Thalmässing + case "4": + return "9174"; // Hilpoltstein + case "5": + return "9175"; // Spalt + case "6": + return "9176"; // Allersberg + case "7": + return "9177"; // Heideck + case "8": + return "9178"; // Abenberg Mittelfr + case "9": + return "9179"; // Freystadt + default: + return ""; + } + } + + private static String fromNumber918(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9180"; // Pyrbaum + case "1": + return "9181"; // Neumarkt i d Opf + case "2": + return "9182"; // Velburg + case "3": + return "9183"; // Burgthann + case "4": + return "9184"; // Deining Oberpf + case "5": + return "9185"; // Mühlhausen Oberpf + case "6": + return "9186"; // Lauterhofen Oberpf + case "7": + return "9187"; // Altdorf b Nürnberg + case "8": + return "9188"; // Postbauer-Heng + case "9": + return "9189"; // Berg b Neumarkt i d Opf + default: + return ""; + } + } + + private static String fromNumber919(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9190"; // Heroldsbach + case "1": + return "9191"; // Forchheim Oberfr + case "2": + return "9192"; // Gräfenberg + case "3": + return "9193"; // Höchstadt a d Aisch + case "4": + return "9194"; // Ebermannstadt + case "5": + return "9195"; // Adelsdorf Mittelfr + case "6": + return "9196"; // Wiesenttal + case "7": + return "9197"; // Egloffstein + case "8": + return "9198"; // Heiligenstadt i Ofr + case "9": + return "9199"; // Kunreuth + default: + return ""; + } + } + + private static String fromNumber92(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber920(number.substring(1)); + case "1": + return "921"; // Bayreuth + case "2": + return fromNumber922(number.substring(1)); + case "3": + return fromNumber923(number.substring(1)); + case "4": + return fromNumber924(number.substring(1)); + case "5": + return fromNumber925(number.substring(1)); + case "6": + return fromNumber926(number.substring(1)); + case "7": + return fromNumber927(number.substring(1)); + case "8": + return fromNumber928(number.substring(1)); + case "9": + return fromNumber929(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber920(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9201"; // Gesees + case "2": + return "9202"; // Waischenfeld + case "3": + return "9203"; // Neudrossenfeld + case "4": + return "9204"; // Plankenfels + case "5": + return "9205"; // Vorbach + case "6": + return "9206"; // Mistelgau-Obernsees + case "7": + return "9207"; // Königsfeld Oberfr + case "8": + return "9208"; // Bindlach + case "9": + return "9209"; // Emtmannsberg + default: + return ""; + } + } + + private static String fromNumber922(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9220"; // Kasendorf-Azendorf + case "1": + return "9221"; // Kulmbach + case "2": + return "9222"; // Presseck + case "3": + return "9223"; // Rugendorf + case "5": + return "9225"; // Stadtsteinach + case "7": + return "9227"; // Neuenmarkt + case "8": + return "9228"; // Thurnau + case "9": + return "9229"; // Mainleus + default: + return ""; + } + } + + private static String fromNumber923(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9231"; // Marktredwitz + case "2": + return "9232"; // Wunsiedel + case "3": + return "9233"; // Arzberg Oberfr + case "4": + return "9234"; // Neusorg + case "5": + return "9235"; // Thierstein + case "6": + return "9236"; // Nagel + case "8": + return "9238"; // Röslau + default: + return ""; + } + } + + private static String fromNumber924(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9241"; // Pegnitz + case "2": + return "9242"; // Gößweinstein + case "3": + return "9243"; // Pottenstein + case "4": + return "9244"; // Betzenstein + case "5": + return "9245"; // Obertrubach + case "6": + return "9246"; // Pegnitz-Trockau + default: + return ""; + } + } + + private static String fromNumber925(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9251"; // Münchberg + case "2": + return "9252"; // Helmbrechts + case "3": + return "9253"; // Weissenstadt + case "4": + return "9254"; // Gefrees + case "5": + return "9255"; // Marktleugast + case "6": + return "9256"; // Stammbach + case "7": + return "9257"; // Zell Oberfr + default: + return ""; + } + } + + private static String fromNumber926(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9260"; // Wilhelmsthal Oberfr + case "1": + return "9261"; // Kronach + case "2": + return "9262"; // Wallenfels + case "3": + return "9263"; // Ludwigsstadt + case "4": + return "9264"; // Küps + case "5": + return "9265"; // Pressig + case "6": + return "9266"; // Mitwitz + case "7": + return "9267"; // Nordhalben + case "8": + return "9268"; // Teuschnitz + case "9": + return "9269"; // Tettau Kr Kronach + default: + return ""; + } + } + + private static String fromNumber927(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9270"; // Creussen + case "1": + return "9271"; // Thurnau-Alladorf + case "2": + return "9272"; // Fichtelberg + case "3": + return "9273"; // Bad Berneck i Fichtelgebirge + case "4": + return "9274"; // Hollfeld + case "5": + return "9275"; // Speichersdorf + case "6": + return "9276"; // Bischofsgrün + case "7": + return "9277"; // Warmensteinach + case "8": + return "9278"; // Weidenberg + case "9": + return "9279"; // Mistelgau + default: + return ""; + } + } + + private static String fromNumber928(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9280"; // Selbitz Oberfr + case "1": + return "9281"; // Hof Saale + case "2": + return "9282"; // Naila + case "3": + return "9283"; // Rehau + case "4": + return "9284"; // Schwarzenbach a d Saale + case "5": + return "9285"; // Kirchenlamitz + case "6": + return "9286"; // Oberkotzau + case "7": + return "9287"; // Selb + case "8": + return "9288"; // Bad Steben + case "9": + return "9289"; // Schwarzenbach a Wald + default: + return ""; + } + } + + private static String fromNumber929(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9292"; // Konradsreuth + case "3": + return "9293"; // Berg Oberfr + case "4": + return "9294"; // Regnitzlosau + case "5": + return "9295"; // Töpen + default: + return ""; + } + } + + private static String fromNumber93(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber930(number.substring(1)); + case "1": + return "931"; // Würzburg + case "2": + return fromNumber932(number.substring(1)); + case "3": + return fromNumber933(number.substring(1)); + case "4": + return fromNumber934(number.substring(1)); + case "5": + return fromNumber935(number.substring(1)); + case "6": + return fromNumber936(number.substring(1)); + case "7": + return fromNumber937(number.substring(1)); + case "8": + return fromNumber938(number.substring(1)); + case "9": + return fromNumber939(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber930(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9302"; // Rottendorf Unterfr + case "3": + return "9303"; // Eibelstadt + case "5": + return "9305"; // Estenfeld + case "6": + return "9306"; // Kist + case "7": + return "9307"; // Altertheim + default: + return ""; + } + } + + private static String fromNumber932(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9321"; // Kitzingen + case "3": + return "9323"; // Iphofen + case "4": + return "9324"; // Dettelbach + case "5": + return "9325"; // Kleinlangheim + case "6": + return "9326"; // Markt Einersheim + default: + return ""; + } + } + + private static String fromNumber933(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9331"; // Ochsenfurt + case "2": + return "9332"; // Marktbreit + case "3": + return "9333"; // Sommerhausen + case "4": + return "9334"; // Giebelstadt + case "5": + return "9335"; // Aub Kr Würzburg + case "6": + return "9336"; // Bütthard + case "7": + return "9337"; // Gaukönigshofen + case "8": + return "9338"; // Röttingen Unterfr + case "9": + return "9339"; // Ippesheim + default: + return ""; + } + } + + private static String fromNumber934(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9340"; // Königheim-Brehmen + case "1": + return "9341"; // Tauberbischofsheim + case "2": + return "9342"; // Wertheim + case "3": + return "9343"; // Lauda-Königshofen + case "4": + return "9344"; // Gerchsheim + case "5": + return "9345"; // Külsheim Baden + case "6": + return "9346"; // Grünsfeld + case "7": + return "9347"; // Wittighausen + case "8": + return "9348"; // Werbach-Gamburg + case "9": + return "9349"; // Werbach-Wenkheim + default: + return ""; + } + } + + private static String fromNumber935(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9350"; // Eussenheim-Hundsbach + case "1": + return "9351"; // Gemünden a Main + case "2": + return "9352"; // Lohr a Main + case "3": + return "9353"; // Karlstadt + case "4": + return "9354"; // Rieneck + case "5": + return "9355"; // Frammersbach + case "6": + return "9356"; // Burgsinn + case "7": + return "9357"; // Gräfendorf Bay + case "8": + return "9358"; // Gössenheim + case "9": + return "9359"; // Karlstadt-Wiesenfeld + default: + return ""; + } + } + + private static String fromNumber936(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9360"; // Thüngen + case "3": + return "9363"; // Arnstein Unterfr + case "4": + return "9364"; // Zellingen + case "5": + return "9365"; // Rimpar + case "6": + return "9366"; // Geroldshausen Unterfr + case "7": + return "9367"; // Unterpleichfeld + case "9": + return "9369"; // Uettingen + default: + return ""; + } + } + + private static String fromNumber937(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9371"; // Miltenberg + case "2": + return "9372"; // Klingenberg a Main + case "3": + return "9373"; // Amorbach + case "4": + return "9374"; // Eschau + case "5": + return "9375"; // Freudenberg Baden + case "6": + return "9376"; // Collenberg + case "7": + return "9377"; // Freudenberg-Boxtal + case "8": + return "9378"; // Eichenbühl-Riedern + default: + return ""; + } + } + + private static String fromNumber938(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9381"; // Volkach + case "2": + return "9382"; // Gerolzhofen + case "3": + return "9383"; // Wiesentheid + case "4": + return "9384"; // Schwanfeld + case "5": + return "9385"; // Kolitzheim + case "6": + return "9386"; // Prosselsheim + default: + return ""; + } + } + + private static String fromNumber939(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9391"; // Marktheidenfeld + case "2": + return "9392"; // Faulbach Unterfr + case "3": + return "9393"; // Rothenfels Unterfr + case "4": + return "9394"; // Esselbach + case "5": + return "9395"; // Triefenstein + case "6": + return "9396"; // Urspringen b Lohr + case "7": + return "9397"; // Wertheim-Dertingen + case "8": + return "9398"; // Birkenfeld b Würzburg + default: + return ""; + } + } + + private static String fromNumber94(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber940(number.substring(1)); + case "1": + return "941"; // Regensburg + case "2": + return fromNumber942(number.substring(1)); + case "3": + return fromNumber943(number.substring(1)); + case "4": + return fromNumber944(number.substring(1)); + case "5": + return fromNumber945(number.substring(1)); + case "6": + return fromNumber946(number.substring(1)); + case "7": + return fromNumber947(number.substring(1)); + case "8": + return fromNumber948(number.substring(1)); + case "9": + return fromNumber949(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber940(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9401"; // Neutraubling + case "2": + return "9402"; // Regenstauf + case "3": + return "9403"; // Donaustauf + case "4": + return "9404"; // Nittendorf + case "5": + return "9405"; // Bad Abbach + case "6": + return "9406"; // Mintraching + case "7": + return "9407"; // Wenzenbach + case "8": + return "9408"; // Altenthann + case "9": + return "9409"; // Pielenhofen + default: + return ""; + } + } + + private static String fromNumber942(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9420"; // Feldkirchen Niederbay + case "1": + return "9421"; // Straubing + case "2": + return "9422"; // Bogen Niederbay + case "3": + return "9423"; // Geiselhöring + case "4": + return "9424"; // Strasskirchen + case "6": + return "9426"; // Oberschneiding + case "7": + return "9427"; // Leiblfing + case "8": + return "9428"; // Kirchroth + case "9": + return "9429"; // Rain Niederbay + default: + return ""; + } + } + + private static String fromNumber943(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9431"; // Schwandorf + case "3": + return "9433"; // Nabburg + case "4": + return "9434"; // Bodenwöhr + case "5": + return "9435"; // Schwarzenfeld + case "6": + return "9436"; // Nittenau + case "8": + return "9438"; // Fensterbach + case "9": + return "9439"; // Neunburg-Kemnath + default: + return ""; + } + } + + private static String fromNumber944(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9441"; // Kelheim + case "2": + return "9442"; // Riedenburg + case "3": + return "9443"; // Abensberg + case "4": + return "9444"; // Siegenburg + case "5": + return "9445"; // Neustadt a d Donau + case "6": + return "9446"; // Altmannstein + case "7": + return "9447"; // Essing + case "8": + return "9448"; // Hausen Niederbay + default: + return ""; + } + } + + private static String fromNumber945(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9451"; // Schierling + case "2": + return "9452"; // Langquaid + case "3": + return "9453"; // Thalmassing + case "4": + return "9454"; // Aufhausen Oberpf + default: + return ""; + } + } + + private static String fromNumber946(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9461"; // Roding + case "2": + return "9462"; // Falkenstein Oberpf + case "3": + return "9463"; // Wald Oberpf + case "4": + return "9464"; // Walderbach + case "5": + return "9465"; // Neukirchen-Balbini + case "6": + return "9466"; // Stamsried + case "7": + return "9467"; // Michelsneukirchen + case "8": + return "9468"; // Zell Oberpf + case "9": + return "9469"; // Roding-Neubäu + default: + return ""; + } + } + + private static String fromNumber947(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9471"; // Burglengenfeld + case "2": + return "9472"; // Hohenfels Oberpf + case "3": + return "9473"; // Kallmünz + case "4": + return "9474"; // Schmidmühlen + default: + return ""; + } + } + + private static String fromNumber948(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9480"; // Sünching + case "1": + return "9481"; // Pfatter + case "2": + return "9482"; // Wörth a d Donau + case "4": + return "9484"; // Brennberg + default: + return ""; + } + } + + private static String fromNumber949(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9491"; // Hemau + case "2": + return "9492"; // Parsberg + case "3": + return "9493"; // Beratzhausen + case "5": + return "9495"; // Breitenbrunn Oberpf + case "7": + return "9497"; // Seubersdorf i d Opf + case "8": + return "9498"; // Laaber + case "9": + return "9499"; // Painten + default: + return ""; + } + } + + private static String fromNumber95(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber950(number.substring(1)); + case "1": + return "951"; // Bamberg + case "2": + return fromNumber952(number.substring(1)); + case "3": + return fromNumber953(number.substring(1)); + case "4": + return fromNumber954(number.substring(1)); + case "5": + return fromNumber955(number.substring(1)); + case "6": + return fromNumber956(number.substring(1)); + case "7": + return fromNumber957(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber950(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9502"; // Frensdorf + case "3": + return "9503"; // Oberhaid Oberfr + case "4": + return "9504"; // Stadelhofen + case "5": + return "9505"; // Litzendorf + default: + return ""; + } + } + + private static String fromNumber952(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9521"; // Hassfurt + case "2": + return "9522"; // Eltmann + case "3": + return "9523"; // Hofheim i Ufr + case "4": + return "9524"; // Zeil a Main + case "5": + return "9525"; // Königsberg i Bay + case "6": + return "9526"; // Riedbach + case "7": + return "9527"; // Knetzgau + case "8": + return "9528"; // Donnersdorf + case "9": + return "9529"; // Oberaurach + default: + return ""; + } + } + + private static String fromNumber953(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9531"; // Ebern + case "2": + return "9532"; // Maroldsweisach + case "3": + return "9533"; // Untermerzbach + case "4": + return "9534"; // Burgpreppach + case "5": + return "9535"; // Pfarrweisach + case "6": + return "9536"; // Kirchlauter + default: + return ""; + } + } + + private static String fromNumber954(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9542"; // Schesslitz + case "3": + return "9543"; // Hirschaid + case "4": + return "9544"; // Baunach + case "5": + return "9545"; // Buttenheim + case "6": + return "9546"; // Burgebrach + case "7": + return "9547"; // Zapfendorf + case "8": + return "9548"; // Mühlhausen Mittelfr + case "9": + return "9549"; // Lisberg + default: + return ""; + } + } + + private static String fromNumber955(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9551"; // Burgwindheim + case "2": + return "9552"; // Burghaslach + case "3": + return "9553"; // Ebrach Oberfr + case "4": + return "9554"; // Untersteinbach Unterfr + case "5": + return "9555"; // Schlüsselfeld-Aschbach + case "6": + return "9556"; // Geiselwind + default: + return ""; + } + } + + private static String fromNumber956(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9560"; // Grub a Forst + case "1": + return "9561"; // Coburg + case "2": + return "9562"; // Sonnefeld + case "3": + return "9563"; // Rödental + case "4": + return "9564"; // Bad Rodach + case "5": + return "9565"; // Untersiemau + case "6": + return "9566"; // Meeder + case "7": + return "9567"; // Seßlach-Gemünda + case "8": + return "9568"; // Neustadt b Coburg + case "9": + return "9569"; // Sesslach + default: + return ""; + } + } + + private static String fromNumber957(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9571"; // Lichtenfels Bay + case "2": + return "9572"; // Burgkunstadt + case "3": + return "9573"; // Staffelstein Oberfr + case "4": + return "9574"; // Marktzeuln + case "5": + return "9575"; // Weismain + case "6": + return "9576"; // Lichtenfels-Isling + default: + return ""; + } + } + + private static String fromNumber96(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber960(number.substring(1)); + case "1": + return "961"; // Weiden i d Opf + case "2": + return fromNumber962(number.substring(1)); + case "3": + return fromNumber963(number.substring(1)); + case "4": + return fromNumber964(number.substring(1)); + case "5": + return fromNumber965(number.substring(1)); + case "6": + return fromNumber966(number.substring(1)); + case "7": + return fromNumber967(number.substring(1)); + case "8": + return fromNumber968(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber960(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9602"; // Neustadt a d Waldnaab + case "3": + return "9603"; // Floss + case "4": + return "9604"; // Wernberg-Köblitz + case "5": + return "9605"; // Weiherhammer + case "6": + return "9606"; // Pfreimd + case "7": + return "9607"; // Luhe-Wildenau + case "8": + return "9608"; // Kohlberg Oberpf + default: + return ""; + } + } + + private static String fromNumber962(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9621"; // Amberg Oberpf + case "2": + return "9622"; // Hirschau Oberpf + case "4": + return "9624"; // Ensdorf Oberpf + case "5": + return "9625"; // Kastl b Amberg + case "6": + return "9626"; // Hohenburg + case "7": + return "9627"; // Freudenberg Oberpf + case "8": + return "9628"; // Ursensollen + default: + return ""; + } + } + + private static String fromNumber963(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9631"; // Tirschenreuth + case "2": + return "9632"; // Waldsassen + case "3": + return "9633"; // Mitterteich + case "4": + return "9634"; // Wiesau + case "5": + return "9635"; // Bärnau + case "6": + return "9636"; // Plößberg + case "7": + return "9637"; // Falkenberg Oberpf + case "8": + return "9638"; // Neualbenreuth + case "9": + return "9639"; // Mähring + default: + return ""; + } + } + + private static String fromNumber964(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9641"; // Grafenwöhr + case "2": + return "9642"; // Kemnath Stadt + case "3": + return "9643"; // Auerbach i d Opf + case "4": + return "9644"; // Pressath + case "5": + return "9645"; // Eschenbach i d Opf + case "6": + return "9646"; // Freihung + case "7": + return "9647"; // Kirchenthumbach + case "8": + return "9648"; // Neustadt a Kulm + default: + return ""; + } + } + + private static String fromNumber965(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9651"; // Vohenstrauss + case "2": + return "9652"; // Waidhaus + case "3": + return "9653"; // Eslarn + case "4": + return "9654"; // Pleystein + case "5": + return "9655"; // Tännesberg + case "6": + return "9656"; // Moosbach b Vohenstrauß + case "7": + return "9657"; // Waldthurn + case "8": + return "9658"; // Georgenberg + case "9": + return "9659"; // Leuchtenberg + default: + return ""; + } + } + + private static String fromNumber966(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9661"; // Sulzbach-Rosenberg + case "2": + return "9662"; // Vilseck + case "3": + return "9663"; // Neukirchen b Sulzbach-Rosenberg + case "4": + return "9664"; // Hahnbach + case "5": + return "9665"; // Königstein Oberpf + case "6": + return "9666"; // Illschwang + default: + return ""; + } + } + + private static String fromNumber967(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9671"; // Oberviechtach + case "2": + return "9672"; // Neunburg vorm Wald + case "3": + return "9673"; // Tiefenbach Oberpf + case "4": + return "9674"; // Schönsee + case "5": + return "9675"; // Altendorf a Nabburg + case "6": + return "9676"; // Winklarn + case "7": + return "9677"; // Oberviechtach-Pullenried + default: + return ""; + } + } + + private static String fromNumber968(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9681"; // Windischeschenbach + case "2": + return "9682"; // Erbendorf + case "3": + return "9683"; // Friedenfels + default: + return ""; + } + } + + private static String fromNumber97(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber970(number.substring(1)); + case "1": + return "971"; // Bad Kissingen + case "2": + return fromNumber972(number.substring(1)); + case "3": + return fromNumber973(number.substring(1)); + case "4": + return fromNumber974(number.substring(1)); + case "6": + return fromNumber976(number.substring(1)); + case "7": + return fromNumber977(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber970(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9701"; // Sandberg Unterfr + case "4": + return "9704"; // Euerdorf + case "8": + return "9708"; // Bad Bocklet + default: + return ""; + } + } + + private static String fromNumber972(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9720"; // Üchtelhausen + case "1": + return "9721"; // Schweinfurt + case "2": + return "9722"; // Werneck + case "3": + return "9723"; // Röthlein + case "4": + return "9724"; // Stadtlauringen + case "5": + return "9725"; // Poppenhausen Unterfr + case "6": + return "9726"; // Euerbach + case "7": + return "9727"; // Schonungen-Marktsteinach + case "8": + return "9728"; // Wülfershausen Unterfr + case "9": + return "9729"; // Grettstadt + default: + return ""; + } + } + + private static String fromNumber973(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9732"; // Hammelburg + case "3": + return "9733"; // Münnerstadt + case "4": + return "9734"; // Burkardroth + case "5": + return "9735"; // Massbach + case "6": + return "9736"; // Oberthulba + case "7": + return "9737"; // Wartmannsroth + case "8": + return "9738"; // Rottershausen + default: + return ""; + } + } + + private static String fromNumber974(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9741"; // Bad Brückenau + case "2": + return "9742"; // Kalbach Rhön + case "4": + return "9744"; // Zeitlofs-Detter + case "5": + return "9745"; // Wildflecken + case "6": + return "9746"; // Zeitlofs + case "7": + return "9747"; // Geroda Bay + case "8": + return "9748"; // Motten + case "9": + return "9749"; // Oberbach Unterfr + default: + return ""; + } + } + + private static String fromNumber976(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9761"; // Bad Königshofen i Grabfeld + case "2": + return "9762"; // Saal a d Saale + case "3": + return "9763"; // Sulzdorf a d Lederhecke + case "4": + return "9764"; // Höchheim + case "5": + return "9765"; // Trappstadt + case "6": + return "9766"; // Grosswenkheim + default: + return ""; + } + } + + private static String fromNumber977(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9771"; // Bad Neustadt a d Saale + case "2": + return "9772"; // Bischofsheim a d Rhön + case "3": + return "9773"; // Unsleben + case "4": + return "9774"; // Oberelsbach + case "5": + return "9775"; // Schönau a d Brend + case "6": + return "9776"; // Mellrichstadt + case "7": + return "9777"; // Ostheim v d Rhön + case "8": + return "9778"; // Fladungen + case "9": + return "9779"; // Nordheim v d Rhön + default: + return ""; + } + } + + private static String fromNumber98(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber980(number.substring(1)); + case "1": + return "981"; // Ansbach + case "2": + return fromNumber982(number.substring(1)); + case "3": + return fromNumber983(number.substring(1)); + case "4": + return fromNumber984(number.substring(1)); + case "5": + return fromNumber985(number.substring(1)); + case "6": + return fromNumber986(number.substring(1)); + case "7": + return fromNumber987(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber980(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9802"; // Ansbach-Katterbach + case "3": + return "9803"; // Colmberg + case "4": + return "9804"; // Aurach + case "5": + return "9805"; // Burgoberbach + default: + return ""; + } + } + + private static String fromNumber982(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9820"; // Lehrberg + case "2": + return "9822"; // Bechhofen a d Heide + case "3": + return "9823"; // Leutershausen + case "4": + return "9824"; // Dietenhofen + case "5": + return "9825"; // Herrieden + case "6": + return "9826"; // Weidenbach Mittelfr + case "7": + return "9827"; // Lichtenau Mittelfr + case "8": + return "9828"; // Rügland + case "9": + return "9829"; // Flachslanden + default: + return ""; + } + } + + private static String fromNumber983(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9831"; // Gunzenhausen + case "2": + return "9832"; // Wassertrüdingen + case "3": + return "9833"; // Heidenheim Mittelfr + case "4": + return "9834"; // Theilenhofen + case "5": + return "9835"; // Ehingen Mittelfr + case "6": + return "9836"; // Gunzenhausen-Cronheim + case "7": + return "9837"; // Haundorf + default: + return ""; + } + } + + private static String fromNumber984(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9841"; // Bad Windsheim + case "2": + return "9842"; // Uffenheim + case "3": + return "9843"; // Burgbernheim + case "4": + return "9844"; // Obernzenn + case "5": + return "9845"; // Oberdachstetten + case "6": + return "9846"; // Ipsheim + case "7": + return "9847"; // Ergersheim + case "8": + return "9848"; // Simmershofen + default: + return ""; + } + } + + private static String fromNumber985(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9851"; // Dinkelsbühl + case "2": + return "9852"; // Feuchtwangen + case "3": + return "9853"; // Wilburgstetten + case "4": + return "9854"; // Wittelshofen + case "5": + return "9855"; // Dentlein a Forst + case "6": + return "9856"; // Dürrwangen + case "7": + return "9857"; // Schopfloch Mittelfr + default: + return ""; + } + } + + private static String fromNumber986(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9861"; // Rothenburg ob der Tauber + case "5": + return "9865"; // Adelshofen Mittelfr + case "7": + return "9867"; // Geslau + case "8": + return "9868"; // Schillingsfürst + case "9": + return "9869"; // Wettringen Mittelfr + default: + return ""; + } + } + + private static String fromNumber987(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9871"; // Windsbach + case "2": + return "9872"; // Heilsbronn + case "3": + return "9873"; // Abenberg-Wassermungenau + case "4": + return "9874"; // Neuendettelsau + case "5": + return "9875"; // Wolframs-Eschenbach + case "6": + return "9876"; // Rohr Mittelfr + default: + return ""; + } + } + + private static String fromNumber99(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber990(number.substring(1)); + case "1": + return "991"; // Deggendorf + case "2": + return fromNumber992(number.substring(1)); + case "3": + return fromNumber993(number.substring(1)); + case "4": + return fromNumber994(number.substring(1)); + case "5": + return fromNumber995(number.substring(1)); + case "6": + return fromNumber996(number.substring(1)); + case "7": + return fromNumber997(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber990(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9901"; // Hengersberg Bay + case "3": + return "9903"; // Schöllnach + case "4": + return "9904"; // Lalling + case "5": + return "9905"; // Bernried Niederbay + case "6": + return "9906"; // Mariaposching + case "7": + return "9907"; // Zenting + case "8": + return "9908"; // Schöfweg + default: + return ""; + } + } + + private static String fromNumber992(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9920"; // Bischofsmais + case "1": + return "9921"; // Regen + case "2": + return "9922"; // Zwiesel + case "3": + return "9923"; // Teisnach + case "4": + return "9924"; // Bodenmais + case "5": + return "9925"; // Bayerisch Eisenstein + case "6": + return "9926"; // Frauenau + case "7": + return "9927"; // Kirchberg Wald + case "8": + return "9928"; // Kirchdorf i Wald + case "9": + return "9929"; // Ruhmannsfelden + default: + return ""; + } + } + + private static String fromNumber993(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9931"; // Plattling + case "2": + return "9932"; // Osterhofen + case "3": + return "9933"; // Wallersdorf + case "5": + return "9935"; // Stephansposching + case "6": + return "9936"; // Wallerfing + case "7": + return "9937"; // Oberpöring + case "8": + return "9938"; // Moos Niederbay + default: + return ""; + } + } + + private static String fromNumber994(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9941"; // Kötzting + case "2": + return "9942"; // Viechtach + case "3": + return "9943"; // Lam Oberpf + case "4": + return "9944"; // Miltach + case "5": + return "9945"; // Arnbruck + case "6": + return "9946"; // Hohenwarth b Kötzing + case "7": + return "9947"; // Neukirchen b Hl Blut + case "8": + return "9948"; // Eschlkam + default: + return ""; + } + } + + private static String fromNumber995(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9951"; // Landau a d Isar + case "2": + return "9952"; // Eichendorf + case "3": + return "9953"; // Pilsting + case "4": + return "9954"; // Simbach Niederbay + case "5": + return "9955"; // Mamming + case "6": + return "9956"; // Eichendorf-Aufhausen + default: + return ""; + } + } + + private static String fromNumber996(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9961"; // Mitterfels + case "2": + return "9962"; // Schwarzach Niederbay + case "3": + return "9963"; // Konzell + case "4": + return "9964"; // Stallwang + case "5": + return "9965"; // Sankt Englmar + case "6": + return "9966"; // Wiesenfelden + default: + return ""; + } + } + + private static String fromNumber997(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9971"; // Cham + case "2": + return "9972"; // Waldmünchen + case "3": + return "9973"; // Furth i Wald + case "4": + return "9974"; // Traitsching + case "5": + return "9975"; // Waldmünchen-Geigant + case "6": + return "9976"; // Rötz + case "7": + return "9977"; // Arnschwang + case "8": + return "9978"; // Schönthal Oberpf + default: + return ""; + } + } + /* + End of generated code. + */ +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy new file mode 100644 index 0000000..5609c69 --- /dev/null +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy @@ -0,0 +1,44 @@ +/* + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer.numberplans + + +import de.telekom.phonenumbernormalizer.numberplans.constants.GermanAreaCodeExtractor +import spock.lang.Specification + +class GermanAreaCodeExtractorTest extends Specification { + + def "Extract Area Codes"(String number, expectedResult) { + given: + + when: + + String result = GermanAreaCodeExtractor.fromNumber(number) + + then: + result == expectedResult + + where: + number | expectedResult + "200556666" | "" + "203555666" | "203" + "204555666" | "2045" + "204655666" | "" + "212555666" | "212" + "212955666" | "2129" + } + +} From 07d7ae0717e5d6bfba6376df26797b601eb6b4b5 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 05/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/NumberPlan.java | 98 +- .../numberplans/PhoneLibWrapper.java | 929 +++++++++++++++++- .../constants/DeFixedLineNumberPlan.java | 112 ++- 3 files changed, 1110 insertions(+), 29 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 1b45737..b491780 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -67,6 +67,82 @@ public static String getCountryCode() { return null; } + /** + * A subclass can provide National Destination Code of the rules - not used inside this class, but + * re-usable when adding the subclass to the factory. + * + * @param nsn - National Significant Number (without IDP + CC or NAC as prefix) + * @return National Destination Code without leading National Access Code + * + * @see NumberPlanFactory + */ + public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { + return ""; + } + + public boolean isUsableWithIDPandCCfromOutside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCandNDCfromOutside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCfromInside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCandNDCfromInside(String number) { + return false; + } + + public boolean isUsableWithNAC(String number) { + return false; + } + public boolean isUsableWithNACandNDC(String number) { + return false; + } + + public boolean isUsableDirectly(String number) { + return isMatchingShortNumber(number); + } + + + /** + * Finds the longest prefix of a short number rule of the current number plan, at the beginning of a number. + * + * @param number - number that should be checked against the number plan + * @return String - if number matches starts with a short number rule prefix, this is the longest one - otherwise it is an empty string. + */ + public String startingWithShortNumberKey(String number) { + // first check if we have rules at all + if (this.getShortNumberCodes() == null) { + LOGGER.debug("no short number code rules available"); + return ""; + } + + // check if the number is starting with a prefix defined in the rule + int minShortNumberKeyLength = this.getMinShortNumberKeyLength(); + int maxShortNumberKeyLength = this.getMaxShortNumberKeyLength(); + + // starting prefix check with the longest prefix, so overlapping prefixes could be realized + // e.g. 1180 is in Germany a starting prefix for a 6 digit short number while 1181 - 1189 is in Germany a starting + // prefix for a 5 digits number and could be summed up by 118 and only 1180 is overriding this prefix part. + for (int i = maxShortNumberKeyLength; i >= minShortNumberKeyLength; i--) { + if (number.length() >= i) { + String shortNumber = number.substring(0, i); + if (this.getShortNumberCodes().containsKey(shortNumber)) { + return shortNumber; + } + } + } + return ""; + } + + public int getShortCodeLength(String shortNumberKey) { + return getShortNumberCodes().get(shortNumberKey); + } + /** * Checks if a number is matching any a short number rule of the current number plan. * @@ -95,24 +171,10 @@ public boolean isMatchingShortNumber(String number) { return false; } - - // check if the number is starting with a prefix defined in the rule - int minShortNumberKeyLength = this.getMinShortNumberKeyLength(); - int maxShortNumberKeyLength = this.getMaxShortNumberKeyLength(); - - Integer validShortNumberLength; - - // starting prefix check with the longest prefix, so overlapping prefixes could be realized - // e.g. 1180 is in Germany a starting prefix for a 6 digit short number while 1181 - 1189 is in Germany a starting - // prefix for a 5 digits number and could be summed up by 118 and only 1180 is overriding this prefix part. - for (int i = maxShortNumberKeyLength; i >= minShortNumberKeyLength; i--) { - if (number.length() >= i) { - String shortNumber = number.substring(0, i); - if (this.getShortNumberCodes().containsKey(shortNumber)) { - validShortNumberLength = this.getShortNumberCodes().get(shortNumber); - return number.length() == validShortNumberLength; - } - } + // check if the number length exactly matches the defined length of the prefix + String shortNumberKey = startingWithShortNumberKey(number); + if (shortNumberKey.length()>0) { + return number.length() == getShortCodeLength(shortNumberKey); } LOGGER.debug("no short number, to code found for number: {}", number); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index fce333d..18a2298 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -25,6 +25,857 @@ import java.lang.reflect.Method; import java.util.Objects; + +class CountryCodeExtractor { + // https://www.itu.int/dms_pub/itu-t/opb/sp/T-SP-E.164D-11-2011-PDF-E.pdf + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "1"; // NANP + case "2": + return fromNumber2(number.substring(1)); + case "3": + return fromNumber3(number.substring(1)); + case "4": + return fromNumber4(number.substring(1)); + case "5": + return fromNumber5(number.substring(1)); + case "6": + return fromNumber6(number.substring(1)); + case "7": + return "7"; // Russian Federation AND Kazakhstan (Republic of) + case "8": + return fromNumber8(number.substring(1)); + case "9": + return fromNumber9(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber2(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "20"; // Egypt (Arab Republic of) + case "1": + return fromNumber21(number.substring(1)); + case "2": + return fromNumber22(number.substring(1)); + case "3": + return fromNumber23(number.substring(1)); + case "4": + return fromNumber24(number.substring(1)); + case "5": + return fromNumber25(number.substring(1)); + case "6": + return fromNumber26(number.substring(1)); + case "7": + return "27"; // South Africa (Republic of) + case "9": + return fromNumber29(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber21(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "211"; // South Sudan (Republic of) + case "2": + return "212"; // Morocco (Kingdom of) + case "3": + return "213"; // Algeria (People's Democratic Republic of) + case "6": + return "216"; // Tunisia + case "8": + return "218"; // Libya (Socialist People's Libyan Arab Jamahiriya) + default: + return ""; + } + } + + public static String fromNumber22(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "220"; // Gambia (Republic of the) + case "1": + return "221"; // Senegal (Republic of) + case "2": + return "222"; // Mauritania (Islamic Republic of) + case "3": + return "223"; // Mali (Republic of) + case "4": + return "224"; // Guinea (Republic of) + case "5": + return "225"; // Côte d'Ivoire (Republic of) + case "6": + return "226"; // Burkina Faso + case "7": + return "227"; // Niger (Republic of the) + case "8": + return "228"; // Togolese Republic + case "9": + return "229"; // Benin (Republic of) + default: + return ""; + } + } + + public static String fromNumber23(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "230"; // Mauritius (Republic of) + case "1": + return "231"; // Liberia (Republic of) + case "2": + return "232"; // Sierra Leone + case "3": + return "233"; // Ghana + case "4": + return "234"; // Nigeria (Federal Republic of) + case "5": + return "235"; // Chad (Republic of) + case "6": + return "236"; // Central African Republic + case "7": + return "237"; // Cameroon (Republic of) + case "8": + return "238"; // Cape Verde (Republic of) + case "9": + return "239"; // Sao Tome and Principe (Democratic Republic of) + default: + return ""; + } + } + + public static String fromNumber24(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "240"; // Equatorial Guinea (Republic of) + case "1": + return "241"; // Gabonese Republic + case "2": + return "242"; // Congo (Republic of the) + case "3": + return "243"; // Democratic Republic of the Congo + case "4": + return "244"; // Angola (Republic of) + case "5": + return "245"; // Guinea-Bissau (Republic of) + case "6": + return "246"; // Diego Garcia + case "7": + return "247"; // {Saint Helena,} Ascension {and Tristan da Cunha} + case "8": + return "248"; // Seychelles (Republic of) + case "9": + return "249"; // Sudan (Republic of the) + default: + return ""; + } + } + + public static String fromNumber25(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "250"; // Rwanda (Republic of) + case "1": + return "251"; // Ethiopia (Federal Democratic Republic of) + case "2": + return "252"; // Somali Democratic Republic + case "3": + return "253"; // Djibouti (Republic of) + case "4": + return "254"; // Kenya (Republic of) + case "5": + return "255"; // Tanzania (United Republic of) + case "6": + return "256"; // Uganda (Republic of) + case "7": + return "257"; // Burundi (Republic of) + case "8": + return "258"; // Mozambique (Republic of) + default: + return ""; + } + } + public static String fromNumber26(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "260"; // Zambia (Republic of) + case "1": + return "261"; // Madagascar (Republic of) + case "2": + return "262"; // French Departments and Territories in the Indian Ocean + case "3": + return "263"; // Zimbabwe (Republic of) + case "4": + return "264"; // Namibia (Republic of) + case "5": + return "265"; // Malawi + case "6": + return "266"; // Lesotho (Kingdom of) + case "7": + return "267"; // Botswana (Republic of) + case "8": + return "268"; // Swaziland (Kingdom of) + case "9": + return "269"; // Comoros (Union of the) + default: + return ""; + } + } + + public static String fromNumber29(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "290"; // Saint Helena{, Ascension} and Tristan da Cunha + case "1": + return "291"; // Eritrea + case "7": + return "297"; // Aruba + case "8": + return "298"; // Faroe Islands + case "9": + return "299"; // Greenland (Denmark) + default: + return ""; + } + } + + public static String fromNumber3(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "30"; // Greece + case "1": + return "31"; // Netherlands (Kingdom of the) + case "2": + return "32"; // Belgium + case "3": + return "33"; // France + case "4": + return "34"; // Spain + case "5": + return fromNumber35(number.substring(1)); + case "6": + return "36"; // Hungary (Republic of) + case "7": + return fromNumber37(number.substring(1)); + case "8": + return fromNumber38(number.substring(1)); + case "9": + return "39"; // Italy AND Vatican City State + default: + return ""; + } + } + + public static String fromNumber35(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "350"; // Gibraltar + case "1": + return "351"; // Portugal + case "2": + return "352"; // Luxembourg + case "3": + return "353"; // Ireland + case "4": + return "354"; // Iceland + case "5": + return "355"; // Albania (Republic of) + case "6": + return "356"; // Malta + case "7": + return "357"; // Cyprus (Republic of) + case "8": + return "358"; // Finland + case "9": + return "359"; // Bulgaria (Republic of) + default: + return ""; + } + } + + public static String fromNumber37(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "370"; // Lithuania (Republic of) + case "1": + return "371"; // Latvia (Republic of) + case "2": + return "372"; // Estonia (Republic of) + case "3": + return "373"; // Moldova (Republic of) + case "4": + return "374"; // Armenia (Republic of) + case "5": + return "375"; // Belarus (Republic of) + case "6": + return "376"; // Andorra (Principality of) + case "7": + return "377"; // Monaco (Principality of) + case "8": + return "378"; // San Marino (Republic of) + case "9": + return "379"; // Vatican City State + default: + return ""; + } + } + + public static String fromNumber38(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "380"; // Ukraine + case "1": + return "381"; // Serbia (Republic of) + case "2": + return "382"; // Montenegro (Republic of) + case "5": + return "385"; // Croatia (Republic of) + case "6": + return "386"; // Slovenia (Republic of) + case "7": + return "387"; // Bosnia and Herzegovina + case "8": + return "388"; // Group of countries, shared code TODO: is it still valid? not on ITU number plan overview page + case "9": + return "389"; // The Former Yugoslav Republic of Macedonia - North Macedonia (ITU number plan overview page) + default: + return ""; + } + } + + public static String fromNumber4(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "40"; // Romania + case "1": + return "41"; // Switzerland (Confederation of) + case "2": + return fromNumber42(number.substring(1)); + case "3": + return "43"; // Austria + case "4": + return "44"; // United Kingdom of Great Britain and Northern Ireland + case "5": + return "45"; // Denmark + case "6": + return "46"; // Sweden + case "7": + return "47"; // Norway + case "8": + return "48"; // Poland (Republic of) + case "9": + return "49"; // Germany (Federal Republic of) + default: + return ""; + } + } + + public static String fromNumber42(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "420"; // Czech Republic + case "1": + return "421"; // Slovak Republic + case "3": + return "423"; // Liechtenstein (Principality of) + default: + return ""; + } + } + + public static String fromNumber5(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber50(number.substring(1)); + case "1": + return "51"; // Peru + case "2": + return "52"; // Mexico + case "3": + return "53"; // Cuba + case "4": + return "54"; // Argentine Republic + case "5": + return "55"; // Brazil (Federative Republic of) + case "6": + return "56"; // Chile + case "7": + return "57"; // Colombia (Republic of) + case "8": + return "58"; // Venezuela (Bolivarian Republic of) + case "9": + return fromNumber59(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber50(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "500"; // Falkland Islands (Malvinas) + case "1": + return "501"; // Belize + case "2": + return "502"; // Guatemala (Republic of) + case "3": + return "503"; // El Salvador (Republic of) + case "4": + return "504"; // Honduras (Republic of) + case "5": + return "505"; // Nicaragua + case "6": + return "506"; // Costa Rica + case "7": + return "507"; // Panama (Republic of) + case "8": + return "508"; // Saint Pierre and Miquelon (Collectivité territoriale de la République française) + case "9": + return "509"; // Haiti (Republic of) + default: + return ""; + } + } + + public static String fromNumber59(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "590"; // Guadeloupe (French Department of) + case "1": + return "591"; // Bolivia (Plurinational State of) + case "2": + return "592"; // Guyana + case "3": + return "593"; // Ecuador + case "4": + return "594"; // French Guiana (French Department of) + case "5": + return "595"; // Paraguay (Republic of) + case "6": + return "596"; // Martinique (French Department of) + case "7": + return "597"; // Suriname (Republic of) + case "8": + return "598"; // Uruguay (Eastern Republic of) + case "9": + return "599"; // Bonaire, Saint Eustatius and Saba AND Curaçao + default: + return ""; + } + } + + public static String fromNumber6(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "60"; // Malaysia + case "1": + return "61"; // Australia + case "2": + return "62"; // Indonesia (Republic of) + case "3": + return "63"; // Philippines (Republic of the) + case "4": + return "64"; // New Zealand + case "5": + return "65"; // Singapore (Republic of) + case "6": + return "66"; // Thailand + case "7": + return fromNumber67(number.substring(1)); + case "8": + return fromNumber68(number.substring(1)); + case "9": + return fromNumber69(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber67(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "670"; // Democratic Republic of Timor-Leste + case "2": + return "672"; // Australian External Territories + case "3": + return "673"; //Brunei Darussalam + case "4": + return "674"; // Nauru (Republic of) + case "5": + return "675"; // Papua New Guinea + case "6": + return "676"; // Tonga (Kingdom of) + case "7": + return "677"; // Solomon Islands + case "8": + return "678"; // Vanuatu (Republic of) + case "9": + return "679"; // Fiji (Republic of) + default: + return ""; + } + } + + public static String fromNumber68(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "680"; // Palau (Republic of) + case "1": + return "681"; // Wallis and Futuna (Territoire français d'outre-mer) + case "2": + return "682"; // Cook Islands + case "3": + return "683"; // Niue + case "5": + return "685"; // Samoa (Independent State of) + case "6": + return "686"; // Kiribati (Republic of) + case "7": + return "687"; // New Caledonia (Territoire français d'outre-mer) + case "8": + return "688"; // Tuvalu + case "9": + return "689"; // French Polynesia (Territoire français d'outre-mer) + default: + return ""; + } + } + + public static String fromNumber69(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "690"; // Tokelau + case "1": + return "691"; // Micronesia (Federated States of) + case "2": + return "692"; // Marshall Islands (Republic of the) + default: + return ""; + } + } + + public static String fromNumber8(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber80(number.substring(1)); + case "1": + return "81"; // Japan + case "2": + return "82"; // Korea (Republic of) + case "4": + return "84"; // Viet Nam (Socialist Republic of) + case "5": + return fromNumber85(number.substring(1)); + case "6": + return "86"; // China (People's Republic of) + case "7": + return fromNumber87(number.substring(1)); + case "8": + return fromNumber88(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber80(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "800"; // International Freephone Service + case "8": + return "808"; // International Shared Cost Service (ISCS) + default: + return ""; + } + } + + public static String fromNumber85(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "850"; // Democratic People's Republic of Korea + case "2": + return "852"; // Hong Kong, China + case "3": + return "853"; // Macao, China + case "5": + return "855"; // Cambodia (Kingdom of) + case "6": + return "856"; // Lao People's Democratic Republic + default: + return ""; + } + } + + public static String fromNumber87(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "870"; // Inmarsat SNAC + case "5": + return "875"; // Reserved - Maritime Mobile Service Applications + case "6": + return "876"; // Reserved - Maritime Mobile Service Applications + case "7": + return "877"; // Reserved - Maritime Mobile Service Applications + case "8": + return "878"; // Universal Personal Telecommunication Service (UPT) + case "9": + return "879"; // Reserved for national non-commercial purposes + default: + return ""; + } + } + + public static String fromNumber88(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "880"; // Bangladesh (People's Republic of) + case "1": + return "881"; // Global Mobile Satellite System (GMSS), shared code + case "2": + return "882"; // International Networks, shared code + case "3": + return "883"; // International Networks, shared code + case "6": + return "886"; // Taiwan, China + case "8": + return "888"; // Telecommunications for Disaster Relief (TDR) + default: + return ""; + } + } + + public static String fromNumber9(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "90"; // Turkey + case "1": + return "91"; // India (Republic of) + case "2": + return "92"; // Pakistan (Islamic Republic of) + case "3": + return "93"; //Afghanistan + case "4": + return "94"; //Sri Lanka (Democratic Socialist Republic of) + case "5": + return "95"; // Myanmar (the Republic of the Union of) + case "6": + return fromNumber96(number.substring(1)); + case "7": + return fromNumber97(number.substring(1)); + case "8": + return "98"; // Iran (Islamic Republic of) + case "9": + return fromNumber99(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber96(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "960"; // Maldives (Republic of) + case "1": + return "961"; // Lebanon + case "2": + return "962"; // Jordan (Hashemite Kingdom of) + case "3": + return "963"; // Syrian Arab Republic + case "4": + return "964"; // Iraq (Republic of) + case "5": + return "965"; // Kuwait (State of) + case "6": + return "966"; // Saudi Arabia (Kingdom of) + case "7": + return "967"; // Yemen (Republic of) + case "8": + return "968"; // Oman (Sultanate of) + case "9": + return "969"; // Reserved - reservation currently under investigation + default: + return ""; + } + } + + public static String fromNumber97(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "970"; // Reserved + case "1": + return "971"; // United Arab Emirates + case "2": + return "972"; // Israel (State of) + case "3": + return "973"; // Bahrain (Kingdom of) + case "4": + return "974"; // Qatar (State of) + case "5": + return "975"; // Bhutan (Kingdom of) + case "6": + return "976"; // Mongolia + case "7": + return "977"; // Nepal (Federal Democratic Republic of) + case "9": + return "979"; // International Premium Rate Service (IPRS) + default: + return ""; + } + } + + public static String fromNumber99(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "991"; // Trial of a proposed new international telecommunication public correspondence service, shared code + case "2": + return "992"; // Tajikistan (Republic of) + case "3": + return "993"; // Turkmenistan + case "4": + return "994"; // Azerbaijani Republic + case "5": + return "995"; // Georgia + case "6": + return "996"; // Kyrgyz Republic + case "8": + return "998"; // Uzbekistan (Republic of) + case "9": + return "999"; // Reserved for future global service + default: + return ""; + } + } +} + + /** * Wrapper around the PhoneLib library from Google *

@@ -229,7 +1080,8 @@ static boolean isSpecialFormat(String value) { if (value == null || value.length()==0) { return false; } - return ("+".equals(value.substring(0, 1))) || ("*".equals(value.substring(0, 1))); + String firstChar = value.substring(0, 1); + return ("+".equals(firstChar)) || ("*".equals(firstChar)); } /** @@ -271,11 +1123,84 @@ public boolean startsWithIDP() { return false; } + // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" String idp = this.getInternationalDialingPrefix(); return isIDPUsed(this.dialableNumber, idp); } + private int parseCountryCode(boolean alsoFromRegionCode) { + Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); + + // Using PhoneLib to extract Country Code from Number + if (tempNumber!=null) { + int result = tempNumber.getCountryCode(); + if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (alsoFromRegionCode) { + return result; + } else { + return 0; + } + } + if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { + return result; + } + } + return 0; + } + + public String getCountryCode(boolean alsoFromRegionCode) { + int parsedCountryCode = parseCountryCode(alsoFromRegionCode); + if (parsedCountryCode>0) { + return String.valueOf(parsedCountryCode); + } + + // FallBack Extraction: + String numberWithoutIDP = removeIDP(); + String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); + + if (countryCode.length()>0) { + return countryCode; + } + + if (alsoFromRegionCode) { + int regionCountryCode = getCountryCodeForRegion(this.regionCode); + if (regionCountryCode>0) { + return String.valueOf(regionCountryCode); + } + } + + return ""; + } + + public String removeNAC() { + if (dialableNumber == null) { + return ""; + } + if (startsWithNAC()) { + return dialableNumber.substring(getNationalAccessCode().length()); + } else { + return ""; + } + } + + public String removeIDP() { + if (dialableNumber == null) { + return ""; + } + if (dialableNumber.startsWith("+")) { + return dialableNumber.substring(1); + } + + if (dialableNumber.startsWith(getInternationalDialingPrefix())) { + return dialableNumber.substring(getInternationalDialingPrefix().length()); + } + + return ""; + } + /** * Checks if the number starts with the NAC of the initializing region * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. @@ -290,11 +1215,9 @@ public boolean startsWithNAC() { if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { return false; - } return dialableNumber.startsWith(nac); - } /** diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index c549471..f2af7ac 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -16,9 +16,47 @@ package de.telekom.phonenumbernormalizer.numberplans.constants; +import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; +import lombok.RequiredArgsConstructor; + + +class ShortNumberDetails { + int length; + + boolean usableWithIDPandCCfromOutside; + + boolean usableWithIDPandCCandNDCfromOutside ; + + boolean usableWithIDPandCCfromInside; + + boolean usableWithIDPandCCandNDCfromInside; + + boolean usableWithNAC; + boolean usableWithNACandNDC; + + boolean usableDirectly; + + public ShortNumberDetails(int length, boolean usableWithIDPandCCfromOutside, + boolean usableWithIDPandCCandNDCfromOutside, + boolean usableWithIDPandCCfromInside, + boolean usableWithIDPandCCandNDCfromInside, + boolean usableWithNAC, + boolean usableWithNACandNDC, + boolean usableDirectly) { + this.length = length; + this.usableWithIDPandCCfromOutside = usableWithIDPandCCfromOutside; + this.usableWithIDPandCCandNDCfromOutside = usableWithIDPandCCandNDCfromOutside; + this.usableWithIDPandCCfromInside = usableWithIDPandCCfromInside; + this.usableWithIDPandCCandNDCfromInside = usableWithIDPandCCandNDCfromInside; + this.usableWithNAC = usableWithNAC; + this.usableWithNACandNDC = usableWithNACandNDC; + this.usableDirectly = usableDirectly; + } +} /** * Definition see Chapter 8.1 in BNetzA German Number Plan @@ -32,17 +70,56 @@ public class DeFixedLineNumberPlan extends NumberPlan { private static final String COUNTRY_CODE = "49"; /** - * Constant for German short numbers in fixed-line + * Constants for German short numbers in fixed-line */ - private static final Map SHORT_NUMBER_CODES = Map.of( - "110", 3, - "112", 3, - "115", 3, - "116", 6, - "1180", 6, - "118", 5 // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. + private static final Map SHORT_NUMBER_CODES_DETAILS = Map.of( + "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "115", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); + /** + * Constant for German short numbers in fixed-line as extracted from the details above + */ + private static final Map SHORT_NUMBER_CODES = SHORT_NUMBER_CODES_DETAILS.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().length)); + + @Override + public boolean isUsableWithIDPandCCfromOutside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; + } + + @Override + public boolean isUsableWithIDPandCCandNDCfromOutside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCandNDCfromOutside; + } + + @Override + public boolean isUsableWithIDPandCCfromInside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromInside; + } + + @Override + public boolean isUsableWithIDPandCCandNDCfromInside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCandNDCfromInside; + } + + @Override + public boolean isUsableWithNAC(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithNAC; + } + @Override + public boolean isUsableWithNACandNDC(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithNACandNDC; + } + + @Override + public boolean isUsableDirectly(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableDirectly; + } @Override protected Map getShortNumberCodes() { @@ -53,4 +130,23 @@ public static String getCountryCode() { return COUNTRY_CODE; } + @Override + public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { + if ((nsn == null) || (nsn.length()<1)) { + return ""; + } + + if ("1".equals(nsn.substring(0,1))) { + // Non-Geographic Area Codes + if (nsn.length()<2) { + return ""; + } + + + + } + // Geographic Area Codes + return GermanAreaCodeExtractor.fromNumber(nsn); + } + } From b53fb1ab9cca31a1985d1eb77f5e7368c078309f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:43 +0200 Subject: [PATCH 06/98] Starting Validator. --- .../PhoneNumberValidatorImpl.java | 161 +++++++++++++++++- .../PhoneNumberValidationResult.java | 6 +- .../PhoneNumberValidatorImplTest.groovy | 42 ++++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 4 + 4 files changed, 202 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 60409fa..a2f8756 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -15,6 +15,9 @@ */ package de.telekom.phonenumbernormalizer; +import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType; +import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; +import de.telekom.phonenumbernormalizer.numberplans.NumberPlanFactory; import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; import lombok.RequiredArgsConstructor; @@ -22,6 +25,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import java.util.Objects; + /** * Concrete implementation of {@link PhoneNumberValidator} using {@link PhoneLibWrapper} to validate a number by mitigating some inaccuracies when it comes to number plans of optional NDC and NAC as zero. @@ -42,20 +47,166 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + // TODO: change parameter regionCode to deviceContext + NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); + if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used - return wrapper.validate(); - //return PhoneNumberValidationResult.IS_POSSIBLE; + + String numberCountryCode = wrapper.getCountryCode(false); + + String regionCountryCode = String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode)); + if (regionCountryCode.equals("0")) { + regionCountryCode = ""; + } + + String numberWithoutCountryCode = wrapper.removeIDP().substring(numberCountryCode.length()); + + if (regionCountryCode.equals(numberCountryCode)) { + // Calling within the country + + + if (numberplan!=null) { + + // Check for ShortNumber directly after CC + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + // Check for NDC after CC: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + } + + } else { + + numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, numberCountryCode); + // calling from outside the country + if (numberplan!=null) { + + // Check for ShortNumber directly after CC + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + // Check for NDC after CC: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + } + + } + + // return wrapper.validate(); } else { // No Country Exit Code has been used, so no CC is following. - if (wrapper.getNationalAccessCode()=="") { + if (Objects.equals(wrapper.getNationalAccessCode(), "")) { // no NAC is used in region return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; } else { // NAC can be used in region if (wrapper.startsWithNAC()) { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + String numberWithOutNac = wrapper.removeNAC(); + + if (numberplan!=null) { + // check if a shortnumber is used directly after NAC and if that is allowed + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNAC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } + } + + // Check for NDC after Nac: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithOutNac.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + } + // Todo: Own Length test + + // As fallback check by libPhone + PhoneNumberValidationResult fallBackResult = wrapper.validate(); + + if ( (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE) || + (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || + // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: + ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) + ) { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } else { + // NAC can be used in region, but is not. + if (numberplan==null) { + // ToDo: Is there a test with PhoneLib? + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + String shortNumberKey = numberplan.startingWithShortNumberKey(wrapper.getDialableNumber()); + if (shortNumberKey.length()>0) { + if (!numberplan.isUsableDirectly(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } else { + if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } else { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + } + } + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } } @@ -65,7 +216,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; - // return wrapper.validate(); + return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index d2e204f..7e81d7e 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -93,13 +93,13 @@ public enum PhoneNumberValidationResult { /** The number has an invalid international dialing prefix (aka IDP) for this region. */ INVALID_INTERNATIONAL_DIALING_PREFIX(ValidationResult.INVALID_LENGTH), - /** The number has an invalid country calling code (aka CC). */ + /** The number has an invalid country calling code (aka CC) or the specific number must not be used with used CC.*/ INVALID_COUNTRY_CODE(ValidationResult.INVALID_COUNTRY_CODE), - /** The number has an invalid national access code (aka NAC). */ + /** The number has an invalid national access code (aka NAC) or the specific number must not be used with used NAC.*/ INVALID_NATIONAL_ACCESS_CODE(ValidationResult.INVALID_LENGTH), - /** The number has an invalid national destination code (aka NDC) for this region. */ + /** The number has an invalid national destination code (aka NDC) for this region or the specific number must not be used with used NDC. */ INVALID_NATIONAL_DESTINATION_CODE(ValidationResult.INVALID_LENGTH), /** The number is shorter than all valid numbers for this region or used NDC. */ diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 7144941..0539399 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -15,9 +15,6 @@ */ package de.telekom.phonenumbernormalizer -import de.telekom.phonenumbernormalizer.dto.DeviceContext -import de.telekom.phonenumbernormalizer.dto.DeviceContextDto -import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult import spock.lang.Specification @@ -66,4 +63,43 @@ class PhoneNumberValidatorImplTest extends Specification { "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY } + def "validate police short code 110 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // short code for Police (110) is not dial-able internationally nor does it has additional numbers + "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + // end of 110 + } + + + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 96011d2..89a8955 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -476,6 +476,10 @@ class IsValidNumberTest extends Specification { // 015xxyyyyyyy xx = block code, yyyyyyy fixed length number in 2 digit block, so together 9 digit is the overall length // 015zzzaaaaaa zzz = newer block zzz, aaaaaa fixes length number in 3 digit block, so together 9 digit is the overall length + // >>> https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html is a list of used blocks + // >>> https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/freie%20RNB/start.html + // >>> markes testcases from isPosible, which are not valid right now. + // // 0150 // From bf5daa18c57e91bc18e0fda2dab3f1aab2d1a1c7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 21 May 2024 12:48:54 +0200 Subject: [PATCH 07/98] Include Mobile NDCs into generator script for GermanAreaCodeExtractor code --- .../GermanAreaCodeExtractor/main.py | 51 +- .../constants/GermanAreaCodeExtractor.java | 14045 ++++++++-------- 2 files changed, 7071 insertions(+), 7025 deletions(-) diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py index dabba83..04618cf 100644 --- a/src/generators/GermanAreaCodeExtractor/main.py +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -15,21 +15,15 @@ def print_function(leaf, prefix): java_visibility = 'public' else: java_visibility = 'private' - print(' '+java_visibility+' static String fromNumber'+ prefix +'(String number) {') print(' if ((number == null) || (number.length()<1)) {') print(' return "";') print(' }') print('') - print(' switch (number.substring(0, 1)) {') - - if prefix == "": - # main function - need explicit reference to service and mobile function for starting numbers with 1 - print(' case "1":') - print(' return fromNumber1(number.substring(1));') + print(' switch (number.charAt(0)) {') for k in leaf: - print(' case "'+k+'":') + print(" case '"+k+"':") if isinstance(leaf[k], dict): print(' return fromNumber'+prefix+k+'(number.substring(1));') @@ -73,6 +67,47 @@ def print_function(leaf, prefix): continue add(onkz, row[0], row[1]) +# Website for used mobile NDCs: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html +with open('mobile_ndcs.html', newline='') as f: + data = f.read().replace('\n', '') + data = data.split("Liste der zugeteilten Rufnummernblöcke / Mobile Dienste")[1] + data = data.split("")[1] + data = data.split("")[0] + data = data.split("")[2] + + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('', ",") + data = data.replace('', ",") + data = data.replace('', "{+}") + data = data.replace('&', "&") + data = data.replace(' ', " ") + data = data.replace(' ', " ") + data = data.replace(', ', ",") + data = data.replace(',', "{:}") + + data = data.replace('15-', "15") + mf_ndcs = data.split('{+}') + + for mf_ndc in mf_ndcs: + ndc = mf_ndc.split('{:}') + if len(ndc) == 2: + add(onkz, ndc[0], ndc[1]) + +onkz = dict(sorted(onkz.items())) + # print code from three print_function(onkz, "") diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index d3a0b27..9e123ce 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -7,23 +7,53 @@ public class GermanAreaCodeExtractor { it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new code and past it between the comments below. - It only generates the code for geographical NDC starting with 2..9 for service and mobile numbers, starting one is - hard coded (reference is added into script automatically. + TODO: special NDC need to be added to the script (mobile is done) + */ + + /* + Start of generated code */ + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.charAt(0)) { + case '1': + return fromNumber1(number.substring(1)); + case '2': + return fromNumber2(number.substring(1)); + case '3': + return fromNumber3(number.substring(1)); + case '4': + return fromNumber4(number.substring(1)); + case '5': + return fromNumber5(number.substring(1)); + case '6': + return fromNumber6(number.substring(1)); + case '7': + return fromNumber7(number.substring(1)); + case '8': + return fromNumber8(number.substring(1)); + case '9': + return fromNumber9(number.substring(1)); + default: + return ""; + } + } private static String fromNumber1(String number) { if ((number == null) || (number.length()<1)) { return ""; } - // used mobile number blocks see: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html - switch (number.substring(0, 1)) { - case "5": + switch (number.charAt(0)) { + case '5': return fromNumber15(number.substring(1)); - case "6": + case '6': return fromNumber16(number.substring(1)); - case "7": + case '7': return fromNumber17(number.substring(1)); default: return ""; @@ -35,24 +65,24 @@ private static String fromNumber15(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber150(number.substring(1)); - case "1": + case '1': return fromNumber151(number.substring(1)); - case "2": - return fromNumber152(number.substring(1)); - case "3": + case '3': return fromNumber153(number.substring(1)); - case "5": + case '2': + return fromNumber152(number.substring(1)); + case '5': return fromNumber155(number.substring(1)); - case "6": + case '6': return fromNumber156(number.substring(1)); - case "7": + case '7': return fromNumber157(number.substring(1)); - case "8": + case '8': return fromNumber158(number.substring(1)); - case "9": + case '9': return fromNumber159(number.substring(1)); default: return ""; @@ -64,10 +94,10 @@ private static String fromNumber150(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return fromNumber1501(number.substring(1)); - case "2": + case '2': return fromNumber1502(number.substring(1)); default: return ""; @@ -79,11 +109,12 @@ private static String fromNumber1501(String number) { return ""; } - // TODO: Replace all substring(0, 1) with chartAt(0) - if (number.charAt(0) == '9') { - return "15019"; // Tismi BV + switch (number.charAt(0)) { + case '9': + return "15019"; // Tismi BV + default: + return ""; } - return ""; } private static String fromNumber1502(String number) { @@ -91,10 +122,12 @@ private static String fromNumber1502(String number) { return ""; } - if (number.charAt(0) == '0') { - return "15020"; // Legos - Local Exchange Global Operation Services + switch (number.charAt(0)) { + case '0': + return "15020"; // Legos - Local Exchange Global Operation Services + default: + return ""; } - return ""; } private static String fromNumber151(String number) { @@ -102,20 +135,20 @@ private static String fromNumber151(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "1511"; // Telekom Deutschland GmbH - case "2": + case '2': return "1512"; // Telekom Deutschland GmbH - case "4": + case '4': return "1514"; // Telekom Deutschland GmbH - case "5": + case '5': return "1515"; // Telekom Deutschland GmbH - case "6": + case '6': return "1516"; // Telekom Deutschland GmbH - case "7": + case '7': return "1517"; // Telekom Deutschland GmbH - case "8": + case '8': return fromNumber1518(number.substring(1)); default: return ""; @@ -127,65 +160,69 @@ private static String fromNumber1518(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15180"; // Telekom Deutschland GmbH - case "1": + case '1': return "15181"; // Telekom Deutschland GmbH - case "2": + case '2': return "15182"; // Telekom Deutschland GmbH - case "3": + case '3': return "15183"; // Telekom Deutschland GmbH default: return ""; } } - private static String fromNumber152(String number) { + private static String fromNumber153(String number) { if ((number == null) || (number.length()<1)) { return ""; } - switch (number.substring(0, 1)) { - case "0": - return "1520"; // Vodafone GmbH - case "1": - return "1521"; // Lycamobile Europe Ltd. - case "2": - return "1522"; // Vodafone GmbH - case "3": - return "1523"; // Vodafone GmbH - case "5": - return "1525"; // Vodafone GmbH - case "6": - return "1526"; // Vodafone GmbH - case "9": - return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH) + switch (number.charAt(0)) { + case '1': + return fromNumber1531(number.substring(1)); default: return ""; } } - private static String fromNumber153(String number) { + private static String fromNumber1531(String number) { if ((number == null) || (number.length()<1)) { return ""; } - if (number.charAt(0) == '1') { - return fromNumber1531(number.substring(1)); + switch (number.charAt(0)) { + case '0': + return "15310"; // MTEL Deutschland GmbH + default: + return ""; } - return ""; } - private static String fromNumber1531(String number) { + private static String fromNumber152(String number) { if ((number == null) || (number.length()<1)) { return ""; } - if (number.charAt(0) == '0') { - return "15310"; // MTEL Deutschland GmbH + switch (number.charAt(0)) { + case '0': + return "1520"; // Vodafone GmbH + case '1': + return "1521"; // Lycamobile Europe Ltd. + case '2': + return "1522"; // Vodafone GmbH + case '3': + return "1523"; // Vodafone GmbH + case '5': + return "1525"; // Vodafone GmbH + case '6': + return "1526"; // Vodafone GmbH + case '9': + return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH ) + default: + return ""; } - return ""; } private static String fromNumber155(String number) { @@ -193,10 +230,10 @@ private static String fromNumber155(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return fromNumber1551(number.substring(1)); - case "6": + case '6': return fromNumber1556(number.substring(1)); default: return ""; @@ -208,10 +245,10 @@ private static String fromNumber1551(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15510"; // Lebara Limited - case "1": + case '1': return "15511"; // Lebara Limited default: return ""; @@ -223,26 +260,26 @@ private static String fromNumber1556(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15560"; // 1&1 Mobilfunk GmbH - case "1": + case '1': return "15561"; // 1&1 Mobilfunk GmbH - case "2": + case '2': return "15562"; // 1&1 Mobilfunk GmbH - case "3": + case '3': return "15563"; // 1&1 Mobilfunk GmbH - case "4": + case '4': return "15564"; // 1&1 Mobilfunk GmbH - case "5": + case '5': return "15565"; // 1&1 Mobilfunk GmbH - case "6": + case '6': return "15566"; // 1&1 Mobilfunk GmbH - case "7": + case '7': return "15567"; // 1&1 Mobilfunk GmbH - case "8": + case '8': return "15568"; // 1&1 Mobilfunk GmbH - case "9": + case '9': return "15569"; // 1&1 Mobilfunk GmbH default: return ""; @@ -254,10 +291,10 @@ private static String fromNumber156(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return fromNumber1563(number.substring(1)); - case "7": + case '7': return fromNumber1567(number.substring(1)); default: return ""; @@ -269,10 +306,12 @@ private static String fromNumber1563(String number) { return ""; } - if (number.charAt(0) == '0') { - return "15630"; // multiConnect GmbH + switch (number.charAt(0)) { + case '0': + return "15630"; // multiConnect GmbH + default: + return ""; } - return ""; } private static String fromNumber1567(String number) { @@ -280,10 +319,10 @@ private static String fromNumber1567(String number) { return ""; } - switch (number.substring(0, 1)) { - case "8": + switch (number.charAt(0)) { + case '8': return "15678"; // Argon Networks UG - case "9": + case '9': return "15679"; // Argon Networks UG default: return ""; @@ -295,19 +334,17 @@ private static String fromNumber157(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber1570(number.substring(1)); - case "3": - return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "5": - return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "7": - return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "8": - return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "9": - return "1579"; // Telefónica Germany GmbH & Co. OHG (Netznutzungsvereinbarung mit Fa. Sipgate Wireless GmbH zuvor Fa. Vintage Wireless Networks Gesellschaft für Telekommunikation mbH), (ehem. E-Plus-Mobilfunk GmbH) + case '3': + return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '5': + return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '7': + return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '8': + return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) default: return ""; } @@ -318,20 +355,19 @@ private static String fromNumber1570(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15700"; // Telefónica Germany GmbH & Co. OHG - case "1": + case '1': return "15701"; // Telefónica Germany GmbH & Co. OHG - case "2": + case '2': return "15702"; // Telefónica Germany GmbH & Co. OHG - case "3": + case '3': return "15703"; // Telefónica Germany GmbH & Co. OHG - case "4": + case '4': return "15704"; // Telefónica Germany GmbH & Co. OHG - case "6": + case '6': return "15706"; // Telefónica Germany GmbH & Co. OHG - default: return ""; } @@ -342,10 +378,12 @@ private static String fromNumber158(String number) { return ""; } - if (number.charAt(0) == '8') { - return fromNumber1588(number.substring(1)); + switch (number.charAt(0)) { + case '8': + return fromNumber1588(number.substring(1)); + default: + return ""; } - return ""; } private static String fromNumber1588(String number) { @@ -353,10 +391,12 @@ private static String fromNumber1588(String number) { return ""; } - if (number.charAt(0) == '8') { - return "15888"; // TelcoVillage GmbH + switch (number.charAt(0)) { + case '8': + return "15888"; // TelcoVillage GmbH + default: + return ""; } - return ""; } private static String fromNumber159(String number) { @@ -364,10 +404,12 @@ private static String fromNumber159(String number) { return ""; } - if (number.charAt(0) == '0') { - return "1590"; // Telefónica Germany GmbH & Co. OHG + switch (number.charAt(0)) { + case '0': + return "1590"; // Telefónica Germany GmbH & Co. OHG + default: + return ""; } - return ""; } private static String fromNumber16(String number) { @@ -375,13 +417,13 @@ private static String fromNumber16(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "160"; // Telekom Deutschland GmbH - case "2": + case '2': return "162"; // Vodafone GmbH - case "3": - return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case '3': + return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) default: return ""; } @@ -392,89 +434,57 @@ private static String fromNumber17(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "170"; // Telekom Deutschland GmbH - case "1": + case '1': return "171"; // Telekom Deutschland GmbH - case "2": + case '2': return "172"; // Vodafone GmbH - case "3": + case '3': return "173"; // Vodafone GmbH - case "4": + case '4': return "174"; // Vodafone GmbH - case "5": + case '5': return "175"; // Telekom Deutschland GmbH - case "6": + case '6': return "176"; // Telefónica Germany GmbH & Co. OHG - case "7": - return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "8": - return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "9": + case '7': + return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '8': + return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '9': return "179"; // Telefónica Germany GmbH & Co. OHG default: return ""; } } - /* - Start of generated code - */ - public static String fromNumber(String number) { - if ((number == null) || (number.length()<1)) { - return ""; - } - - switch (number.substring(0, 1)) { - case "1": - return fromNumber1(number.substring(1)); - case "2": - return fromNumber2(number.substring(1)); - case "3": - return fromNumber3(number.substring(1)); - case "4": - return fromNumber4(number.substring(1)); - case "5": - return fromNumber5(number.substring(1)); - case "6": - return fromNumber6(number.substring(1)); - case "7": - return fromNumber7(number.substring(1)); - case "8": - return fromNumber8(number.substring(1)); - case "9": - return fromNumber9(number.substring(1)); - default: - return ""; - } - } - private static String fromNumber2(String number) { if ((number == null) || (number.length()<1)) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber20(number.substring(1)); - case "1": + case '1': return fromNumber21(number.substring(1)); - case "2": + case '2': return fromNumber22(number.substring(1)); - case "3": + case '3': return fromNumber23(number.substring(1)); - case "4": + case '4': return fromNumber24(number.substring(1)); - case "5": + case '5': return fromNumber25(number.substring(1)); - case "6": + case '6': return fromNumber26(number.substring(1)); - case "7": + case '7': return fromNumber27(number.substring(1)); - case "8": + case '8': return fromNumber28(number.substring(1)); - case "9": + case '9': return fromNumber29(number.substring(1)); default: return ""; @@ -486,22 +496,22 @@ private static String fromNumber20(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "201"; // Essen - case "2": + case '2': return "202"; // Wuppertal - case "3": + case '3': return "203"; // Duisburg - case "4": + case '4': return fromNumber204(number.substring(1)); - case "5": + case '5': return fromNumber205(number.substring(1)); - case "6": + case '6': return fromNumber206(number.substring(1)); - case "8": + case '8': return "208"; // Oberhausen Rheinl - case "9": + case '9': return "209"; // Gelsenkirchen default: return ""; @@ -513,12 +523,12 @@ private static String fromNumber204(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2041"; // Bottrop - case "3": + case '3': return "2043"; // Gladbeck - case "5": + case '5': return "2045"; // Bottrop-Kirchhellen default: return ""; @@ -530,18 +540,18 @@ private static String fromNumber205(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2051"; // Velbert - case "2": + case '2': return "2052"; // Velbert-Langenberg - case "3": + case '3': return "2053"; // Velbert-Neviges - case "4": + case '4': return "2054"; // Essen-Kettwig - case "6": + case '6': return "2056"; // Heiligenhaus - case "8": + case '8': return "2058"; // Wülfrath default: return ""; @@ -553,12 +563,12 @@ private static String fromNumber206(String number) { return ""; } - switch (number.substring(0, 1)) { - case "4": + switch (number.charAt(0)) { + case '4': return "2064"; // Dinslaken - case "5": + case '5': return "2065"; // Duisburg-Rheinhausen - case "6": + case '6': return "2066"; // Duisburg-Homberg default: return ""; @@ -570,30 +580,30 @@ private static String fromNumber21(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber210(number.substring(1)); - case "1": + case '1': return "211"; // Düsseldorf - case "2": + case '2': // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBVerzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1 if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) { return "2129"; // Haan Rheinland } return "212"; // Solingen - case "3": + case '3': return fromNumber213(number.substring(1)); - case "4": + case '4': return "214"; // Leverkusen - case "5": + case '5': return fromNumber215(number.substring(1)); - case "6": + case '6': return fromNumber216(number.substring(1)); - case "7": + case '7': return fromNumber217(number.substring(1)); - case "8": + case '8': return fromNumber218(number.substring(1)); - case "9": + case '9': return fromNumber219(number.substring(1)); default: return ""; @@ -605,12 +615,12 @@ private static String fromNumber210(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2102"; // Ratingen - case "3": + case '3': return "2103"; // Hilden - case "4": + case '4': return "2104"; // Mettmann default: return ""; @@ -622,14 +632,14 @@ private static String fromNumber213(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2131"; // Neuss - case "2": + case '2': return "2132"; // Meerbusch-Büderich - case "3": + case '3': return "2133"; // Dormagen - case "7": + case '7': return "2137"; // Neuss-Norf default: return ""; @@ -641,24 +651,24 @@ private static String fromNumber215(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2150"; // Meerbusch-Lank - case "1": + case '1': return "2151"; // Krefeld - case "2": + case '2': return "2152"; // Kempen - case "3": + case '3': return "2153"; // Nettetal-Lobberich - case "4": + case '4': return "2154"; // Willich - case "6": + case '6': return "2156"; // Willich-Anrath - case "7": + case '7': return "2157"; // Nettetal-Kaldenkirchen - case "8": + case '8': return "2158"; // Grefrath b Krefeld - case "9": + case '9': return "2159"; // Meerbusch-Osterath default: return ""; @@ -670,18 +680,18 @@ private static String fromNumber216(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2161"; // Mönchengladbach - case "2": + case '2': return "2162"; // Viersen - case "3": + case '3': return "2163"; // Schwalmtal Niederrhein - case "4": + case '4': return "2164"; // Jüchen-Otzenrath - case "5": + case '5': return "2165"; // Jüchen - case "6": + case '6': return "2166"; // Mönchengladbach-Rheydt default: return ""; @@ -693,14 +703,14 @@ private static String fromNumber217(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2171"; // Leverkusen-Opladen - case "3": + case '3': return "2173"; // Langenfeld Rheinland - case "4": + case '4': return "2174"; // Burscheid Rheinl - case "5": + case '5': return "2175"; // Leichlingen Rheinland default: return ""; @@ -712,12 +722,12 @@ private static String fromNumber218(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2181"; // Grevenbroich - case "2": + case '2': return "2182"; // Grevenbroich-Kapellen - case "3": + case '3': return "2183"; // Rommerskirchen default: return ""; @@ -729,16 +739,16 @@ private static String fromNumber219(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2191"; // Remscheid - case "2": + case '2': return "2192"; // Hückeswagen - case "3": + case '3': return "2193"; // Dabringhausen - case "5": + case '5': return "2195"; // Radevormwald - case "6": + case '6': return "2196"; // Wermelskirchen default: return ""; @@ -750,26 +760,26 @@ private static String fromNumber22(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber220(number.substring(1)); - case "1": + case '1': return "221"; // Köln - case "2": + case '2': return fromNumber222(number.substring(1)); - case "3": + case '3': return fromNumber223(number.substring(1)); - case "4": + case '4': return fromNumber224(number.substring(1)); - case "5": + case '5': return fromNumber225(number.substring(1)); - case "6": + case '6': return fromNumber226(number.substring(1)); - case "7": + case '7': return fromNumber227(number.substring(1)); - case "8": + case '8': return "228"; // Bonn - case "9": + case '9': return fromNumber229(number.substring(1)); default: return ""; @@ -781,20 +791,20 @@ private static String fromNumber220(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2202"; // Bergisch Gladbach - case "3": + case '3': return "2203"; // Köln-Porz - case "4": + case '4': return "2204"; // Bensberg - case "5": + case '5': return "2205"; // Rösrath - case "6": + case '6': return "2206"; // Overath - case "7": + case '7': return "2207"; // Kürten-Dürscheid - case "8": + case '8': return "2208"; // Niederkassel default: return ""; @@ -806,20 +816,20 @@ private static String fromNumber222(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2222"; // Bornheim Rheinl - case "3": + case '3': return "2223"; // Königswinter - case "4": + case '4': return "2224"; // Bad Honnef - case "5": + case '5': return "2225"; // Meckenheim Rheinl - case "6": + case '6': return "2226"; // Rheinbach - case "7": + case '7': return "2227"; // Bornheim-Merten - case "8": + case '8': return "2228"; // Remagen-Rolandseck default: return ""; @@ -831,20 +841,20 @@ private static String fromNumber223(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2232"; // Brühl Rheinl - case "3": + case '3': return "2233"; // Hürth Rheinl - case "4": + case '4': return "2234"; // Frechen - case "5": + case '5': return "2235"; // Erftstadt - case "6": + case '6': return "2236"; // Wesseling Rheinl - case "7": + case '7': return "2237"; // Kerpen Rheinl-Türnich - case "8": + case '8': return "2238"; // Pulheim default: return ""; @@ -856,22 +866,22 @@ private static String fromNumber224(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2241"; // Siegburg - case "2": + case '2': return "2242"; // Hennef Sieg - case "3": + case '3': return "2243"; // Eitorf - case "4": + case '4': return "2244"; // Königswinter-Oberpleis - case "5": + case '5': return "2245"; // Much - case "6": + case '6': return "2246"; // Lohmar Rheinland - case "7": + case '7': return "2247"; // Neunkirchen-Seelscheid - case "8": + case '8': return "2248"; // Hennef-Uckerath default: return ""; @@ -883,20 +893,20 @@ private static String fromNumber225(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2251"; // Euskirchen - case "2": + case '2': return "2252"; // Zülpich - case "3": + case '3': return "2253"; // Bad Münstereifel - case "4": + case '4': return "2254"; // Weilerswist - case "5": + case '5': return "2255"; // Euskirchen-Flamersheim - case "6": + case '6': return "2256"; // Mechernich-Satzvey - case "7": + case '7': return "2257"; // Reckerscheid default: return ""; @@ -908,24 +918,24 @@ private static String fromNumber226(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2261"; // Gummersbach - case "2": + case '2': return "2262"; // Wiehl - case "3": + case '3': return "2263"; // Engelskirchen - case "4": + case '4': return "2264"; // Marienheide - case "5": + case '5': return "2265"; // Reichshof-Eckenhagen - case "6": + case '6': return "2266"; // Lindlar - case "7": + case '7': return "2267"; // Wipperfürth - case "8": + case '8': return "2268"; // Kürten - case "9": + case '9': return "2269"; // Kierspe-Rönsahl default: return ""; @@ -937,16 +947,16 @@ private static String fromNumber227(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2271"; // Bergheim Erft - case "2": + case '2': return "2272"; // Bedburg Erft - case "3": + case '3': return "2273"; // Kerpen-Horrem - case "4": + case '4': return "2274"; // Elsdorf Rheinl - case "5": + case '5': return "2275"; // Kerpen-Buir default: return ""; @@ -958,20 +968,20 @@ private static String fromNumber229(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2291"; // Waldbröl - case "2": + case '2': return "2292"; // Windeck Sieg - case "3": + case '3': return "2293"; // Nümbrecht - case "4": + case '4': return "2294"; // Morsbach Sieg - case "5": + case '5': return "2295"; // Ruppichteroth - case "6": + case '6': return "2296"; // Reichshof-Brüchermühle - case "7": + case '7': return "2297"; // Wildbergerhütte default: return ""; @@ -983,26 +993,26 @@ private static String fromNumber23(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber230(number.substring(1)); - case "1": + case '1': return "231"; // Dortmund - case "2": + case '2': return fromNumber232(number.substring(1)); - case "3": + case '3': return fromNumber233(number.substring(1)); - case "4": + case '4': return "234"; // Bochum - case "5": + case '5': return fromNumber235(number.substring(1)); - case "6": + case '6': return fromNumber236(number.substring(1)); - case "7": + case '7': return fromNumber237(number.substring(1)); - case "8": + case '8': return fromNumber238(number.substring(1)); - case "9": + case '9': return fromNumber239(number.substring(1)); default: return ""; @@ -1014,24 +1024,24 @@ private static String fromNumber230(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2301"; // Holzwickede - case "2": + case '2': return "2302"; // Witten - case "3": + case '3': return "2303"; // Unna - case "4": + case '4': return "2304"; // Schwerte - case "5": + case '5': return "2305"; // Castrop-Rauxel - case "6": + case '6': return "2306"; // Lünen - case "7": + case '7': return "2307"; // Kamen - case "8": + case '8': return "2308"; // Unna-Hemmerde - case "9": + case '9': return "2309"; // Waltrop default: return ""; @@ -1043,14 +1053,14 @@ private static String fromNumber232(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "2323"; // Herne - case "4": + case '4': return "2324"; // Hattingen Ruhr - case "5": + case '5': return "2325"; // Wanne-Eickel - case "7": + case '7': return "2327"; // Bochum-Wattenscheid default: return ""; @@ -1062,26 +1072,26 @@ private static String fromNumber233(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2330"; // Herdecke - case "1": + case '1': return "2331"; // Hagen Westf - case "2": + case '2': return "2332"; // Gevelsberg - case "3": + case '3': return "2333"; // Ennepetal - case "4": + case '4': return "2334"; // Hagen-Hohenlimburg - case "5": + case '5': return "2335"; // Wetter Ruhr - case "6": + case '6': return "2336"; // Schwelm - case "7": + case '7': return "2337"; // Hagen-Dahl - case "8": + case '8': return "2338"; // Breckerfeld - case "9": + case '9': return "2339"; // Sprockhövel-Haßlinghausen default: return ""; @@ -1093,22 +1103,22 @@ private static String fromNumber235(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2351"; // Lüdenscheid - case "2": + case '2': return "2352"; // Altena Westf - case "3": + case '3': return "2353"; // Halver - case "4": + case '4': return "2354"; // Meinerzhagen - case "5": + case '5': return "2355"; // Schalksmühle - case "7": + case '7': return "2357"; // Herscheid Westf - case "8": + case '8': return "2358"; // Meinerzhagen-Valbert - case "9": + case '9': return "2359"; // Kierspe default: return ""; @@ -1120,26 +1130,26 @@ private static String fromNumber236(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2360"; // Haltern-Lippramsdorf - case "1": + case '1': return "2361"; // Recklinghausen - case "2": + case '2': return "2362"; // Dorsten - case "3": + case '3': return "2363"; // Datteln - case "4": + case '4': return "2364"; // Haltern Westf - case "5": + case '5': return "2365"; // Marl - case "6": + case '6': return "2366"; // Herten Westf - case "7": + case '7': return "2367"; // Henrichenburg - case "8": + case '8': return "2368"; // Oer-Erkenschwick - case "9": + case '9': return "2369"; // Dorsten-Wulfen default: return ""; @@ -1151,22 +1161,22 @@ private static String fromNumber237(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2371"; // Iserlohn - case "2": + case '2': return "2372"; // Hemer - case "3": + case '3': return "2373"; // Menden Sauerland - case "4": + case '4': return "2374"; // Iserlohn-Letmathe - case "5": + case '5': return "2375"; // Balve - case "7": + case '7': return "2377"; // Wickede Ruhr - case "8": + case '8': return "2378"; // Fröndenberg-Langschede - case "9": + case '9': return "2379"; // Menden-Asbeck default: return ""; @@ -1178,22 +1188,22 @@ private static String fromNumber238(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2381"; // Hamm Westf - case "2": + case '2': return "2382"; // Ahlen Westf - case "3": + case '3': return "2383"; // Bönen - case "4": + case '4': return "2384"; // Welver - case "5": + case '5': return "2385"; // Hamm-Rhynern - case "7": + case '7': return "2387"; // Drensteinfurt-Walstedde - case "8": + case '8': return "2388"; // Hamm-Uentrop - case "9": + case '9': return "2389"; // Werne default: return ""; @@ -1205,16 +1215,16 @@ private static String fromNumber239(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2391"; // Plettenberg - case "2": + case '2': return "2392"; // Werdohl - case "3": + case '3': return "2393"; // Sundern-Allendorf - case "4": + case '4': return "2394"; // Neuenrade-Affeln - case "5": + case '5': return "2395"; // Finnentrop-Rönkhausen default: return ""; @@ -1226,24 +1236,24 @@ private static String fromNumber24(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber240(number.substring(1)); - case "1": + case '1': return "241"; // Aachen - case "2": + case '2': return fromNumber242(number.substring(1)); - case "3": + case '3': return fromNumber243(number.substring(1)); - case "4": + case '4': return fromNumber244(number.substring(1)); - case "5": + case '5': return fromNumber245(number.substring(1)); - case "6": + case '6': return fromNumber246(number.substring(1)); - case "7": + case '7': return fromNumber247(number.substring(1)); - case "8": + case '8': return fromNumber248(number.substring(1)); default: return ""; @@ -1255,24 +1265,24 @@ private static String fromNumber240(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2401"; // Baesweiler - case "2": + case '2': return "2402"; // Stolberg Rheinl - case "3": + case '3': return "2403"; // Eschweiler Rheinl - case "4": + case '4': return "2404"; // Alsdorf Rheinl - case "5": + case '5': return "2405"; // Würselen - case "6": + case '6': return "2406"; // Herzogenrath - case "7": + case '7': return "2407"; // Herzogenrath-Kohlscheid - case "8": + case '8': return "2408"; // Aachen-Kornelimünster - case "9": + case '9': return "2409"; // Stolberg-Gressenich default: return ""; @@ -1284,24 +1294,24 @@ private static String fromNumber242(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2421"; // Düren - case "2": + case '2': return "2422"; // Kreuzau - case "3": + case '3': return "2423"; // Langerwehe - case "4": + case '4': return "2424"; // Vettweiss - case "5": + case '5': return "2425"; // Nideggen-Embken - case "6": + case '6': return "2426"; // Nörvenich - case "7": + case '7': return "2427"; // Nideggen - case "8": + case '8': return "2428"; // Niederzier - case "9": + case '9': return "2429"; // Hürtgenwald default: return ""; @@ -1313,18 +1323,18 @@ private static String fromNumber243(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2431"; // Erkelenz - case "2": + case '2': return "2432"; // Wassenberg - case "3": + case '3': return "2433"; // Hückelhoven - case "4": + case '4': return "2434"; // Wegberg - case "5": + case '5': return "2435"; // Erkelenz-Lövenich - case "6": + case '6': return "2436"; // Wegberg-Rödgen default: return ""; @@ -1336,24 +1346,24 @@ private static String fromNumber244(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2440"; // Nettersheim-Tondorf - case "1": + case '1': return "2441"; // Kall - case "3": + case '3': return "2443"; // Mechernich - case "4": + case '4': return "2444"; // Schleiden-Gemünd - case "5": + case '5': return "2445"; // Schleiden Eifel - case "6": + case '6': return "2446"; // Heimbach Eifel - case "7": + case '7': return "2447"; // Dahlem b Kall - case "8": + case '8': return "2448"; // Hellenthal-Rescheid - case "9": + case '9': return "2449"; // Blankenheim Ahr default: return ""; @@ -1365,18 +1375,18 @@ private static String fromNumber245(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2451"; // Geilenkirchen - case "2": + case '2': return "2452"; // Heinsberg Rheinl - case "3": + case '3': return "2453"; // Heinsberg-Randerath - case "4": + case '4': return "2454"; // Gangelt - case "5": + case '5': return "2455"; // Waldfeucht - case "6": + case '6': return "2456"; // Selfkant default: return ""; @@ -1388,16 +1398,16 @@ private static String fromNumber246(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2461"; // Jülich - case "2": + case '2': return "2462"; // Linnich - case "3": + case '3': return "2463"; // Titz - case "4": + case '4': return "2464"; // Aldenhoven b Jülich - case "5": + case '5': return "2465"; // Inden default: return ""; @@ -1409,14 +1419,14 @@ private static String fromNumber247(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2471"; // Roetgen Eifel - case "2": + case '2': return "2472"; // Monschau - case "3": + case '3': return "2473"; // Simmerath - case "4": + case '4': return "2474"; // Nideggen-Schmidt default: return ""; @@ -1428,14 +1438,14 @@ private static String fromNumber248(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2482"; // Hellenthal - case "4": + case '4': return "2484"; // Mechernich-Eiserfey - case "5": + case '5': return "2485"; // Schleiden-Dreiborn - case "6": + case '6': return "2486"; // Nettersheim default: return ""; @@ -1447,26 +1457,26 @@ private static String fromNumber25(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber250(number.substring(1)); - case "1": + case '1': return "251"; // Münster - case "2": + case '2': return fromNumber252(number.substring(1)); - case "3": + case '3': return fromNumber253(number.substring(1)); - case "4": + case '4': return fromNumber254(number.substring(1)); - case "5": + case '5': return fromNumber255(number.substring(1)); - case "6": + case '6': return fromNumber256(number.substring(1)); - case "7": + case '7': return fromNumber257(number.substring(1)); - case "8": + case '8': return fromNumber258(number.substring(1)); - case "9": + case '9': return fromNumber259(number.substring(1)); default: return ""; @@ -1478,22 +1488,22 @@ private static String fromNumber250(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2501"; // Münster-Hiltrup - case "2": + case '2': return "2502"; // Nottuln - case "4": + case '4': return "2504"; // Telgte - case "5": + case '5': return "2505"; // Altenberge Westf - case "6": + case '6': return "2506"; // Münster-Wolbeck - case "7": + case '7': return "2507"; // Havixbeck - case "8": + case '8': return "2508"; // Drensteinfurt - case "9": + case '9': return "2509"; // Nottuln-Appelhülsen default: return ""; @@ -1505,26 +1515,26 @@ private static String fromNumber252(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2520"; // Wadersloh-Diestedde - case "1": + case '1': return "2521"; // Beckum - case "2": + case '2': return "2522"; // Oelde - case "3": + case '3': return "2523"; // Wadersloh - case "4": + case '4': return "2524"; // Ennigerloh - case "5": + case '5': return "2525"; // Beckum-Neubeckum - case "6": + case '6': return "2526"; // Sendenhorst - case "7": + case '7': return "2527"; // Lippetal-Lippborg - case "8": + case '8': return "2528"; // Ennigerloh-Enniger - case "9": + case '9': return "2529"; // Oelde-Stromberg default: return ""; @@ -1536,18 +1546,18 @@ private static String fromNumber253(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2532"; // Ostbevern - case "3": + case '3': return "2533"; // Münster-Nienberge - case "4": + case '4': return "2534"; // Münster-Roxel - case "5": + case '5': return "2535"; // Sendenhorst-Albersloh - case "6": + case '6': return "2536"; // Münster-Albachten - case "8": + case '8': return "2538"; // Drensteinfurt-Rinkerode default: return ""; @@ -1559,20 +1569,20 @@ private static String fromNumber254(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2541"; // Coesfeld - case "2": + case '2': return "2542"; // Gescher - case "3": + case '3': return "2543"; // Billerbeck Westf - case "5": + case '5': return "2545"; // Rosendahl-Darfeld - case "6": + case '6': return "2546"; // Coesfeld-Lette - case "7": + case '7': return "2547"; // Rosendahl-Osterwick - case "8": + case '8': return "2548"; // Dülmen-Rorup default: return ""; @@ -1584,22 +1594,22 @@ private static String fromNumber255(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2551"; // Steinfurt-Burgsteinfurt - case "2": + case '2': return "2552"; // Steinfurt-Borghorst - case "3": + case '3': return "2553"; // Ochtrup - case "4": + case '4': return "2554"; // Laer Kr Steinfurt - case "5": + case '5': return "2555"; // Schöppingen - case "6": + case '6': return "2556"; // Metelen - case "7": + case '7': return "2557"; // Wettringen Kr Steinfurt - case "8": + case '8': return "2558"; // Horstmar default: return ""; @@ -1611,22 +1621,22 @@ private static String fromNumber256(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2561"; // Ahaus - case "2": + case '2': return "2562"; // Gronau Westfalen - case "3": + case '3': return "2563"; // Stadtlohn - case "4": + case '4': return "2564"; // Vreden - case "5": + case '5': return "2565"; // Gronau-Epe - case "6": + case '6': return "2566"; // Legden - case "7": + case '7': return "2567"; // Ahaus-Alstätte - case "8": + case '8': return "2568"; // Heek default: return ""; @@ -1638,16 +1648,16 @@ private static String fromNumber257(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2571"; // Greven Westf - case "2": + case '2': return "2572"; // Emsdetten - case "3": + case '3': return "2573"; // Nordwalde - case "4": + case '4': return "2574"; // Saerbeck - case "5": + case '5': return "2575"; // Greven-Reckenfeld default: return ""; @@ -1659,22 +1669,22 @@ private static String fromNumber258(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2581"; // Warendorf - case "2": + case '2': return "2582"; // Everswinkel - case "3": + case '3': return "2583"; // Sassenberg - case "4": + case '4': return "2584"; // Warendorf-Milte - case "5": + case '5': return "2585"; // Warendorf-Hoetmar - case "6": + case '6': return "2586"; // Beelen - case "7": + case '7': return "2587"; // Ennigerloh-Westkirchen - case "8": + case '8': return "2588"; // Harsewinkel-Greffen default: return ""; @@ -1686,26 +1696,26 @@ private static String fromNumber259(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2590"; // Dülmen-Buldern - case "1": + case '1': return "2591"; // Lüdinghausen - case "2": + case '2': return "2592"; // Selm - case "3": + case '3': return "2593"; // Ascheberg Westf - case "4": + case '4': return "2594"; // Dülmen - case "5": + case '5': return "2595"; // Olfen - case "6": + case '6': return "2596"; // Nordkirchen - case "7": + case '7': return "2597"; // Senden Westf - case "8": + case '8': return "2598"; // Senden-Ottmarsbocholt - case "9": + case '9': return "2599"; // Ascheberg-Herbern default: return ""; @@ -1717,26 +1727,26 @@ private static String fromNumber26(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber260(number.substring(1)); - case "1": + case '1': return "261"; // Koblenz a Rhein - case "2": + case '2': return fromNumber262(number.substring(1)); - case "3": + case '3': return fromNumber263(number.substring(1)); - case "4": + case '4': return fromNumber264(number.substring(1)); - case "5": + case '5': return fromNumber265(number.substring(1)); - case "6": + case '6': return fromNumber266(number.substring(1)); - case "7": + case '7': return fromNumber267(number.substring(1)); - case "8": + case '8': return fromNumber268(number.substring(1)); - case "9": + case '9': return fromNumber269(number.substring(1)); default: return ""; @@ -1748,22 +1758,22 @@ private static String fromNumber260(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2601"; // Nauort - case "2": + case '2': return "2602"; // Montabaur - case "3": + case '3': return "2603"; // Bad Ems - case "4": + case '4': return "2604"; // Nassau Lahn - case "5": + case '5': return "2605"; // Löf - case "6": + case '6': return "2606"; // Winningen Mosel - case "7": + case '7': return "2607"; // Kobern-Gondorf - case "8": + case '8': return "2608"; // Welschneudorf default: return ""; @@ -1775,24 +1785,24 @@ private static String fromNumber262(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2620"; // Neuhäusel Westerw - case "1": + case '1': return "2621"; // Lahnstein - case "2": + case '2': return "2622"; // Bendorf Rhein - case "3": + case '3': return "2623"; // Ransbach-Baumbach - case "4": + case '4': return "2624"; // Höhr-Grenzhausen - case "5": + case '5': return "2625"; // Ochtendung - case "6": + case '6': return "2626"; // Selters Westferwald - case "7": + case '7': return "2627"; // Braubach - case "8": + case '8': return "2628"; // Rhens default: return ""; @@ -1804,26 +1814,26 @@ private static String fromNumber263(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2630"; // Mülheim-Kärlich - case "1": + case '1': return "2631"; // Neuwied - case "2": + case '2': return "2632"; // Andernach - case "3": + case '3': return "2633"; // Brohl-Lützing - case "4": + case '4': return "2634"; // Rengsdorf - case "5": + case '5': return "2635"; // Rheinbrohl - case "6": + case '6': return "2636"; // Burgbrohl - case "7": + case '7': return "2637"; // Weissenthurm - case "8": + case '8': return "2638"; // Waldbreitbach - case "9": + case '9': return "2639"; // Anhausen Kr Neuwied default: return ""; @@ -1835,20 +1845,20 @@ private static String fromNumber264(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2641"; // Bad Neuenahr-Ahrweiler - case "2": + case '2': return "2642"; // Remagen - case "3": + case '3': return "2643"; // Altenahr - case "4": + case '4': return "2644"; // Linz am Rhein - case "5": + case '5': return "2645"; // Vettelschoss - case "6": + case '6': return "2646"; // Königsfeld Eifel - case "7": + case '7': return "2647"; // Kesseling default: return ""; @@ -1860,20 +1870,20 @@ private static String fromNumber265(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2651"; // Mayen - case "2": + case '2': return "2652"; // Mendig - case "3": + case '3': return "2653"; // Kaisersesch - case "4": + case '4': return "2654"; // Polch - case "5": + case '5': return "2655"; // Weibern - case "6": + case '6': return "2656"; // Virneburg - case "7": + case '7': return "2657"; // Uersfeld default: return ""; @@ -1885,18 +1895,18 @@ private static String fromNumber266(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2661"; // Bad Marienberg Westerwald - case "2": + case '2': return "2662"; // Hachenburg - case "3": + case '3': return "2663"; // Westerburg Westerw - case "4": + case '4': return "2664"; // Rennerod - case "6": + case '6': return "2666"; // Freilingen Westerw - case "7": + case '7': return "2667"; // Stein-Neukirch default: return ""; @@ -1908,22 +1918,22 @@ private static String fromNumber267(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2671"; // Cochem - case "2": + case '2': return "2672"; // Treis-Karden - case "3": + case '3': return "2673"; // Ellenz-Poltersdorf - case "4": + case '4': return "2674"; // Bad Bertrich - case "5": + case '5': return "2675"; // Ediger-Eller - case "6": + case '6': return "2676"; // Ulmen - case "7": + case '7': return "2677"; // Lutzerath - case "8": + case '8': return "2678"; // Büchel b Cochem default: return ""; @@ -1935,26 +1945,26 @@ private static String fromNumber268(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2680"; // Mündersbach - case "1": + case '1': return "2681"; // Altenkirchen Westerwald - case "2": + case '2': return "2682"; // Hamm Sieg - case "3": + case '3': return "2683"; // Asbach Westerw - case "4": + case '4': return "2684"; // Puderbach Westerw - case "5": + case '5': return "2685"; // Flammersfeld - case "6": + case '6': return "2686"; // Weyerbusch - case "7": + case '7': return "2687"; // Horhausen Westerwald - case "8": + case '8': return "2688"; // Kroppach - case "9": + case '9': return "2689"; // Dierdorf default: return ""; @@ -1966,20 +1976,20 @@ private static String fromNumber269(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2691"; // Adenau - case "2": + case '2': return "2692"; // Kelberg - case "3": + case '3': return "2693"; // Antweiler - case "4": + case '4': return "2694"; // Wershofen - case "5": + case '5': return "2695"; // Insul - case "6": + case '6': return "2696"; // Nohn Eifel - case "7": + case '7': return "2697"; // Blankenheim-Ahrhütte default: return ""; @@ -1991,20 +2001,20 @@ private static String fromNumber27(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "271"; // Siegen - case "2": + case '2': return fromNumber272(number.substring(1)); - case "3": + case '3': return fromNumber273(number.substring(1)); - case "4": + case '4': return fromNumber274(number.substring(1)); - case "5": + case '5': return fromNumber275(number.substring(1)); - case "6": + case '6': return fromNumber276(number.substring(1)); - case "7": + case '7': return fromNumber277(number.substring(1)); default: return ""; @@ -2016,16 +2026,16 @@ private static String fromNumber272(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2721"; // Lennestadt - case "2": + case '2': return "2722"; // Attendorn - case "3": + case '3': return "2723"; // Kirchhundem - case "4": + case '4': return "2724"; // Finnentrop-Serkenrode - case "5": + case '5': return "2725"; // Lennestadt-Oedingen default: return ""; @@ -2037,22 +2047,22 @@ private static String fromNumber273(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2732"; // Kreuztal - case "3": + case '3': return "2733"; // Hilchenbach - case "4": + case '4': return "2734"; // Freudenberg Westf - case "5": + case '5': return "2735"; // Neunkirchen Siegerl - case "6": + case '6': return "2736"; // Burbach Siegerl - case "7": + case '7': return "2737"; // Netphen-Deuz - case "8": + case '8': return "2738"; // Netphen - case "9": + case '9': return "2739"; // Wilnsdorf default: return ""; @@ -2064,18 +2074,18 @@ private static String fromNumber274(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2741"; // Betzdorf - case "2": + case '2': return "2742"; // Wissen - case "3": + case '3': return "2743"; // Daaden - case "4": + case '4': return "2744"; // Herdorf - case "5": + case '5': return "2745"; // Brachbach Sieg - case "7": + case '7': return "2747"; // Molzhain default: return ""; @@ -2087,22 +2097,22 @@ private static String fromNumber275(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2750"; // Diedenshausen - case "1": + case '1': return "2751"; // Bad Berleburg - case "2": + case '2': return "2752"; // Bad Laasphe - case "3": + case '3': return "2753"; // Erndtebrück - case "4": + case '4': return "2754"; // Bad Laasphe-Feudingen - case "5": + case '5': return "2755"; // Bad Berleburg-Schwarzenau - case "8": + case '8': return "2758"; // Bad Berleburg-Girkhausen - case "9": + case '9': return "2759"; // Bad Berleburg-Aue default: return ""; @@ -2114,14 +2124,14 @@ private static String fromNumber276(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2761"; // Olpe Biggesee - case "2": + case '2': return "2762"; // Wenden Südsauerland - case "3": + case '3': return "2763"; // Drolshagen-Bleche - case "4": + case '4': return "2764"; // Welschen Ennest default: return ""; @@ -2133,26 +2143,26 @@ private static String fromNumber277(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2770"; // Eschenburg - case "1": + case '1': return "2771"; // Dillenburg - case "2": + case '2': return "2772"; // Herborn Hess - case "3": + case '3': return "2773"; // Haiger - case "4": + case '4': return "2774"; // Dietzhölztal - case "5": + case '5': return "2775"; // Driedorf - case "6": + case '6': return "2776"; // Bad Endbach-Hartenrod - case "7": + case '7': return "2777"; // Breitscheid Hess - case "8": + case '8': return "2778"; // Siegbach - case "9": + case '9': return "2779"; // Greifenstein-Beilstein default: return ""; @@ -2164,22 +2174,22 @@ private static String fromNumber28(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber280(number.substring(1)); - case "1": + case '1': return "281"; // Wesel - case "2": + case '2': return fromNumber282(number.substring(1)); - case "3": + case '3': return fromNumber283(number.substring(1)); - case "4": + case '4': return fromNumber284(number.substring(1)); - case "5": + case '5': return fromNumber285(number.substring(1)); - case "6": + case '6': return fromNumber286(number.substring(1)); - case "7": + case '7': return fromNumber287(number.substring(1)); default: return ""; @@ -2191,14 +2201,14 @@ private static String fromNumber280(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2801"; // Xanten - case "2": + case '2': return "2802"; // Alpen - case "3": + case '3': return "2803"; // Wesel-Büderich - case "4": + case '4': return "2804"; // Xanten-Marienbaum default: return ""; @@ -2210,22 +2220,22 @@ private static String fromNumber282(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2821"; // Kleve Niederrhein - case "2": + case '2': return "2822"; // Emmerich - case "3": + case '3': return "2823"; // Goch - case "4": + case '4': return "2824"; // Kalkar - case "5": + case '5': return "2825"; // Uedem - case "6": + case '6': return "2826"; // Kranenburg Niederrhein - case "7": + case '7': return "2827"; // Goch-Hassum - case "8": + case '8': return "2828"; // Emmerich-Elten default: return ""; @@ -2237,24 +2247,24 @@ private static String fromNumber283(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2831"; // Geldern - case "2": + case '2': return "2832"; // Kevelaer - case "3": + case '3': return "2833"; // Kerken - case "4": + case '4': return "2834"; // Straelen - case "5": + case '5': return "2835"; // Issum - case "6": + case '6': return "2836"; // Wachtendonk - case "7": + case '7': return "2837"; // Weeze - case "8": + case '8': return "2838"; // Sonsbeck - case "9": + case '9': return "2839"; // Straelen-Herongen default: return ""; @@ -2266,16 +2276,16 @@ private static String fromNumber284(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2841"; // Moers - case "2": + case '2': return "2842"; // Kamp-Lintfort - case "3": + case '3': return "2843"; // Rheinberg - case "4": + case '4': return "2844"; // Rheinberg-Orsoy - case "5": + case '5': return "2845"; // Neukirchen-Vluyn default: return ""; @@ -2287,24 +2297,24 @@ private static String fromNumber285(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2850"; // Rees-Haldern - case "1": + case '1': return "2851"; // Rees - case "2": + case '2': return "2852"; // Hamminkeln - case "3": + case '3': return "2853"; // Schermbeck - case "5": + case '5': return "2855"; // Voerde Niederrhein - case "6": + case '6': return "2856"; // Hamminkeln-Brünen - case "7": + case '7': return "2857"; // Rees-Mehr - case "8": + case '8': return "2858"; // Hünxe - case "9": + case '9': return "2859"; // Wesel-Bislich default: return ""; @@ -2316,20 +2326,20 @@ private static String fromNumber286(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2861"; // Borken Westf - case "2": + case '2': return "2862"; // Südlohn - case "3": + case '3': return "2863"; // Velen - case "4": + case '4': return "2864"; // Reken - case "5": + case '5': return "2865"; // Raesfeld - case "6": + case '6': return "2866"; // Dorsten-Rhade - case "7": + case '7': return "2867"; // Heiden Kr Borken default: return ""; @@ -2341,14 +2351,14 @@ private static String fromNumber287(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2871"; // Bocholt - case "2": + case '2': return "2872"; // Rhede Westf - case "3": + case '3': return "2873"; // Isselburg-Werth - case "4": + case '4': return "2874"; // Isselburg default: return ""; @@ -2360,26 +2370,26 @@ private static String fromNumber29(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber290(number.substring(1)); - case "1": + case '1': return "291"; // Meschede - case "2": + case '2': return fromNumber292(number.substring(1)); - case "3": + case '3': return fromNumber293(number.substring(1)); - case "4": + case '4': return fromNumber294(number.substring(1)); - case "5": + case '5': return fromNumber295(number.substring(1)); - case "6": + case '6': return fromNumber296(number.substring(1)); - case "7": + case '7': return fromNumber297(number.substring(1)); - case "8": + case '8': return fromNumber298(number.substring(1)); - case "9": + case '9': return fromNumber299(number.substring(1)); default: return ""; @@ -2391,14 +2401,14 @@ private static String fromNumber290(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2902"; // Warstein - case "3": + case '3': return "2903"; // Meschede-Freienohl - case "4": + case '4': return "2904"; // Bestwig - case "5": + case '5': return "2905"; // Bestwig-Ramsbeck default: return ""; @@ -2410,20 +2420,20 @@ private static String fromNumber292(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2921"; // Soest - case "2": + case '2': return "2922"; // Werl - case "3": + case '3': return "2923"; // Lippetal-Herzfeld - case "4": + case '4': return "2924"; // Möhnesee - case "5": + case '5': return "2925"; // Warstein-Allagen - case "7": + case '7': return "2927"; // Neuengeseke - case "8": + case '8': return "2928"; // Soest-Ostönnen default: return ""; @@ -2435,20 +2445,20 @@ private static String fromNumber293(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2931"; // Arnsberg - case "2": + case '2': return "2932"; // Neheim-Hüsten - case "3": + case '3': return "2933"; // Sundern Sauerland - case "4": + case '4': return "2934"; // Sundern-Altenhellefeld - case "5": + case '5': return "2935"; // Sundern-Hachen - case "7": + case '7': return "2937"; // Arnsberg-Oeventrop - case "8": + case '8': return "2938"; // Ense default: return ""; @@ -2460,20 +2470,20 @@ private static String fromNumber294(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2941"; // Lippstadt - case "2": + case '2': return "2942"; // Geseke - case "3": + case '3': return "2943"; // Erwitte - case "4": + case '4': return "2944"; // Rietberg-Mastholte - case "5": + case '5': return "2945"; // Lippstadt-Benninghausen - case "7": + case '7': return "2947"; // Anröchte - case "8": + case '8': return "2948"; // Lippstadt-Rebbeke default: return ""; @@ -2485,20 +2495,20 @@ private static String fromNumber295(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2951"; // Büren - case "2": + case '2': return "2952"; // Rüthen - case "3": + case '3': return "2953"; // Wünnenberg - case "4": + case '4': return "2954"; // Rüthen-Oestereiden - case "5": + case '5': return "2955"; // Büren-Wewelsburg - case "7": + case '7': return "2957"; // Wünnenberg-Haaren - case "8": + case '8': return "2958"; // Büren-Harth default: return ""; @@ -2510,14 +2520,14 @@ private static String fromNumber296(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2961"; // Brilon - case "2": + case '2': return "2962"; // Olsberg - case "3": + case '3': return "2963"; // Brilon-Messinghausen - case "4": + case '4': return "2964"; // Brilon-Alme default: return ""; @@ -2529,18 +2539,18 @@ private static String fromNumber297(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2971"; // Schmallenberg-Dorlar - case "2": + case '2': return "2972"; // Schmallenberg - case "3": + case '3': return "2973"; // Eslohe Sauerland - case "4": + case '4': return "2974"; // Schmallenberg-Fredeburg - case "5": + case '5': return "2975"; // Schmallenberg-Oberkirchen - case "7": + case '7': return "2977"; // Schmallenberg-Bödefeld default: return ""; @@ -2552,16 +2562,16 @@ private static String fromNumber298(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2981"; // Winterberg Westf - case "2": + case '2': return "2982"; // Medebach - case "3": + case '3': return "2983"; // Winterberg-Siedlinghausen - case "4": + case '4': return "2984"; // Hallenberg - case "5": + case '5': return "2985"; // Winterberg-Niedersfeld default: return ""; @@ -2573,14 +2583,14 @@ private static String fromNumber299(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2991"; // Marsberg-Bredelar - case "2": + case '2': return "2992"; // Marsberg - case "3": + case '3': return "2993"; // Marsberg-Canstein - case "4": + case '4': return "2994"; // Marsberg-Westheim default: return ""; @@ -2592,22 +2602,22 @@ private static String fromNumber3(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "30"; // Berlin - case "3": + case '3': return fromNumber33(number.substring(1)); - case "4": + case '4': return fromNumber34(number.substring(1)); - case "5": + case '5': return fromNumber35(number.substring(1)); - case "6": + case '6': return fromNumber36(number.substring(1)); - case "7": + case '7': return fromNumber37(number.substring(1)); - case "8": + case '8': return fromNumber38(number.substring(1)); - case "9": + case '9': return fromNumber39(number.substring(1)); default: return ""; @@ -2619,26 +2629,26 @@ private static String fromNumber33(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber330(number.substring(1)); - case "1": + case '1': return "331"; // Potsdam - case "2": + case '2': return fromNumber332(number.substring(1)); - case "3": + case '3': return fromNumber333(number.substring(1)); - case "4": + case '4': return fromNumber334(number.substring(1)); - case "5": + case '5': return "335"; // Frankfurt (Oder) - case "6": + case '6': return fromNumber336(number.substring(1)); - case "7": + case '7': return fromNumber337(number.substring(1)); - case "8": + case '8': return fromNumber338(number.substring(1)); - case "9": + case '9': return fromNumber339(number.substring(1)); default: return ""; @@ -2650,24 +2660,24 @@ private static String fromNumber330(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3301"; // Oranienburg - case "2": + case '2': return "3302"; // Hennigsdorf - case "3": + case '3': return "3303"; // Birkenwerder - case "4": + case '4': return "3304"; // Velten - case "5": + case '5': return fromNumber3305(number.substring(1)); - case "6": + case '6': return "3306"; // Gransee - case "7": + case '7': return "3307"; // Zehdenick - case "8": + case '8': return fromNumber3308(number.substring(1)); - case "9": + case '9': return fromNumber3309(number.substring(1)); default: return ""; @@ -2679,18 +2689,18 @@ private static String fromNumber3305(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33051"; // Nassenheide - case "2": + case '2': return "33052"; // Leegebruch - case "3": + case '3': return "33053"; // Zehlendorf Kr Oberhavel - case "4": + case '4': return "33054"; // Liebenwalde - case "5": + case '5': return "33055"; // Kremmen - case "6": + case '6': return "33056"; // Mühlenbeck Kr Oberhavel default: return ""; @@ -2702,24 +2712,24 @@ private static String fromNumber3308(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33080"; // Marienthal Kr Oberhavel - case "2": + case '2': return "33082"; // Menz Kr Oberhavel - case "3": + case '3': return "33083"; // Schulzendorf Kr Oberhavel - case "4": + case '4': return "33084"; // Gutengermendorf - case "5": + case '5': return "33085"; // Seilershof - case "6": + case '6': return "33086"; // Grieben Kr Oberhavel - case "7": + case '7': return "33087"; // Bredereiche - case "8": + case '8': return "33088"; // Falkenthal - case "9": + case '9': return "33089"; // Himmelpfort default: return ""; @@ -2731,10 +2741,10 @@ private static String fromNumber3309(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "33093"; // Fürstenberg Havel - case "4": + case '4': return "33094"; // Löwenberg default: return ""; @@ -2746,20 +2756,20 @@ private static String fromNumber332(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3320(number.substring(1)); - case "1": + case '1': return "3321"; // Nauen Brandenb - case "2": + case '2': return "3322"; // Falkensee - case "3": + case '3': return fromNumber3323(number.substring(1)); - case "7": + case '7': return "3327"; // Werder Havel - case "8": + case '8': return "3328"; // Teltow - case "9": + case '9': return "3329"; // Stahnsdorf default: return ""; @@ -2771,26 +2781,26 @@ private static String fromNumber3320(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33200"; // Bergholz-Rehbrücke - case "1": + case '1': return "33201"; // Gross Glienicke - case "2": + case '2': return "33202"; // Töplitz - case "3": + case '3': return "33203"; // Kleinmachnow - case "4": + case '4': return "33204"; // Beelitz Mark - case "5": + case '5': return "33205"; // Michendorf - case "6": + case '6': return "33206"; // Fichtenwalde - case "7": + case '7': return "33207"; // Gross Kreutz - case "8": + case '8': return "33208"; // Fahrland - case "9": + case '9': return "33209"; // Caputh default: return ""; @@ -2802,24 +2812,24 @@ private static String fromNumber3323(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33230"; // Börnicke Kr Havelland - case "1": + case '1': return "33231"; // Pausin - case "2": + case '2': return "33232"; // Brieselang - case "3": + case '3': return "33233"; // Ketzin - case "4": + case '4': return "33234"; // Wustermark - case "5": + case '5': return "33235"; // Friesack - case "7": + case '7': return "33237"; // Paulinenaue - case "8": + case '8': return "33238"; // Senzke - case "9": + case '9': return "33239"; // Gross Behnitz default: return ""; @@ -2831,24 +2841,24 @@ private static String fromNumber333(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3331"; // Angermünde - case "2": + case '2': return "3332"; // Schwedt/Oder - case "3": + case '3': return fromNumber3333(number.substring(1)); - case "4": + case '4': return "3334"; // Eberswalde - case "5": + case '5': return "3335"; // Finowfurt - case "6": + case '6': return fromNumber3336(number.substring(1)); - case "7": + case '7': return "3337"; // Biesenthal Brandenb - case "8": + case '8': return "3338"; // Bernau Brandenb - case "9": + case '9': return fromNumber3339(number.substring(1)); default: return ""; @@ -2860,22 +2870,22 @@ private static String fromNumber3333(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33331"; // Casekow - case "2": + case '2': return "33332"; // Gartz Oder - case "3": + case '3': return "33333"; // Tantow - case "4": + case '4': return "33334"; // Greiffenberg - case "5": + case '5': return "33335"; // Pinnow Kr Uckermark - case "6": + case '6': return "33336"; // Passow Kr Uckermark - case "7": + case '7': return "33337"; // Altkünkendorf - case "8": + case '8': return "33338"; // Stolpe/Oder default: return ""; @@ -2887,24 +2897,24 @@ private static String fromNumber3336(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33361"; // Joachimsthal - case "2": + case '2': return "33362"; // Liepe Kr Barnim - case "3": + case '3': return "33363"; // Altenhof Kr Barnim - case "4": + case '4': return "33364"; // Gross Ziethen Kr Barnim - case "5": + case '5': return "33365"; // Lüdersdorf Kr Barnim - case "6": + case '6': return "33366"; // Chorin - case "7": + case '7': return "33367"; // Friedrichswalde Brandenb - case "8": + case '8': return "33368"; // Hohensaaten - case "9": + case '9': return "33369"; // Oderberg default: return ""; @@ -2916,18 +2926,18 @@ private static String fromNumber3339(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "33393"; // Gross Schönebeck Kr Barnim - case "4": + case '4': return "33394"; // Blumberg Kr Barnim - case "5": + case '5': return "33395"; // Zerpenschleuse - case "6": + case '6': return "33396"; // Klosterfelde - case "7": + case '7': return "33397"; // Wandlitz - case "8": + case '8': return "33398"; // Werneuchen default: return ""; @@ -2939,20 +2949,20 @@ private static String fromNumber334(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3341"; // Strausberg - case "2": + case '2': return "3342"; // Neuenhagen b Berlin - case "3": + case '3': return fromNumber3343(number.substring(1)); - case "4": + case '4': return "3344"; // Bad Freienwalde - case "5": + case '5': return fromNumber3345(number.substring(1)); - case "6": + case '6': return "3346"; // Seelow - case "7": + case '7': return fromNumber3347(number.substring(1)); default: return ""; @@ -2964,22 +2974,22 @@ private static String fromNumber3343(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33432"; // Müncheberg - case "3": + case '3': return "33433"; // Buckow Märk Schweiz - case "4": + case '4': return "33434"; // Herzfelde b Strausberg - case "5": + case '5': return "33435"; // Rehfelde - case "6": + case '6': return "33436"; // Prötzel - case "7": + case '7': return "33437"; // Reichenberg b Strausberg - case "8": + case '8': return "33438"; // Altlandsberg - case "9": + case '9': return "33439"; // Fredersdorf-Vogelsdorf default: return ""; @@ -2991,18 +3001,18 @@ private static String fromNumber3345(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33451"; // Heckelberg - case "2": + case '2': return "33452"; // Neulewin - case "4": + case '4': return "33454"; // Wölsickendorf/Wollenberg - case "6": + case '6': return "33456"; // Wriezen - case "7": + case '7': return "33457"; // Altreetz - case "8": + case '8': return "33458"; // Falkenberg Mark default: return ""; @@ -3014,24 +3024,24 @@ private static String fromNumber3347(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33470"; // Lietzen - case "2": + case '2': return "33472"; // Golzow b Seelow - case "3": + case '3': return "33473"; // Zechin - case "4": + case '4': return "33474"; // Neutrebbin - case "5": + case '5': return "33475"; // Letschin - case "6": + case '6': return "33476"; // Neuhardenberg - case "7": + case '7': return "33477"; // Trebnitz b Müncheberg - case "8": + case '8': return "33478"; // Gross Neuendorf - case "9": + case '9': return "33479"; // Küstrin-Kietz default: return ""; @@ -3043,22 +3053,22 @@ private static String fromNumber336(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3360(number.substring(1)); - case "1": + case '1': return "3361"; // Fürstenwalde Spree - case "2": + case '2': return "3362"; // Erkner - case "3": + case '3': return fromNumber3363(number.substring(1)); - case "4": + case '4': return "3364"; // Eisenhüttenstadt - case "5": + case '5': return fromNumber3365(number.substring(1)); - case "6": + case '6': return "3366"; // Beeskow - case "7": + case '7': return fromNumber3367(number.substring(1)); default: return ""; @@ -3070,24 +3080,24 @@ private static String fromNumber3360(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33601"; // Podelzig - case "2": + case '2': return "33602"; // Alt Zeschdorf - case "3": + case '3': return "33603"; // Falkenhagen b Seelow - case "4": + case '4': return "33604"; // Lebus - case "5": + case '5': return "33605"; // Boossen - case "6": + case '6': return "33606"; // Müllrose - case "7": + case '7': return "33607"; // Briesen Mark - case "8": + case '8': return "33608"; // Jacobsdorf Mark - case "9": + case '9': return "33609"; // Brieskow-Finkenheerd default: return ""; @@ -3099,22 +3109,22 @@ private static String fromNumber3363(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33631"; // Bad Saarow-Pieskow - case "2": + case '2': return "33632"; // Hangelsberg - case "3": + case '3': return "33633"; // Spreenhagen - case "4": + case '4': return "33634"; // Berkenbrück Kr Oder-Spree - case "5": + case '5': return "33635"; // Arensdorf Kr Oder-Spree - case "6": + case '6': return "33636"; // Steinhöfel Kr Oder-Spree - case "7": + case '7': return "33637"; // Beerfelde - case "8": + case '8': return "33638"; // Rüdersdorf b Berlin default: return ""; @@ -3126,18 +3136,18 @@ private static String fromNumber3365(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33652"; // Neuzelle - case "3": + case '3': return "33653"; // Ziltendorf - case "4": + case '4': return "33654"; // Fünfeichen - case "5": + case '5': return "33655"; // Grunow Kr Oder-Spree - case "6": + case '6': return "33656"; // Bahro - case "7": + case '7': return "33657"; // Steinsdorf Brandenb default: return ""; @@ -3149,24 +3159,24 @@ private static String fromNumber3367(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33671"; // Lieberose - case "2": + case '2': return "33672"; // Pfaffendorfb Beeskow - case "3": + case '3': return "33673"; // Weichensdorf - case "4": + case '4': return "33674"; // Trebatsch - case "5": + case '5': return "33675"; // Tauche - case "6": + case '6': return "33676"; // Friedland b Beeskow - case "7": + case '7': return "33677"; // Glienicke b Beeskow - case "8": + case '8': return "33678"; // Storkow Mark - case "9": + case '9': return "33679"; // Wendisch Rietz default: return ""; @@ -3178,26 +3188,26 @@ private static String fromNumber337(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3370(number.substring(1)); - case "1": + case '1': return "3371"; // Luckenwalde - case "2": + case '2': return "3372"; // Jüterbog - case "3": + case '3': return fromNumber3373(number.substring(1)); - case "4": + case '4': return fromNumber3374(number.substring(1)); - case "5": + case '5': return "3375"; // Königs Wusterhausen - case "6": + case '6': return fromNumber3376(number.substring(1)); - case "7": + case '7': return "3377"; // Zossen Brandenb - case "8": + case '8': return "3378"; // Ludwigsfelde - case "9": + case '9': return "3379"; // Mahlow default: return ""; @@ -3209,16 +3219,16 @@ private static String fromNumber3370(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33701"; // Grossbeeren - case "2": + case '2': return "33702"; // Wünsdorf - case "3": + case '3': return "33703"; // Sperenberg - case "4": + case '4': return "33704"; // Baruth Mark - case "8": + case '8': return "33708"; // Rangsdorf default: return ""; @@ -3230,14 +3240,14 @@ private static String fromNumber3373(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33731"; // Trebbin - case "2": + case '2': return "33732"; // Hennickendorf b Luckenwalde - case "3": + case '3': return "33733"; // Stülpe - case "4": + case '4': return "33734"; // Felgentreu default: return ""; @@ -3249,22 +3259,22 @@ private static String fromNumber3374(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33741"; // Niedergörsdorf - case "2": + case '2': return "33742"; // Oehna Brandenb - case "3": + case '3': return "33743"; // Blönsdorf - case "4": + case '4': return "33744"; // Hohenseefeld - case "5": + case '5': return "33745"; // Petkus - case "6": + case '6': return "33746"; // Werbig b Jüterbog - case "7": + case '7': return "33747"; // Marzahna - case "8": + case '8': return "33748"; // Treuenbrietzen default: return ""; @@ -3276,24 +3286,24 @@ private static String fromNumber3376(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33760"; // Münchehofe Kr Dahme-Spreewald - case "2": + case '2': return "33762"; // Zeuthen - case "3": + case '3': return "33763"; // Bestensee - case "4": + case '4': return "33764"; // Mittenwalde Mark - case "5": + case '5': return "33765"; // Märkisch Buchholz - case "6": + case '6': return "33766"; // Teupitz - case "7": + case '7': return "33767"; // Friedersdorf b Berlin - case "8": + case '8': return "33768"; // Prieros - case "9": + case '9': return "33769"; // Töpchin default: return ""; @@ -3305,20 +3315,20 @@ private static String fromNumber338(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3381"; // Brandenburg an der Havel - case "2": + case '2': return "3382"; // Lehnin - case "3": + case '3': return fromNumber3383(number.substring(1)); - case "4": + case '4': return fromNumber3384(number.substring(1)); - case "5": + case '5': return "3385"; // Rathenow - case "6": + case '6': return "3386"; // Premnitz - case "7": + case '7': return fromNumber3387(number.substring(1)); default: return ""; @@ -3330,26 +3340,26 @@ private static String fromNumber3383(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33830"; // Ziesar - case "1": + case '1': return "33831"; // Weseram - case "2": + case '2': return "33832"; // Rogäsen - case "3": + case '3': return "33833"; // Wollin b Brandenburg - case "4": + case '4': return "33834"; // Pritzerbe - case "5": + case '5': return "33835"; // Golzow b Brandenburg - case "6": + case '6': return "33836"; // Butzow b Brandenburg - case "7": + case '7': return "33837"; // Brielow - case "8": + case '8': return "33838"; // Päwesin - case "9": + case '9': return "33839"; // Wusterwitz default: return ""; @@ -3361,22 +3371,22 @@ private static String fromNumber3384(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33841"; // Belzig - case "3": + case '3': return "33843"; // Niemegk - case "4": + case '4': return "33844"; // Brück Brandenb - case "5": + case '5': return "33845"; // Borkheide - case "6": + case '6': return "33846"; // Dippmannsdorf - case "7": + case '7': return "33847"; // Görzke - case "8": + case '8': return "33848"; // Raben - case "9": + case '9': return "33849"; // Wiesenburg Mark default: return ""; @@ -3388,22 +3398,22 @@ private static String fromNumber3387(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33870"; // Zollchow b Rathenow - case "2": + case '2': return "33872"; // Hohennauen - case "3": + case '3': return "33873"; // Grosswudicke - case "4": + case '4': return "33874"; // Stechow Brandenb - case "5": + case '5': return "33875"; // Rhinow - case "6": + case '6': return "33876"; // Buschow - case "7": + case '7': return "33877"; // Nitzahn - case "8": + case '8': return "33878"; // Nennhausen default: return ""; @@ -3415,22 +3425,22 @@ private static String fromNumber339(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3391"; // Neuruppin - case "2": + case '2': return fromNumber3392(number.substring(1)); - case "3": + case '3': return fromNumber3393(number.substring(1)); - case "4": + case '4': return "3394"; // Wittstock Dosse - case "5": + case '5': return "3395"; // Pritzwalk - case "6": + case '6': return fromNumber3396(number.substring(1)); - case "7": + case '7': return fromNumber3397(number.substring(1)); - case "8": + case '8': return fromNumber3398(number.substring(1)); default: return ""; @@ -3442,26 +3452,26 @@ private static String fromNumber3392(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33920"; // Walsleben b Neuruppin - case "1": + case '1': return "33921"; // Zechlinerhütte - case "2": + case '2': return "33922"; // Karwesee - case "3": + case '3': return "33923"; // Flecken Zechlin - case "4": + case '4': return "33924"; // Rägelin - case "5": + case '5': return "33925"; // Wustrau-Altfriesack - case "6": + case '6': return "33926"; // Herzberg Mark - case "7": + case '7': return "33927"; // Linum - case "8": + case '8': return "33928"; // Wildberg Brandenb - case "9": + case '9': return "33929"; // Gühlen-Glienicke default: return ""; @@ -3473,12 +3483,12 @@ private static String fromNumber3393(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33931"; // Rheinsberg Mark - case "2": + case '2': return "33932"; // Fehrbellin - case "3": + case '3': return "33933"; // Lindow Mark default: return ""; @@ -3490,22 +3500,22 @@ private static String fromNumber3396(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33962"; // Heiligengrabe - case "3": + case '3': return "33963"; // Wulfersdorf b Wittstock - case "4": + case '4': return "33964"; // Fretzdorf - case "5": + case '5': return "33965"; // Herzsprung b Wittstock - case "6": + case '6': return "33966"; // Dranse - case "7": + case '7': return "33967"; // Freyenstein - case "8": + case '8': return "33968"; // Meyenburg Kr Prignitz - case "9": + case '9': return "33969"; // Stepenitz default: return ""; @@ -3517,26 +3527,26 @@ private static String fromNumber3397(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33970"; // Neustadt Dosse - case "1": + case '1': return "33971"; // Kyritz Brandenb - case "2": + case '2': return "33972"; // Breddin - case "3": + case '3': return "33973"; // Zernitz b Neustadt Dosse - case "4": + case '4': return "33974"; // Dessow - case "5": + case '5': return "33975"; // Dannenwalde Kr Prignitz - case "6": + case '6': return "33976"; // Wutike - case "7": + case '7': return "33977"; // Gumtow - case "8": + case '8': return "33978"; // Segeletz - case "9": + case '9': return "33979"; // Wusterhausen Dosse default: return ""; @@ -3548,18 +3558,18 @@ private static String fromNumber3398(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33981"; // Putlitz - case "2": + case '2': return "33982"; // Hoppenrade Kr Prignitz - case "3": + case '3': return "33983"; // Gross Pankow Kr Prignitz - case "4": + case '4': return "33984"; // Blumenthal b Pritzwalk - case "6": + case '6': return "33986"; // Falkenhagen Kr Prignitz - case "9": + case '9': return "33989"; // Sadenbeck default: return ""; @@ -3571,24 +3581,24 @@ private static String fromNumber34(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "340"; // Dessau Anh - case "1": + case '1': return "341"; // Leipzig - case "2": + case '2': return fromNumber342(number.substring(1)); - case "3": + case '3': return fromNumber343(number.substring(1)); - case "4": + case '4': return fromNumber344(number.substring(1)); - case "5": + case '5': return "345"; // Halle Saale - case "6": + case '6': return fromNumber346(number.substring(1)); - case "7": + case '7': return fromNumber347(number.substring(1)); - case "9": + case '9': return fromNumber349(number.substring(1)); default: return ""; @@ -3600,22 +3610,22 @@ private static String fromNumber342(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3420(number.substring(1)); - case "1": + case '1': return "3421"; // Torgau - case "2": + case '2': return fromNumber3422(number.substring(1)); - case "3": + case '3': return "3423"; // Eilenburg - case "4": + case '4': return fromNumber3424(number.substring(1)); - case "5": + case '5': return "3425"; // Wurzen - case "6": + case '6': return fromNumber3426(number.substring(1)); - case "9": + case '9': return fromNumber3429(number.substring(1)); default: return ""; @@ -3627,20 +3637,20 @@ private static String fromNumber3420(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34202"; // Delitzsch - case "3": + case '3': return "34203"; // Zwenkau - case "4": + case '4': return "34204"; // Schkeuditz - case "5": + case '5': return "34205"; // Markranstädt - case "6": + case '6': return "34206"; // Rötha - case "7": + case '7': return "34207"; // Zwochau - case "8": + case '8': return "34208"; // Löbnitz B Delitzsch default: return ""; @@ -3652,14 +3662,14 @@ private static String fromNumber3422(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34221"; // Schildau Gneisenaustadt - case "2": + case '2': return "34222"; // Arzberg b Torgau - case "3": + case '3': return "34223"; // Dommitzsch - case "4": + case '4': return "34224"; // Belgern Sachs default: return ""; @@ -3671,14 +3681,14 @@ private static String fromNumber3424(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34241"; // Jesewitz - case "2": + case '2': return "34242"; // Hohenpriessnitz - case "3": + case '3': return "34243"; // Bad Düben - case "4": + case '4': return "34244"; // Mockrehna default: return ""; @@ -3690,12 +3700,12 @@ private static String fromNumber3426(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34261"; // Kühren b Wurzen - case "2": + case '2': return "34262"; // Falkenhain b Wurzen - case "3": + case '3': return "34263"; // Hohburg default: return ""; @@ -3707,24 +3717,24 @@ private static String fromNumber3429(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34291"; // Borsdorf - case "2": + case '2': return "34292"; // Brandis b Wurzen - case "3": + case '3': return "34293"; // Naunhof b Grimma - case "4": + case '4': return "34294"; // Rackwitz - case "5": + case '5': return "34295"; // Krensitz - case "6": + case '6': return "34296"; // Groitzsch b Pegau - case "7": + case '7': return "34297"; // Liebertwolkwitz - case "8": + case '8': return "34298"; // Taucha b Leipzig - case "9": + case '9': return "34299"; // Gaschwitz default: return ""; @@ -3736,22 +3746,22 @@ private static String fromNumber343(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3431"; // Döbeln - case "2": + case '2': return fromNumber3432(number.substring(1)); - case "3": + case '3': return "3433"; // Borna Stadt - case "4": + case '4': return fromNumber3434(number.substring(1)); - case "5": + case '5': return "3435"; // Oschatz - case "6": + case '6': return fromNumber3436(number.substring(1)); - case "7": + case '7': return "3437"; // Grimma - case "8": + case '8': return fromNumber3438(number.substring(1)); default: return ""; @@ -3763,18 +3773,18 @@ private static String fromNumber3432(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34321"; // Leisnig - case "2": + case '2': return "34322"; // Rosswein - case "4": + case '4': return "34324"; // Ostrau Sachs - case "5": + case '5': return "34325"; // Mochau-Lüttewitz - case "7": + case '7': return "34327"; // Waldheim Sachs - case "8": + case '8': return "34328"; // Hartha b Döbeln default: return ""; @@ -3786,22 +3796,22 @@ private static String fromNumber3434(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34341"; // Geithain - case "2": + case '2': return "34342"; // Neukieritzsch - case "3": + case '3': return "34343"; // Regis-Breitingen - case "4": + case '4': return "34344"; // Kohren-Sahlis - case "5": + case '5': return "34345"; // Bad Lausick - case "6": + case '6': return "34346"; // Narsdorf - case "7": + case '7': return "34347"; // Oelzschau b Borna - case "8": + case '8': return "34348"; // Frohburg default: return ""; @@ -3813,14 +3823,14 @@ private static String fromNumber3436(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34361"; // Dahlen Sachs - case "2": + case '2': return "34362"; // Mügeln b Oschatz - case "3": + case '3': return "34363"; // Cavertitz - case "4": + case '4': return "34364"; // Wermsdorf default: return ""; @@ -3832,18 +3842,18 @@ private static String fromNumber3438(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34381"; // Colditz - case "2": + case '2': return "34382"; // Nerchau - case "3": + case '3': return "34383"; // Trebsen Mulde - case "4": + case '4': return "34384"; // Grossbothen - case "5": + case '5': return "34385"; // Mutzschen - case "6": + case '6': return "34386"; // Dürrweitzschen B Grimma default: return ""; @@ -3855,24 +3865,24 @@ private static String fromNumber344(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3441"; // Zeitz - case "2": + case '2': return fromNumber3442(number.substring(1)); - case "3": + case '3': return "3443"; // Weissenfels Sachs-Anh - case "4": + case '4': return fromNumber3444(number.substring(1)); - case "5": + case '5': return "3445"; // Naumburg Saale - case "6": + case '6': return fromNumber3446(number.substring(1)); - case "7": + case '7': return "3447"; // Altenburg Thür - case "8": + case '8': return "3448"; // Meuselwitz Thür - case "9": + case '9': return fromNumber3449(number.substring(1)); default: return ""; @@ -3884,16 +3894,16 @@ private static String fromNumber3442(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34422"; // Osterfeld - case "3": + case '3': return "34423"; // Heuckewalde - case "4": + case '4': return "34424"; // Reuden b Zeitz - case "5": + case '5': return "34425"; // Droyssig - case "6": + case '6': return "34426"; // Kayna default: return ""; @@ -3905,16 +3915,16 @@ private static String fromNumber3444(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34441"; // Hohenmölsen - case "3": + case '3': return "34443"; // Teuchern - case "4": + case '4': return "34444"; // Lützen - case "5": + case '5': return "34445"; // Stößen - case "6": + case '6': return "34446"; // Grosskorbetha default: return ""; @@ -3926,20 +3936,20 @@ private static String fromNumber3446(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34461"; // Nebra Unstrut - case "2": + case '2': return "34462"; // Laucha Unstrut - case "3": + case '3': return "34463"; // Bad Kösen - case "4": + case '4': return "34464"; // Freyburg Unstrut - case "5": + case '5': return "34465"; // Bad Bibra - case "6": + case '6': return "34466"; // Janisroda - case "7": + case '7': return "34467"; // Eckartsberga default: return ""; @@ -3951,22 +3961,22 @@ private static String fromNumber3449(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34491"; // Schmölln Thür - case "2": + case '2': return "34492"; // Lucka - case "3": + case '3': return "34493"; // Gößnitz Thür - case "4": + case '4': return "34494"; // Ehrenhain - case "5": + case '5': return "34495"; // Dobitschen - case "6": + case '6': return "34496"; // Nöbdenitz - case "7": + case '7': return "34497"; // Langenleuba-Niederhain - case "8": + case '8': return "34498"; // Rositz default: return ""; @@ -3978,24 +3988,24 @@ private static String fromNumber346(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3460(number.substring(1)); - case "1": + case '1': return "3461"; // Merseburg Saale - case "2": + case '2': return "3462"; // Bad Dürrenberg - case "3": + case '3': return fromNumber3463(number.substring(1)); - case "4": + case '4': return "3464"; // Sangerhausen - case "5": + case '5': return fromNumber3465(number.substring(1)); - case "6": + case '6': return "3466"; // Artern Unstrut - case "7": + case '7': return fromNumber3467(number.substring(1)); - case "9": + case '9': return fromNumber3469(number.substring(1)); default: return ""; @@ -4007,24 +4017,24 @@ private static String fromNumber3460(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "34600"; // Ostrau Saalkreis - case "1": + case '1': return "34601"; // Teutschenthal - case "2": + case '2': return "34602"; // Landsberg Sachs-Anh - case "3": + case '3': return "34603"; // Nauendorf Sachs-Anh - case "4": + case '4': return "34604"; // Niemberg - case "5": + case '5': return "34605"; // Gröbers - case "6": + case '6': return "34606"; // Teicha Sachs-Anh - case "7": + case '7': return "34607"; // Wettin - case "9": + case '9': return "34609"; // Salzmünde default: return ""; @@ -4036,20 +4046,20 @@ private static String fromNumber3463(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34632"; // Mücheln Geiseltal - case "3": + case '3': return "34633"; // Braunsbedra - case "5": + case '5': return "34635"; // Bad Lauchstädt - case "6": + case '6': return "34636"; // Schafstädt - case "7": + case '7': return "34637"; // Frankleben - case "8": + case '8': return "34638"; // Zöschen - case "9": + case '9': return "34639"; // Wallendorf Luppe default: return ""; @@ -4061,20 +4071,20 @@ private static String fromNumber3465(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34651"; // Rossla - case "2": + case '2': return "34652"; // Allstedt - case "3": + case '3': return "34653"; // Rottleberode - case "4": + case '4': return "34654"; // Stolberg Harz - case "6": + case '6': return "34656"; // Wallhausen Sachs-Anh - case "8": + case '8': return "34658"; // Hayn Harz - case "9": + case '9': return "34659"; // Blankenheim b Sangerhausen default: return ""; @@ -4086,12 +4096,12 @@ private static String fromNumber3467(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34671"; // Bad Frankenhausen Kyffhäuser - case "2": + case '2': return "34672"; // Rossleben - case "3": + case '3': return "34673"; // Heldrungen default: return ""; @@ -4103,10 +4113,10 @@ private static String fromNumber3469(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34691"; // Könnern - case "2": + case '2': return "34692"; // Alsleben Saale default: return ""; @@ -4118,22 +4128,22 @@ private static String fromNumber347(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3471"; // Bernburg Saale - case "2": + case '2': return fromNumber3472(number.substring(1)); - case "3": + case '3': return "3473"; // Aschersleben Sachs-Anh - case "4": + case '4': return fromNumber3474(number.substring(1)); - case "5": + case '5': return "3475"; // Lutherstadt Eisleben - case "6": + case '6': return "3476"; // Hettstedt Sachs-Anh - case "7": + case '7': return fromNumber3477(number.substring(1)); - case "8": + case '8': return fromNumber3478(number.substring(1)); default: return ""; @@ -4145,10 +4155,10 @@ private static String fromNumber3472(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34721"; // Nienburg Saale - case "2": + case '2': return "34722"; // Preusslitz default: return ""; @@ -4160,16 +4170,16 @@ private static String fromNumber3474(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34741"; // Frose - case "2": + case '2': return "34742"; // Sylda - case "3": + case '3': return "34743"; // Ermsleben - case "5": + case '5': return "34745"; // Winningen Sachs-Anh - case "6": + case '6': return "34746"; // Giersleben default: return ""; @@ -4181,20 +4191,20 @@ private static String fromNumber3477(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34771"; // Querfurt - case "2": + case '2': return "34772"; // Helbra - case "3": + case '3': return "34773"; // Schwittersdorf - case "4": + case '4': return "34774"; // Röblingen am See - case "5": + case '5': return "34775"; // Wippra - case "6": + case '6': return "34776"; // Rothenschirmbach - case "9": + case '9': return "34779"; // Abberode default: return ""; @@ -4206,14 +4216,14 @@ private static String fromNumber3478(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34781"; // Greifenhagen - case "2": + case '2': return "34782"; // Mansfeld Südharz - case "3": + case '3': return "34783"; // Gerbstedt - case "5": + case '5': return "34785"; // Sandersleben default: return ""; @@ -4225,22 +4235,22 @@ private static String fromNumber349(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3490(number.substring(1)); - case "1": + case '1': return "3491"; // Lutherstadt Wittenberg - case "2": + case '2': return fromNumber3492(number.substring(1)); - case "3": + case '3': return "3493"; // Bitterfeld - case "4": + case '4': return "3494"; // Wolfen - case "5": + case '5': return fromNumber3495(number.substring(1)); - case "6": + case '6': return "3496"; // Köthen Anhalt - case "7": + case '7': return fromNumber3497(number.substring(1)); default: return ""; @@ -4252,20 +4262,20 @@ private static String fromNumber3490(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34901"; // Roßlau Elbe - case "3": + case '3': return "34903"; // Coswig Anhalt - case "4": + case '4': return "34904"; // Oranienbaum - case "5": + case '5': return "34905"; // Wörlitz - case "6": + case '6': return "34906"; // Raguhn - case "7": + case '7': return "34907"; // Jeber-Bergfrieden - case "9": + case '9': return "34909"; // Aken Elbe default: return ""; @@ -4277,26 +4287,26 @@ private static String fromNumber3492(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "34920"; // Kropstädt - case "1": + case '1': return "34921"; // Kemberg - case "2": + case '2': return "34922"; // Mühlanger - case "3": + case '3': return "34923"; // Cobbelsdorf - case "4": + case '4': return "34924"; // Zahna - case "5": + case '5': return "34925"; // Bad Schmiedeberg - case "6": + case '6': return "34926"; // Pretzsch Elbe - case "7": + case '7': return "34927"; // Globig-Bleddin - case "8": + case '8': return "34928"; // Seegrehna - case "9": + case '9': return "34929"; // Straach default: return ""; @@ -4308,14 +4318,14 @@ private static String fromNumber3495(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "34953"; // Gräfenhainichen - case "4": + case '4': return "34954"; // Roitzsch b Bitterfeld - case "5": + case '5': return "34955"; // Gossa - case "6": + case '6': return "34956"; // Zörbig default: return ""; @@ -4327,18 +4337,18 @@ private static String fromNumber3497(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "34973"; // Osternienburg - case "5": + case '5': return "34975"; // Görzig Kr Köthen - case "6": + case '6': return "34976"; // Gröbzig - case "7": + case '7': return "34977"; // Quellendorf - case "8": + case '8': return "34978"; // Radegast Kr Köthen - case "9": + case '9': return "34979"; // Wulfen Sachs-Anh default: return ""; @@ -4350,26 +4360,26 @@ private static String fromNumber35(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber350(number.substring(1)); - case "1": + case '1': return "351"; // Dresden - case "2": + case '2': return fromNumber352(number.substring(1)); - case "3": + case '3': return fromNumber353(number.substring(1)); - case "4": + case '4': return fromNumber354(number.substring(1)); - case "5": + case '5': return "355"; // Cottbus - case "6": + case '6': return fromNumber356(number.substring(1)); - case "7": + case '7': return fromNumber357(number.substring(1)); - case "8": + case '8': return fromNumber358(number.substring(1)); - case "9": + case '9': return fromNumber359(number.substring(1)); default: return ""; @@ -4381,16 +4391,16 @@ private static String fromNumber350(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3501"; // Pirna - case "2": + case '2': return fromNumber3502(number.substring(1)); - case "3": + case '3': return fromNumber3503(number.substring(1)); - case "4": + case '4': return "3504"; // Dippoldiswalde - case "5": + case '5': return fromNumber3505(number.substring(1)); default: return ""; @@ -4402,24 +4412,24 @@ private static String fromNumber3502(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35020"; // Struppen - case "1": + case '1': return "35021"; // Königstein Sächs Schweiz - case "2": + case '2': return "35022"; // Bad Schandau - case "3": + case '3': return "35023"; // Bad Gottleuba - case "4": + case '4': return "35024"; // Stadt Wehlen - case "5": + case '5': return "35025"; // Liebstadt - case "6": + case '6': return "35026"; // Dürrröhrsdorf-Dittersbach - case "7": + case '7': return "35027"; // Weesenstein - case "8": + case '8': return "35028"; // Krippen default: return ""; @@ -4431,10 +4441,10 @@ private static String fromNumber3503(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35032"; // Langenhennersdorf - case "3": + case '3': return "35033"; // Rosenthal Sächs Schweiz default: return ""; @@ -4446,20 +4456,20 @@ private static String fromNumber3505(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35052"; // Kipsdorf Kurort - case "3": + case '3': return "35053"; // Glashütte Sachs - case "4": + case '4': return "35054"; // Lauenstein Sachs - case "5": + case '5': return "35055"; // Höckendorf b Dippoldiswalde - case "6": + case '6': return "35056"; // Altenberg Sachs - case "7": + case '7': return "35057"; // Hermsdorf Erzgeb - case "8": + case '8': return "35058"; // Pretzschendorf default: return ""; @@ -4471,24 +4481,24 @@ private static String fromNumber352(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3520(number.substring(1)); - case "1": + case '1': return "3521"; // Meissen - case "2": + case '2': return "3522"; // Grossenhain Sachs - case "3": + case '3': return "3523"; // Coswig b Dresden - case "4": + case '4': return fromNumber3524(number.substring(1)); - case "5": + case '5': return "3525"; // Riesa - case "6": + case '6': return fromNumber3526(number.substring(1)); - case "8": + case '8': return "3528"; // Radeberg - case "9": + case '9': return "3529"; // Heidenau Sachs default: return ""; @@ -4500,26 +4510,26 @@ private static String fromNumber3520(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35200"; // Arnsdorf b Dresden - case "1": + case '1': return "35201"; // Langebrück - case "2": + case '2': return "35202"; // Klingenberg Sachs - case "3": + case '3': return "35203"; // Tharandt - case "4": + case '4': return "35204"; // Wilsdruff - case "5": + case '5': return "35205"; // Ottendorf-Okrilla - case "6": + case '6': return "35206"; // Kreischa b Dresden - case "7": + case '7': return "35207"; // Moritzburg - case "8": + case '8': return "35208"; // Radeburg - case "9": + case '9': return "35209"; // Mohorn default: return ""; @@ -4531,26 +4541,26 @@ private static String fromNumber3524(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35240"; // Tauscha b Großenhain - case "1": + case '1': return "35241"; // Lommatzsch - case "2": + case '2': return "35242"; // Nossen - case "3": + case '3': return "35243"; // Weinböhla - case "4": + case '4': return "35244"; // Krögis - case "5": + case '5': return "35245"; // Burkhardswalde-Munzig - case "6": + case '6': return "35246"; // Ziegenhain Sachs - case "7": + case '7': return "35247"; // Zehren Sachs - case "8": + case '8': return "35248"; // Schönfeld b Großenhain - case "9": + case '9': return "35249"; // Basslitz default: return ""; @@ -4562,18 +4572,18 @@ private static String fromNumber3526(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35263"; // Gröditz b Riesa - case "4": + case '4': return "35264"; // Strehla - case "5": + case '5': return "35265"; // Glaubitz - case "6": + case '6': return "35266"; // Heyda b Riesa - case "7": + case '7': return "35267"; // Diesbar-Seusslitz - case "8": + case '8': return "35268"; // Stauchitz default: return ""; @@ -4585,22 +4595,22 @@ private static String fromNumber353(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3531"; // Finsterwalde - case "2": + case '2': return fromNumber3532(number.substring(1)); - case "3": + case '3': return "3533"; // Elsterwerda - case "4": + case '4': return fromNumber3534(number.substring(1)); - case "5": + case '5': return "3535"; // Herzberg Elster - case "6": + case '6': return fromNumber3536(number.substring(1)); - case "7": + case '7': return "3537"; // Jessen Elster - case "8": + case '8': return fromNumber3538(number.substring(1)); default: return ""; @@ -4612,20 +4622,20 @@ private static String fromNumber3532(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35322"; // Doberlug-Kirchhain - case "3": + case '3': return "35323"; // Sonnewalde - case "4": + case '4': return "35324"; // Crinitz - case "5": + case '5': return "35325"; // Rückersdorf b Finsterwalde - case "6": + case '6': return "35326"; // Schönborn Kr Elbe-Elster - case "7": + case '7': return "35327"; // Priessen - case "9": + case '9': return "35329"; // Dollenchen default: return ""; @@ -4637,12 +4647,12 @@ private static String fromNumber3534(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35341"; // Bad Liebenwerda - case "2": + case '2': return "35342"; // Mühlberg Elbe - case "3": + case '3': return "35343"; // Hirschfeld b Elsterwerda default: return ""; @@ -4654,16 +4664,16 @@ private static String fromNumber3536(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35361"; // Schlieben - case "2": + case '2': return "35362"; // Schönewalde b Herzberg - case "3": + case '3': return "35363"; // Fermerswalde - case "4": + case '4': return "35364"; // Lebusa - case "5": + case '5': return "35365"; // Falkenberg Elster default: return ""; @@ -4675,20 +4685,20 @@ private static String fromNumber3538(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35383"; // Elster Elbe - case "4": + case '4': return "35384"; // Steinsdorf b Jessen - case "5": + case '5': return "35385"; // Annaburg - case "6": + case '6': return "35386"; // Prettin - case "7": + case '7': return "35387"; // Seyda - case "8": + case '8': return "35388"; // Klöden - case "9": + case '9': return "35389"; // Holzdorf Elster default: return ""; @@ -4700,20 +4710,20 @@ private static String fromNumber354(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3541"; // Calau - case "2": + case '2': return "3542"; // Lübbenau Spreewald - case "3": + case '3': return fromNumber3543(number.substring(1)); - case "4": + case '4': return "3544"; // Luckau Brandenb - case "5": + case '5': return fromNumber3545(number.substring(1)); - case "6": + case '6': return "3546"; // Lübben Spreewald - case "7": + case '7': return fromNumber3547(number.substring(1)); default: return ""; @@ -4725,16 +4735,16 @@ private static String fromNumber3543(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35433"; // Vetschau - case "4": + case '4': return "35434"; // Altdöbern - case "5": + case '5': return "35435"; // Gollmitz b Calau - case "6": + case '6': return "35436"; // Laasow b Calau - case "9": + case '9': return "35439"; // Zinnitz default: return ""; @@ -4746,18 +4756,18 @@ private static String fromNumber3545(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35451"; // Dahme Brandenb - case "2": + case '2': return "35452"; // Golssen - case "3": + case '3': return "35453"; // Drahnsdorf - case "4": + case '4': return "35454"; // Uckro - case "5": + case '5': return "35455"; // Walddrehna - case "6": + case '6': return "35456"; // Terpt default: return ""; @@ -4769,22 +4779,22 @@ private static String fromNumber3547(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35471"; // Birkenhainchen - case "2": + case '2': return "35472"; // Schlepzig - case "3": + case '3': return "35473"; // Neu Lübbenau - case "4": + case '4': return "35474"; // Schönwalde b Lübben - case "5": + case '5': return "35475"; // Straupitz - case "6": + case '6': return "35476"; // Wittmannsdorf-Bückchen - case "7": + case '7': return "35477"; // Rietzneuendorf-Friedrichshof - case "8": + case '8': return "35478"; // Goyatz default: return ""; @@ -4796,18 +4806,18 @@ private static String fromNumber356(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3560(number.substring(1)); - case "1": + case '1': return "3561"; // Guben - case "2": + case '2': return "3562"; // Forst Lausitz - case "3": + case '3': return "3563"; // Spremberg - case "4": + case '4': return "3564"; // Schwarze Pumpe - case "9": + case '9': return fromNumber3569(number.substring(1)); default: return ""; @@ -4819,26 +4829,26 @@ private static String fromNumber3560(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35600"; // Döbern NL - case "1": + case '1': return "35601"; // Peitz - case "2": + case '2': return "35602"; // Drebkau - case "3": + case '3': return "35603"; // Burg Spreewald - case "4": + case '4': return "35604"; // Krieschow - case "5": + case '5': return "35605"; // Komptendorf - case "6": + case '6': return "35606"; // Briesen b Cottbus - case "7": + case '7': return "35607"; // Jänschwalde - case "8": + case '8': return "35608"; // Gross Ossnig - case "9": + case '9': return "35609"; // Drachhausen default: return ""; @@ -4850,22 +4860,22 @@ private static String fromNumber3569(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35691"; // Bärenklau NL - case "2": + case '2': return "35692"; // Kerkwitz - case "3": + case '3': return "35693"; // Lauschütz - case "4": + case '4': return "35694"; // Gosda b Klinge - case "5": + case '5': return "35695"; // Simmersdorf - case "6": + case '6': return "35696"; // Briesnig - case "7": + case '7': return "35697"; // Bagenz - case "8": + case '8': return "35698"; // Hornow default: return ""; @@ -4877,24 +4887,24 @@ private static String fromNumber357(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3571"; // Hoyerswerda - case "2": + case '2': return fromNumber3572(number.substring(1)); - case "3": + case '3': return "3573"; // Senftenberg - case "4": + case '4': return "3574"; // Lauchhammer - case "5": + case '5': return fromNumber3575(number.substring(1)); - case "6": + case '6': return "3576"; // Weisswasser - case "7": + case '7': return fromNumber3577(number.substring(1)); - case "8": + case '8': return "3578"; // Kamenz - case "9": + case '9': return fromNumber3579(number.substring(1)); default: return ""; @@ -4906,20 +4916,20 @@ private static String fromNumber3572(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35722"; // Lauta b Hoyerswerda - case "3": + case '3': return "35723"; // Bernsdorf OL - case "4": + case '4': return "35724"; // Lohsa - case "5": + case '5': return "35725"; // Wittichenau - case "6": + case '6': return "35726"; // Groß Särchen - case "7": + case '7': return "35727"; // Burghammer - case "8": + case '8': return "35728"; // Uhyst Spree default: return ""; @@ -4931,18 +4941,18 @@ private static String fromNumber3575(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35751"; // Welzow - case "2": + case '2': return "35752"; // Ruhland - case "3": + case '3': return "35753"; // Großräschen - case "4": + case '4': return "35754"; // Klettwitz - case "5": + case '5': return "35755"; // Ortrand - case "6": + case '6': return "35756"; // Hosena default: return ""; @@ -4954,16 +4964,16 @@ private static String fromNumber3577(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35771"; // Bad Muskau - case "2": + case '2': return "35772"; // Rietschen - case "3": + case '3': return "35773"; // Schleife - case "4": + case '4': return "35774"; // Boxberg Sachs - case "5": + case '5': return "35775"; // Pechern default: return ""; @@ -4975,16 +4985,16 @@ private static String fromNumber3579(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35792"; // Ossling - case "3": + case '3': return "35793"; // Elstra - case "5": + case '5': return "35795"; // Königsbrück - case "6": + case '6': return "35796"; // Panschwitz-Kuckau - case "7": + case '7': return "35797"; // Schwepnitz default: return ""; @@ -4996,24 +5006,24 @@ private static String fromNumber358(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3581"; // Görlitz - case "2": + case '2': return fromNumber3582(number.substring(1)); - case "3": + case '3': return "3583"; // Zittau - case "4": + case '4': return fromNumber3584(number.substring(1)); - case "5": + case '5': return "3585"; // Löbau - case "6": + case '6': return "3586"; // Neugersdorf Sachs - case "7": + case '7': return fromNumber3587(number.substring(1)); - case "8": + case '8': return "3588"; // Niesky - case "9": + case '9': return fromNumber3589(number.substring(1)); default: return ""; @@ -5025,22 +5035,22 @@ private static String fromNumber3582(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35820"; // Zodel - case "2": + case '2': return "35822"; // Hagenwerder - case "3": + case '3': return "35823"; // Ostritz - case "5": + case '5': return "35825"; // Kodersdorf - case "6": + case '6': return "35826"; // Königshain b Görlitz - case "7": + case '7': return "35827"; // Nieder-Seifersdorf - case "8": + case '8': return "35828"; // Reichenbach OL - case "9": + case '9': return "35829"; // Gersdorf b Görlitz default: return ""; @@ -5052,14 +5062,14 @@ private static String fromNumber3584(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35841"; // Großschönau Sachs - case "2": + case '2': return "35842"; // Oderwitz - case "3": + case '3': return "35843"; // Hirschfelde b Zittau - case "4": + case '4': return "35844"; // Oybin Kurort default: return ""; @@ -5071,18 +5081,18 @@ private static String fromNumber3587(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35872"; // Neusalza-Spremberg - case "3": + case '3': return "35873"; // Herrnhut - case "4": + case '4': return "35874"; // Bernstadt a d Eigen - case "5": + case '5': return "35875"; // Obercunnersdorf b Löbau - case "6": + case '6': return "35876"; // Weissenberg Sachs - case "7": + case '7': return "35877"; // Cunewalde default: return ""; @@ -5094,16 +5104,16 @@ private static String fromNumber3589(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35891"; // Rothenburg OL - case "2": + case '2': return "35892"; // Horka OL - case "3": + case '3': return "35893"; // Mücka - case "4": + case '4': return "35894"; // Hähnichen - case "5": + case '5': return "35895"; // Klitten default: return ""; @@ -5115,20 +5125,20 @@ private static String fromNumber359(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3591"; // Bautzen - case "2": + case '2': return "3592"; // Kirschau - case "3": + case '3': return fromNumber3593(number.substring(1)); - case "4": + case '4': return "3594"; // Bischofswerda - case "5": + case '5': return fromNumber3595(number.substring(1)); - case "6": + case '6': return "3596"; // Neustadt i Sa - case "7": + case '7': return fromNumber3597(number.substring(1)); default: return ""; @@ -5140,26 +5150,26 @@ private static String fromNumber3593(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35930"; // Seitschen - case "1": + case '1': return "35931"; // Königswartha - case "2": + case '2': return "35932"; // Guttau - case "3": + case '3': return "35933"; // Neschwitz - case "4": + case '4': return "35934"; // Grossdubrau - case "5": + case '5': return "35935"; // Kleinwelka - case "6": + case '6': return "35936"; // Sohland Spree - case "7": + case '7': return "35937"; // Prischwitz - case "8": + case '8': return "35938"; // Großpostwitz OL - case "9": + case '9': return "35939"; // Hochkirch default: return ""; @@ -5171,16 +5181,16 @@ private static String fromNumber3595(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35951"; // Neukirch Lausitz - case "2": + case '2': return "35952"; // Großröhrsdorf OL - case "3": + case '3': return "35953"; // Burkau - case "4": + case '4': return "35954"; // Grossharthau - case "5": + case '5': return "35955"; // Pulsnitz default: return ""; @@ -5192,14 +5202,14 @@ private static String fromNumber3597(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35971"; // Sebnitz - case "3": + case '3': return "35973"; // Stolpen - case "4": + case '4': return "35974"; // Hinterhermsdorf - case "5": + case '5': return "35975"; // Hohnstein default: return ""; @@ -5211,26 +5221,26 @@ private static String fromNumber36(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber360(number.substring(1)); - case "1": + case '1': return "361"; // Erfurt - case "2": + case '2': return fromNumber362(number.substring(1)); - case "3": + case '3': return fromNumber363(number.substring(1)); - case "4": + case '4': return fromNumber364(number.substring(1)); - case "5": + case '5': return "365"; // Gera - case "6": + case '6': return fromNumber366(number.substring(1)); - case "7": + case '7': return fromNumber367(number.substring(1)); - case "8": + case '8': return fromNumber368(number.substring(1)); - case "9": + case '9': return fromNumber369(number.substring(1)); default: return ""; @@ -5242,22 +5252,22 @@ private static String fromNumber360(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3601"; // Mühlhausen Thür - case "2": + case '2': return fromNumber3602(number.substring(1)); - case "3": + case '3': return "3603"; // Bad Langensalza - case "4": + case '4': return fromNumber3604(number.substring(1)); - case "5": + case '5': return "3605"; // Leinefelde - case "6": + case '6': return "3606"; // Heiligenstadt Heilbad - case "7": + case '7': return fromNumber3607(number.substring(1)); - case "8": + case '8': return fromNumber3608(number.substring(1)); default: return ""; @@ -5269,26 +5279,26 @@ private static String fromNumber3602(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36020"; // Ebeleben - case "1": + case '1': return "36021"; // Schlotheim - case "2": + case '2': return "36022"; // Grossengottern - case "3": + case '3': return "36023"; // Horsmar - case "4": + case '4': return "36024"; // Diedorf b Mühlhausen Thür - case "5": + case '5': return "36025"; // Körner - case "6": + case '6': return "36026"; // Struth b Mühlhausen Thür - case "7": + case '7': return "36027"; // Lengenfeld Unterm Stein - case "8": + case '8': return "36028"; // Kammerforst Thür - case "9": + case '9': return "36029"; // Menteroda default: return ""; @@ -5300,12 +5310,12 @@ private static String fromNumber3604(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36041"; // Bad Tennstedt - case "2": + case '2': return "36042"; // Tonna - case "3": + case '3': return "36043"; // Kirchheilingen default: return ""; @@ -5317,18 +5327,18 @@ private static String fromNumber3607(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36071"; // Teistungen - case "2": + case '2': return "36072"; // Weißenborn-Lüderode - case "4": + case '4': return "36074"; // Worbis - case "5": + case '5': return "36075"; // Dingelstädt Eichsfeld - case "6": + case '6': return "36076"; // Niederorschel - case "7": + case '7': return "36077"; // Grossbodungen default: return ""; @@ -5340,18 +5350,18 @@ private static String fromNumber3608(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36081"; // Arenshausen - case "2": + case '2': return "36082"; // Ershausen - case "3": + case '3': return "36083"; // Uder - case "4": + case '4': return "36084"; // Heuthen - case "5": + case '5': return "36085"; // Reinholterode - case "7": + case '7': return "36087"; // Wüstheuterode default: return ""; @@ -5363,22 +5373,22 @@ private static String fromNumber362(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3620(number.substring(1)); - case "1": + case '1': return "3621"; // Gotha Thür - case "2": + case '2': return "3622"; // Waltershausen Thür - case "3": + case '3': return "3623"; // Friedrichroda - case "4": + case '4': return "3624"; // Ohrdruf - case "5": + case '5': return fromNumber3625(number.substring(1)); - case "8": + case '8': return "3628"; // Arnstadt - case "9": + case '9': return "3629"; // Stadtilm default: return ""; @@ -5390,26 +5400,26 @@ private static String fromNumber3620(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36200"; // Elxleben b Arnstadt - case "1": + case '1': return "36201"; // Walschleben - case "2": + case '2': return "36202"; // Neudietendorf - case "3": + case '3': return "36203"; // Vieselbach - case "4": + case '4': return "36204"; // Stotternheim - case "5": + case '5': return "36205"; // Gräfenroda - case "6": + case '6': return "36206"; // Grossfahner - case "7": + case '7': return "36207"; // Plaue Thür - case "8": + case '8': return "36208"; // Ermstedt - case "9": + case '9': return "36209"; // Klettbach default: return ""; @@ -5421,22 +5431,22 @@ private static String fromNumber3625(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "36252"; // Tambach-Dietharz Thür Wald - case "3": + case '3': return "36253"; // Georgenthal Thür Wald - case "4": + case '4': return "36254"; // Friedrichswerth - case "5": + case '5': return "36255"; // Goldbach b Gotha - case "6": + case '6': return "36256"; // Wechmar - case "7": + case '7': return "36257"; // Luisenthal Thür - case "8": + case '8': return "36258"; // Friemar - case "9": + case '9': return "36259"; // Tabarz Thür Wald default: return ""; @@ -5448,20 +5458,20 @@ private static String fromNumber363(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3631"; // Nordhausen Thür - case "2": + case '2': return "3632"; // Sondershausen - case "3": + case '3': return fromNumber3633(number.substring(1)); - case "4": + case '4': return "3634"; // Sömmerda - case "5": + case '5': return "3635"; // Kölleda - case "6": + case '6': return "3636"; // Greussen - case "7": + case '7': return fromNumber3637(number.substring(1)); default: return ""; @@ -5473,24 +5483,24 @@ private static String fromNumber3633(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36330"; // Grossberndten - case "1": + case '1': return "36331"; // Ilfeld - case "2": + case '2': return "36332"; // Ellrich - case "3": + case '3': return "36333"; // Heringen Helme - case "4": + case '4': return "36334"; // Wolkramshausen - case "5": + case '5': return "36335"; // Grosswechsungen - case "6": + case '6': return "36336"; // Klettenberg - case "7": + case '7': return "36337"; // Schiedungen - case "8": + case '8': return "36338"; // Bleicherode default: return ""; @@ -5502,26 +5512,26 @@ private static String fromNumber3637(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36370"; // Grossenehrich - case "1": + case '1': return "36371"; // Schlossvippach - case "2": + case '2': return "36372"; // Kleinneuhausen - case "3": + case '3': return "36373"; // Buttstädt - case "4": + case '4': return "36374"; // Weissensee - case "5": + case '5': return "36375"; // Kindelbrück - case "6": + case '6': return "36376"; // Straussfurt - case "7": + case '7': return "36377"; // Rastenberg - case "8": + case '8': return "36378"; // Ostramondra - case "9": + case '9': return "36379"; // Holzengel default: return ""; @@ -5533,22 +5543,22 @@ private static String fromNumber364(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3641"; // Jena - case "2": + case '2': return fromNumber3642(number.substring(1)); - case "3": + case '3': return "3643"; // Weimar Thür - case "4": + case '4': return "3644"; // Apolda - case "5": + case '5': return fromNumber3645(number.substring(1)); - case "6": + case '6': return fromNumber3646(number.substring(1)); - case "7": + case '7': return "3647"; // Pößneck - case "8": + case '8': return fromNumber3648(number.substring(1)); default: return ""; @@ -5560,22 +5570,22 @@ private static String fromNumber3642(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36421"; // Camburg - case "2": + case '2': return "36422"; // Reinstädt Thür - case "3": + case '3': return "36423"; // Orlamünde - case "4": + case '4': return "36424"; // Kahla Thür - case "5": + case '5': return "36425"; // Isserstedt - case "6": + case '6': return "36426"; // Ottendorf b Stadtroda - case "7": + case '7': return "36427"; // Dornburg Saale - case "8": + case '8': return "36428"; // Stadtroda default: return ""; @@ -5587,20 +5597,20 @@ private static String fromNumber3645(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36450"; // Kranichfeld - case "1": + case '1': return "36451"; // Buttelstedt - case "2": + case '2': return "36452"; // Berlstedt - case "3": + case '3': return "36453"; // Mellingen - case "4": + case '4': return "36454"; // Magdala - case "8": + case '8': return "36458"; // Bad Berka - case "9": + case '9': return "36459"; // Blankenhain Thür default: return ""; @@ -5612,16 +5622,16 @@ private static String fromNumber3646(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36461"; // Bad Sulza - case "2": + case '2': return "36462"; // Ossmannstedt - case "3": + case '3': return "36463"; // Gebstedt - case "4": + case '4': return "36464"; // Wormstedt - case "5": + case '5': return "36465"; // Oberndorf b Apolda default: return ""; @@ -5633,14 +5643,14 @@ private static String fromNumber3648(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36481"; // Neustadt an der Orla - case "2": + case '2': return "36482"; // Triptis - case "3": + case '3': return "36483"; // Ziegenrück - case "4": + case '4': return "36484"; // Knau b Pößneck default: return ""; @@ -5652,20 +5662,20 @@ private static String fromNumber366(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3660(number.substring(1)); - case "1": + case '1': return "3661"; // Greiz - case "2": + case '2': return fromNumber3662(number.substring(1)); - case "3": + case '3': return "3663"; // Schleiz - case "4": + case '4': return fromNumber3664(number.substring(1)); - case "5": + case '5': return fromNumber3665(number.substring(1)); - case "9": + case '9': return fromNumber3669(number.substring(1)); default: return ""; @@ -5677,22 +5687,22 @@ private static String fromNumber3660(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36601"; // Hermsdorf Thür - case "2": + case '2': return "36602"; // Ronneburg Thür - case "3": + case '3': return "36603"; // Weida - case "4": + case '4': return "36604"; // Münchenbernsdorf - case "5": + case '5': return "36605"; // Bad Köstritz - case "6": + case '6': return "36606"; // Kraftsdorf - case "7": + case '7': return "36607"; // Niederpöllnitz - case "8": + case '8': return "36608"; // Seelingstädt b Gera default: return ""; @@ -5704,20 +5714,20 @@ private static String fromNumber3662(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36621"; // Elsterberg b Plauen - case "2": + case '2': return "36622"; // Triebes - case "3": + case '3': return "36623"; // Berga Elster - case "4": + case '4': return "36624"; // Teichwolframsdorf - case "5": + case '5': return "36625"; // Langenwetzendorf - case "6": + case '6': return "36626"; // Auma - case "8": + case '8': return "36628"; // Zeulenroda default: return ""; @@ -5729,24 +5739,24 @@ private static String fromNumber3664(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36640"; // Remptendorf - case "2": + case '2': return "36642"; // Harra - case "3": + case '3': return "36643"; // Thimmendorf - case "4": + case '4': return "36644"; // Hirschberg Saale - case "5": + case '5': return "36645"; // Mühltroff - case "6": + case '6': return "36646"; // Tanna b Schleiz - case "7": + case '7': return "36647"; // Saalburg Thür - case "8": + case '8': return "36648"; // Dittersdorf b Schleiz - case "9": + case '9': return "36649"; // Gefell b Schleiz default: return ""; @@ -5758,12 +5768,12 @@ private static String fromNumber3665(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36651"; // Lobenstein - case "2": + case '2': return "36652"; // Wurzbach - case "3": + case '3': return "36653"; // Lehesten Thür Wald default: return ""; @@ -5775,16 +5785,16 @@ private static String fromNumber3669(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36691"; // Eisenberg Thür - case "2": + case '2': return "36692"; // Bürgel - case "3": + case '3': return "36693"; // Crossen an der Elster - case "4": + case '4': return "36694"; // Schkölen Thür - case "5": + case '5': return "36695"; // Söllmnitz default: return ""; @@ -5796,26 +5806,26 @@ private static String fromNumber367(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3670(number.substring(1)); - case "1": + case '1': return "3671"; // Saalfeld Saale - case "2": + case '2': return "3672"; // Rudolstadt - case "3": + case '3': return fromNumber3673(number.substring(1)); - case "4": + case '4': return fromNumber3674(number.substring(1)); - case "5": + case '5': return "3675"; // Sonneberg Thür - case "6": + case '6': return fromNumber3676(number.substring(1)); - case "7": + case '7': return "3677"; // Ilmenau Thür - case "8": + case '8': return fromNumber3678(number.substring(1)); - case "9": + case '9': return "3679"; // Neuhaus a Rennweg default: return ""; @@ -5827,16 +5837,16 @@ private static String fromNumber3670(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36701"; // Lichte - case "2": + case '2': return "36702"; // Lauscha - case "3": + case '3': return "36703"; // Gräfenthal - case "4": + case '4': return "36704"; // Steinheid - case "5": + case '5': return "36705"; // Oberweißbach Thür Wald default: return ""; @@ -5848,26 +5858,26 @@ private static String fromNumber3673(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36730"; // Sitzendorf - case "1": + case '1': return "36731"; // Unterloquitz - case "2": + case '2': return "36732"; // Könitz - case "3": + case '3': return "36733"; // Kaulsdorf - case "4": + case '4': return "36734"; // Leutenberg - case "5": + case '5': return "36735"; // Probstzella - case "6": + case '6': return "36736"; // Arnsgereuth - case "7": + case '7': return "36737"; // Drognitz - case "8": + case '8': return "36738"; // Königsee - case "9": + case '9': return "36739"; // Rottenbach default: return ""; @@ -5879,14 +5889,14 @@ private static String fromNumber3674(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36741"; // Bad Blankenburg - case "2": + case '2': return "36742"; // Uhlstädt - case "3": + case '3': return "36743"; // Teichel - case "4": + case '4': return "36744"; // Remda default: return ""; @@ -5898,14 +5908,14 @@ private static String fromNumber3676(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36761"; // Heubisch - case "2": + case '2': return "36762"; // Steinach Thür - case "4": + case '4': return "36764"; // Neuhaus-Schierschnitz - case "6": + case '6': return "36766"; // Schalkau default: return ""; @@ -5917,16 +5927,16 @@ private static String fromNumber3678(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36781"; // Grossbreitenbach - case "2": + case '2': return "36782"; // Schmiedefeld a Rennsteig - case "3": + case '3': return "36783"; // Gehren Thür - case "4": + case '4': return "36784"; // Stützerbach - case "5": + case '5': return "36785"; // Gräfinau-Angstedt default: return ""; @@ -5938,20 +5948,20 @@ private static String fromNumber368(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3681"; // Suhl - case "2": + case '2': return "3682"; // Zella-Mehlis - case "3": + case '3': return "3683"; // Schmalkalden - case "4": + case '4': return fromNumber3684(number.substring(1)); - case "5": + case '5': return "3685"; // Hildburghausen - case "6": + case '6': return "3686"; // Eisfeld - case "7": + case '7': return fromNumber3687(number.substring(1)); default: return ""; @@ -5963,26 +5973,26 @@ private static String fromNumber3684(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36840"; // Trusetal - case "1": + case '1': return "36841"; // Schleusingen - case "2": + case '2': return "36842"; // Oberhof Thür - case "3": + case '3': return "36843"; // Benshausen - case "4": + case '4': return "36844"; // Rohr Thür - case "5": + case '5': return "36845"; // Gehlberg - case "6": + case '6': return "36846"; // Suhl-Dietzhausen - case "7": + case '7': return "36847"; // Steinbach-Hallenberg - case "8": + case '8': return "36848"; // Wernshausen - case "9": + case '9': return "36849"; // Kleinschmalkalden default: return ""; @@ -5994,18 +6004,18 @@ private static String fromNumber3687(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36870"; // Masserberg - case "1": + case '1': return "36871"; // Bad Colberg-Heldburg - case "3": + case '3': return "36873"; // Themar - case "4": + case '4': return "36874"; // Schönbrunn b Hildburghaus - case "5": + case '5': return "36875"; // Straufhain-Streufdorf - case "8": + case '8': return "36878"; // Oberland default: return ""; @@ -6017,18 +6027,18 @@ private static String fromNumber369(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3691"; // Eisenach Thür - case "2": + case '2': return fromNumber3692(number.substring(1)); - case "3": + case '3': return "3693"; // Meiningen - case "4": + case '4': return fromNumber3694(number.substring(1)); - case "5": + case '5': return "3695"; // Bad Salzungen - case "6": + case '6': return fromNumber3696(number.substring(1)); default: return ""; @@ -6040,26 +6050,26 @@ private static String fromNumber3692(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36920"; // Grossenlupnitz - case "1": + case '1': return "36921"; // Wutha-Farnroda - case "2": + case '2': return "36922"; // Gerstungen - case "3": + case '3': return "36923"; // Treffurt - case "4": + case '4': return "36924"; // Mihla - case "5": + case '5': return "36925"; // Marksuhl - case "6": + case '6': return "36926"; // Creuzburg - case "7": + case '7': return "36927"; // Unterellen - case "8": + case '8': return "36928"; // Neuenhof Thür - case "9": + case '9': return "36929"; // Ruhla default: return ""; @@ -6071,24 +6081,24 @@ private static String fromNumber3694(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36940"; // Oepfershausen - case "1": + case '1': return "36941"; // Wasungen - case "3": + case '3': return "36943"; // Bettenhausen Thür - case "4": + case '4': return "36944"; // Rentwertshausen - case "5": + case '5': return "36945"; // Henneberg - case "6": + case '6': return "36946"; // Erbenhausen Thür - case "7": + case '7': return "36947"; // Jüchsen - case "8": + case '8': return "36948"; // Römhild - case "9": + case '9': return "36949"; // Obermaßfeld-Grimmenthal default: return ""; @@ -6100,24 +6110,24 @@ private static String fromNumber3696(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36961"; // Bad Liebenstein - case "2": + case '2': return "36962"; // Vacha - case "3": + case '3': return "36963"; // Dorndorf Rhön - case "4": + case '4': return "36964"; // Dermbach Rhön - case "5": + case '5': return "36965"; // Stadtlengsfeld - case "6": + case '6': return "36966"; // Kaltennordheim - case "7": + case '7': return "36967"; // Geisa - case "8": + case '8': return "36968"; // Rossdorf Rhön - case "9": + case '9': return "36969"; // Merkers default: return ""; @@ -6129,20 +6139,20 @@ private static String fromNumber37(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "371"; // Chemnitz Sachs - case "2": + case '2': return fromNumber372(number.substring(1)); - case "3": + case '3': return fromNumber373(number.substring(1)); - case "4": + case '4': return fromNumber374(number.substring(1)); - case "5": + case '5': return "375"; // Zwickau - case "6": + case '6': return fromNumber376(number.substring(1)); - case "7": + case '7': return fromNumber377(number.substring(1)); default: return ""; @@ -6154,24 +6164,24 @@ private static String fromNumber372(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3720(number.substring(1)); - case "1": + case '1': return "3721"; // Meinersdorf - case "2": + case '2': return "3722"; // Limbach-Oberfrohna - case "3": + case '3': return "3723"; // Hohenstein-Ernstthal - case "4": + case '4': return "3724"; // Burgstädt - case "5": + case '5': return "3725"; // Zschopau - case "6": + case '6': return "3726"; // Flöha - case "7": + case '7': return "3727"; // Mittweida - case "9": + case '9': return fromNumber3729(number.substring(1)); default: return ""; @@ -6183,22 +6193,22 @@ private static String fromNumber3720(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37200"; // Wittgensdorf b Chemnitz - case "2": + case '2': return "37202"; // Claussnitz b Chemnitz - case "3": + case '3': return "37203"; // Gersdorf b Chemnitz - case "4": + case '4': return "37204"; // Lichtenstein Sachs - case "6": + case '6': return "37206"; // Frankenberg Sachs - case "7": + case '7': return "37207"; // Hainichen Sachs - case "8": + case '8': return "37208"; // Auerswalde - case "9": + case '9': return "37209"; // Einsiedel b Chemnitz default: return ""; @@ -6210,22 +6220,22 @@ private static String fromNumber3729(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37291"; // Augustusburg - case "2": + case '2': return "37292"; // Oederan - case "3": + case '3': return "37293"; // Eppendorf Sachs - case "4": + case '4': return "37294"; // Grünhainichen - case "5": + case '5': return "37295"; // Lugau Erzgeb - case "6": + case '6': return "37296"; // Stollberg Erzgeb - case "7": + case '7': return "37297"; // Thum Sachs - case "8": + case '8': return "37298"; // Oelsnitz Erzgeb default: return ""; @@ -6237,22 +6247,22 @@ private static String fromNumber373(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3731"; // Freiberg Sachs - case "2": + case '2': return fromNumber3732(number.substring(1)); - case "3": + case '3': return "3733"; // Annaberg-Buchholz - case "4": + case '4': return fromNumber3734(number.substring(1)); - case "5": + case '5': return "3735"; // Marienberg Sachs - case "6": + case '6': return fromNumber3736(number.substring(1)); - case "7": + case '7': return "3737"; // Rochlitz - case "8": + case '8': return fromNumber3738(number.substring(1)); default: return ""; @@ -6264,26 +6274,26 @@ private static String fromNumber3732(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37320"; // Mulda Sachs - case "1": + case '1': return "37321"; // Frankenstein Sachs - case "2": + case '2': return "37322"; // Brand-Erbisdorf - case "3": + case '3': return "37323"; // Lichtenberg Erzgeb - case "4": + case '4': return "37324"; // Reinsberg Sachs - case "5": + case '5': return "37325"; // Niederbobritzsch - case "6": + case '6': return "37326"; // Frauenstein Sachs - case "7": + case '7': return "37327"; // Rechenberg-Bienenmühle - case "8": + case '8': return "37328"; // Grossschirma - case "9": + case '9': return "37329"; // Grosshartmannsdorf default: return ""; @@ -6295,22 +6305,22 @@ private static String fromNumber3734(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37341"; // Ehrenfriedersdorf - case "2": + case '2': return "37342"; // Cranzahl - case "3": + case '3': return "37343"; // Jöhstadt - case "4": + case '4': return "37344"; // Crottendorf Sachs - case "6": + case '6': return "37346"; // Geyer - case "7": + case '7': return "37347"; // Bärenstein Kr Annaberg - case "8": + case '8': return "37348"; // Oberwiesenthal Kurort - case "9": + case '9': return "37349"; // Scheibenberg default: return ""; @@ -6322,26 +6332,26 @@ private static String fromNumber3736(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37360"; // Olbernhau - case "1": + case '1': return "37361"; // Neuhausen Erzgeb - case "2": + case '2': return "37362"; // Seiffen Erzgeb - case "3": + case '3': return "37363"; // Zöblitz - case "4": + case '4': return "37364"; // Reitzenhain Erzgeb - case "5": + case '5': return "37365"; // Sayda - case "6": + case '6': return "37366"; // Rübenau - case "7": + case '7': return "37367"; // Lengefeld Erzgeb - case "8": + case '8': return "37368"; // Deutschneudorf - case "9": + case '9': return "37369"; // Wolkenstein default: return ""; @@ -6353,14 +6363,14 @@ private static String fromNumber3738(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37381"; // Penig - case "2": + case '2': return "37382"; // Geringswalde - case "3": + case '3': return "37383"; // Lunzenau - case "4": + case '4': return "37384"; // Wechselburg default: return ""; @@ -6372,18 +6382,18 @@ private static String fromNumber374(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3741"; // Plauen - case "2": + case '2': return fromNumber3742(number.substring(1)); - case "3": + case '3': return fromNumber3743(number.substring(1)); - case "4": + case '4': return "3744"; // Auerbach Vogtl - case "5": + case '5': return "3745"; // Falkenstein Vogtl - case "6": + case '6': return fromNumber3746(number.substring(1)); default: return ""; @@ -6395,12 +6405,12 @@ private static String fromNumber3742(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37421"; // Oelsnitz Vogtl - case "2": + case '2': return "37422"; // Markneukirchen - case "3": + case '3': return "37423"; // Adorf Vogtl default: return ""; @@ -6412,26 +6422,26 @@ private static String fromNumber3743(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37430"; // Eichigt - case "1": + case '1': return "37431"; // Mehltheuer Vogtl - case "2": + case '2': return "37432"; // Pausa Vogtl - case "3": + case '3': return "37433"; // Gutenfürst - case "4": + case '4': return "37434"; // Bobenneukirchen - case "5": + case '5': return "37435"; // Reuth b Plauen - case "6": + case '6': return "37436"; // Weischlitz - case "7": + case '7': return "37437"; // Bad Elster - case "8": + case '8': return "37438"; // Bad Brambach - case "9": + case '9': return "37439"; // Jocketa default: return ""; @@ -6443,18 +6453,18 @@ private static String fromNumber3746(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "37462"; // Rothenkirchen Vogtl - case "3": + case '3': return "37463"; // Bergen Vogtl - case "4": + case '4': return "37464"; // Schöneck Vogtl - case "5": + case '5': return "37465"; // Tannenbergsthal Vogtl - case "7": + case '7': return "37467"; // Klingenthal Sachs - case "8": + case '8': return "37468"; // Treuen Vogtl default: return ""; @@ -6466,18 +6476,18 @@ private static String fromNumber376(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3760(number.substring(1)); - case "1": + case '1': return "3761"; // Werdau Sachs - case "2": + case '2': return "3762"; // Crimmitschau - case "3": + case '3': return "3763"; // Glauchau - case "4": + case '4': return "3764"; // Meerane - case "5": + case '5': return "3765"; // Reichenbach Vogtl default: return ""; @@ -6489,26 +6499,26 @@ private static String fromNumber3760(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37600"; // Neumark Sachs - case "1": + case '1': return "37601"; // Mülsen Skt Jacob - case "2": + case '2': return "37602"; // Kirchberg Sachs - case "3": + case '3': return "37603"; // Wildenfels - case "4": + case '4': return "37604"; // Mosel - case "5": + case '5': return "37605"; // Hartenstein Sachs - case "6": + case '6': return "37606"; // Lengenfeld Vogtl - case "7": + case '7': return "37607"; // Ebersbrunn Sachs - case "8": + case '8': return "37608"; // Waldenburg Sachs - case "9": + case '9': return "37609"; // Wolkenburg Mulde default: return ""; @@ -6520,16 +6530,16 @@ private static String fromNumber377(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3771"; // Aue Sachs - case "2": + case '2': return "3772"; // Schneeberg Erzgeb - case "3": + case '3': return "3773"; // Johanngeorgenstadt - case "4": + case '4': return "3774"; // Schwarzenberg - case "5": + case '5': return fromNumber3775(number.substring(1)); default: return ""; @@ -6541,16 +6551,16 @@ private static String fromNumber3775(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "37752"; // Eibenstock - case "4": + case '4': return "37754"; // Zwönitz - case "5": + case '5': return "37755"; // Schönheide Erzgeb - case "6": + case '6': return "37756"; // Breitenbrunn Erzgeb - case "7": + case '7': return "37757"; // Rittersgrün default: return ""; @@ -6562,22 +6572,22 @@ private static String fromNumber38(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "381"; // Rostock - case "2": + case '2': return fromNumber382(number.substring(1)); - case "3": + case '3': return fromNumber383(number.substring(1)); - case "4": + case '4': return fromNumber384(number.substring(1)); - case "5": + case '5': return "385"; // Schwerin Meckl - case "6": + case '6': return fromNumber386(number.substring(1)); - case "7": + case '7': return fromNumber387(number.substring(1)); - case "8": + case '8': return fromNumber388(number.substring(1)); default: return ""; @@ -6589,16 +6599,16 @@ private static String fromNumber382(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3820(number.substring(1)); - case "1": + case '1': return "3821"; // Ribnitz-Damgarten - case "2": + case '2': return fromNumber3822(number.substring(1)); - case "3": + case '3': return fromNumber3823(number.substring(1)); - case "9": + case '9': return fromNumber3829(number.substring(1)); default: return ""; @@ -6610,24 +6620,24 @@ private static String fromNumber3820(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38201"; // Gelbensande - case "2": + case '2': return "38202"; // Volkenshagen - case "3": + case '3': return "38203"; // Bad Doberan - case "4": + case '4': return "38204"; // Broderstorf - case "5": + case '5': return "38205"; // Tessin b Rostock - case "6": + case '6': return "38206"; // Graal-Müritz Seeheilbad - case "7": + case '7': return "38207"; // Stäbelow - case "8": + case '8': return "38208"; // Kavelstorf - case "9": + case '9': return "38209"; // Sanitz b Rostock default: return ""; @@ -6639,26 +6649,26 @@ private static String fromNumber3822(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38220"; // Wustrow Ostseebad - case "1": + case '1': return "38221"; // Marlow - case "2": + case '2': return "38222"; // Semlow - case "3": + case '3': return "38223"; // Saal Vorpom - case "4": + case '4': return "38224"; // Gresenhorst - case "5": + case '5': return "38225"; // Trinwillershagen - case "6": + case '6': return "38226"; // Dierhagen Ostseebad - case "7": + case '7': return "38227"; // Lüdershagen b Barth - case "8": + case '8': return "38228"; // Dettmannsdorf-Kölzow - case "9": + case '9': return "38229"; // Bad Sülze default: return ""; @@ -6670,14 +6680,14 @@ private static String fromNumber3823(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38231"; // Barth - case "2": + case '2': return "38232"; // Zingst Ostseebad - case "3": + case '3': return "38233"; // Prerow Ostseebad - case "4": + case '4': return "38234"; // Born a Darß default: return ""; @@ -6689,18 +6699,18 @@ private static String fromNumber3829(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "38292"; // Kröpelin - case "3": + case '3': return "38293"; // Kühlungsborn Ostseebad - case "4": + case '4': return "38294"; // Neubukow - case "5": + case '5': return "38295"; // Satow b Bad Doberan - case "6": + case '6': return "38296"; // Rerik Ostseebad - case "7": + case '7': return "38297"; // Moitin default: return ""; @@ -6712,26 +6722,26 @@ private static String fromNumber383(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3830(number.substring(1)); - case "1": + case '1': return "3831"; // Stralsund - case "2": + case '2': return fromNumber3832(number.substring(1)); - case "3": + case '3': return fromNumber3833(number.substring(1)); - case "4": + case '4': return "3834"; // Greifswald - case "5": + case '5': return fromNumber3835(number.substring(1)); - case "6": + case '6': return "3836"; // Wolgast - case "7": + case '7': return fromNumber3837(number.substring(1)); - case "8": + case '8': return "3838"; // Bergen auf Rügen - case "9": + case '9': return fromNumber3839(number.substring(1)); default: return ""; @@ -6743,26 +6753,26 @@ private static String fromNumber3830(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38300"; // Insel Hiddensee - case "1": + case '1': return "38301"; // Putbus - case "2": + case '2': return "38302"; // Sagard - case "3": + case '3': return "38303"; // Sellin Ostseebad - case "4": + case '4': return "38304"; // Garz Rügen - case "5": + case '5': return "38305"; // Gingst - case "6": + case '6': return "38306"; // Samtens - case "7": + case '7': return "38307"; // Poseritz - case "8": + case '8': return "38308"; // Göhren Rügen - case "9": + case '9': return "38309"; // Trent default: return ""; @@ -6774,24 +6784,24 @@ private static String fromNumber3832(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38320"; // Tribsees - case "1": + case '1': return "38321"; // Martensdorf b Stralsund - case "2": + case '2': return "38322"; // Richtenberg - case "3": + case '3': return "38323"; // Prohn - case "4": + case '4': return "38324"; // Velgast - case "5": + case '5': return "38325"; // Rolofshagen - case "6": + case '6': return "38326"; // Grimmen - case "7": + case '7': return "38327"; // Elmenhorst Vorpom - case "8": + case '8': return "38328"; // Miltzow default: return ""; @@ -6803,14 +6813,14 @@ private static String fromNumber3833(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38331"; // Rakow Vorpom - case "2": + case '2': return "38332"; // Gross Bisdorf - case "3": + case '3': return "38333"; // Horst b Grimmen - case "4": + case '4': return "38334"; // Grammendorf default: return ""; @@ -6822,18 +6832,18 @@ private static String fromNumber3835(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38351"; // Mesekenhagen - case "2": + case '2': return "38352"; // Kemnitz b Greifswald - case "3": + case '3': return "38353"; // Gützkow b Greifswald - case "4": + case '4': return "38354"; // Wusterhusen - case "5": + case '5': return "38355"; // Züssow - case "6": + case '6': return "38356"; // Behrenhoff default: return ""; @@ -6845,26 +6855,26 @@ private static String fromNumber3837(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38370"; // Kröslin - case "1": + case '1': return "38371"; // Karlshagen - case "2": + case '2': return "38372"; // Usedom - case "3": + case '3': return "38373"; // Katzow - case "4": + case '4': return "38374"; // Lassan b Wolgast - case "5": + case '5': return "38375"; // Koserow - case "6": + case '6': return "38376"; // Zirchow - case "7": + case '7': return "38377"; // Zinnowitz - case "8": + case '8': return "38378"; // Heringsdorf Seebad - case "9": + case '9': return "38379"; // Benz Usedom default: return ""; @@ -6876,12 +6886,12 @@ private static String fromNumber3839(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38391"; // Altenkirchen Rügen - case "2": + case '2': return "38392"; // Sassnitz - case "3": + case '3': return "38393"; // Binz Ostseebad default: return ""; @@ -6893,22 +6903,22 @@ private static String fromNumber384(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3841"; // Wismar Meckl - case "2": + case '2': return fromNumber3842(number.substring(1)); - case "3": + case '3': return "3843"; // Güstrow - case "4": + case '4': return "3844"; // Schwaan - case "5": + case '5': return fromNumber3845(number.substring(1)); - case "6": + case '6': return fromNumber3846(number.substring(1)); - case "7": + case '7': return "3847"; // Sternberg - case "8": + case '8': return fromNumber3848(number.substring(1)); default: return ""; @@ -6920,22 +6930,22 @@ private static String fromNumber3842(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "38422"; // Neukloster - case "3": + case '3': return "38423"; // Bad Kleinen - case "4": + case '4': return "38424"; // Bobitz - case "5": + case '5': return "38425"; // Kirchdorf Poel - case "6": + case '6': return "38426"; // Neuburg-Steinhausen - case "7": + case '7': return "38427"; // Blowatz - case "8": + case '8': return "38428"; // Hohenkirchen b Wismar - case "9": + case '9': return "38429"; // Glasin default: return ""; @@ -6947,26 +6957,26 @@ private static String fromNumber3845(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38450"; // Tarnow b Bützow - case "1": + case '1': return "38451"; // Hoppenrade b Güstrow - case "2": + case '2': return "38452"; // Lalendorf - case "3": + case '3': return "38453"; // Mistorf - case "4": + case '4': return "38454"; // Kritzkow - case "5": + case '5': return "38455"; // Plaaz - case "6": + case '6': return "38456"; // Langhagen b Güstrow - case "7": + case '7': return "38457"; // Krakow am See - case "8": + case '8': return "38458"; // Zehna - case "9": + case '9': return "38459"; // Laage default: return ""; @@ -6978,14 +6988,14 @@ private static String fromNumber3846(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38461"; // Bützow - case "2": + case '2': return "38462"; // Baumgarten Meckl - case "4": + case '4': return "38464"; // Bernitt - case "6": + case '6': return "38466"; // Jürgenshagen default: return ""; @@ -6997,20 +7007,20 @@ private static String fromNumber3848(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38481"; // Witzin - case "2": + case '2': return "38482"; // Warin - case "3": + case '3': return "38483"; // Brüel - case "4": + case '4': return "38484"; // Ventschow - case "5": + case '5': return "38485"; // Dabel - case "6": + case '6': return "38486"; // Gustävel - case "8": + case '8': return "38488"; // Demen default: return ""; @@ -7022,22 +7032,22 @@ private static String fromNumber386(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "3860"; // Raben Steinfeld - case "1": + case '1': return "3861"; // Plate - case "3": + case '3': return "3863"; // Crivitz - case "5": + case '5': return "3865"; // Holthusen - case "6": + case '6': return "3866"; // Cambs - case "7": + case '7': return "3867"; // Lübstorf - case "8": + case '8': return "3868"; // Rastow - case "9": + case '9': return "3869"; // Dümmer default: return ""; @@ -7049,24 +7059,24 @@ private static String fromNumber387(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3871"; // Parchim - case "2": + case '2': return fromNumber3872(number.substring(1)); - case "3": + case '3': return fromNumber3873(number.substring(1)); - case "4": + case '4': return "3874"; // Ludwigslust Meckl - case "5": + case '5': return fromNumber3875(number.substring(1)); - case "6": + case '6': return "3876"; // Perleberg - case "7": + case '7': return "3877"; // Wittenberge - case "8": + case '8': return fromNumber3878(number.substring(1)); - case "9": + case '9': return fromNumber3879(number.substring(1)); default: return ""; @@ -7078,26 +7088,26 @@ private static String fromNumber3872(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38720"; // Grebbin - case "1": + case '1': return "38721"; // Ziegendorf - case "2": + case '2': return "38722"; // Raduhn - case "3": + case '3': return "38723"; // Kladrum - case "4": + case '4': return "38724"; // Siggelkow - case "5": + case '5': return "38725"; // Gross Godems - case "6": + case '6': return "38726"; // Spornitz - case "7": + case '7': return "38727"; // Mestlin - case "8": + case '8': return "38728"; // Domsühl - case "9": + case '9': return "38729"; // Marnitz default: return ""; @@ -7109,20 +7119,20 @@ private static String fromNumber3873(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38731"; // Lübz - case "2": + case '2': return "38732"; // Gallin b Lübz - case "3": + case '3': return "38733"; // Karbow-Vietlübbe - case "5": + case '5': return "38735"; // Plau am See - case "6": + case '6': return "38736"; // Goldberg Meckl - case "7": + case '7': return "38737"; // Ganzlin - case "8": + case '8': return "38738"; // Karow b Lübz default: return ""; @@ -7134,26 +7144,26 @@ private static String fromNumber3875(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38750"; // Malliss - case "1": + case '1': return "38751"; // Picher - case "2": + case '2': return "38752"; // Zierzow b Ludwigslust - case "3": + case '3': return "38753"; // Wöbbelin - case "4": + case '4': return "38754"; // Leussow b Ludwigslust - case "5": + case '5': return "38755"; // Eldena - case "6": + case '6': return "38756"; // Grabow Meckl - case "7": + case '7': return "38757"; // Neustadt-Glewe - case "8": + case '8': return "38758"; // Dömitz - case "9": + case '9': return "38759"; // Tewswoos default: return ""; @@ -7165,24 +7175,24 @@ private static String fromNumber3878(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38780"; // Lanz Brandenb - case "1": + case '1': return "38781"; // Mellen - case "2": + case '2': return "38782"; // Reetz b Perleberg - case "3": + case '3': return "38783"; // Dallmin - case "4": + case '4': return "38784"; // Kleinow Kr Prignitz - case "5": + case '5': return "38785"; // Berge b Perleberg - case "7": + case '7': return "38787"; // Glöwen - case "8": + case '8': return "38788"; // Gross Warnow - case "9": + case '9': return "38789"; // Wolfshagen b Perleberg default: return ""; @@ -7194,18 +7204,18 @@ private static String fromNumber3879(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38791"; // Bad Wilsnack - case "2": + case '2': return "38792"; // Lenzen (Elbe) - case "3": + case '3': return "38793"; // Dergenthin - case "4": + case '4': return "38794"; // Cumlosen - case "6": + case '6': return "38796"; // Viesecke - case "7": + case '7': return "38797"; // Karstädt Kr Prignitz default: return ""; @@ -7217,20 +7227,20 @@ private static String fromNumber388(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3881"; // Grevesmühlen - case "2": + case '2': return fromNumber3882(number.substring(1)); - case "3": + case '3': return "3883"; // Hagenow - case "4": + case '4': return fromNumber3884(number.substring(1)); - case "5": + case '5': return fromNumber3885(number.substring(1)); - case "6": + case '6': return "3886"; // Gadebusch - case "7": + case '7': return fromNumber3887(number.substring(1)); default: return ""; @@ -7242,22 +7252,22 @@ private static String fromNumber3882(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38821"; // Lüdersdorf Meckl - case "2": + case '2': return "38822"; // Diedrichshagen b Grevesmühlen - case "3": + case '3': return "38823"; // Selmsdorf - case "4": + case '4': return "38824"; // Mallentin - case "5": + case '5': return "38825"; // Klütz - case "6": + case '6': return "38826"; // Dassow - case "7": + case '7': return "38827"; // Kalkhorst - case "8": + case '8': return "38828"; // Schönberg Meckl default: return ""; @@ -7269,20 +7279,20 @@ private static String fromNumber3884(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38841"; // Neuhaus Elbe - case "2": + case '2': return "38842"; // Lüttenmark - case "3": + case '3': return "38843"; // Bennin - case "4": + case '4': return "38844"; // Gülze - case "5": + case '5': return "38845"; // Kaarssen - case "7": + case '7': return "38847"; // Boizenburg Elbe - case "8": + case '8': return "38848"; // Vellahn default: return ""; @@ -7294,24 +7304,24 @@ private static String fromNumber3885(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38850"; // Gammelin - case "1": + case '1': return "38851"; // Zarrentin Meckl - case "2": + case '2': return "38852"; // Wittenburg - case "3": + case '3': return "38853"; // Drönnewitz b Hagenow - case "4": + case '4': return "38854"; // Redefin - case "5": + case '5': return "38855"; // Lübtheen - case "6": + case '6': return "38856"; // Pritzier b Hagenow - case "8": + case '8': return "38858"; // Lassahn - case "9": + case '9': return "38859"; // Alt Zachun default: return ""; @@ -7323,18 +7333,18 @@ private static String fromNumber3887(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38871"; // Mühlen Eichsen - case "2": + case '2': return "38872"; // Rehna - case "3": + case '3': return "38873"; // Carlow - case "4": + case '4': return "38874"; // Lützow - case "5": + case '5': return "38875"; // Schlagsdorf b Gadebusch - case "6": + case '6': return "38876"; // Roggendorf default: return ""; @@ -7346,26 +7356,26 @@ private static String fromNumber39(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber390(number.substring(1)); - case "1": + case '1': return "391"; // Magdeburg - case "2": + case '2': return fromNumber392(number.substring(1)); - case "3": + case '3': return fromNumber393(number.substring(1)); - case "4": + case '4': return fromNumber394(number.substring(1)); - case "5": + case '5': return "395"; // Neubrandenburg - case "6": + case '6': return fromNumber396(number.substring(1)); - case "7": + case '7': return fromNumber397(number.substring(1)); - case "8": + case '8': return fromNumber398(number.substring(1)); - case "9": + case '9': return fromNumber399(number.substring(1)); default: return ""; @@ -7377,26 +7387,26 @@ private static String fromNumber390(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3900(number.substring(1)); - case "1": + case '1': return "3901"; // Salzwedel - case "2": + case '2': return "3902"; // Diesdorf Altm - case "3": + case '3': return fromNumber3903(number.substring(1)); - case "4": + case '4': return "3904"; // Haldensleben - case "5": + case '5': return fromNumber3905(number.substring(1)); - case "6": + case '6': return fromNumber3906(number.substring(1)); - case "7": + case '7': return "3907"; // Gardelegen - case "8": + case '8': return fromNumber3908(number.substring(1)); - case "9": + case '9': return "3909"; // Klötze Altmark default: return ""; @@ -7408,26 +7418,26 @@ private static String fromNumber3900(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39000"; // Beetzendorf - case "1": + case '1': return "39001"; // Apenburg - case "2": + case '2': return "39002"; // Oebisfelde - case "3": + case '3': return "39003"; // Jübar - case "4": + case '4': return "39004"; // Köckte b Gardelegen - case "5": + case '5': return "39005"; // Kusey - case "6": + case '6': return "39006"; // Miesterhorst - case "7": + case '7': return "39007"; // Tangeln - case "8": + case '8': return "39008"; // Kunrau - case "9": + case '9': return "39009"; // Badel default: return ""; @@ -7439,26 +7449,26 @@ private static String fromNumber3903(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39030"; // Brunau - case "1": + case '1': return "39031"; // Dähre - case "2": + case '2': return "39032"; // Mahlsdorf b Salzwedel - case "3": + case '3': return "39033"; // Wallstawe - case "4": + case '4': return "39034"; // Fleetmark - case "5": + case '5': return "39035"; // Kuhfelde - case "6": + case '6': return "39036"; // Binde - case "7": + case '7': return "39037"; // Pretzier - case "8": + case '8': return "39038"; // Henningen - case "9": + case '9': return "39039"; // Bonese default: return ""; @@ -7470,26 +7480,26 @@ private static String fromNumber3905(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39050"; // Bartensleben - case "1": + case '1': return "39051"; // Calvörde - case "2": + case '2': return "39052"; // Erxleben b Haldensleben - case "3": + case '3': return "39053"; // Süplingen - case "4": + case '4': return "39054"; // Flechtingen - case "5": + case '5': return "39055"; // Hörsingen - case "6": + case '6': return "39056"; // Klüden - case "7": + case '7': return "39057"; // Rätzlingen Sachs-Anh - case "8": + case '8': return "39058"; // Uthmöden - case "9": + case '9': return "39059"; // Wegenstedt default: return ""; @@ -7501,10 +7511,10 @@ private static String fromNumber3906(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39061"; // Weferlingen - case "2": + case '2': return "39062"; // Bebertal default: return ""; @@ -7516,26 +7526,26 @@ private static String fromNumber3908(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39080"; // Kalbe Milde - case "1": + case '1': return "39081"; // Kakerbeck Sachs-Anh - case "2": + case '2': return "39082"; // Mieste - case "3": + case '3': return "39083"; // Messdorf - case "4": + case '4': return "39084"; // Lindstedt - case "5": + case '5': return "39085"; // Zichtau - case "6": + case '6': return "39086"; // Jävenitz - case "7": + case '7': return "39087"; // Jerchel Altmark - case "8": + case '8': return "39088"; // Letzlingen - case "9": + case '9': return "39089"; // Bismark Altmark default: return ""; @@ -7547,24 +7557,24 @@ private static String fromNumber392(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3920(number.substring(1)); - case "1": + case '1': return "3921"; // Burg b Magdeburg - case "2": + case '2': return fromNumber3922(number.substring(1)); - case "3": + case '3': return "3923"; // Zerbst - case "4": + case '4': return fromNumber3924(number.substring(1)); - case "5": + case '5': return "3925"; // Stassfurt - case "6": + case '6': return fromNumber3926(number.substring(1)); - case "8": + case '8': return "3928"; // Schönebeck Elbe - case "9": + case '9': return fromNumber3929(number.substring(1)); default: return ""; @@ -7576,26 +7586,26 @@ private static String fromNumber3920(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39200"; // Gommern - case "1": + case '1': return "39201"; // Wolmirstedt - case "2": + case '2': return "39202"; // Gross Ammensleben - case "3": + case '3': return "39203"; // Barleben - case "4": + case '4': return "39204"; // Niederndodeleben - case "5": + case '5': return "39205"; // Langenweddingen - case "6": + case '6': return "39206"; // Eichenbarleben - case "7": + case '7': return "39207"; // Colbitz - case "8": + case '8': return "39208"; // Loitsche - case "9": + case '9': return "39209"; // Wanzleben default: return ""; @@ -7607,18 +7617,18 @@ private static String fromNumber3922(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39221"; // Möckern b Magdeburg - case "2": + case '2': return "39222"; // Möser - case "3": + case '3': return "39223"; // Theessen - case "4": + case '4': return "39224"; // Büden - case "5": + case '5': return "39225"; // Altengrabow - case "6": + case '6': return "39226"; // Hohenziatz default: return ""; @@ -7630,22 +7640,22 @@ private static String fromNumber3924(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39241"; // Leitzkau - case "2": + case '2': return "39242"; // Prödel - case "3": + case '3': return "39243"; // Nedlitz b Zerbst - case "4": + case '4': return "39244"; // Steutz - case "5": + case '5': return "39245"; // Loburg - case "6": + case '6': return "39246"; // Lindau Anh - case "7": + case '7': return "39247"; // Güterglück - case "8": + case '8': return "39248"; // Dobritz default: return ""; @@ -7657,20 +7667,20 @@ private static String fromNumber3926(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "39262"; // Güsten Anh - case "3": + case '3': return "39263"; // Unseburg - case "4": + case '4': return "39264"; // Kroppenstedt - case "5": + case '5': return "39265"; // Löderburg - case "6": + case '6': return "39266"; // Förderstedt - case "7": + case '7': return "39267"; // Schneidlingen - case "8": + case '8': return "39268"; // Egeln default: return ""; @@ -7682,22 +7692,22 @@ private static String fromNumber3929(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39291"; // Calbe Saale - case "2": + case '2': return "39292"; // Biederitz - case "3": + case '3': return "39293"; // Dreileben - case "4": + case '4': return "39294"; // Gross Rosenburg - case "5": + case '5': return "39295"; // Zuchau - case "6": + case '6': return "39296"; // Welsleben - case "7": + case '7': return "39297"; // Eickendorf Kr Schönebeck - case "8": + case '8': return "39298"; // Barby Elbe default: return ""; @@ -7709,24 +7719,24 @@ private static String fromNumber393(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3931"; // Stendal - case "2": + case '2': return fromNumber3932(number.substring(1)); - case "3": + case '3': return "3933"; // Genthin - case "4": + case '4': return fromNumber3934(number.substring(1)); - case "5": + case '5': return "3935"; // Tangerhütte - case "6": + case '6': return fromNumber3936(number.substring(1)); - case "7": + case '7': return "3937"; // Osterburg Altmark - case "8": + case '8': return fromNumber3938(number.substring(1)); - case "9": + case '9': return fromNumber3939(number.substring(1)); default: return ""; @@ -7738,24 +7748,24 @@ private static String fromNumber3932(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39320"; // Schinne - case "1": + case '1': return "39321"; // Arneburg - case "2": + case '2': return "39322"; // Tangermünde - case "3": + case '3': return "39323"; // Schönhausen Elbe - case "4": + case '4': return "39324"; // Kläden b Stendal - case "5": + case '5': return "39325"; // Vinzelberg - case "7": + case '7': return "39327"; // Klietz - case "8": + case '8': return "39328"; // Rochau - case "9": + case '9': return "39329"; // Möringen default: return ""; @@ -7767,24 +7777,24 @@ private static String fromNumber3934(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39341"; // Redekin - case "2": + case '2': return "39342"; // Gladau - case "3": + case '3': return "39343"; // Jerichow - case "4": + case '4': return "39344"; // Güsen - case "5": + case '5': return "39345"; // Parchen - case "6": + case '6': return "39346"; // Tucheim - case "7": + case '7': return "39347"; // Kade - case "8": + case '8': return "39348"; // Klitsche - case "9": + case '9': return "39349"; // Parey Elbe default: return ""; @@ -7796,18 +7806,18 @@ private static String fromNumber3936(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39361"; // Lüderitz - case "2": + case '2': return "39362"; // Grieben b Tangerhütte - case "3": + case '3': return "39363"; // Angern - case "4": + case '4': return "39364"; // Dolle - case "5": + case '5': return "39365"; // Bellingen b Stendal - case "6": + case '6': return "39366"; // Kehnert default: return ""; @@ -7819,20 +7829,20 @@ private static String fromNumber3938(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "39382"; // Kamern - case "3": + case '3': return "39383"; // Sandau Elbe - case "4": + case '4': return "39384"; // Arendsee Altmark - case "6": + case '6': return "39386"; // Seehausen Altmark - case "7": + case '7': return "39387"; // Havelberg - case "8": + case '8': return "39388"; // Goldbeck Altm - case "9": + case '9': return "39389"; // Schollene default: return ""; @@ -7844,26 +7854,26 @@ private static String fromNumber3939(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39390"; // Iden - case "1": + case '1': return "39391"; // Lückstedt - case "2": + case '2': return "39392"; // Rönnebeck Sachs-Ahn - case "3": + case '3': return "39393"; // Werben Elbe - case "4": + case '4': return "39394"; // Hohenberg-Krusemark - case "5": + case '5': return "39395"; // Wanzer - case "6": + case '6': return "39396"; // Neukirchen Altmark - case "7": + case '7': return "39397"; // Geestgottberg - case "8": + case '8': return "39398"; // Gross Garz - case "9": + case '9': return "39399"; // Kleinau default: return ""; @@ -7875,26 +7885,26 @@ private static String fromNumber394(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3940(number.substring(1)); - case "1": + case '1': return "3941"; // Halberstadt - case "2": + case '2': return fromNumber3942(number.substring(1)); - case "3": + case '3': return "3943"; // Wernigerode - case "4": + case '4': return "3944"; // Blankenburg Harz - case "5": + case '5': return fromNumber3945(number.substring(1)); - case "6": + case '6': return "3946"; // Quedlinburg - case "7": + case '7': return "3947"; // Thale - case "8": + case '8': return fromNumber3948(number.substring(1)); - case "9": + case '9': return "3949"; // Oschersleben Bode default: return ""; @@ -7906,26 +7916,26 @@ private static String fromNumber3940(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39400"; // Wefensleben - case "1": + case '1': return "39401"; // Neuwegersleben - case "2": + case '2': return "39402"; // Völpke - case "3": + case '3': return "39403"; // Gröningen Sachs-Ahn - case "4": + case '4': return "39404"; // Ausleben - case "5": + case '5': return "39405"; // Hötensleben - case "6": + case '6': return "39406"; // Harbke - case "7": + case '7': return "39407"; // Seehausen Börde - case "8": + case '8': return "39408"; // Hadmersleben - case "9": + case '9': return "39409"; // Eilsleben default: return ""; @@ -7937,22 +7947,22 @@ private static String fromNumber3942(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39421"; // Osterwieck - case "2": + case '2': return "39422"; // Badersleben - case "3": + case '3': return "39423"; // Wegeleben - case "4": + case '4': return "39424"; // Schwanebeck Sachs-Anh - case "5": + case '5': return "39425"; // Dingelstedt a Huy - case "6": + case '6': return "39426"; // Hessen - case "7": + case '7': return "39427"; // Ströbeck - case "8": + case '8': return "39428"; // Pabstorf default: return ""; @@ -7964,24 +7974,24 @@ private static String fromNumber3945(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39451"; // Wasserleben - case "2": + case '2': return "39452"; // Ilsenburg - case "3": + case '3': return "39453"; // Derenburg - case "4": + case '4': return "39454"; // Elbingerode Harz - case "5": + case '5': return "39455"; // Schierke - case "6": + case '6': return "39456"; // Altenbrak - case "7": + case '7': return "39457"; // Benneckenstein Harz - case "8": + case '8': return "39458"; // Heudeber - case "9": + case '9': return "39459"; // Hasselfelde default: return ""; @@ -7993,22 +8003,22 @@ private static String fromNumber3948(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39481"; // Hedersleben b Aschersleben - case "2": + case '2': return "39482"; // Gatersleben - case "3": + case '3': return "39483"; // Ballenstedt - case "4": + case '4': return "39484"; // Harzgerode - case "5": + case '5': return "39485"; // Gernrode Harz - case "7": + case '7': return "39487"; // Friedrichsbrunn - case "8": + case '8': return "39488"; // Güntersberge - case "9": + case '9': return "39489"; // Strassberg Harz default: return ""; @@ -8020,26 +8030,26 @@ private static String fromNumber396(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3960(number.substring(1)); - case "1": + case '1': return "3961"; // Altentreptow - case "2": + case '2': return "3962"; // Penzlin b Waren - case "3": + case '3': return "3963"; // Woldegk - case "4": + case '4': return "3964"; // Bredenfelde b Strasburg - case "5": + case '5': return "3965"; // Burow b Altentreptow - case "6": + case '6': return "3966"; // Cölpin - case "7": + case '7': return "3967"; // Oertzenhof b Strasburg - case "8": + case '8': return "3968"; // Schönbeck Meckl - case "9": + case '9': return "3969"; // Siedenbollentin default: return ""; @@ -8051,24 +8061,24 @@ private static String fromNumber3960(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39600"; // Zwiedorf - case "1": + case '1': return "39601"; // Friedland Meckl - case "2": + case '2': return "39602"; // Kleeth - case "3": + case '3': return "39603"; // Burg Stargard - case "4": + case '4': return "39604"; // Wildberg b Altentreptow - case "5": + case '5': return "39605"; // Gross Nemerow - case "6": + case '6': return "39606"; // Glienke - case "7": + case '7': return "39607"; // Kotelow - case "8": + case '8': return "39608"; // Staven default: return ""; @@ -8080,20 +8090,20 @@ private static String fromNumber397(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3971"; // Anklam - case "2": + case '2': return fromNumber3972(number.substring(1)); - case "3": + case '3': return "3973"; // Pasewalk - case "4": + case '4': return fromNumber3974(number.substring(1)); - case "5": + case '5': return fromNumber3975(number.substring(1)); - case "6": + case '6': return "3976"; // Torgelow b Ueckermünde - case "7": + case '7': return fromNumber3977(number.substring(1)); default: return ""; @@ -8105,20 +8115,20 @@ private static String fromNumber3972(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39721"; // Liepen b Anklam - case "2": + case '2': return "39722"; // Sarnow b Anklam - case "3": + case '3': return "39723"; // Krien - case "4": + case '4': return "39724"; // Klein Bünzow - case "6": + case '6': return "39726"; // Ducherow - case "7": + case '7': return "39727"; // Spantekow - case "8": + case '8': return "39728"; // Medow b Anklam default: return ""; @@ -8130,26 +8140,26 @@ private static String fromNumber3974(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39740"; // Nechlin - case "1": + case '1': return "39741"; // Jatznick - case "2": + case '2': return "39742"; // Brüssow b Pasewalk - case "3": + case '3': return "39743"; // Zerrenthin - case "4": + case '4': return "39744"; // Rothenklempenow - case "5": + case '5': return "39745"; // Hetzdorf b Strasburg - case "6": + case '6': return "39746"; // Krackow - case "7": + case '7': return "39747"; // Züsedom - case "8": + case '8': return "39748"; // Viereck - case "9": + case '9': return "39749"; // Grambow b Pasewalk default: return ""; @@ -8161,14 +8171,14 @@ private static String fromNumber3975(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39751"; // Penkun - case "2": + case '2': return "39752"; // Blumenhagen b Strasburg - case "3": + case '3': return "39753"; // Strasburg - case "4": + case '4': return "39754"; // Löcknitz Vorpom default: return ""; @@ -8180,24 +8190,24 @@ private static String fromNumber3977(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39771"; // Ueckermünde - case "2": + case '2': return "39772"; // Rothemühl - case "3": + case '3': return "39773"; // Altwarp - case "4": + case '4': return "39774"; // Mönkebude - case "5": + case '5': return "39775"; // Ahlbeck b Torgelow - case "6": + case '6': return "39776"; // Hintersee - case "7": + case '7': return "39777"; // Borkenfriede - case "8": + case '8': return "39778"; // Ferdinandshof b Torgelow - case "9": + case '9': return "39779"; // Eggesin default: return ""; @@ -8209,22 +8219,22 @@ private static String fromNumber398(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3981"; // Neustrelitz - case "2": + case '2': return fromNumber3982(number.substring(1)); - case "3": + case '3': return fromNumber3983(number.substring(1)); - case "4": + case '4': return "3984"; // Prenzlau - case "5": + case '5': return fromNumber3985(number.substring(1)); - case "6": + case '6': return fromNumber3986(number.substring(1)); - case "7": + case '7': return "3987"; // Templin - case "8": + case '8': return fromNumber3988(number.substring(1)); default: return ""; @@ -8236,26 +8246,26 @@ private static String fromNumber3982(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39820"; // Triepkendorf - case "1": + case '1': return "39821"; // Carpin - case "2": + case '2': return "39822"; // Kratzeburg - case "3": + case '3': return "39823"; // Rechlin - case "4": + case '4': return "39824"; // Hohenzieritz - case "5": + case '5': return "39825"; // Wokuhl - case "6": + case '6': return "39826"; // Blankensee b Neustrelitz - case "7": + case '7': return "39827"; // Schwarz b Neustrelitz - case "8": + case '8': return "39828"; // Wustrow Kr Mecklenburg-Strelitz - case "9": + case '9': return "39829"; // Blankenförde default: return ""; @@ -8267,12 +8277,12 @@ private static String fromNumber3983(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39831"; // Feldberg Meckl - case "2": + case '2': return "39832"; // Wesenberg Meckl - case "3": + case '3': return "39833"; // Mirow Kr Neustrelitz default: return ""; @@ -8284,24 +8294,24 @@ private static String fromNumber3985(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39851"; // Göritz b Prenzlau - case "2": + case '2': return "39852"; // Schönermark b Prenzlau - case "3": + case '3': return "39853"; // Holzendorf b Prenzlau - case "4": + case '4': return "39854"; // Kleptow - case "5": + case '5': return "39855"; // Parmen-Weggun - case "6": + case '6': return "39856"; // Beenz b Prenzlau - case "7": + case '7': return "39857"; // Drense - case "8": + case '8': return "39858"; // Bietikow - case "9": + case '9': return "39859"; // Fürstenwerder default: return ""; @@ -8313,12 +8323,12 @@ private static String fromNumber3986(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39861"; // Gramzow b Prenzlau - case "2": + case '2': return "39862"; // Schmölln b Prenzlau - case "3": + case '3': return "39863"; // Seehausen b Prenzlau default: return ""; @@ -8330,24 +8340,24 @@ private static String fromNumber3988(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39881"; // Ringenwalde b Templin - case "2": + case '2': return "39882"; // Gollin - case "3": + case '3': return "39883"; // Groß Dölln - case "4": + case '4': return "39884"; // Hassleben b Prenzlau - case "5": + case '5': return "39885"; // Jakobshagen - case "6": + case '6': return "39886"; // Milmersdorf - case "7": + case '7': return "39887"; // Gerswalde - case "8": + case '8': return "39888"; // Lychen - case "9": + case '9': return "39889"; // Boitzenburg default: return ""; @@ -8359,24 +8369,24 @@ private static String fromNumber399(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3991"; // Waren Müritz - case "2": + case '2': return fromNumber3992(number.substring(1)); - case "3": + case '3': return fromNumber3993(number.substring(1)); - case "4": + case '4': return "3994"; // Malchin - case "5": + case '5': return fromNumber3995(number.substring(1)); - case "6": + case '6': return "3996"; // Teterow - case "7": + case '7': return fromNumber3997(number.substring(1)); - case "8": + case '8': return "3998"; // Demmin - case "9": + case '9': return fromNumber3999(number.substring(1)); default: return ""; @@ -8388,24 +8398,24 @@ private static String fromNumber3992(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39921"; // Ankershagen - case "2": + case '2': return "39922"; // Dambeck b Röbel - case "3": + case '3': return "39923"; // Priborn - case "4": + case '4': return "39924"; // Stuer - case "5": + case '5': return "39925"; // Wredenhagen - case "6": + case '6': return "39926"; // Grabowhöfe - case "7": + case '7': return "39927"; // Nossentiner Hütte - case "8": + case '8': return "39928"; // Möllenhagen - case "9": + case '9': return "39929"; // Jabel b Waren default: return ""; @@ -8417,14 +8427,14 @@ private static String fromNumber3993(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39931"; // Röbel Müritz - case "2": + case '2': return "39932"; // Malchow b Waren - case "3": + case '3': return "39933"; // Vollrathsruhe - case "4": + case '4': return "39934"; // Groß Plasten default: return ""; @@ -8436,22 +8446,22 @@ private static String fromNumber3995(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39951"; // Faulenrost - case "2": + case '2': return "39952"; // Grammentin - case "3": + case '3': return "39953"; // Schwinkendorf - case "4": + case '4': return "39954"; // Stavenhagen Reuterstadt - case "5": + case '5': return "39955"; // Jürgenstorf Meckl - case "6": + case '6': return "39956"; // Neukalen - case "7": + case '7': return "39957"; // Gielow - case "9": + case '9': return "39959"; // Dargun default: return ""; @@ -8463,20 +8473,20 @@ private static String fromNumber3997(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39971"; // Gnoien - case "2": + case '2': return "39972"; // Walkendorf - case "3": + case '3': return "39973"; // Altkalen - case "5": + case '5': return "39975"; // Thürkow - case "6": + case '6': return "39976"; // Groß Bützin - case "7": + case '7': return "39977"; // Jördenstorf - case "8": + case '8': return "39978"; // Gross Roge default: return ""; @@ -8488,24 +8498,24 @@ private static String fromNumber3999(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39991"; // Daberkow - case "2": + case '2': return "39992"; // Görmin - case "3": + case '3': return "39993"; // Hohenmocker - case "4": + case '4': return "39994"; // Metschow - case "5": + case '5': return "39995"; // Nossendorf - case "6": + case '6': return "39996"; // Törpin - case "7": + case '7': return "39997"; // Jarmen - case "8": + case '8': return "39998"; // Loitz b Demmin - case "9": + case '9': return "39999"; // Tutow default: return ""; @@ -8517,26 +8527,26 @@ private static String fromNumber4(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "40"; // Hamburg - case "1": + case '1': return fromNumber41(number.substring(1)); - case "2": + case '2': return fromNumber42(number.substring(1)); - case "3": + case '3': return fromNumber43(number.substring(1)); - case "4": + case '4': return fromNumber44(number.substring(1)); - case "5": + case '5': return fromNumber45(number.substring(1)); - case "6": + case '6': return fromNumber46(number.substring(1)); - case "7": + case '7': return fromNumber47(number.substring(1)); - case "8": + case '8': return fromNumber48(number.substring(1)); - case "9": + case '9': return fromNumber49(number.substring(1)); default: return ""; @@ -8548,24 +8558,24 @@ private static String fromNumber41(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber410(number.substring(1)); - case "2": + case '2': return fromNumber412(number.substring(1)); - case "3": + case '3': return fromNumber413(number.substring(1)); - case "4": + case '4': return fromNumber414(number.substring(1)); - case "5": + case '5': return fromNumber415(number.substring(1)); - case "6": + case '6': return fromNumber416(number.substring(1)); - case "7": + case '7': return fromNumber417(number.substring(1)); - case "8": + case '8': return fromNumber418(number.substring(1)); - case "9": + case '9': return fromNumber419(number.substring(1)); default: return ""; @@ -8577,24 +8587,24 @@ private static String fromNumber410(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4101"; // Pinneberg - case "2": + case '2': return "4102"; // Ahrensburg - case "3": + case '3': return "4103"; // Wedel - case "4": + case '4': return "4104"; // Aumühle b Hamburg - case "5": + case '5': return "4105"; // Seevetal - case "6": + case '6': return "4106"; // Quickborn Kr Pinneberg - case "7": + case '7': return "4107"; // Siek Kr Stormarn - case "8": + case '8': return "4108"; // Rosengarten Kr Harburg - case "9": + case '9': return "4109"; // Tangstedt Bz Hamburg default: return ""; @@ -8606,26 +8616,26 @@ private static String fromNumber412(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4120"; // Ellerhoop - case "1": + case '1': return "4121"; // Elmshorn - case "2": + case '2': return "4122"; // Uetersen - case "3": + case '3': return "4123"; // Barmstedt - case "4": + case '4': return "4124"; // Glückstadt - case "5": + case '5': return "4125"; // Seestermühe - case "6": + case '6': return "4126"; // Horst Holstein - case "7": + case '7': return "4127"; // Westerhorn - case "8": + case '8': return "4128"; // Kollmar - case "9": + case '9': return "4129"; // Haseldorf default: return ""; @@ -8637,24 +8647,24 @@ private static String fromNumber413(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4131"; // Lüneburg - case "2": + case '2': return "4132"; // Amelinghausen - case "3": + case '3': return "4133"; // Wittorf Kr Lünebeburg - case "4": + case '4': return "4134"; // Embsen Kr Lünebeburg - case "5": + case '5': return "4135"; // Kirchgellersen - case "6": + case '6': return "4136"; // Scharnebeck - case "7": + case '7': return "4137"; // Barendorf - case "8": + case '8': return "4138"; // Betzendorf Kr Lünebeburg - case "9": + case '9': return "4139"; // Hohnstorf Elbe default: return ""; @@ -8666,22 +8676,22 @@ private static String fromNumber414(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4140"; // Estorf Kr Stade - case "1": + case '1': return "4141"; // Stade - case "2": + case '2': return "4142"; // Steinkirchen Kr Stade - case "3": + case '3': return "4143"; // Drochtersen - case "4": + case '4': return "4144"; // Himmelpforten - case "6": + case '6': return "4146"; // Stade-Bützfleth - case "8": + case '8': return "4148"; // Drochtersen-Assel - case "9": + case '9': return "4149"; // Fredenbeck default: return ""; @@ -8693,22 +8703,22 @@ private static String fromNumber415(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4151"; // Schwarzenbek - case "2": + case '2': return "4152"; // Geesthacht - case "3": + case '3': return "4153"; // Lauenburg Elbe - case "4": + case '4': return "4154"; // Trittau - case "5": + case '5': return "4155"; // Büchen - case "6": + case '6': return "4156"; // Talkau - case "8": + case '8': return "4158"; // Roseburg - case "9": + case '9': return "4159"; // Basthorst default: return ""; @@ -8720,24 +8730,24 @@ private static String fromNumber416(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4161"; // Buxtehude - case "2": + case '2': return "4162"; // Jork - case "3": + case '3': return "4163"; // Horneburg Niederelbe - case "4": + case '4': return "4164"; // Harsefeld - case "5": + case '5': return "4165"; // Hollenstedt Nordheide - case "6": + case '6': return "4166"; // Ahlerstedt - case "7": + case '7': return "4167"; // Apensen - case "8": + case '8': return "4168"; // Neu Wulmstorf-Elstorf - case "9": + case '9': return "4169"; // Sauensiek default: return ""; @@ -8749,24 +8759,24 @@ private static String fromNumber417(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4171"; // Winsen Luhe - case "2": + case '2': return "4172"; // Salzhausen - case "3": + case '3': return "4173"; // Wulfsen - case "4": + case '4': return "4174"; // Stelle Kr Harburg - case "5": + case '5': return "4175"; // Egestorf Nordheide - case "6": + case '6': return "4176"; // Marschacht - case "7": + case '7': return "4177"; // Drage Elbe - case "8": + case '8': return "4178"; // Radbruch - case "9": + case '9': return "4179"; // Winsen-Tönnhausen default: return ""; @@ -8778,26 +8788,26 @@ private static String fromNumber418(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4180"; // Königsmoor - case "1": + case '1': return "4181"; // Buchholz in der Nordheide - case "2": + case '2': return "4182"; // Tostedt - case "3": + case '3': return "4183"; // Jesteburg - case "4": + case '4': return "4184"; // Hanstedt Nordheide - case "5": + case '5': return "4185"; // Marxen Auetal - case "6": + case '6': return "4186"; // Buchholz-Trelde - case "7": + case '7': return "4187"; // Holm-Seppensen - case "8": + case '8': return "4188"; // Welle Nordheide - case "9": + case '9': return "4189"; // Undeloh default: return ""; @@ -8809,16 +8819,16 @@ private static String fromNumber419(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4191"; // Kaltenkirchen Holst - case "2": + case '2': return "4192"; // Bad Bramstedt - case "3": + case '3': return "4193"; // Henstedt-Ulzburg - case "4": + case '4': return "4194"; // Sievershütten - case "5": + case '5': return "4195"; // Hartenholm default: return ""; @@ -8830,26 +8840,26 @@ private static String fromNumber42(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber420(number.substring(1)); - case "1": + case '1': return "421"; // Bremen - case "2": + case '2': return fromNumber422(number.substring(1)); - case "3": + case '3': return fromNumber423(number.substring(1)); - case "4": + case '4': return fromNumber424(number.substring(1)); - case "5": + case '5': return fromNumber425(number.substring(1)); - case "6": + case '6': return fromNumber426(number.substring(1)); - case "7": + case '7': return fromNumber427(number.substring(1)); - case "8": + case '8': return fromNumber428(number.substring(1)); - case "9": + case '9': return fromNumber429(number.substring(1)); default: return ""; @@ -8861,22 +8871,22 @@ private static String fromNumber420(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4202"; // Achim b Bremen - case "3": + case '3': return "4203"; // Weyhe b Bremen - case "4": + case '4': return "4204"; // Thedinghausen - case "5": + case '5': return "4205"; // Ottersberg - case "6": + case '6': return "4206"; // Stuhr-Heiligenrode - case "7": + case '7': return "4207"; // Oyten - case "8": + case '8': return "4208"; // Grasberg - case "9": + case '9': return "4209"; // Schwanewede default: return ""; @@ -8888,14 +8898,14 @@ private static String fromNumber422(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4221"; // Delmenhorst - case "2": + case '2': return "4222"; // Ganderkesee - case "3": + case '3': return "4223"; // Ganderkesee-Bookholzberg - case "4": + case '4': return "4224"; // Gross Ippener default: return ""; @@ -8907,26 +8917,26 @@ private static String fromNumber423(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4230"; // Verden-Walle - case "1": + case '1': return "4231"; // Verden Aller - case "2": + case '2': return "4232"; // Langwedel Kr Verden - case "3": + case '3': return "4233"; // Blender - case "4": + case '4': return "4234"; // Dörverden - case "5": + case '5': return "4235"; // Langwedel-Etelsen - case "6": + case '6': return "4236"; // Kirchlinteln - case "7": + case '7': return "4237"; // Bendingbostel - case "8": + case '8': return "4238"; // Neddenaverbergen - case "9": + case '9': return "4239"; // Dörverden-Westen default: return ""; @@ -8938,26 +8948,26 @@ private static String fromNumber424(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4240"; // Syke-Heiligenfelde - case "1": + case '1': return "4241"; // Bassum - case "2": + case '2': return "4242"; // Syke - case "3": + case '3': return "4243"; // Twistringen - case "4": + case '4': return "4244"; // Harpstedt - case "5": + case '5': return "4245"; // Neuenkirchen b Bassum - case "6": + case '6': return "4246"; // Twistringen-Heiligenloh - case "7": + case '7': return "4247"; // Affinghausen - case "8": + case '8': return "4248"; // Bassum-Neubruchhausen - case "9": + case '9': return "4249"; // Bassum-Nordwohlde default: return ""; @@ -8969,22 +8979,22 @@ private static String fromNumber425(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4251"; // Hoya - case "2": + case '2': return "4252"; // Bruchhausen-Vilsen - case "3": + case '3': return "4253"; // Asendorf Kr Diepholz - case "4": + case '4': return "4254"; // Eystrup - case "5": + case '5': return "4255"; // Martfeld - case "6": + case '6': return "4256"; // Hilgermissen - case "7": + case '7': return "4257"; // Schweringen - case "8": + case '8': return "4258"; // Schwarme default: return ""; @@ -8996,26 +9006,26 @@ private static String fromNumber426(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4260"; // Visselhövede-Wittorf - case "1": + case '1': return "4261"; // Rotenburg Wümme - case "2": + case '2': return "4262"; // Visselhövede - case "3": + case '3': return "4263"; // Scheessel - case "4": + case '4': return "4264"; // Sottrum Kr Rotenburg - case "5": + case '5': return "4265"; // Fintel - case "6": + case '6': return "4266"; // Brockel - case "7": + case '7': return "4267"; // Lauenbrück - case "8": + case '8': return "4268"; // Bötersen - case "9": + case '9': return "4269"; // Ahausen-Kirchwalsede default: return ""; @@ -9027,20 +9037,20 @@ private static String fromNumber427(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4271"; // Sulingen - case "2": + case '2': return "4272"; // Siedenburg - case "3": + case '3': return "4273"; // Kirchdorf b Sulingen - case "4": + case '4': return "4274"; // Varrel b Sulingen - case "5": + case '5': return "4275"; // Ehrenburg - case "6": + case '6': return "4276"; // Borstel b Sulingen - case "7": + case '7': return "4277"; // Schwaförden default: return ""; @@ -9052,24 +9062,24 @@ private static String fromNumber428(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4281"; // Zeven - case "2": + case '2': return "4282"; // Sittensen - case "3": + case '3': return "4283"; // Tarmstedt - case "4": + case '4': return "4284"; // Selsingen - case "5": + case '5': return "4285"; // Rhade b Zeven - case "6": + case '6': return "4286"; // Gyhum - case "7": + case '7': return "4287"; // Heeslingen-Boitzen - case "8": + case '8': return "4288"; // Horstedt Kr Rotenburg - case "9": + case '9': return "4289"; // Kirchtimke default: return ""; @@ -9081,20 +9091,20 @@ private static String fromNumber429(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4292"; // Ritterhude - case "3": + case '3': return "4293"; // Ottersberg-Fischerhude - case "4": + case '4': return "4294"; // Riede Kr Verden - case "5": + case '5': return "4295"; // Emtinghausen - case "6": + case '6': return "4296"; // Schwanewede-Aschwarden - case "7": + case '7': return "4297"; // Ottersberg-Posthausen - case "8": + case '8': return "4298"; // Lilienthal default: return ""; @@ -9106,26 +9116,26 @@ private static String fromNumber43(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber430(number.substring(1)); - case "1": + case '1': return "431"; // Kiel - case "2": + case '2': return fromNumber432(number.substring(1)); - case "3": + case '3': return fromNumber433(number.substring(1)); - case "4": + case '4': return fromNumber434(number.substring(1)); - case "5": + case '5': return fromNumber435(number.substring(1)); - case "6": + case '6': return fromNumber436(number.substring(1)); - case "7": + case '7': return fromNumber437(number.substring(1)); - case "8": + case '8': return fromNumber438(number.substring(1)); - case "9": + case '9': return fromNumber439(number.substring(1)); default: return ""; @@ -9137,16 +9147,16 @@ private static String fromNumber430(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4302"; // Kirchbarkau - case "3": + case '3': return "4303"; // Schlesen - case "5": + case '5': return "4305"; // Westensee - case "7": + case '7': return "4307"; // Raisdorf - case "8": + case '8': return "4308"; // Schwedeneck default: return ""; @@ -9158,24 +9168,24 @@ private static String fromNumber432(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4320"; // Heidmühlen - case "1": + case '1': return "4321"; // Neumünster - case "2": + case '2': return "4322"; // Bordesholm - case "3": + case '3': return "4323"; // Bornhöved - case "4": + case '4': return "4324"; // Brokstedt - case "6": + case '6': return "4326"; // Wankendorf - case "7": + case '7': return "4327"; // Grossenaspe - case "8": + case '8': return "4328"; // Rickling - case "9": + case '9': return "4329"; // Langwedel Holst default: return ""; @@ -9187,26 +9197,26 @@ private static String fromNumber433(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4330"; // Emkendorf - case "1": + case '1': return "4331"; // Rendsburg - case "2": + case '2': return "4332"; // Hamdorf b Rendsburg - case "3": + case '3': return "4333"; // Erfde - case "4": + case '4': return "4334"; // Bredenbek b Rendsburg - case "5": + case '5': return "4335"; // Hohn b Rendsburg - case "6": + case '6': return "4336"; // Owschlag - case "7": + case '7': return "4337"; // Jevenstedt - case "8": + case '8': return "4338"; // Alt Duvenstedt - case "9": + case '9': return "4339"; // Christiansholm default: return ""; @@ -9218,22 +9228,22 @@ private static String fromNumber434(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4340"; // Achterwehr - case "2": + case '2': return "4342"; // Preetz Kr Plön - case "3": + case '3': return "4343"; // Laboe - case "4": + case '4': return "4344"; // Schönberg Holstein - case "6": + case '6': return "4346"; // Gettorf - case "7": + case '7': return "4347"; // Flintbek - case "8": + case '8': return "4348"; // Schönkirchen - case "9": + case '9': return "4349"; // Dänischenhagen default: return ""; @@ -9245,22 +9255,22 @@ private static String fromNumber435(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4351"; // Eckernförde - case "2": + case '2': return "4352"; // Damp - case "3": + case '3': return "4353"; // Ascheffel - case "4": + case '4': return "4354"; // Fleckeby - case "5": + case '5': return "4355"; // Rieseby - case "6": + case '6': return "4356"; // Gross Wittensee - case "7": + case '7': return "4357"; // Sehestedt Eider - case "8": + case '8': return "4358"; // Loose b Eckernförde default: return ""; @@ -9272,20 +9282,20 @@ private static String fromNumber436(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4361"; // Oldenburg in Holstein - case "2": + case '2': return "4362"; // Heiligenhafen - case "3": + case '3': return "4363"; // Lensahn - case "4": + case '4': return "4364"; // Dahme Kr Ostholstein - case "5": + case '5': return "4365"; // Heringsdorf Holst - case "6": + case '6': return "4366"; // Grömitz-Cismar - case "7": + case '7': return "4367"; // Grossenbrode default: return ""; @@ -9297,10 +9307,10 @@ private static String fromNumber437(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4371"; // Burg auf Fehmarn - case "2": + case '2': return "4372"; // Westfehmarn default: return ""; @@ -9312,16 +9322,16 @@ private static String fromNumber438(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4381"; // Lütjenburg - case "2": + case '2': return "4382"; // Wangels - case "3": + case '3': return "4383"; // Grebin - case "4": + case '4': return "4384"; // Selent - case "5": + case '5': return "4385"; // Hohenfelde b Kiel default: return ""; @@ -9333,12 +9343,12 @@ private static String fromNumber439(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4392"; // Nortorf b Neumünster - case "3": + case '3': return "4393"; // Boostedt - case "4": + case '4': return "4394"; // Bokhorst default: return ""; @@ -9350,26 +9360,26 @@ private static String fromNumber44(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber440(number.substring(1)); - case "1": + case '1': return "441"; // Oldenburg (Oldb) - case "2": + case '2': return fromNumber442(number.substring(1)); - case "3": + case '3': return fromNumber443(number.substring(1)); - case "4": + case '4': return fromNumber444(number.substring(1)); - case "5": + case '5': return fromNumber445(number.substring(1)); - case "6": + case '6': return fromNumber446(number.substring(1)); - case "7": + case '7': return fromNumber447(number.substring(1)); - case "8": + case '8': return fromNumber448(number.substring(1)); - case "9": + case '9': return fromNumber449(number.substring(1)); default: return ""; @@ -9381,24 +9391,24 @@ private static String fromNumber440(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4401"; // Brake Unterweser - case "2": + case '2': return "4402"; // Rastede - case "3": + case '3': return "4403"; // Bad Zwischenahn - case "4": + case '4': return "4404"; // Elsfleth - case "5": + case '5': return "4405"; // Edewecht - case "6": + case '6': return "4406"; // Berne - case "7": + case '7': return "4407"; // Wardenburg - case "8": + case '8': return "4408"; // Hude Oldenburg - case "9": + case '9': return "4409"; // Westerstede-Ocholt default: return ""; @@ -9410,16 +9420,16 @@ private static String fromNumber442(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4421"; // Wilhelmshaven - case "2": + case '2': return "4422"; // Sande Kr Friesl - case "3": + case '3': return "4423"; // Fedderwarden - case "5": + case '5': return "4425"; // Wangerland-Hooksiel - case "6": + case '6': return "4426"; // Wangerland-Horumersiel default: return ""; @@ -9431,16 +9441,16 @@ private static String fromNumber443(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4431"; // Wildeshausen - case "2": + case '2': return "4432"; // Dötlingen-Brettorf - case "3": + case '3': return "4433"; // Dötlingen - case "4": + case '4': return "4434"; // Colnrade - case "5": + case '5': return "4435"; // Grossenkneten default: return ""; @@ -9452,20 +9462,20 @@ private static String fromNumber444(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4441"; // Vechta - case "2": + case '2': return "4442"; // Lohne Oldenburg - case "3": + case '3': return "4443"; // Dinklage - case "4": + case '4': return "4444"; // Goldenstedt - case "5": + case '5': return "4445"; // Visbek Kr Vechta - case "6": + case '6': return "4446"; // Bakum Kr Vechta - case "7": + case '7': return "4447"; // Vechta-Langförden default: return ""; @@ -9477,20 +9487,20 @@ private static String fromNumber445(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4451"; // Varel Jadebusen - case "2": + case '2': return "4452"; // Zetel-Neuenburg - case "3": + case '3': return "4453"; // Zetel - case "4": + case '4': return "4454"; // Jade - case "5": + case '5': return "4455"; // Jade-Schweiburg - case "6": + case '6': return "4456"; // Varel-Altjührden - case "8": + case '8': return "4458"; // Wiefelstede-Spohle default: return ""; @@ -9502,24 +9512,24 @@ private static String fromNumber446(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4461"; // Jever - case "2": + case '2': return "4462"; // Wittmund - case "3": + case '3': return "4463"; // Wangerland - case "4": + case '4': return "4464"; // Wittmund-Carolinensiel - case "5": + case '5': return "4465"; // Friedeburg Ostfriesl - case "6": + case '6': return "4466"; // Wittmund-Ardorf - case "7": + case '7': return "4467"; // Wittmund-Funnix - case "8": + case '8': return "4468"; // Friedeburg-Reepsholt - case "9": + case '9': return "4469"; // Wangerooge default: return ""; @@ -9531,22 +9541,22 @@ private static String fromNumber447(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4471"; // Cloppenburg - case "2": + case '2': return "4472"; // Lastrup - case "3": + case '3': return "4473"; // Emstek - case "4": + case '4': return "4474"; // Garrel - case "5": + case '5': return "4475"; // Molbergen - case "7": + case '7': return "4477"; // Lastrup-Hemmelte - case "8": + case '8': return "4478"; // Cappeln Oldenburg - case "9": + case '9': return "4479"; // Molbergen-Peheim default: return ""; @@ -9558,26 +9568,26 @@ private static String fromNumber448(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4480"; // Ovelgönne-Strückhausen - case "1": + case '1': return "4481"; // Hatten-Sandkrug - case "2": + case '2': return "4482"; // Hatten - case "3": + case '3': return "4483"; // Ovelgönne-Großenmeer - case "4": + case '4': return "4484"; // Hude-Wüsting - case "5": + case '5': return "4485"; // Elsfleth-Huntorf - case "6": + case '6': return "4486"; // Edewecht-Friedrichsfehn - case "7": + case '7': return "4487"; // Grossenkneten-Huntlosen - case "8": + case '8': return "4488"; // Westerstede - case "9": + case '9': return "4489"; // Apen default: return ""; @@ -9589,24 +9599,24 @@ private static String fromNumber449(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4491"; // Friesoythe - case "2": + case '2': return "4492"; // Saterland - case "3": + case '3': return "4493"; // Friesoythe-Gehlenberg - case "4": + case '4': return "4494"; // Bösel Oldenburg - case "5": + case '5': return "4495"; // Friesoythe-Thüle - case "6": + case '6': return "4496"; // Friesoythe-Markhausen - case "7": + case '7': return "4497"; // Barßel-Harkebrügge - case "8": + case '8': return "4498"; // Saterland-Ramsloh - case "9": + case '9': return "4499"; // Barssel default: return ""; @@ -9618,20 +9628,20 @@ private static String fromNumber45(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber450(number.substring(1)); - case "1": + case '1': return "451"; // Lübeck - case "2": + case '2': return fromNumber452(number.substring(1)); - case "3": + case '3': return fromNumber453(number.substring(1)); - case "4": + case '4': return fromNumber454(number.substring(1)); - case "5": + case '5': return fromNumber455(number.substring(1)); - case "6": + case '6': return fromNumber456(number.substring(1)); default: return ""; @@ -9643,22 +9653,22 @@ private static String fromNumber450(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4501"; // Kastorf Holst - case "2": + case '2': return "4502"; // Lübeck-Travemünde - case "3": + case '3': return "4503"; // Timmendorfer Strand - case "4": + case '4': return "4504"; // Ratekau - case "5": + case '5': return "4505"; // Stockelsdorf-Curau - case "6": + case '6': return "4506"; // Stockelsdorf-Krumbeck - case "8": + case '8': return "4508"; // Krummesse - case "9": + case '9': return "4509"; // Groß Grönau default: return ""; @@ -9670,24 +9680,24 @@ private static String fromNumber452(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4521"; // Eutin - case "2": + case '2': return "4522"; // Plön - case "3": + case '3': return "4523"; // Malente - case "4": + case '4': return "4524"; // Scharbeutz-Pönitz - case "5": + case '5': return "4525"; // Ahrensbök - case "6": + case '6': return "4526"; // Ascheberg Holstein - case "7": + case '7': return "4527"; // Bosau - case "8": + case '8': return "4528"; // Schönwalde am Bungsberg - case "9": + case '9': return "4529"; // Süsel-Bujendorf default: return ""; @@ -9699,22 +9709,22 @@ private static String fromNumber453(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4531"; // Bad Oldesloe - case "2": + case '2': return "4532"; // Bargteheide - case "3": + case '3': return "4533"; // Reinfeld Holstein - case "4": + case '4': return "4534"; // Steinburg Kr Storman - case "5": + case '5': return "4535"; // Nahe - case "6": + case '6': return "4536"; // Steinhorst Lauenb - case "7": + case '7': return "4537"; // Sülfeld Holst - case "9": + case '9': return "4539"; // Westerau default: return ""; @@ -9726,20 +9736,20 @@ private static String fromNumber454(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4541"; // Ratzeburg - case "2": + case '2': return "4542"; // Mölln Lauenb - case "3": + case '3': return "4543"; // Nusse - case "4": + case '4': return "4544"; // Berkenthin - case "5": + case '5': return "4545"; // Seedorf Lauenb - case "6": + case '6': return "4546"; // Mustin Lauenburg - case "7": + case '7': return "4547"; // Gudow Lauenb default: return ""; @@ -9751,26 +9761,26 @@ private static String fromNumber455(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4550"; // Bühnsdorf - case "1": + case '1': return "4551"; // Bad Segeberg - case "2": + case '2': return "4552"; // Leezen - case "3": + case '3': return "4553"; // Geschendorf - case "4": + case '4': return "4554"; // Wahlstedt - case "5": + case '5': return "4555"; // Seedorf b Bad Segeberg - case "6": + case '6': return "4556"; // Ahrensbök-Gnissau - case "7": + case '7': return "4557"; // Blunk - case "8": + case '8': return "4558"; // Todesfelde - case "9": + case '9': return "4559"; // Wensin default: return ""; @@ -9782,14 +9792,14 @@ private static String fromNumber456(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4561"; // Neustadt in Holstein - case "2": + case '2': return "4562"; // Grömitz - case "3": + case '3': return "4563"; // Scharbeutz-Haffkrug - case "4": + case '4': return "4564"; // Schashagen default: return ""; @@ -9801,24 +9811,24 @@ private static String fromNumber46(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber460(number.substring(1)); - case "1": + case '1': return "461"; // Flensburg - case "2": + case '2': return fromNumber462(number.substring(1)); - case "3": + case '3': return fromNumber463(number.substring(1)); - case "4": + case '4': return fromNumber464(number.substring(1)); - case "5": + case '5': return fromNumber465(number.substring(1)); - case "6": + case '6': return fromNumber466(number.substring(1)); - case "7": + case '7': return fromNumber467(number.substring(1)); - case "8": + case '8': return fromNumber468(number.substring(1)); default: return ""; @@ -9830,22 +9840,22 @@ private static String fromNumber460(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4602"; // Freienwill - case "3": + case '3': return "4603"; // Havetoft - case "4": + case '4': return "4604"; // Grossenwiehe - case "5": + case '5': return "4605"; // Medelby - case "6": + case '6': return "4606"; // Wanderup - case "7": + case '7': return "4607"; // Janneby - case "8": + case '8': return "4608"; // Handewitt - case "9": + case '9': return "4609"; // Eggebek default: return ""; @@ -9857,20 +9867,20 @@ private static String fromNumber462(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4621"; // Schleswig - case "2": + case '2': return "4622"; // Taarstedt - case "3": + case '3': return "4623"; // Böklund - case "4": + case '4': return "4624"; // Kropp - case "5": + case '5': return "4625"; // Jübek - case "6": + case '6': return "4626"; // Treia - case "7": + case '7': return "4627"; // Dörpstedt default: return ""; @@ -9882,26 +9892,26 @@ private static String fromNumber463(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4630"; // Barderup - case "1": + case '1': return "4631"; // Glücksburg Ostsee - case "2": + case '2': return "4632"; // Steinbergkirche - case "3": + case '3': return "4633"; // Satrup - case "4": + case '4': return "4634"; // Husby - case "5": + case '5': return "4635"; // Sörup - case "6": + case '6': return "4636"; // Langballig - case "7": + case '7': return "4637"; // Sterup - case "8": + case '8': return "4638"; // Tarp - case "9": + case '9': return "4639"; // Schafflund default: return ""; @@ -9913,16 +9923,16 @@ private static String fromNumber464(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4641"; // Süderbrarup - case "2": + case '2': return "4642"; // Kappeln Schlei - case "3": + case '3': return "4643"; // Gelting Angeln - case "4": + case '4': return "4644"; // Karby - case "6": + case '6': return "4646"; // Mohrkirch default: return ""; @@ -9934,8 +9944,8 @@ private static String fromNumber465(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4651"; // Sylt default: return ""; @@ -9947,22 +9957,22 @@ private static String fromNumber466(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4661"; // Niebüll - case "2": + case '2': return "4662"; // Leck - case "3": + case '3': return "4663"; // Süderlügum - case "4": + case '4': return "4664"; // Neukirchen b Niebüll - case "5": + case '5': return "4665"; // Emmelsbüll-Horsbüll - case "6": + case '6': return "4666"; // Ladelund - case "7": + case '7': return "4667"; // Dagebüll - case "8": + case '8': return "4668"; // Klanxbüll default: return ""; @@ -9974,14 +9984,14 @@ private static String fromNumber467(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4671"; // Bredstedt - case "2": + case '2': return "4672"; // Langenhorn - case "3": + case '3': return "4673"; // Joldelund - case "4": + case '4': return "4674"; // Ockholm default: return ""; @@ -9993,14 +10003,14 @@ private static String fromNumber468(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4681"; // Wyk auf Föhr - case "2": + case '2': return "4682"; // Amrum - case "3": + case '3': return "4683"; // Oldsum - case "4": + case '4': return "4684"; // Langeneß Hallig default: return ""; @@ -10012,24 +10022,24 @@ private static String fromNumber47(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber470(number.substring(1)); - case "1": + case '1': return "471"; // Bremerhaven - case "2": + case '2': return fromNumber472(number.substring(1)); - case "3": + case '3': return fromNumber473(number.substring(1)); - case "4": + case '4': return fromNumber474(number.substring(1)); - case "5": + case '5': return fromNumber475(number.substring(1)); - case "6": + case '6': return fromNumber476(number.substring(1)); - case "7": + case '7': return fromNumber477(number.substring(1)); - case "9": + case '9': return fromNumber479(number.substring(1)); default: return ""; @@ -10041,20 +10051,20 @@ private static String fromNumber470(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4702"; // Sandstedt - case "3": + case '3': return "4703"; // Loxstedt-Donnern - case "4": + case '4': return "4704"; // Drangstedt - case "5": + case '5': return "4705"; // Wremen - case "6": + case '6': return "4706"; // Schiffdorf - case "7": + case '7': return "4707"; // Langen-Neuenwalde - case "8": + case '8': return "4708"; // Ringstedt default: return ""; @@ -10066,16 +10076,16 @@ private static String fromNumber472(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4721"; // Cuxhaven - case "2": + case '2': return "4722"; // Cuxhaven-Altenbruch - case "3": + case '3': return "4723"; // Cuxhaven-Altenwalde - case "4": + case '4': return "4724"; // Cuxhaven-Lüdingworth - case "5": + case '5': return "4725"; // Helgoland default: return ""; @@ -10087,20 +10097,20 @@ private static String fromNumber473(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4731"; // Nordenham - case "2": + case '2': return "4732"; // Stadland-Rodenkirchen - case "3": + case '3': return "4733"; // Butjadingen-Burhave - case "4": + case '4': return "4734"; // Stadland-Seefeld - case "5": + case '5': return "4735"; // Butjadingen-Stollhamm - case "6": + case '6': return "4736"; // Butjadingen-Tossens - case "7": + case '7': return "4737"; // Stadland-Schwei default: return ""; @@ -10112,26 +10122,26 @@ private static String fromNumber474(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4740"; // Loxstedt-Dedesdorf - case "1": + case '1': return "4741"; // Nordholz b Bremerhaven - case "2": + case '2': return "4742"; // Dorum - case "3": + case '3': return "4743"; // Langen b Bremerhaven - case "4": + case '4': return "4744"; // Loxstedt - case "5": + case '5': return "4745"; // Bad Bederkesa - case "6": + case '6': return "4746"; // Hagen b Bremerhaven - case "7": + case '7': return "4747"; // Beverstedt - case "8": + case '8': return "4748"; // Stubben b Bremerhaven - case "9": + case '9': return "4749"; // Schiffdorf-Geestenseth default: return ""; @@ -10143,22 +10153,22 @@ private static String fromNumber475(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4751"; // Otterndorf - case "2": + case '2': return "4752"; // Neuhaus Oste - case "3": + case '3': return "4753"; // Balje - case "4": + case '4': return "4754"; // Bülkau - case "5": + case '5': return "4755"; // Ihlienworth - case "6": + case '6': return "4756"; // Odisheim - case "7": + case '7': return "4757"; // Wanna - case "8": + case '8': return "4758"; // Nordleda default: return ""; @@ -10170,24 +10180,24 @@ private static String fromNumber476(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4761"; // Bremervörde - case "2": + case '2': return "4762"; // Kutenholz - case "3": + case '3': return "4763"; // Gnarrenburg - case "4": + case '4': return "4764"; // Gnarrenburg-Klenkendorf - case "5": + case '5': return "4765"; // Ebersdorf b Bremervörde - case "6": + case '6': return "4766"; // Basdahl - case "7": + case '7': return "4767"; // Bremervörde-Bevern - case "8": + case '8': return "4768"; // Hipstedt - case "9": + case '9': return "4769"; // Bremervörde-Iselersheim default: return ""; @@ -10199,26 +10209,26 @@ private static String fromNumber477(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4770"; // Wischhafen - case "1": + case '1': return "4771"; // Hemmoor - case "2": + case '2': return "4772"; // Oberndorf Oste - case "3": + case '3': return "4773"; // Lamstedt - case "4": + case '4': return "4774"; // Hechthausen - case "5": + case '5': return "4775"; // Grossenwörden - case "6": + case '6': return "4776"; // Osten-Altendorf - case "7": + case '7': return "4777"; // Cadenberge - case "8": + case '8': return "4778"; // Wingst - case "9": + case '9': return "4779"; // Freiburg Elbe default: return ""; @@ -10230,18 +10240,18 @@ private static String fromNumber479(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4791"; // Osterholz-Scharmbeck - case "2": + case '2': return "4792"; // Worpswede - case "3": + case '3': return "4793"; // Hambergen - case "4": + case '4': return "4794"; // Worpswede-Ostersode - case "5": + case '5': return "4795"; // Garlstedt - case "6": + case '6': return "4796"; // Teufelsmoor default: return ""; @@ -10253,26 +10263,26 @@ private static String fromNumber48(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber480(number.substring(1)); - case "1": + case '1': return "481"; // Heide Holst - case "2": + case '2': return fromNumber482(number.substring(1)); - case "3": + case '3': return fromNumber483(number.substring(1)); - case "4": + case '4': return fromNumber484(number.substring(1)); - case "5": + case '5': return fromNumber485(number.substring(1)); - case "6": + case '6': return fromNumber486(number.substring(1)); - case "7": + case '7': return fromNumber487(number.substring(1)); - case "8": + case '8': return fromNumber488(number.substring(1)); - case "9": + case '9': return fromNumber489(number.substring(1)); default: return ""; @@ -10284,16 +10294,16 @@ private static String fromNumber480(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4802"; // Wrohm - case "3": + case '3': return "4803"; // Pahlen - case "4": + case '4': return "4804"; // Nordhastedt - case "5": + case '5': return "4805"; // Schafstedt - case "6": + case '6': return "4806"; // Sarzbüttel default: return ""; @@ -10305,24 +10315,24 @@ private static String fromNumber482(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4821"; // Itzehoe - case "2": + case '2': return "4822"; // Kellinghusen - case "3": + case '3': return "4823"; // Wilster - case "4": + case '4': return "4824"; // Krempe - case "5": + case '5': return "4825"; // Burg Dithmarschen - case "6": + case '6': return "4826"; // Hohenlockstedt - case "7": + case '7': return "4827"; // Wacken - case "8": + case '8': return "4828"; // Lägerdorf - case "9": + case '9': return "4829"; // Wewelsfleth default: return ""; @@ -10334,24 +10344,24 @@ private static String fromNumber483(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4830"; // Süderhastedt - case "2": + case '2': return "4832"; // Meldorf - case "3": + case '3': return "4833"; // Wesselburen - case "4": + case '4': return "4834"; // Büsum - case "5": + case '5': return "4835"; // Albersdorf Holst - case "6": + case '6': return "4836"; // Hennstedt Dithm - case "7": + case '7': return "4837"; // Neuenkirchen Dithm - case "8": + case '8': return "4838"; // Tellingstedt - case "9": + case '9': return "4839"; // Wöhrden Dithm default: return ""; @@ -10363,24 +10373,24 @@ private static String fromNumber484(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4841"; // Husum Nordsee - case "2": + case '2': return "4842"; // Nordstrand - case "3": + case '3': return "4843"; // Viöl - case "4": + case '4': return "4844"; // Pellworm - case "5": + case '5': return "4845"; // Ostenfeld Husum - case "6": + case '6': return "4846"; // Hattstedt - case "7": + case '7': return "4847"; // Oster-Ohrstedt - case "8": + case '8': return "4848"; // Rantrum - case "9": + case '9': return "4849"; // Hooge default: return ""; @@ -10392,24 +10402,24 @@ private static String fromNumber485(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4851"; // Marne - case "2": + case '2': return "4852"; // Brunsbüttel - case "3": + case '3': return "4853"; // Sankt Michaelisdonn - case "4": + case '4': return "4854"; // Friedrichskoog - case "5": + case '5': return "4855"; // Eddelak - case "6": + case '6': return "4856"; // Kronprinzenkoog - case "7": + case '7': return "4857"; // Barlt - case "8": + case '8': return "4858"; // Sankt Margarethen Holst - case "9": + case '9': return "4859"; // Windbergen default: return ""; @@ -10421,16 +10431,16 @@ private static String fromNumber486(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4861"; // Tönning - case "2": + case '2': return "4862"; // Garding - case "3": + case '3': return "4863"; // Sankt Peter-Ording - case "4": + case '4': return "4864"; // Oldenswort - case "5": + case '5': return "4865"; // Osterhever default: return ""; @@ -10442,20 +10452,20 @@ private static String fromNumber487(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4871"; // Hohenwestedt - case "2": + case '2': return "4872"; // Hanerau-Hademarschen - case "3": + case '3': return "4873"; // Aukrug - case "4": + case '4': return "4874"; // Todenbüttel - case "5": + case '5': return "4875"; // Stafstedt - case "6": + case '6': return "4876"; // Reher Holst - case "7": + case '7': return "4877"; // Hennstedt b Itzehoe default: return ""; @@ -10467,16 +10477,16 @@ private static String fromNumber488(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4881"; // Friedrichstadt - case "2": + case '2': return "4882"; // Lunden - case "3": + case '3': return "4883"; // Süderstapel - case "4": + case '4': return "4884"; // Schwabstedt - case "5": + case '5': return "4885"; // Bergenhusen default: return ""; @@ -10488,10 +10498,10 @@ private static String fromNumber489(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4892"; // Schenefeld Mittelholst - case "3": + case '3': return "4893"; // Hohenaspe default: return ""; @@ -10503,22 +10513,22 @@ private static String fromNumber49(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber490(number.substring(1)); - case "1": + case '1': return "491"; // Leer Ostfriesland - case "2": + case '2': return fromNumber492(number.substring(1)); - case "3": + case '3': return fromNumber493(number.substring(1)); - case "4": + case '4': return fromNumber494(number.substring(1)); - case "5": + case '5': return fromNumber495(number.substring(1)); - case "6": + case '6': return fromNumber496(number.substring(1)); - case "7": + case '7': return fromNumber497(number.substring(1)); default: return ""; @@ -10530,10 +10540,10 @@ private static String fromNumber490(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4902"; // Jemgum-Ditzum - case "3": + case '3': return "4903"; // Wymeer default: return ""; @@ -10545,26 +10555,26 @@ private static String fromNumber492(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4920"; // Wirdum - case "1": + case '1': return "4921"; // Emden Stadt - case "2": + case '2': return "4922"; // Borkum - case "3": + case '3': return "4923"; // Krummhörn-Pewsum - case "4": + case '4': return "4924"; // Moormerland-Oldersum - case "5": + case '5': return "4925"; // Hinte - case "6": + case '6': return "4926"; // Krummhörn-Greetsiel - case "7": + case '7': return "4927"; // Krummhörn-Loquard - case "8": + case '8': return "4928"; // Ihlow-Riepe - case "9": + case '9': return "4929"; // Ihlow Kr Aurich default: return ""; @@ -10576,22 +10586,22 @@ private static String fromNumber493(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4931"; // Norden - case "2": + case '2': return "4932"; // Norderney - case "3": + case '3': return "4933"; // Dornum Ostfriesl - case "4": + case '4': return "4934"; // Marienhafe - case "5": + case '5': return "4935"; // Juist - case "6": + case '6': return "4936"; // Grossheide - case "8": + case '8': return "4938"; // Hagermarsch - case "9": + case '9': return "4939"; // Baltrum default: return ""; @@ -10603,22 +10613,22 @@ private static String fromNumber494(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4941"; // Aurich - case "2": + case '2': return "4942"; // Südbrookmerland - case "3": + case '3': return "4943"; // Grossefehn - case "4": + case '4': return "4944"; // Wiesmoor - case "5": + case '5': return "4945"; // Grossefehn-Timmel - case "6": + case '6': return "4946"; // Grossefehn-Bagband - case "7": + case '7': return "4947"; // Aurich-Ogenbargen - case "8": + case '8': return "4948"; // Wiesmoor-Marcardsmoor default: return ""; @@ -10630,26 +10640,26 @@ private static String fromNumber495(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4950"; // Holtland - case "1": + case '1': return "4951"; // Weener - case "2": + case '2': return "4952"; // Rhauderfehn - case "3": + case '3': return "4953"; // Bunde - case "4": + case '4': return "4954"; // Moormerland - case "5": + case '5': return "4955"; // Westoverledingen - case "6": + case '6': return "4956"; // Uplengen - case "7": + case '7': return "4957"; // Detern - case "8": + case '8': return "4958"; // Jemgum - case "9": + case '9': return "4959"; // Dollart default: return ""; @@ -10661,22 +10671,22 @@ private static String fromNumber496(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4961"; // Papenburg - case "2": + case '2': return "4962"; // Papenburg-Aschendorf - case "3": + case '3': return "4963"; // Dörpen - case "4": + case '4': return "4964"; // Rhede Ems - case "5": + case '5': return "4965"; // Surwold - case "6": + case '6': return "4966"; // Neubörger - case "7": + case '7': return "4967"; // Rhauderfehn-Burlage - case "8": + case '8': return "4968"; // Neulehe default: return ""; @@ -10688,20 +10698,20 @@ private static String fromNumber497(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4971"; // Esens - case "2": + case '2': return "4972"; // Langeoog - case "3": + case '3': return "4973"; // Wittmund-Burhafe - case "4": + case '4': return "4974"; // Neuharlingersiel - case "5": + case '5': return "4975"; // Westerholt Ostfriesl - case "6": + case '6': return "4976"; // Spiekeroog - case "7": + case '7': return "4977"; // Blomberg Ostfriesl default: return ""; @@ -10713,26 +10723,26 @@ private static String fromNumber5(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber50(number.substring(1)); - case "1": + case '1': return fromNumber51(number.substring(1)); - case "2": + case '2': return fromNumber52(number.substring(1)); - case "3": + case '3': return fromNumber53(number.substring(1)); - case "4": + case '4': return fromNumber54(number.substring(1)); - case "5": + case '5': return fromNumber55(number.substring(1)); - case "6": + case '6': return fromNumber56(number.substring(1)); - case "7": + case '7': return fromNumber57(number.substring(1)); - case "8": + case '8': return fromNumber58(number.substring(1)); - case "9": + case '9': return fromNumber59(number.substring(1)); default: return ""; @@ -10744,20 +10754,20 @@ private static String fromNumber50(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber502(number.substring(1)); - case "3": + case '3': return fromNumber503(number.substring(1)); - case "4": + case '4': return fromNumber504(number.substring(1)); - case "5": + case '5': return fromNumber505(number.substring(1)); - case "6": + case '6': return fromNumber506(number.substring(1)); - case "7": + case '7': return fromNumber507(number.substring(1)); - case "8": + case '8': return fromNumber508(number.substring(1)); default: return ""; @@ -10769,22 +10779,22 @@ private static String fromNumber502(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5021"; // Nienburg Weser - case "2": + case '2': return "5022"; // Wietzen - case "3": + case '3': return "5023"; // Liebenau Kr Nieburg Weser - case "4": + case '4': return "5024"; // Rohrsen Kr Nienburg Weser - case "5": + case '5': return "5025"; // Estorf Weser - case "6": + case '6': return "5026"; // Steimbke - case "7": + case '7': return "5027"; // Linsburg - case "8": + case '8': return "5028"; // Pennigsehl default: return ""; @@ -10796,20 +10806,20 @@ private static String fromNumber503(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5031"; // Wunstorf - case "2": + case '2': return "5032"; // Neustadt am Rübenberge - case "3": + case '3': return "5033"; // Wunstorf-Grossenheidorn - case "4": + case '4': return "5034"; // Neustadt-Hagen - case "5": + case '5': return "5035"; // Gross Munzel - case "6": + case '6': return "5036"; // Neustadt-Schneeren - case "7": + case '7': return "5037"; // Bad Rehburg default: return ""; @@ -10821,16 +10831,16 @@ private static String fromNumber504(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5041"; // Springe Deister - case "2": + case '2': return "5042"; // Bad Münder am Deister - case "3": + case '3': return "5043"; // Lauenau - case "4": + case '4': return "5044"; // Springe-Eldagsen - case "5": + case '5': return "5045"; // Springe-Bennigsen default: return ""; @@ -10842,18 +10852,18 @@ private static String fromNumber505(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5051"; // Bergen Kr Celle - case "2": + case '2': return "5052"; // Hermannsburg - case "3": + case '3': return "5053"; // Faßberg-Müden - case "4": + case '4': return "5054"; // Bergen-Sülze - case "5": + case '5': return "5055"; // Fassberg - case "6": + case '6': return "5056"; // Winsen-Meissendorf default: return ""; @@ -10865,24 +10875,24 @@ private static String fromNumber506(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5060"; // Bodenburg - case "2": + case '2': return "5062"; // Holle b Hildesheim - case "3": + case '3': return "5063"; // Bad Salzdetfurth - case "4": + case '4': return "5064"; // Groß Düngen - case "5": + case '5': return "5065"; // Sibbesse - case "6": + case '6': return "5066"; // Sarstedt - case "7": + case '7': return "5067"; // Bockenem - case "8": + case '8': return "5068"; // Elze Leine - case "9": + case '9': return "5069"; // Nordstemmen default: return ""; @@ -10894,14 +10904,14 @@ private static String fromNumber507(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5071"; // Schwarmstedt - case "2": + case '2': return "5072"; // Neustadt-Mandelsloh - case "3": + case '3': return "5073"; // Neustadt-Esperke - case "4": + case '4': return "5074"; // Rodewald default: return ""; @@ -10913,16 +10923,16 @@ private static String fromNumber508(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5082"; // Langlingen - case "3": + case '3': return "5083"; // Hohne b Celle - case "4": + case '4': return "5084"; // Hambühren - case "5": + case '5': return "5085"; // Burgdorf-Ehlershausen - case "6": + case '6': return "5086"; // Celle-Scheuen default: return ""; @@ -10934,26 +10944,26 @@ private static String fromNumber51(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber510(number.substring(1)); - case "1": + case '1': return "511"; // Hannover - case "2": + case '2': return fromNumber512(number.substring(1)); - case "3": + case '3': return fromNumber513(number.substring(1)); - case "4": + case '4': return fromNumber514(number.substring(1)); - case "5": + case '5': return fromNumber515(number.substring(1)); - case "6": + case '6': return fromNumber516(number.substring(1)); - case "7": + case '7': return fromNumber517(number.substring(1)); - case "8": + case '8': return fromNumber518(number.substring(1)); - case "9": + case '9': return fromNumber519(number.substring(1)); default: return ""; @@ -10965,18 +10975,18 @@ private static String fromNumber510(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5101"; // Pattensen - case "2": + case '2': return "5102"; // Laatzen - case "3": + case '3': return "5103"; // Wennigsen Deister - case "5": + case '5': return "5105"; // Barsinghausen - case "8": + case '8': return "5108"; // Gehrden Han - case "9": + case '9': return "5109"; // Ronnenberg default: return ""; @@ -10988,18 +10998,18 @@ private static String fromNumber512(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5121"; // Hildesheim - case "3": + case '3': return "5123"; // Schellerten - case "6": + case '6': return "5126"; // Algermissen - case "7": + case '7': return "5127"; // Harsum - case "8": + case '8': return "5128"; // Hohenhameln - case "9": + case '9': return "5129"; // Söhlde default: return ""; @@ -11011,22 +11021,22 @@ private static String fromNumber513(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5130"; // Wedemark - case "1": + case '1': return "5131"; // Garbsen - case "2": + case '2': return "5132"; // Lehrte - case "5": + case '5': return "5135"; // Burgwedel-Fuhrberg - case "6": + case '6': return "5136"; // Burgdorf Kr Hannover - case "7": + case '7': return "5137"; // Seelze - case "8": + case '8': return "5138"; // Sehnde - case "9": + case '9': return "5139"; // Burgwedel default: return ""; @@ -11038,24 +11048,24 @@ private static String fromNumber514(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5141"; // Celle - case "2": + case '2': return "5142"; // Eschede - case "3": + case '3': return "5143"; // Winsen Aller - case "4": + case '4': return "5144"; // Wathlingen - case "5": + case '5': return "5145"; // Beedenbostel - case "6": + case '6': return "5146"; // Wietze - case "7": + case '7': return "5147"; // Uetze-Hänigsen - case "8": + case '8': return "5148"; // Steinhorst Niedersachs - case "9": + case '9': return "5149"; // Wienhausen default: return ""; @@ -11067,24 +11077,24 @@ private static String fromNumber515(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5151"; // Hameln - case "2": + case '2': return "5152"; // Hessisch Oldendorf - case "3": + case '3': return "5153"; // Salzhemmendorf - case "4": + case '4': return "5154"; // Aerzen - case "5": + case '5': return "5155"; // Emmerthal - case "6": + case '6': return "5156"; // Coppenbrügge - case "7": + case '7': return "5157"; // Emmerthal-Börry - case "8": + case '8': return "5158"; // Hemeringen - case "9": + case '9': return "5159"; // Coppenbrügge-Bisperode default: return ""; @@ -11096,22 +11106,22 @@ private static String fromNumber516(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5161"; // Walsrode - case "2": + case '2': return "5162"; // Fallingbostel - case "3": + case '3': return "5163"; // Fallingbostel-Dorfmark - case "4": + case '4': return "5164"; // Hodenhagen - case "5": + case '5': return "5165"; // Rethem Aller - case "6": + case '6': return "5166"; // Walsrode-Kirchboitzen - case "7": + case '7': return "5167"; // Walsrode-Westenholz - case "8": + case '8': return "5168"; // Walsrode-Stellichte default: return ""; @@ -11123,20 +11133,20 @@ private static String fromNumber517(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5171"; // Peine - case "2": + case '2': return "5172"; // Ilsede - case "3": + case '3': return "5173"; // Uetze - case "4": + case '4': return "5174"; // Lahstedt - case "5": + case '5': return "5175"; // Lehrte-Arpke - case "6": + case '6': return "5176"; // Edemissen - case "7": + case '7': return "5177"; // Edemissen-Abbensen default: return ""; @@ -11148,20 +11158,20 @@ private static String fromNumber518(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5181"; // Alfeld Leine - case "2": + case '2': return "5182"; // Gronau Leine - case "3": + case '3': return "5183"; // Lamspringe - case "4": + case '4': return "5184"; // Freden Leine - case "5": + case '5': return "5185"; // Duingen - case "6": + case '6': return "5186"; // Salzhemmendorf-Wallensen - case "7": + case '7': return "5187"; // Delligsen default: return ""; @@ -11173,26 +11183,26 @@ private static String fromNumber519(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5190"; // Soltau-Emmingen - case "1": + case '1': return "5191"; // Soltau - case "2": + case '2': return "5192"; // Munster - case "3": + case '3': return "5193"; // Schneverdingen - case "4": + case '4': return "5194"; // Bispingen - case "5": + case '5': return "5195"; // Neuenkirchen b Soltau - case "6": + case '6': return "5196"; // Wietzendorf - case "7": + case '7': return "5197"; // Soltau-Frielingen - case "8": + case '8': return "5198"; // Schneverdingen-Wintermoor - case "9": + case '9': return "5199"; // Schneverdingen-Heber default: return ""; @@ -11204,26 +11214,26 @@ private static String fromNumber52(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber520(number.substring(1)); - case "1": + case '1': return "521"; // Bielefeld - case "2": + case '2': return fromNumber522(number.substring(1)); - case "3": + case '3': return fromNumber523(number.substring(1)); - case "4": + case '4': return fromNumber524(number.substring(1)); - case "5": + case '5': return fromNumber525(number.substring(1)); - case "6": + case '6': return fromNumber526(number.substring(1)); - case "7": + case '7': return fromNumber527(number.substring(1)); - case "8": + case '8': return fromNumber528(number.substring(1)); - case "9": + case '9': return fromNumber529(number.substring(1)); default: return ""; @@ -11235,24 +11245,24 @@ private static String fromNumber520(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5201"; // Halle Westf - case "2": + case '2': return "5202"; // Oerlinghausen - case "3": + case '3': return "5203"; // Werther Westf - case "4": + case '4': return "5204"; // Steinhagen Westf - case "5": + case '5': return "5205"; // Bielefeld-Sennestadt - case "6": + case '6': return "5206"; // Bielefeld-Jöllenbeck - case "7": + case '7': return "5207"; // Schloss Holte-Stukenbrock - case "8": + case '8': return "5208"; // Leopoldshöhe - case "9": + case '9': return "5209"; // Gütersloh-Friedrichsdorf default: return ""; @@ -11264,20 +11274,20 @@ private static String fromNumber522(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5221"; // Herford - case "2": + case '2': return "5222"; // Bad Salzuflen - case "3": + case '3': return "5223"; // Bünde - case "4": + case '4': return "5224"; // Enger Westf - case "5": + case '5': return "5225"; // Spenge - case "6": + case '6': return "5226"; // Bruchmühlen Westf - case "8": + case '8': return "5228"; // Vlotho-Exter default: return ""; @@ -11289,22 +11299,22 @@ private static String fromNumber523(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5231"; // Detmold - case "2": + case '2': return "5232"; // Lage Lippe - case "3": + case '3': return "5233"; // Steinheim Westf - case "4": + case '4': return "5234"; // Horn-Bad Meinberg - case "5": + case '5': return "5235"; // Blomberg Lippe - case "6": + case '6': return "5236"; // Blomberg-Grossenmarpe - case "7": + case '7': return "5237"; // Augustdorf - case "8": + case '8': return "5238"; // Nieheim-Himmighausen default: return ""; @@ -11316,20 +11326,20 @@ private static String fromNumber524(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5241"; // Gütersloh - case "2": + case '2': return "5242"; // Rheda-Wiedenbrück - case "4": + case '4': return "5244"; // Rietberg - case "5": + case '5': return "5245"; // Herzebrock-Clarholz - case "6": + case '6': return "5246"; // Verl - case "7": + case '7': return "5247"; // Harsewinkel - case "8": + case '8': return "5248"; // Langenberg Kr Gütersloh default: return ""; @@ -11341,24 +11351,24 @@ private static String fromNumber525(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5250"; // Delbrück Westf - case "1": + case '1': return "5251"; // Paderborn - case "2": + case '2': return "5252"; // Bad Lippspringe - case "3": + case '3': return "5253"; // Bad Driburg - case "4": + case '4': return "5254"; // Paderborn-Schloss Neuhaus - case "5": + case '5': return "5255"; // Altenbeken - case "7": + case '7': return "5257"; // Hövelhof - case "8": + case '8': return "5258"; // Salzkotten - case "9": + case '9': return "5259"; // Bad Driburg-Neuenheerse default: return ""; @@ -11370,18 +11380,18 @@ private static String fromNumber526(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5261"; // Lemgo - case "2": + case '2': return "5262"; // Extertal - case "3": + case '3': return "5263"; // Barntrup - case "4": + case '4': return "5264"; // Kalletal - case "5": + case '5': return "5265"; // Dörentrup - case "6": + case '6': return "5266"; // Lemgo-Kirchheide default: return ""; @@ -11393,22 +11403,22 @@ private static String fromNumber527(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5271"; // Höxter - case "2": + case '2': return "5272"; // Brakel Westf - case "3": + case '3': return "5273"; // Beverungen - case "4": + case '4': return "5274"; // Nieheim - case "5": + case '5': return "5275"; // Höxter-Ottbergen - case "6": + case '6': return "5276"; // Marienmünster - case "7": + case '7': return "5277"; // Höxter-Fürstenau - case "8": + case '8': return "5278"; // Höxter-Ovenhausen default: return ""; @@ -11420,18 +11430,18 @@ private static String fromNumber528(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5281"; // Bad Pyrmont - case "2": + case '2': return "5282"; // Schieder-Schwalenberg - case "3": + case '3': return "5283"; // Lügde-Rischenau - case "4": + case '4': return "5284"; // Schwalenberg - case "5": + case '5': return "5285"; // Bad Pyrmont-Kleinenberg - case "6": + case '6': return "5286"; // Ottenstein Niedersachs default: return ""; @@ -11443,14 +11453,14 @@ private static String fromNumber529(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5292"; // Lichtenau-Atteln - case "3": + case '3': return "5293"; // Paderborn-Dahl - case "4": + case '4': return "5294"; // Hövelhof-Espeln - case "5": + case '5': return "5295"; // Lichtenau Westf default: return ""; @@ -11462,24 +11472,24 @@ private static String fromNumber53(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber530(number.substring(1)); - case "1": + case '1': return "531"; // Braunschweig - case "2": + case '2': return fromNumber532(number.substring(1)); - case "3": + case '3': return fromNumber533(number.substring(1)); - case "4": + case '4': return fromNumber534(number.substring(1)); - case "5": + case '5': return fromNumber535(number.substring(1)); - case "6": + case '6': return fromNumber536(number.substring(1)); - case "7": + case '7': return fromNumber537(number.substring(1)); - case "8": + case '8': return fromNumber538(number.substring(1)); default: return ""; @@ -11491,26 +11501,26 @@ private static String fromNumber530(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5300"; // Salzgitter-Üfingen - case "1": + case '1': return "5301"; // Lehre-Essenrode - case "2": + case '2': return "5302"; // Vechelde - case "3": + case '3': return "5303"; // Wendeburg - case "4": + case '4': return "5304"; // Meine - case "5": + case '5': return "5305"; // Sickte - case "6": + case '6': return "5306"; // Cremlingen - case "7": + case '7': return "5307"; // Braunschweig-Wenden - case "8": + case '8': return "5308"; // Lehre - case "9": + case '9': return "5309"; // Lehre-Wendhausen default: return ""; @@ -11522,26 +11532,26 @@ private static String fromNumber532(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5320"; // Torfhaus - case "1": + case '1': return "5321"; // Goslar - case "2": + case '2': return "5322"; // Bad Harzburg - case "3": + case '3': return "5323"; // Clausthal-Zellerfeld - case "4": + case '4': return "5324"; // Vienenburg - case "5": + case '5': return "5325"; // Goslar-Hahnenklee - case "6": + case '6': return "5326"; // Langelsheim - case "7": + case '7': return "5327"; // Bad Grund Harz - case "8": + case '8': return "5328"; // Altenau Harz - case "9": + case '9': return "5329"; // Schulenberg im Oberharz default: return ""; @@ -11553,22 +11563,22 @@ private static String fromNumber533(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5331"; // Wolfenbüttel - case "2": + case '2': return "5332"; // Schöppenstedt - case "3": + case '3': return "5333"; // Dettum - case "4": + case '4': return "5334"; // Hornburg Kr Wolfenbüttel - case "5": + case '5': return "5335"; // Schladen - case "6": + case '6': return "5336"; // Semmenstedt - case "7": + case '7': return "5337"; // Kissenbrück - case "9": + case '9': return "5339"; // Gielde default: return ""; @@ -11580,16 +11590,16 @@ private static String fromNumber534(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5341"; // Salzgitter - case "4": + case '4': return "5344"; // Lengede - case "5": + case '5': return "5345"; // Baddeckenstedt - case "6": + case '6': return "5346"; // Liebenburg - case "7": + case '7': return "5347"; // Burgdorf b Salzgitter default: return ""; @@ -11601,22 +11611,22 @@ private static String fromNumber535(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5351"; // Helmstedt - case "2": + case '2': return "5352"; // Schöningen - case "3": + case '3': return "5353"; // Königslutter am Elm - case "4": + case '4': return "5354"; // Jerxheim - case "5": + case '5': return "5355"; // Frellstedt - case "6": + case '6': return "5356"; // Helmstedt-Barmke - case "7": + case '7': return "5357"; // Grasleben - case "8": + case '8': return "5358"; // Bahrdorf-Mackendorf default: return ""; @@ -11628,22 +11638,22 @@ private static String fromNumber536(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5361"; // Wolfsburg - case "2": + case '2': return "5362"; // Wolfsburg-Fallersleben - case "3": + case '3': return "5363"; // Wolfsburg-Vorsfelde - case "4": + case '4': return "5364"; // Velpke - case "5": + case '5': return "5365"; // Wolfsburg-Neindorf - case "6": + case '6': return "5366"; // Jembke - case "7": + case '7': return "5367"; // Rühen - case "8": + case '8': return "5368"; // Parsau default: return ""; @@ -11655,24 +11665,24 @@ private static String fromNumber537(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5371"; // Gifhorn - case "2": + case '2': return "5372"; // Meinersen - case "3": + case '3': return "5373"; // Hillerse Kr Gifhorn - case "4": + case '4': return "5374"; // Isenbüttel - case "5": + case '5': return "5375"; // Müden Aller - case "6": + case '6': return "5376"; // Wesendorf Kr Gifhorn - case "7": + case '7': return "5377"; // Ehra-Lessien - case "8": + case '8': return "5378"; // Sassenburg-Platendorf - case "9": + case '9': return "5379"; // Sassenburg-Grussendorf default: return ""; @@ -11684,14 +11694,14 @@ private static String fromNumber538(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5381"; // Seesen - case "2": + case '2': return "5382"; // Bad Gandersheim - case "3": + case '3': return "5383"; // Lutter am Barenberge - case "4": + case '4': return "5384"; // Seesen-Groß Rhüden default: return ""; @@ -11703,26 +11713,26 @@ private static String fromNumber54(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber540(number.substring(1)); - case "1": + case '1': return "541"; // Osnabrück - case "2": + case '2': return fromNumber542(number.substring(1)); - case "3": + case '3': return fromNumber543(number.substring(1)); - case "4": + case '4': return fromNumber544(number.substring(1)); - case "5": + case '5': return fromNumber545(number.substring(1)); - case "6": + case '6': return fromNumber546(number.substring(1)); - case "7": + case '7': return fromNumber547(number.substring(1)); - case "8": + case '8': return fromNumber548(number.substring(1)); - case "9": + case '9': return fromNumber549(number.substring(1)); default: return ""; @@ -11734,22 +11744,22 @@ private static String fromNumber540(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5401"; // Georgsmarienhütte - case "2": + case '2': return "5402"; // Bissendorf Kr Osnabrück - case "3": + case '3': return "5403"; // Bad Iburg - case "4": + case '4': return "5404"; // Westerkappeln - case "5": + case '5': return "5405"; // Hasbergen Kr Osnabrück - case "6": + case '6': return "5406"; // Belm - case "7": + case '7': return "5407"; // Wallenhorst - case "9": + case '9': return "5409"; // Hilter am Teutoburger Wald default: return ""; @@ -11761,24 +11771,24 @@ private static String fromNumber542(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5421"; // Dissen am Teutoburger Wald - case "2": + case '2': return "5422"; // Melle - case "3": + case '3': return "5423"; // Versmold - case "4": + case '4': return "5424"; // Bad Rothenfelde - case "5": + case '5': return "5425"; // Borgholzhausen - case "6": + case '6': return "5426"; // Glandorf - case "7": + case '7': return "5427"; // Melle-Buer - case "8": + case '8': return "5428"; // Melle-Neuenkirchen - case "9": + case '9': return "5429"; // Melle-Wellingholzhausen default: return ""; @@ -11790,24 +11800,24 @@ private static String fromNumber543(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5431"; // Quakenbrück - case "2": + case '2': return "5432"; // Löningen - case "3": + case '3': return "5433"; // Badbergen - case "4": + case '4': return "5434"; // Essen Oldenburg - case "5": + case '5': return "5435"; // Berge b Quakenbrück - case "6": + case '6': return "5436"; // Nortrup - case "7": + case '7': return "5437"; // Menslage - case "8": + case '8': return "5438"; // Bakum-Lüsche - case "9": + case '9': return "5439"; // Bersenbrück default: return ""; @@ -11819,22 +11829,22 @@ private static String fromNumber544(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5441"; // Diepholz - case "2": + case '2': return "5442"; // Barnstorf Kr Diepholz - case "3": + case '3': return "5443"; // Lemförde - case "4": + case '4': return "5444"; // Wagenfeld - case "5": + case '5': return "5445"; // Drebber - case "6": + case '6': return "5446"; // Rehden - case "7": + case '7': return "5447"; // Lembruch - case "8": + case '8': return "5448"; // Barver default: return ""; @@ -11846,24 +11856,24 @@ private static String fromNumber545(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5451"; // Ibbenbüren - case "2": + case '2': return "5452"; // Mettingen Westf - case "3": + case '3': return "5453"; // Recke - case "4": + case '4': return "5454"; // Hörstel-Riesenbeck - case "5": + case '5': return "5455"; // Tecklenburg-Brochterbeck - case "6": + case '6': return "5456"; // Westerkappeln-Velpe - case "7": + case '7': return "5457"; // Hopsten-Schale - case "8": + case '8': return "5458"; // Hopsten - case "9": + case '9': return "5459"; // Hörstel default: return ""; @@ -11875,20 +11885,20 @@ private static String fromNumber546(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5461"; // Bramsche Hase - case "2": + case '2': return "5462"; // Ankum - case "4": + case '4': return "5464"; // Alfhausen - case "5": + case '5': return "5465"; // Neuenkirchen b Bramsche - case "6": + case '6': return "5466"; // Merzen - case "7": + case '7': return "5467"; // Voltlage - case "8": + case '8': return "5468"; // Bramsche-Engter default: return ""; @@ -11900,18 +11910,18 @@ private static String fromNumber547(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5471"; // Bohmte - case "2": + case '2': return "5472"; // Bad Essen - case "3": + case '3': return "5473"; // Ostercappeln - case "4": + case '4': return "5474"; // Stemwede-Dielingen - case "5": + case '5': return "5475"; // Bohmte-Hunteburg - case "6": + case '6': return "5476"; // Ostercappeln-Venne default: return ""; @@ -11923,16 +11933,16 @@ private static String fromNumber548(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5481"; // Lengerich Westf - case "2": + case '2': return "5482"; // Tecklenburg - case "3": + case '3': return "5483"; // Lienen - case "4": + case '4': return "5484"; // Lienen-Kattenvenne - case "5": + case '5': return "5485"; // Ladbergen default: return ""; @@ -11944,16 +11954,16 @@ private static String fromNumber549(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5491"; // Damme Dümmer - case "2": + case '2': return "5492"; // Steinfeld Oldenburg - case "3": + case '3': return "5493"; // Neuenkirchen Kr Vechta - case "4": + case '4': return "5494"; // Holdorf Niedersachs - case "5": + case '5': return "5495"; // Vörden Kr Vechta default: return ""; @@ -11965,26 +11975,26 @@ private static String fromNumber55(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber550(number.substring(1)); - case "1": + case '1': return "551"; // Göttingen - case "2": + case '2': return fromNumber552(number.substring(1)); - case "3": + case '3': return fromNumber553(number.substring(1)); - case "4": + case '4': return fromNumber554(number.substring(1)); - case "5": + case '5': return fromNumber555(number.substring(1)); - case "6": + case '6': return fromNumber556(number.substring(1)); - case "7": + case '7': return fromNumber557(number.substring(1)); - case "8": + case '8': return fromNumber558(number.substring(1)); - case "9": + case '9': return fromNumber559(number.substring(1)); default: return ""; @@ -11996,22 +12006,22 @@ private static String fromNumber550(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5502"; // Dransfeld - case "3": + case '3': return "5503"; // Nörten-Hardenberg - case "4": + case '4': return "5504"; // Friedland Kr Göttingen - case "5": + case '5': return "5505"; // Hardegsen - case "6": + case '6': return "5506"; // Adelebsen - case "7": + case '7': return "5507"; // Ebergötzen - case "8": + case '8': return "5508"; // Gleichen-Rittmarshausen - case "9": + case '9': return "5509"; // Rosdorf Kr Göttingen default: return ""; @@ -12023,24 +12033,24 @@ private static String fromNumber552(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5520"; // Braunlage - case "1": + case '1': return "5521"; // Herzberg am Harz - case "2": + case '2': return "5522"; // Osterode am Harz - case "3": + case '3': return "5523"; // Bad Sachsa - case "4": + case '4': return "5524"; // Bad Lauterberg im Harz - case "5": + case '5': return "5525"; // Walkenried - case "7": + case '7': return "5527"; // Duderstadt - case "8": + case '8': return "5528"; // Gieboldehausen - case "9": + case '9': return "5529"; // Rhumspringe default: return ""; @@ -12052,18 +12062,18 @@ private static String fromNumber553(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5531"; // Holzminden - case "2": + case '2': return "5532"; // Stadtoldendorf - case "3": + case '3': return "5533"; // Bodenwerder - case "4": + case '4': return "5534"; // Eschershausen a d Lenne - case "5": + case '5': return "5535"; // Polle - case "6": + case '6': return "5536"; // Holzminden-Neuhaus default: return ""; @@ -12075,18 +12085,18 @@ private static String fromNumber554(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5541"; // Hann. Münden - case "2": + case '2': return "5542"; // Witzenhausen - case "3": + case '3': return "5543"; // Staufenberg Niedersachs - case "4": + case '4': return "5544"; // Reinhardshagen - case "5": + case '5': return "5545"; // Hedemünden - case "6": + case '6': return "5546"; // Scheden default: return ""; @@ -12098,18 +12108,18 @@ private static String fromNumber555(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5551"; // Northeim - case "2": + case '2': return "5552"; // Katlenburg - case "3": + case '3': return "5553"; // Kalefeld - case "4": + case '4': return "5554"; // Moringen - case "5": + case '5': return "5555"; // Moringen-Fredelsloh - case "6": + case '6': return "5556"; // Lindau Harz default: return ""; @@ -12121,16 +12131,16 @@ private static String fromNumber556(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5561"; // Einbeck - case "2": + case '2': return "5562"; // Dassel-Markoldendorf - case "3": + case '3': return "5563"; // Kreiensen - case "4": + case '4': return "5564"; // Dassel - case "5": + case '5': return "5565"; // Einbeck-Wenzen default: return ""; @@ -12142,14 +12152,14 @@ private static String fromNumber557(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5571"; // Uslar - case "2": + case '2': return "5572"; // Bodenfelde - case "3": + case '3': return "5573"; // Uslar-Volpriehausen - case "4": + case '4': return "5574"; // Oberweser default: return ""; @@ -12161,16 +12171,16 @@ private static String fromNumber558(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5582"; // Sankt Andreasberg - case "3": + case '3': return "5583"; // Braunlage-Hohegeiss - case "4": + case '4': return "5584"; // Hattorf am Harz - case "5": + case '5': return "5585"; // Herzberg-Sieber - case "6": + case '6': return "5586"; // Wieda default: return ""; @@ -12182,12 +12192,12 @@ private static String fromNumber559(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5592"; // Gleichen-Bremke - case "3": + case '3': return "5593"; // Bovenden-Lenglern - case "4": + case '4': return "5594"; // Bovenden-Reyershausen default: return ""; @@ -12199,26 +12209,26 @@ private static String fromNumber56(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber560(number.substring(1)); - case "1": + case '1': return "561"; // Kassel - case "2": + case '2': return fromNumber562(number.substring(1)); - case "3": + case '3': return fromNumber563(number.substring(1)); - case "4": + case '4': return fromNumber564(number.substring(1)); - case "5": + case '5': return fromNumber565(number.substring(1)); - case "6": + case '6': return fromNumber566(number.substring(1)); - case "7": + case '7': return fromNumber567(number.substring(1)); - case "8": + case '8': return fromNumber568(number.substring(1)); - case "9": + case '9': return fromNumber569(number.substring(1)); default: return ""; @@ -12230,24 +12240,24 @@ private static String fromNumber560(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5601"; // Schauenburg - case "2": + case '2': return "5602"; // Hessisch Lichtenau - case "3": + case '3': return "5603"; // Gudensberg - case "4": + case '4': return "5604"; // Grossalmerode - case "5": + case '5': return "5605"; // Kaufungen Hess - case "6": + case '6': return "5606"; // Zierenberg - case "7": + case '7': return "5607"; // Fuldatal - case "8": + case '8': return "5608"; // Söhrewald - case "9": + case '9': return "5609"; // Ahnatal default: return ""; @@ -12259,18 +12269,18 @@ private static String fromNumber562(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5621"; // Bad Wildungen - case "2": + case '2': return "5622"; // Fritzlar - case "3": + case '3': return "5623"; // Edertal - case "4": + case '4': return "5624"; // Bad Emstal - case "5": + case '5': return "5625"; // Naumburg Hess - case "6": + case '6': return "5626"; // Bad Zwesten default: return ""; @@ -12282,18 +12292,18 @@ private static String fromNumber563(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5631"; // Korbach - case "2": + case '2': return "5632"; // Willingen Upland - case "3": + case '3': return "5633"; // Diemelsee - case "4": + case '4': return "5634"; // Waldeck-Sachsenhausen - case "5": + case '5': return "5635"; // Vöhl - case "6": + case '6': return "5636"; // Lichtenfels-Goddelsheim default: return ""; @@ -12305,22 +12315,22 @@ private static String fromNumber564(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5641"; // Warburg - case "2": + case '2': return "5642"; // Warburg-Scherfede - case "3": + case '3': return "5643"; // Borgentreich - case "4": + case '4': return "5644"; // Willebadessen-Peckelsheim - case "5": + case '5': return "5645"; // Borgentreich-Borgholz - case "6": + case '6': return "5646"; // Willebadessen - case "7": + case '7': return "5647"; // Lichtenau-Kleinenberg - case "8": + case '8': return "5648"; // Brakel-Gehrden default: return ""; @@ -12332,26 +12342,26 @@ private static String fromNumber565(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5650"; // Cornberg - case "1": + case '1': return "5651"; // Eschwege - case "2": + case '2': return "5652"; // Bad Sooden-Allendorf - case "3": + case '3': return "5653"; // Sontra - case "4": + case '4': return "5654"; // Herleshausen - case "5": + case '5': return "5655"; // Wanfried - case "6": + case '6': return "5656"; // Waldkappel - case "7": + case '7': return "5657"; // Meissner - case "8": + case '8': return "5658"; // Wehretal - case "9": + case '9': return "5659"; // Ringgau default: return ""; @@ -12363,16 +12373,16 @@ private static String fromNumber566(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5661"; // Melsungen - case "2": + case '2': return "5662"; // Felsberg Hess - case "3": + case '3': return "5663"; // Spangenberg - case "4": + case '4': return "5664"; // Morschen - case "5": + case '5': return "5665"; // Guxhagen default: return ""; @@ -12384,20 +12394,20 @@ private static String fromNumber567(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5671"; // Hofgeismar - case "2": + case '2': return "5672"; // Bad Karlshafen - case "3": + case '3': return "5673"; // Immenhausen Hess - case "4": + case '4': return "5674"; // Grebenstein - case "5": + case '5': return "5675"; // Trendelburg - case "6": + case '6': return "5676"; // Liebenau Hess - case "7": + case '7': return "5677"; // Calden-Westuffeln default: return ""; @@ -12409,18 +12419,18 @@ private static String fromNumber568(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5681"; // Homberg Efze - case "2": + case '2': return "5682"; // Borken Hessen - case "3": + case '3': return "5683"; // Wabern Hess - case "4": + case '4': return "5684"; // Frielendorf - case "5": + case '5': return "5685"; // Knüllwald - case "6": + case '6': return "5686"; // Schwarzenborn Knüll default: return ""; @@ -12432,18 +12442,18 @@ private static String fromNumber569(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5691"; // Bad Arolsen - case "2": + case '2': return "5692"; // Wolfhagen - case "3": + case '3': return "5693"; // Volkmarsen - case "4": + case '4': return "5694"; // Diemelstadt - case "5": + case '5': return "5695"; // Twistetal - case "6": + case '6': return "5696"; // Bad Arolsen-Landau default: return ""; @@ -12455,22 +12465,22 @@ private static String fromNumber57(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber570(number.substring(1)); - case "1": + case '1': return "571"; // Minden Westf - case "2": + case '2': return fromNumber572(number.substring(1)); - case "3": + case '3': return fromNumber573(number.substring(1)); - case "4": + case '4': return fromNumber574(number.substring(1)); - case "5": + case '5': return fromNumber575(number.substring(1)); - case "6": + case '6': return fromNumber576(number.substring(1)); - case "7": + case '7': return fromNumber577(number.substring(1)); default: return ""; @@ -12482,18 +12492,18 @@ private static String fromNumber570(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5702"; // Petershagen-Lahde - case "3": + case '3': return "5703"; // Hille - case "4": + case '4': return "5704"; // Petershagen-Friedewalde - case "5": + case '5': return "5705"; // Petershagen-Windheim - case "6": + case '6': return "5706"; // Porta Westfalica - case "7": + case '7': return "5707"; // Petershagen Weser default: return ""; @@ -12505,18 +12515,18 @@ private static String fromNumber572(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5721"; // Stadthagen - case "2": + case '2': return "5722"; // Bückeburg - case "3": + case '3': return "5723"; // Bad Nenndorf - case "4": + case '4': return "5724"; // Obernkirchen - case "5": + case '5': return "5725"; // Lindhorst b Stadthagen - case "6": + case '6': return "5726"; // Wiedensahl default: return ""; @@ -12528,14 +12538,14 @@ private static String fromNumber573(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5731"; // Bad Oeynhausen - case "2": + case '2': return "5732"; // Löhne - case "3": + case '3': return "5733"; // Vlotho - case "4": + case '4': return "5734"; // Bergkirchen Westf default: return ""; @@ -12547,18 +12557,18 @@ private static String fromNumber574(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5741"; // Lübbecke - case "2": + case '2': return "5742"; // Preussisch Oldendorf - case "3": + case '3': return "5743"; // Espelkamp-Gestringen - case "4": + case '4': return "5744"; // Hüllhorst - case "5": + case '5': return "5745"; // Stemwede-Levern - case "6": + case '6': return "5746"; // Rödinghausen default: return ""; @@ -12570,16 +12580,16 @@ private static String fromNumber575(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5751"; // Rinteln - case "2": + case '2': return "5752"; // Auetal-Hattendorf - case "3": + case '3': return "5753"; // Auetal-Bernsen - case "4": + case '4': return "5754"; // Extertal-Bremke - case "5": + case '5': return "5755"; // Kalletal-Varenholz default: return ""; @@ -12591,22 +12601,22 @@ private static String fromNumber576(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5761"; // Stolzenau - case "3": + case '3': return "5763"; // Uchte - case "4": + case '4': return "5764"; // Steyerberg - case "5": + case '5': return "5765"; // Raddestorf - case "6": + case '6': return "5766"; // Rehburg-Loccum - case "7": + case '7': return "5767"; // Warmsen - case "8": + case '8': return "5768"; // Petershagen-Heimsen - case "9": + case '9': return "5769"; // Steyerberg-Voigtei default: return ""; @@ -12618,20 +12628,20 @@ private static String fromNumber577(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5771"; // Rahden Westf - case "2": + case '2': return "5772"; // Espelkamp - case "3": + case '3': return "5773"; // Stemwede-Wehdem - case "4": + case '4': return "5774"; // Wagenfeld-Ströhen - case "5": + case '5': return "5775"; // Diepenau - case "6": + case '6': return "5776"; // Preussisch Ströhen - case "7": + case '7': return "5777"; // Diepenau-Essern default: return ""; @@ -12643,24 +12653,24 @@ private static String fromNumber58(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber580(number.substring(1)); - case "1": + case '1': return "581"; // Uelzen - case "2": + case '2': return fromNumber582(number.substring(1)); - case "3": + case '3': return fromNumber583(number.substring(1)); - case "4": + case '4': return fromNumber584(number.substring(1)); - case "5": + case '5': return fromNumber585(number.substring(1)); - case "6": + case '6': return fromNumber586(number.substring(1)); - case "7": + case '7': return fromNumber587(number.substring(1)); - case "8": + case '8': return fromNumber588(number.substring(1)); default: return ""; @@ -12672,20 +12682,20 @@ private static String fromNumber580(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5802"; // Wrestedt - case "3": + case '3': return "5803"; // Rosche - case "4": + case '4': return "5804"; // Rätzlingen Kr Uelzen - case "5": + case '5': return "5805"; // Oetzen - case "6": + case '6': return "5806"; // Barum b Bad Bevensen - case "7": + case '7': return "5807"; // Altenmedingen - case "8": + case '8': return "5808"; // Gerdau default: return ""; @@ -12697,26 +12707,26 @@ private static String fromNumber582(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5820"; // Suhlendorf - case "1": + case '1': return "5821"; // Bad Bevensen - case "2": + case '2': return "5822"; // Ebstorf - case "3": + case '3': return "5823"; // Bienenbüttel - case "4": + case '4': return "5824"; // Bad Bodenteich - case "5": + case '5': return "5825"; // Wieren - case "6": + case '6': return "5826"; // Suderburg - case "7": + case '7': return "5827"; // Unterlüß - case "8": + case '8': return "5828"; // Himbergen - case "9": + case '9': return "5829"; // Wriedel default: return ""; @@ -12728,24 +12738,24 @@ private static String fromNumber583(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5831"; // Wittingen - case "2": + case '2': return "5832"; // Hankensbüttel - case "3": + case '3': return "5833"; // Brome - case "4": + case '4': return "5834"; // Wittingen-Knesebeck - case "5": + case '5': return "5835"; // Wahrenholz - case "6": + case '6': return "5836"; // Wittingen-Radenbeck - case "7": + case '7': return "5837"; // Sprakensehl - case "8": + case '8': return "5838"; // Gross Oesingen - case "9": + case '9': return "5839"; // Wittingen-Ohrdorf default: return ""; @@ -12757,24 +12767,24 @@ private static String fromNumber584(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5840"; // Schnackenburg - case "1": + case '1': return "5841"; // Lüchow Wendland - case "2": + case '2': return "5842"; // Schnega - case "3": + case '3': return "5843"; // Wustrow Wendland - case "4": + case '4': return "5844"; // Clenze - case "5": + case '5': return "5845"; // Bergen Dumme - case "6": + case '6': return "5846"; // Gartow Niedersachs - case "8": + case '8': return "5848"; // Trebel - case "9": + case '9': return "5849"; // Waddeweitz default: return ""; @@ -12786,24 +12796,24 @@ private static String fromNumber585(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5850"; // Neetze - case "1": + case '1': return "5851"; // Dahlenburg - case "2": + case '2': return "5852"; // Bleckede - case "3": + case '3': return "5853"; // Neu Darchau - case "4": + case '4': return "5854"; // Bleckede-Barskamp - case "5": + case '5': return "5855"; // Nahrendorf - case "7": + case '7': return "5857"; // Bleckede-Brackede - case "8": + case '8': return "5858"; // Hitzacker-Wietzetze - case "9": + case '9': return "5859"; // Thomasburg default: return ""; @@ -12815,16 +12825,16 @@ private static String fromNumber586(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5861"; // Dannenberg Elbe - case "2": + case '2': return "5862"; // Hitzacker Elbe - case "3": + case '3': return "5863"; // Zernien - case "4": + case '4': return "5864"; // Jameln - case "5": + case '5': return "5865"; // Gusborn default: return ""; @@ -12836,14 +12846,14 @@ private static String fromNumber587(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5872"; // Stoetze - case "3": + case '3': return "5873"; // Eimke - case "4": + case '4': return "5874"; // Soltendieck - case "5": + case '5': return "5875"; // Emmendorf default: return ""; @@ -12855,10 +12865,10 @@ private static String fromNumber588(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5882"; // Gorleben - case "3": + case '3': return "5883"; // Lemgow default: return ""; @@ -12870,22 +12880,22 @@ private static String fromNumber59(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber590(number.substring(1)); - case "1": + case '1': return "591"; // Lingen (Ems) - case "2": + case '2': return fromNumber592(number.substring(1)); - case "3": + case '3': return fromNumber593(number.substring(1)); - case "4": + case '4': return fromNumber594(number.substring(1)); - case "5": + case '5': return fromNumber595(number.substring(1)); - case "6": + case '6': return fromNumber596(number.substring(1)); - case "7": + case '7': return fromNumber597(number.substring(1)); default: return ""; @@ -12897,24 +12907,24 @@ private static String fromNumber590(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5901"; // Fürstenau b Bramsche - case "2": + case '2': return "5902"; // Freren - case "3": + case '3': return "5903"; // Emsbüren - case "4": + case '4': return "5904"; // Lengerich Emsl - case "5": + case '5': return "5905"; // Beesten - case "6": + case '6': return "5906"; // Lünne - case "7": + case '7': return "5907"; // Geeste - case "8": + case '8': return "5908"; // Wietmarschen-Lohne - case "9": + case '9': return "5909"; // Wettrup default: return ""; @@ -12926,18 +12936,18 @@ private static String fromNumber592(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5921"; // Nordhorn - case "2": + case '2': return "5922"; // Bad Bentheim - case "3": + case '3': return "5923"; // Schüttorf - case "4": + case '4': return "5924"; // Bad Bentheim-Gildehaus - case "5": + case '5': return "5925"; // Wietmarschen - case "6": + case '6': return "5926"; // Engden default: return ""; @@ -12949,22 +12959,22 @@ private static String fromNumber593(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5931"; // Meppen - case "2": + case '2': return "5932"; // Haren Ems - case "3": + case '3': return "5933"; // Lathen - case "4": + case '4': return "5934"; // Haren-Rütenbrock - case "5": + case '5': return "5935"; // Twist-Schöninghsdorf - case "6": + case '6': return "5936"; // Twist - case "7": + case '7': return "5937"; // Geeste-Gross Hesepe - case "9": + case '9': return "5939"; // Sustrum default: return ""; @@ -12976,22 +12986,22 @@ private static String fromNumber594(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5941"; // Neuenhaus Dinkel - case "2": + case '2': return "5942"; // Uelsen - case "3": + case '3': return "5943"; // Emlichheim - case "4": + case '4': return "5944"; // Hoogstede - case "5": + case '5': return "5945"; // Wilsum - case "6": + case '6': return "5946"; // Georgsdorf - case "7": + case '7': return "5947"; // Laar Vechte - case "8": + case '8': return "5948"; // Itterbeck default: return ""; @@ -13003,20 +13013,20 @@ private static String fromNumber595(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5951"; // Werlte - case "2": + case '2': return "5952"; // Sögel - case "3": + case '3': return "5953"; // Börger - case "4": + case '4': return "5954"; // Lorup - case "5": + case '5': return "5955"; // Esterwegen - case "6": + case '6': return "5956"; // Rastdorf - case "7": + case '7': return "5957"; // Lindern Oldenburg default: return ""; @@ -13028,18 +13038,18 @@ private static String fromNumber596(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5961"; // Haselünne - case "2": + case '2': return "5962"; // Herzlake - case "3": + case '3': return "5963"; // Bawinkel - case "4": + case '4': return "5964"; // Lähden - case "5": + case '5': return "5965"; // Klein Berssen - case "6": + case '6': return "5966"; // Meppen-Apeldorn default: return ""; @@ -13051,18 +13061,18 @@ private static String fromNumber597(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5971"; // Rheine - case "3": + case '3': return "5973"; // Neuenkirchen Kr Steinfurt - case "5": + case '5': return "5975"; // Rheine-Mesum - case "6": + case '6': return "5976"; // Salzbergen - case "7": + case '7': return "5977"; // Spelle - case "8": + case '8': return "5978"; // Hörstel-Dreierwalde default: return ""; @@ -13074,26 +13084,26 @@ private static String fromNumber6(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber60(number.substring(1)); - case "1": + case '1': return fromNumber61(number.substring(1)); - case "2": + case '2': return fromNumber62(number.substring(1)); - case "3": + case '3': return fromNumber63(number.substring(1)); - case "4": + case '4': return fromNumber64(number.substring(1)); - case "5": + case '5': return fromNumber65(number.substring(1)); - case "6": + case '6': return fromNumber66(number.substring(1)); - case "7": + case '7': return fromNumber67(number.substring(1)); - case "8": + case '8': return fromNumber68(number.substring(1)); - case "9": + case '9': return "69"; // Frankfurt am Main default: return ""; @@ -13105,24 +13115,24 @@ private static String fromNumber60(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber600(number.substring(1)); - case "2": + case '2': return fromNumber602(number.substring(1)); - case "3": + case '3': return fromNumber603(number.substring(1)); - case "4": + case '4': return fromNumber604(number.substring(1)); - case "5": + case '5': return fromNumber605(number.substring(1)); - case "6": + case '6': return fromNumber606(number.substring(1)); - case "7": + case '7': return fromNumber607(number.substring(1)); - case "8": + case '8': return fromNumber608(number.substring(1)); - case "9": + case '9': return fromNumber609(number.substring(1)); default: return ""; @@ -13134,16 +13144,16 @@ private static String fromNumber600(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6002"; // Ober-Mörlen - case "3": + case '3': return "6003"; // Rosbach v d Höhe - case "4": + case '4': return "6004"; // Lich-Eberstadt - case "7": + case '7': return "6007"; // Rosbach-Rodheim - case "8": + case '8': return "6008"; // Echzell default: return ""; @@ -13155,24 +13165,24 @@ private static String fromNumber602(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6020"; // Heigenbrücken - case "1": + case '1': return "6021"; // Aschaffenburg - case "2": + case '2': return "6022"; // Obernburg a Main - case "3": + case '3': return "6023"; // Alzenau i Ufr - case "4": + case '4': return "6024"; // Schöllkrippen - case "6": + case '6': return "6026"; // Grossostheim - case "7": + case '7': return "6027"; // Stockstadt a Main - case "8": + case '8': return "6028"; // Sulzbach a Main - case "9": + case '9': return "6029"; // Mömbris default: return ""; @@ -13184,20 +13194,20 @@ private static String fromNumber603(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6031"; // Friedberg Hess - case "2": + case '2': return "6032"; // Bad Nauheim - case "3": + case '3': return "6033"; // Butzbach - case "4": + case '4': return "6034"; // Wöllstadt - case "5": + case '5': return "6035"; // Reichelsheim Wetterau - case "6": + case '6': return "6036"; // Wölfersheim - case "9": + case '9': return "6039"; // Karben default: return ""; @@ -13209,24 +13219,24 @@ private static String fromNumber604(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6041"; // Glauburg - case "2": + case '2': return "6042"; // Büdingen Hess - case "3": + case '3': return "6043"; // Nidda - case "4": + case '4': return "6044"; // Schotten Hess - case "5": + case '5': return "6045"; // Gedern - case "6": + case '6': return "6046"; // Ortenberg Hess - case "7": + case '7': return "6047"; // Altenstadt Hess - case "8": + case '8': return "6048"; // Büdingen-Eckartshausen - case "9": + case '9': return "6049"; // Kefenrod default: return ""; @@ -13238,26 +13248,26 @@ private static String fromNumber605(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6050"; // Biebergemünd - case "1": + case '1': return "6051"; // Gelnhausen - case "2": + case '2': return "6052"; // Bad Orb - case "3": + case '3': return "6053"; // Wächtersbach - case "4": + case '4': return "6054"; // Birstein - case "5": + case '5': return "6055"; // Freigericht - case "6": + case '6': return "6056"; // Bad Soden-Salmünster - case "7": + case '7': return "6057"; // Flörsbachtal - case "8": + case '8': return "6058"; // Gründau - case "9": + case '9': return "6059"; // Jossgrund default: return ""; @@ -13269,16 +13279,16 @@ private static String fromNumber606(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6061"; // Michelstadt - case "2": + case '2': return "6062"; // Erbach Odenw - case "3": + case '3': return "6063"; // Bad König - case "6": + case '6': return "6066"; // Michelstadt-Vielbrunn - case "8": + case '8': return "6068"; // Beerfelden default: return ""; @@ -13290,14 +13300,14 @@ private static String fromNumber607(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6071"; // Dieburg - case "3": + case '3': return "6073"; // Babenhausen Hess - case "4": + case '4': return "6074"; // Rödermark - case "8": + case '8': return "6078"; // Gross-Umstadt default: return ""; @@ -13309,20 +13319,20 @@ private static String fromNumber608(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6081"; // Usingen - case "2": + case '2': return "6082"; // Niederreifenberg - case "3": + case '3': return "6083"; // Weilrod - case "4": + case '4': return "6084"; // Schmitten Taunus - case "5": + case '5': return "6085"; // Waldsolms - case "6": + case '6': return "6086"; // Grävenwiesbach - case "7": + case '7': return "6087"; // Waldems default: return ""; @@ -13334,16 +13344,16 @@ private static String fromNumber609(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6092"; // Heimbuchenthal - case "3": + case '3': return "6093"; // Laufach - case "4": + case '4': return "6094"; // Weibersbrunn - case "5": + case '5': return "6095"; // Bessenbach - case "6": + case '6': return "6096"; // Wiesen Unterfr default: return ""; @@ -13355,26 +13365,26 @@ private static String fromNumber61(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber610(number.substring(1)); - case "1": + case '1': return "611"; // Wiesbaden - case "2": + case '2': return fromNumber612(number.substring(1)); - case "3": + case '3': return fromNumber613(number.substring(1)); - case "4": + case '4': return fromNumber614(number.substring(1)); - case "5": + case '5': return fromNumber615(number.substring(1)); - case "6": + case '6': return fromNumber616(number.substring(1)); - case "7": + case '7': return fromNumber617(number.substring(1)); - case "8": + case '8': return fromNumber618(number.substring(1)); - case "9": + case '9': return fromNumber619(number.substring(1)); default: return ""; @@ -13386,24 +13396,24 @@ private static String fromNumber610(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6101"; // Bad Vilbel - case "2": + case '2': return "6102"; // Neu-Isenburg - case "3": + case '3': return "6103"; // Langen Hess - case "4": + case '4': return "6104"; // Heusenstamm - case "5": + case '5': return "6105"; // Mörfelden-Walldorf - case "6": + case '6': return "6106"; // Rodgau - case "7": + case '7': return "6107"; // Kelsterbach - case "8": + case '8': return "6108"; // Mühlheim am Main - case "9": + case '9': return "6109"; // Frankfurt-Bergen-Enkheim default: return ""; @@ -13415,22 +13425,22 @@ private static String fromNumber612(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6120"; // Aarbergen - case "2": + case '2': return "6122"; // Hofheim-Wallau - case "3": + case '3': return "6123"; // Eltville am Rhein - case "4": + case '4': return "6124"; // Bad Schwalbach - case "6": + case '6': return "6126"; // Idstein - case "7": + case '7': return "6127"; // Niedernhausen Taunus - case "8": + case '8': return "6128"; // Taunusstein - case "9": + case '9': return "6129"; // Schlangenbad default: return ""; @@ -13442,24 +13452,24 @@ private static String fromNumber613(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6130"; // Schwabenheim an der Selz - case "1": + case '1': return "6131"; // Mainz - case "2": + case '2': return "6132"; // Ingelheim am Rhein - case "3": + case '3': return "6133"; // Oppenheim - case "4": + case '4': return "6134"; // Mainz-Kastel - case "5": + case '5': return "6135"; // Bodenheim Rhein - case "6": + case '6': return "6136"; // Nieder-Olm - case "8": + case '8': return "6138"; // Mommenheim - case "9": + case '9': return "6139"; // Budenheim default: return ""; @@ -13471,16 +13481,16 @@ private static String fromNumber614(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6142"; // Rüsselsheim - case "4": + case '4': return "6144"; // Bischofsheim b Rüsselsheim - case "5": + case '5': return "6145"; // Flörsheim am Main - case "6": + case '6': return "6146"; // Hochheim am Main - case "7": + case '7': return "6147"; // Trebur default: return ""; @@ -13492,22 +13502,22 @@ private static String fromNumber615(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6150"; // Weiterstadt - case "1": + case '1': return "6151"; // Darmstadt - case "2": + case '2': return "6152"; // Gross-Gerau - case "4": + case '4': return "6154"; // Ober-Ramstadt - case "5": + case '5': return "6155"; // Griesheim Hess - case "7": + case '7': return "6157"; // Pfungstadt - case "8": + case '8': return "6158"; // Riedstadt - case "9": + case '9': return "6159"; // Messel default: return ""; @@ -13519,20 +13529,20 @@ private static String fromNumber616(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6161"; // Brensbach - case "2": + case '2': return "6162"; // Reinheim Odenw - case "3": + case '3': return "6163"; // Höchst i Odw - case "4": + case '4': return "6164"; // Reichelsheim Odenwald - case "5": + case '5': return "6165"; // Breuberg - case "6": + case '6': return "6166"; // Fischbachtal - case "7": + case '7': return "6167"; // Modautal default: return ""; @@ -13544,16 +13554,16 @@ private static String fromNumber617(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6171"; // Oberursel Taunus - case "2": + case '2': return "6172"; // Bad Homburg v d Höhe - case "3": + case '3': return "6173"; // Kronberg im Taunus - case "4": + case '4': return "6174"; // Königstein im Taunus - case "5": + case '5': return "6175"; // Friedrichsdorf Taunus default: return ""; @@ -13565,22 +13575,22 @@ private static String fromNumber618(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6181"; // Hanau - case "2": + case '2': return "6182"; // Seligenstadt - case "3": + case '3': return "6183"; // Erlensee - case "4": + case '4': return "6184"; // Langenselbold - case "5": + case '5': return "6185"; // Hammersbach Hess - case "6": + case '6': return "6186"; // Grosskrotzenburg - case "7": + case '7': return "6187"; // Schöneck - case "8": + case '8': return "6188"; // Kahl a Main default: return ""; @@ -13592,16 +13602,16 @@ private static String fromNumber619(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6190"; // Hattersheim a Main - case "2": + case '2': return "6192"; // Hofheim am Taunus - case "5": + case '5': return "6195"; // Kelkheim Taunus - case "6": + case '6': return "6196"; // Bad Soden am Taunus - case "8": + case '8': return "6198"; // Eppstein default: return ""; @@ -13613,26 +13623,26 @@ private static String fromNumber62(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber620(number.substring(1)); - case "1": + case '1': return "621"; // Mannheim - case "2": + case '2': return fromNumber622(number.substring(1)); - case "3": + case '3': return fromNumber623(number.substring(1)); - case "4": + case '4': return fromNumber624(number.substring(1)); - case "5": + case '5': return fromNumber625(number.substring(1)); - case "6": + case '6': return fromNumber626(number.substring(1)); - case "7": + case '7': return fromNumber627(number.substring(1)); - case "8": + case '8': return fromNumber628(number.substring(1)); - case "9": + case '9': return fromNumber629(number.substring(1)); default: return ""; @@ -13644,22 +13654,22 @@ private static String fromNumber620(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6201"; // Weinheim Bergstr - case "2": + case '2': return "6202"; // Schwetzingen - case "3": + case '3': return "6203"; // Ladenburg - case "4": + case '4': return "6204"; // Viernheim - case "5": + case '5': return "6205"; // Hockenheim - case "6": + case '6': return "6206"; // Lampertheim - case "7": + case '7': return "6207"; // Wald-Michelbach - case "9": + case '9': return "6209"; // Mörlenbach default: return ""; @@ -13671,24 +13681,24 @@ private static String fromNumber622(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6220"; // Wilhelmsfeld - case "1": + case '1': return "6221"; // Heidelberg - case "2": + case '2': return "6222"; // Wiesloch - case "3": + case '3': return "6223"; // Neckargemünd - case "4": + case '4': return "6224"; // Sandhausen Baden - case "6": + case '6': return "6226"; // Meckesheim - case "7": + case '7': return "6227"; // Walldorf Baden - case "8": + case '8': return "6228"; // Schönau Odenw - case "9": + case '9': return "6229"; // Neckarsteinach default: return ""; @@ -13700,24 +13710,24 @@ private static String fromNumber623(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6231"; // Hochdorf-Assenheim - case "2": + case '2': return "6232"; // Speyer - case "3": + case '3': return "6233"; // Frankenthal Pfalz - case "4": + case '4': return "6234"; // Mutterstadt - case "5": + case '5': return "6235"; // Schifferstadt - case "6": + case '6': return "6236"; // Neuhofen Pfalz - case "7": + case '7': return "6237"; // Maxdorf - case "8": + case '8': return "6238"; // Dirmstein - case "9": + case '9': return "6239"; // Bobenheim-Roxheim default: return ""; @@ -13729,22 +13739,22 @@ private static String fromNumber624(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6241"; // Worms - case "2": + case '2': return "6242"; // Osthofen - case "3": + case '3': return "6243"; // Monsheim - case "4": + case '4': return "6244"; // Westhofen Rheinhess - case "5": + case '5': return "6245"; // Biblis - case "6": + case '6': return "6246"; // Eich Rheinhess - case "7": + case '7': return "6247"; // Worms-Pfeddersheim - case "9": + case '9': return "6249"; // Guntersblum default: return ""; @@ -13756,22 +13766,22 @@ private static String fromNumber625(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6251"; // Bensheim - case "2": + case '2': return "6252"; // Heppenheim Bergstraße - case "3": + case '3': return "6253"; // Fürth Odenw - case "4": + case '4': return "6254"; // Lautertal Odenwald - case "5": + case '5': return "6255"; // Lindenfels - case "6": + case '6': return "6256"; // Lampertheim-Hüttenfeld - case "7": + case '7': return "6257"; // Seeheim-Jugenheim - case "8": + case '8': return "6258"; // Gernsheim default: return ""; @@ -13783,24 +13793,24 @@ private static String fromNumber626(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6261"; // Mosbach Baden - case "2": + case '2': return "6262"; // Aglasterhausen - case "3": + case '3': return "6263"; // Neckargerach - case "4": + case '4': return "6264"; // Neudenau - case "5": + case '5': return "6265"; // Billigheim Baden - case "6": + case '6': return "6266"; // Hassmersheim - case "7": + case '7': return "6267"; // Fahrenbach Baden - case "8": + case '8': return "6268"; // Hüffenhardt - case "9": + case '9': return "6269"; // Gundelsheim Württ default: return ""; @@ -13812,16 +13822,16 @@ private static String fromNumber627(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6271"; // Eberbach Baden - case "2": + case '2': return "6272"; // Hirschhorn Neckar - case "4": + case '4': return "6274"; // Waldbrunn Odenw - case "5": + case '5': return "6275"; // Rothenberg Odenw - case "6": + case '6': return "6276"; // Hesseneck default: return ""; @@ -13833,20 +13843,20 @@ private static String fromNumber628(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6281"; // Buchen Odenwald - case "2": + case '2': return "6282"; // Walldürn - case "3": + case '3': return "6283"; // Hardheim Odenw - case "4": + case '4': return "6284"; // Mudau - case "5": + case '5': return "6285"; // Walldürn-Altheim - case "6": + case '6': return "6286"; // Walldürn-Rippberg - case "7": + case '7': return "6287"; // Limbach Baden default: return ""; @@ -13858,22 +13868,22 @@ private static String fromNumber629(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6291"; // Adelsheim - case "2": + case '2': return "6292"; // Seckach - case "3": + case '3': return "6293"; // Schefflenz - case "4": + case '4': return "6294"; // Krautheim Jagst - case "5": + case '5': return "6295"; // Rosenberg Baden - case "6": + case '6': return "6296"; // Ahorn Baden - case "7": + case '7': return "6297"; // Ravenstein Baden - case "8": + case '8': return "6298"; // Möckmühl default: return ""; @@ -13885,26 +13895,26 @@ private static String fromNumber63(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber630(number.substring(1)); - case "1": + case '1': return "631"; // Kaiserslautern - case "2": + case '2': return fromNumber632(number.substring(1)); - case "3": + case '3': return fromNumber633(number.substring(1)); - case "4": + case '4': return fromNumber634(number.substring(1)); - case "5": + case '5': return fromNumber635(number.substring(1)); - case "6": + case '6': return fromNumber636(number.substring(1)); - case "7": + case '7': return fromNumber637(number.substring(1)); - case "8": + case '8': return fromNumber638(number.substring(1)); - case "9": + case '9': return fromNumber639(number.substring(1)); default: return ""; @@ -13916,22 +13926,22 @@ private static String fromNumber630(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6301"; // Otterbach Pfalz - case "2": + case '2': return "6302"; // Winnweiler - case "3": + case '3': return "6303"; // Enkenbach-Alsenborn - case "4": + case '4': return "6304"; // Wolfstein Pfalz - case "5": + case '5': return "6305"; // Hochspeyer - case "6": + case '6': return "6306"; // Trippstadt - case "7": + case '7': return "6307"; // Schopp - case "8": + case '8': return "6308"; // Olsbrücken default: return ""; @@ -13943,24 +13953,24 @@ private static String fromNumber632(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6321"; // Neustadt an der Weinstraße - case "2": + case '2': return "6322"; // Bad Dürkheim - case "3": + case '3': return "6323"; // Edenkoben - case "4": + case '4': return "6324"; // Hassloch - case "5": + case '5': return "6325"; // Lambrecht Pfalz - case "6": + case '6': return "6326"; // Deidesheim - case "7": + case '7': return "6327"; // Neustadt-Lachen - case "8": + case '8': return "6328"; // Elmstein - case "9": + case '9': return "6329"; // Weidenthal Pfalz default: return ""; @@ -13972,24 +13982,24 @@ private static String fromNumber633(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6331"; // Pirmasens - case "2": + case '2': return "6332"; // Zweibrücken - case "3": + case '3': return "6333"; // Waldfischbach-Burgalben - case "4": + case '4': return "6334"; // Thaleischweiler-Fröschen - case "5": + case '5': return "6335"; // Trulben - case "6": + case '6': return "6336"; // Dellfeld - case "7": + case '7': return "6337"; // Grossbundenbach - case "8": + case '8': return "6338"; // Hornbach Pfalz - case "9": + case '9': return "6339"; // Grosssteinhausen default: return ""; @@ -14001,26 +14011,26 @@ private static String fromNumber634(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6340"; // Wörth-Schaidt - case "1": + case '1': return "6341"; // Landau in der Pfalz - case "2": + case '2': return "6342"; // Schweigen-Rechtenbach - case "3": + case '3': return "6343"; // Bad Bergzabern - case "4": + case '4': return "6344"; // Schwegenheim - case "5": + case '5': return "6345"; // Albersweiler - case "6": + case '6': return "6346"; // Annweiler am Trifels - case "7": + case '7': return "6347"; // Hochstadt Pfalz - case "8": + case '8': return "6348"; // Offenbach an der Queich - case "9": + case '9': return "6349"; // Billigheim-Ingenheim default: return ""; @@ -14032,22 +14042,22 @@ private static String fromNumber635(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6351"; // Eisenberg Pfalz - case "2": + case '2': return "6352"; // Kirchheimbolanden - case "3": + case '3': return "6353"; // Freinsheim - case "5": + case '5': return "6355"; // Albisheim Pfrimm - case "6": + case '6': return "6356"; // Carlsberg Pfalz - case "7": + case '7': return "6357"; // Standenbühl - case "8": + case '8': return "6358"; // Kriegsfeld - case "9": + case '9': return "6359"; // Grünstadt default: return ""; @@ -14059,14 +14069,14 @@ private static String fromNumber636(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6361"; // Rockenhausen - case "2": + case '2': return "6362"; // Alsenz - case "3": + case '3': return "6363"; // Niederkirchen - case "4": + case '4': return "6364"; // Nußbach Pfalz default: return ""; @@ -14078,16 +14088,16 @@ private static String fromNumber637(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6371"; // Landstuhl - case "2": + case '2': return "6372"; // Bruchmühlbach-Miesau - case "3": + case '3': return "6373"; // Schönenberg-Kübelberg - case "4": + case '4': return "6374"; // Weilerbach - case "5": + case '5': return "6375"; // Wallhalben default: return ""; @@ -14099,20 +14109,20 @@ private static String fromNumber638(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6381"; // Kusel - case "2": + case '2': return "6382"; // Lauterecken - case "3": + case '3': return "6383"; // Glan-Münchweiler - case "4": + case '4': return "6384"; // Konken - case "5": + case '5': return "6385"; // Reichenbach-Steegen - case "6": + case '6': return "6386"; // Altenkirchen Pfalz - case "7": + case '7': return "6387"; // Sankt Julian default: return ""; @@ -14124,22 +14134,22 @@ private static String fromNumber639(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6391"; // Dahn - case "2": + case '2': return "6392"; // Hauenstein Pfalz - case "3": + case '3': return "6393"; // Fischbach bei Dahn - case "4": + case '4': return "6394"; // Bundenthal - case "5": + case '5': return "6395"; // Münchweiler an der Rodalb - case "6": + case '6': return "6396"; // Hinterweidenthal - case "7": + case '7': return "6397"; // Leimen Pfalz - case "8": + case '8': return "6398"; // Vorderweidenthal default: return ""; @@ -14151,24 +14161,24 @@ private static String fromNumber64(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber640(number.substring(1)); - case "1": + case '1': return "641"; // Giessen - case "2": + case '2': return fromNumber642(number.substring(1)); - case "3": + case '3': return fromNumber643(number.substring(1)); - case "4": + case '4': return fromNumber644(number.substring(1)); - case "5": + case '5': return fromNumber645(number.substring(1)); - case "6": + case '6': return fromNumber646(number.substring(1)); - case "7": + case '7': return fromNumber647(number.substring(1)); - case "8": + case '8': return fromNumber648(number.substring(1)); default: return ""; @@ -14180,26 +14190,26 @@ private static String fromNumber640(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6400"; // Mücke - case "1": + case '1': return "6401"; // Grünberg Hess - case "2": + case '2': return "6402"; // Hungen - case "3": + case '3': return "6403"; // Linden Hess - case "4": + case '4': return "6404"; // Lich Hess - case "5": + case '5': return "6405"; // Laubach Hess - case "6": + case '6': return "6406"; // Lollar - case "7": + case '7': return "6407"; // Rabenau Hess - case "8": + case '8': return "6408"; // Buseck - case "9": + case '9': return "6409"; // Biebertal default: return ""; @@ -14211,26 +14221,26 @@ private static String fromNumber642(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6420"; // Lahntal - case "1": + case '1': return "6421"; // Marburg - case "2": + case '2': return "6422"; // Kirchhain - case "3": + case '3': return "6423"; // Wetter Hessen - case "4": + case '4': return "6424"; // Ebsdorfergrund - case "5": + case '5': return "6425"; // Rauschenberg Hess - case "6": + case '6': return "6426"; // Fronhausen - case "7": + case '7': return "6427"; // Cölbe-Schönstadt - case "8": + case '8': return "6428"; // Stadtallendorf - case "9": + case '9': return "6429"; // Schweinsberg Hess default: return ""; @@ -14242,24 +14252,24 @@ private static String fromNumber643(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6430"; // Hahnstätten - case "1": + case '1': return "6431"; // Limburg a d Lahn - case "2": + case '2': return "6432"; // Diez - case "3": + case '3': return "6433"; // Hadamar - case "4": + case '4': return "6434"; // Bad Camberg - case "5": + case '5': return "6435"; // Wallmerod - case "6": + case '6': return "6436"; // Dornburg Hess - case "8": + case '8': return "6438"; // Hünfelden - case "9": + case '9': return "6439"; // Holzappel default: return ""; @@ -14271,24 +14281,24 @@ private static String fromNumber644(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6440"; // Kölschhausen - case "1": + case '1': return "6441"; // Wetzlar - case "2": + case '2': return "6442"; // Braunfels - case "3": + case '3': return "6443"; // Ehringshausen Dill - case "4": + case '4': return "6444"; // Bischoffen - case "5": + case '5': return "6445"; // Schöffengrund - case "6": + case '6': return "6446"; // Hohenahr - case "7": + case '7': return "6447"; // Langgöns-Niederkleen - case "9": + case '9': return "6449"; // Ehringshausen-Katzenfurt default: return ""; @@ -14300,22 +14310,22 @@ private static String fromNumber645(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6451"; // Frankenberg Eder - case "2": + case '2': return "6452"; // Battenberg Eder - case "3": + case '3': return "6453"; // Gemünden Wohra - case "4": + case '4': return "6454"; // Lichtenfels-Sachsenberg - case "5": + case '5': return "6455"; // Frankenau Hess - case "6": + case '6': return "6456"; // Haina Kloster - case "7": + case '7': return "6457"; // Burgwald Eder - case "8": + case '8': return "6458"; // Rosenthal Hess default: return ""; @@ -14327,20 +14337,20 @@ private static String fromNumber646(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6461"; // Biedenkopf - case "2": + case '2': return "6462"; // Gladenbach - case "4": + case '4': return "6464"; // Angelburg - case "5": + case '5': return "6465"; // Breidenbach b Biedenkopf - case "6": + case '6': return "6466"; // Dautphetal-Friedensdorf - case "7": + case '7': return "6467"; // Hatzfeld Eder - case "8": + case '8': return "6468"; // Dautphetal-Mornshausen default: return ""; @@ -14352,24 +14362,24 @@ private static String fromNumber647(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6471"; // Weilburg - case "2": + case '2': return "6472"; // Weilmünster - case "3": + case '3': return "6473"; // Leun - case "4": + case '4': return "6474"; // Villmar-Aumenau - case "5": + case '5': return "6475"; // Weilmünster-Wolfenhausen - case "6": + case '6': return "6476"; // Mengerskirchen - case "7": + case '7': return "6477"; // Greifenstein-Nenderoth - case "8": + case '8': return "6478"; // Greifenstein-Ulm - case "9": + case '9': return "6479"; // Waldbrunn Westerwald default: return ""; @@ -14381,16 +14391,16 @@ private static String fromNumber648(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6482"; // Runkel - case "3": + case '3': return "6483"; // Selters Taunus - case "4": + case '4': return "6484"; // Beselich - case "5": + case '5': return "6485"; // Nentershausen Westerw - case "6": + case '6': return "6486"; // Katzenelnbogen default: return ""; @@ -14402,26 +14412,26 @@ private static String fromNumber65(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber650(number.substring(1)); - case "1": + case '1': return "651"; // Trier - case "2": + case '2': return fromNumber652(number.substring(1)); - case "3": + case '3': return fromNumber653(number.substring(1)); - case "4": + case '4': return fromNumber654(number.substring(1)); - case "5": + case '5': return fromNumber655(number.substring(1)); - case "6": + case '6': return fromNumber656(number.substring(1)); - case "7": + case '7': return fromNumber657(number.substring(1)); - case "8": + case '8': return fromNumber658(number.substring(1)); - case "9": + case '9': return fromNumber659(number.substring(1)); default: return ""; @@ -14433,26 +14443,26 @@ private static String fromNumber650(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6500"; // Waldrach - case "1": + case '1': return "6501"; // Konz - case "2": + case '2': return "6502"; // Schweich - case "3": + case '3': return "6503"; // Hermeskeil - case "4": + case '4': return "6504"; // Thalfang - case "5": + case '5': return "6505"; // Kordel - case "6": + case '6': return "6506"; // Welschbillig - case "7": + case '7': return "6507"; // Neumagen-Dhron - case "8": + case '8': return "6508"; // Hetzerath Mosel - case "9": + case '9': return "6509"; // Büdlich default: return ""; @@ -14464,18 +14474,18 @@ private static String fromNumber652(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6522"; // Mettendorf - case "3": + case '3': return "6523"; // Holsthum - case "4": + case '4': return "6524"; // Rodershausen - case "5": + case '5': return "6525"; // Irrel - case "6": + case '6': return "6526"; // Bollendorf - case "7": + case '7': return "6527"; // Oberweis default: return ""; @@ -14487,18 +14497,18 @@ private static String fromNumber653(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6531"; // Bernkastel-Kues - case "2": + case '2': return "6532"; // Zeltingen-Rachtig - case "3": + case '3': return "6533"; // Morbach Hunsrück - case "4": + case '4': return "6534"; // Mülheim Mosel - case "5": + case '5': return "6535"; // Osann-Monzel - case "6": + case '6': return "6536"; // Kleinich default: return ""; @@ -14510,16 +14520,16 @@ private static String fromNumber654(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6541"; // Traben-Trarbach - case "2": + case '2': return "6542"; // Bullay - case "3": + case '3': return "6543"; // Büchenbeuren - case "4": + case '4': return "6544"; // Rhaunen - case "5": + case '5': return "6545"; // Blankenrath default: return ""; @@ -14531,26 +14541,26 @@ private static String fromNumber655(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6550"; // Irrhausen - case "1": + case '1': return "6551"; // Prüm - case "2": + case '2': return "6552"; // Olzheim - case "3": + case '3': return "6553"; // Schönecken - case "4": + case '4': return "6554"; // Waxweiler - case "5": + case '5': return "6555"; // Bleialf - case "6": + case '6': return "6556"; // Pronsfeld - case "7": + case '7': return "6557"; // Hallschlag - case "8": + case '8': return "6558"; // Büdesheim Eifel - case "9": + case '9': return "6559"; // Leidenborn default: return ""; @@ -14562,24 +14572,24 @@ private static String fromNumber656(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6561"; // Bitburg - case "2": + case '2': return "6562"; // Speicher - case "3": + case '3': return "6563"; // Kyllburg - case "4": + case '4': return "6564"; // Neuerburg Eifel - case "5": + case '5': return "6565"; // Dudeldorf - case "6": + case '6': return "6566"; // Körperich - case "7": + case '7': return "6567"; // Oberkail - case "8": + case '8': return "6568"; // Wolsfeld - case "9": + case '9': return "6569"; // Bickendorf default: return ""; @@ -14591,18 +14601,18 @@ private static String fromNumber657(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6571"; // Wittlich - case "2": + case '2': return "6572"; // Manderscheid Eifel - case "3": + case '3': return "6573"; // Gillenfeld - case "4": + case '4': return "6574"; // Hasborn - case "5": + case '5': return "6575"; // Landscheid - case "8": + case '8': return "6578"; // Salmtal default: return ""; @@ -14614,26 +14624,26 @@ private static String fromNumber658(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6580"; // Zemmer - case "1": + case '1': return "6581"; // Saarburg - case "2": + case '2': return "6582"; // Freudenburg - case "3": + case '3': return "6583"; // Palzem - case "4": + case '4': return "6584"; // Wellen Mosel - case "5": + case '5': return "6585"; // Ralingen - case "6": + case '6': return "6586"; // Beuren Hochwald - case "7": + case '7': return "6587"; // Zerf - case "8": + case '8': return "6588"; // Pluwig - case "9": + case '9': return "6589"; // Kell am See default: return ""; @@ -14645,22 +14655,22 @@ private static String fromNumber659(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6591"; // Gerolstein - case "2": + case '2': return "6592"; // Daun - case "3": + case '3': return "6593"; // Hillesheim Eifel - case "4": + case '4': return "6594"; // Birresborn - case "5": + case '5': return "6595"; // Dockweiler - case "6": + case '6': return "6596"; // Üdersdorf - case "7": + case '7': return "6597"; // Jünkerath - case "9": + case '9': return "6599"; // Weidenbach b Gerolstein default: return ""; @@ -14672,24 +14682,24 @@ private static String fromNumber66(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "661"; // Fulda - case "2": + case '2': return fromNumber662(number.substring(1)); - case "3": + case '3': return fromNumber663(number.substring(1)); - case "4": + case '4': return fromNumber664(number.substring(1)); - case "5": + case '5': return fromNumber665(number.substring(1)); - case "6": + case '6': return fromNumber666(number.substring(1)); - case "7": + case '7': return fromNumber667(number.substring(1)); - case "8": + case '8': return fromNumber668(number.substring(1)); - case "9": + case '9': return fromNumber669(number.substring(1)); default: return ""; @@ -14701,26 +14711,26 @@ private static String fromNumber662(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6620"; // Philippsthal Werra - case "1": + case '1': return "6621"; // Bad Hersfeld - case "2": + case '2': return "6622"; // Bebra - case "3": + case '3': return "6623"; // Rotenburg a d Fulda - case "4": + case '4': return "6624"; // Heringen Werra - case "5": + case '5': return "6625"; // Niederaula - case "6": + case '6': return "6626"; // Wildeck-Obersuhl - case "7": + case '7': return "6627"; // Nentershausen Hess - case "8": + case '8': return "6628"; // Oberaula - case "9": + case '9': return "6629"; // Schenklengsfeld default: return ""; @@ -14732,24 +14742,24 @@ private static String fromNumber663(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6630"; // Schwalmtal-Storndorf - case "1": + case '1': return "6631"; // Alsfeld - case "3": + case '3': return "6633"; // Homberg Ohm - case "4": + case '4': return "6634"; // Gemünden Felda - case "5": + case '5': return "6635"; // Kirtorf - case "6": + case '6': return "6636"; // Romrod - case "7": + case '7': return "6637"; // Feldatal - case "8": + case '8': return "6638"; // Schwalmtal-Renzendorf - case "9": + case '9': return "6639"; // Ottrau default: return ""; @@ -14761,22 +14771,22 @@ private static String fromNumber664(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6641"; // Lauterbach Hessen - case "2": + case '2': return "6642"; // Schlitz - case "3": + case '3': return "6643"; // Herbstein - case "4": + case '4': return "6644"; // Grebenhain - case "5": + case '5': return "6645"; // Ulrichstein - case "6": + case '6': return "6646"; // Grebenau - case "7": + case '7': return "6647"; // Herbstein-Stockhausen - case "8": + case '8': return "6648"; // Bad Salzschlirf default: return ""; @@ -14788,26 +14798,26 @@ private static String fromNumber665(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6650"; // Hosenfeld - case "1": + case '1': return "6651"; // Rasdorf - case "2": + case '2': return "6652"; // Hünfeld - case "3": + case '3': return "6653"; // Burghaun - case "4": + case '4': return "6654"; // Gersfeld Rhön - case "5": + case '5': return "6655"; // Neuhof Kr Fulda - case "6": + case '6': return "6656"; // Ebersburg - case "7": + case '7': return "6657"; // Hofbieber - case "8": + case '8': return "6658"; // Poppenhausen Wasserkuppe - case "9": + case '9': return "6659"; // Eichenzell default: return ""; @@ -14819,24 +14829,24 @@ private static String fromNumber666(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6660"; // Steinau-Marjoss - case "1": + case '1': return "6661"; // Schlüchtern - case "3": + case '3': return "6663"; // Steinau an der Straße - case "4": + case '4': return "6664"; // Sinntal-Sterbfritz - case "5": + case '5': return "6665"; // Sinntal-Altengronau - case "6": + case '6': return "6666"; // Freiensteinau - case "7": + case '7': return "6667"; // Steinau-Ulmbach - case "8": + case '8': return "6668"; // Birstein-Lichenroth - case "9": + case '9': return "6669"; // Neuhof-Hauswurz default: return ""; @@ -14848,22 +14858,22 @@ private static String fromNumber667(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6670"; // Ludwigsau Hess - case "2": + case '2': return "6672"; // Eiterfeld - case "3": + case '3': return "6673"; // Haunetal - case "4": + case '4': return "6674"; // Friedewald Hess - case "5": + case '5': return "6675"; // Breitenbach a Herzberg - case "6": + case '6': return "6676"; // Hohenroda Hess - case "7": + case '7': return "6677"; // Neuenstein Hess - case "8": + case '8': return "6678"; // Wildeck-Hönebach default: return ""; @@ -14875,14 +14885,14 @@ private static String fromNumber668(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6681"; // Hilders - case "2": + case '2': return "6682"; // Tann Rhön - case "3": + case '3': return "6683"; // Ehrenberg Rhön - case "4": + case '4': return "6684"; // Hofbieber-Schwarzbach default: return ""; @@ -14894,22 +14904,22 @@ private static String fromNumber669(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6691"; // Schwalmstadt - case "2": + case '2': return "6692"; // Neustadt Hessen - case "3": + case '3': return "6693"; // Neuental - case "4": + case '4': return "6694"; // Neukirchen Knüll - case "5": + case '5': return "6695"; // Jesberg - case "6": + case '6': return "6696"; // Gilserberg - case "7": + case '7': return "6697"; // Willingshausen - case "8": + case '8': return "6698"; // Schrecksbach default: return ""; @@ -14921,24 +14931,24 @@ private static String fromNumber67(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber670(number.substring(1)); - case "1": + case '1': return "671"; // Bad Kreuznach - case "2": + case '2': return fromNumber672(number.substring(1)); - case "3": + case '3': return fromNumber673(number.substring(1)); - case "4": + case '4': return fromNumber674(number.substring(1)); - case "5": + case '5': return fromNumber675(number.substring(1)); - case "6": + case '6': return fromNumber676(number.substring(1)); - case "7": + case '7': return fromNumber677(number.substring(1)); - case "8": + case '8': return fromNumber678(number.substring(1)); default: return ""; @@ -14950,20 +14960,20 @@ private static String fromNumber670(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6701"; // Sprendlingen Rheinhess - case "3": + case '3': return "6703"; // Wöllstein Rheinhess - case "4": + case '4': return "6704"; // Langenlonsheim - case "6": + case '6': return "6706"; // Wallhausen Nahe - case "7": + case '7': return "6707"; // Windesheim - case "8": + case '8': return "6708"; // Bad Münster am Stein-Ebernburg - case "9": + case '9': return "6709"; // Fürfeld Kr Bad Kreuznach default: return ""; @@ -14975,22 +14985,22 @@ private static String fromNumber672(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6721"; // Bingen am Rhein - case "2": + case '2': return "6722"; // Rüdesheim am Rhein - case "3": + case '3': return "6723"; // Oestrich-Winkel - case "4": + case '4': return "6724"; // Stromberg Hunsrück - case "5": + case '5': return "6725"; // Gau-Algesheim - case "6": + case '6': return "6726"; // Lorch Rheingau - case "7": + case '7': return "6727"; // Gensingen - case "8": + case '8': return "6728"; // Ober-Hilbersheim default: return ""; @@ -15002,20 +15012,20 @@ private static String fromNumber673(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6731"; // Alzey - case "2": + case '2': return "6732"; // Wörrstadt - case "3": + case '3': return "6733"; // Gau-Odernheim - case "4": + case '4': return "6734"; // Flonheim - case "5": + case '5': return "6735"; // Eppelsheim - case "6": + case '6': return "6736"; // Bechenheim - case "7": + case '7': return "6737"; // Köngernheim default: return ""; @@ -15027,20 +15037,20 @@ private static String fromNumber674(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6741"; // St Goar - case "2": + case '2': return "6742"; // Boppard - case "3": + case '3': return "6743"; // Bacharach - case "4": + case '4': return "6744"; // Oberwesel - case "5": + case '5': return "6745"; // Gondershausen - case "6": + case '6': return "6746"; // Pfalzfeld - case "7": + case '7': return "6747"; // Emmelshausen default: return ""; @@ -15052,22 +15062,22 @@ private static String fromNumber675(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6751"; // Bad Sobernheim - case "2": + case '2': return "6752"; // Kirn Nahe - case "3": + case '3': return "6753"; // Meisenheim - case "4": + case '4': return "6754"; // Martinstein - case "5": + case '5': return "6755"; // Odernheim am Glan - case "6": + case '6': return "6756"; // Winterbach Soonwald - case "7": + case '7': return "6757"; // Becherbach bei Kirn - case "8": + case '8': return "6758"; // Waldböckelheim default: return ""; @@ -15079,18 +15089,18 @@ private static String fromNumber676(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6761"; // Simmern Hunsrück - case "2": + case '2': return "6762"; // Kastellaun - case "3": + case '3': return "6763"; // Kirchberg Hunsrück - case "4": + case '4': return "6764"; // Rheinböllen - case "5": + case '5': return "6765"; // Gemünden Hunsrück - case "6": + case '6': return "6766"; // Kisselbach default: return ""; @@ -15102,18 +15112,18 @@ private static String fromNumber677(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6771"; // St Goarshausen - case "2": + case '2': return "6772"; // Nastätten - case "3": + case '3': return "6773"; // Kamp-Bornhofen - case "4": + case '4': return "6774"; // Kaub - case "5": + case '5': return "6775"; // Strüth Taunus - case "6": + case '6': return "6776"; // Dachsenhausen default: return ""; @@ -15125,24 +15135,24 @@ private static String fromNumber678(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6781"; // Idar-Oberstein - case "2": + case '2': return "6782"; // Birkenfeld Nahe - case "3": + case '3': return "6783"; // Baumholder - case "4": + case '4': return "6784"; // Weierbach - case "5": + case '5': return "6785"; // Herrstein - case "6": + case '6': return "6786"; // Kempfeld - case "7": + case '7': return "6787"; // Niederbrombach - case "8": + case '8': return "6788"; // Sien - case "9": + case '9': return "6789"; // Heimbach Nahe default: return ""; @@ -15154,26 +15164,26 @@ private static String fromNumber68(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber680(number.substring(1)); - case "1": + case '1': return "681"; // Saarbrücken - case "2": + case '2': return fromNumber682(number.substring(1)); - case "3": + case '3': return fromNumber683(number.substring(1)); - case "4": + case '4': return fromNumber684(number.substring(1)); - case "5": + case '5': return fromNumber685(number.substring(1)); - case "6": + case '6': return fromNumber686(number.substring(1)); - case "7": + case '7': return fromNumber687(number.substring(1)); - case "8": + case '8': return fromNumber688(number.substring(1)); - case "9": + case '9': return fromNumber689(number.substring(1)); default: return ""; @@ -15185,18 +15195,18 @@ private static String fromNumber680(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6802"; // Völklingen-Lauterbach - case "3": + case '3': return "6803"; // Mandelbachtal-Ommersheim - case "4": + case '4': return "6804"; // Mandelbachtal - case "5": + case '5': return "6805"; // Kleinblittersdorf - case "6": + case '6': return "6806"; // Heusweiler - case "9": + case '9': return "6809"; // Grossrosseln default: return ""; @@ -15208,16 +15218,16 @@ private static String fromNumber682(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6821"; // Neunkirchen Saar - case "4": + case '4': return "6824"; // Ottweiler - case "5": + case '5': return "6825"; // Illingen Saar - case "6": + case '6': return "6826"; // Bexbach - case "7": + case '7': return "6827"; // Eppelborn default: return ""; @@ -15229,22 +15239,22 @@ private static String fromNumber683(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6831"; // Saarlouis - case "2": + case '2': return "6832"; // Beckingen-Reimsbach - case "3": + case '3': return "6833"; // Rehlingen-Siersburg - case "4": + case '4': return "6834"; // Bous - case "5": + case '5': return "6835"; // Beckingen - case "6": + case '6': return "6836"; // Überherrn - case "7": + case '7': return "6837"; // Wallerfangen - case "8": + case '8': return "6838"; // Saarwellingen default: return ""; @@ -15256,18 +15266,18 @@ private static String fromNumber684(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6841"; // Homburg Saar - case "2": + case '2': return "6842"; // Blieskastel - case "3": + case '3': return "6843"; // Gersheim - case "4": + case '4': return "6844"; // Blieskastel-Altheim - case "8": + case '8': return "6848"; // Homburg-Einöd - case "9": + case '9': return "6849"; // Kirkel default: return ""; @@ -15279,22 +15289,22 @@ private static String fromNumber685(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6851"; // St Wendel - case "2": + case '2': return "6852"; // Nohfelden - case "3": + case '3': return "6853"; // Marpingen - case "4": + case '4': return "6854"; // Oberthal Saar - case "5": + case '5': return "6855"; // Freisen - case "6": + case '6': return "6856"; // St Wendel-Niederkirchen - case "7": + case '7': return "6857"; // Namborn - case "8": + case '8': return "6858"; // Ottweiler-Fürth default: return ""; @@ -15306,20 +15316,20 @@ private static String fromNumber686(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6861"; // Merzig - case "4": + case '4': return "6864"; // Mettlach - case "5": + case '5': return "6865"; // Mettlach-Orscholz - case "6": + case '6': return "6866"; // Perl-Nennig - case "7": + case '7': return "6867"; // Perl - case "8": + case '8': return "6868"; // Mettlach-Tünsdorf - case "9": + case '9': return "6869"; // Merzig-Silwingen default: return ""; @@ -15331,18 +15341,18 @@ private static String fromNumber687(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6871"; // Wadern - case "2": + case '2': return "6872"; // Losheim am See - case "3": + case '3': return "6873"; // Nonnweiler - case "4": + case '4': return "6874"; // Wadern-Nunkirchen - case "5": + case '5': return "6875"; // Nonnweiler-Primstal - case "6": + case '6': return "6876"; // Weiskirchen Saar default: return ""; @@ -15354,12 +15364,12 @@ private static String fromNumber688(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6881"; // Lebach - case "7": + case '7': return "6887"; // Schmelz Saar - case "8": + case '8': return "6888"; // Lebach-Steinbach default: return ""; @@ -15371,14 +15381,14 @@ private static String fromNumber689(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "6893"; // Saarbrücken-Ensheim - case "4": + case '4': return "6894"; // St Ingbert - case "7": + case '7': return "6897"; // Sulzbach Saar - case "8": + case '8': return "6898"; // Völklingen default: return ""; @@ -15390,26 +15400,26 @@ private static String fromNumber7(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber70(number.substring(1)); - case "1": + case '1': return fromNumber71(number.substring(1)); - case "2": + case '2': return fromNumber72(number.substring(1)); - case "3": + case '3': return fromNumber73(number.substring(1)); - case "4": + case '4': return fromNumber74(number.substring(1)); - case "5": + case '5': return fromNumber75(number.substring(1)); - case "6": + case '6': return fromNumber76(number.substring(1)); - case "7": + case '7': return fromNumber77(number.substring(1)); - case "8": + case '8': return fromNumber78(number.substring(1)); - case "9": + case '9': return fromNumber79(number.substring(1)); default: return ""; @@ -15421,20 +15431,20 @@ private static String fromNumber70(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber702(number.substring(1)); - case "3": + case '3': return fromNumber703(number.substring(1)); - case "4": + case '4': return fromNumber704(number.substring(1)); - case "5": + case '5': return fromNumber705(number.substring(1)); - case "6": + case '6': return fromNumber706(number.substring(1)); - case "7": + case '7': return fromNumber707(number.substring(1)); - case "8": + case '8': return fromNumber708(number.substring(1)); default: return ""; @@ -15446,18 +15456,18 @@ private static String fromNumber702(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7021"; // Kirchheim unter Teck - case "2": + case '2': return "7022"; // Nürtingen - case "3": + case '3': return "7023"; // Weilheim an der Teck - case "4": + case '4': return "7024"; // Wendlingen am Neckar - case "5": + case '5': return "7025"; // Neuffen - case "6": + case '6': return "7026"; // Lenningen default: return ""; @@ -15469,14 +15479,14 @@ private static String fromNumber703(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7031"; // Böblingen - case "2": + case '2': return "7032"; // Herrenberg - case "3": + case '3': return "7033"; // Weil Der Stadt - case "4": + case '4': return "7034"; // Ehningen default: return ""; @@ -15488,18 +15498,18 @@ private static String fromNumber704(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7041"; // Mühlacker - case "2": + case '2': return "7042"; // Vaihingen an der Enz - case "3": + case '3': return "7043"; // Maulbronn - case "4": + case '4': return "7044"; // Mönsheim - case "5": + case '5': return "7045"; // Oberderdingen - case "6": + case '6': return "7046"; // Zaberfeld default: return ""; @@ -15511,18 +15521,18 @@ private static String fromNumber705(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7051"; // Calw - case "2": + case '2': return "7052"; // Bad Liebenzell - case "3": + case '3': return "7053"; // Bad Teinach-Zavelstein - case "4": + case '4': return "7054"; // Wildberg Württ - case "5": + case '5': return "7055"; // Neuweiler Kr Calw - case "6": + case '6': return "7056"; // Gechingen default: return ""; @@ -15534,12 +15544,12 @@ private static String fromNumber706(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7062"; // Beilstein Württ - case "3": + case '3': return "7063"; // Bad Wimpfen - case "6": + case '6': return "7066"; // Bad Rappenau-Bonfeld default: return ""; @@ -15551,12 +15561,12 @@ private static String fromNumber707(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7071"; // Tübingen - case "2": + case '2': return "7072"; // Gomaringen - case "3": + case '3': return "7073"; // Ammerbuch default: return ""; @@ -15568,16 +15578,16 @@ private static String fromNumber708(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7081"; // Bad Wildbad - case "2": + case '2': return "7082"; // Neuenbürg Württ - case "3": + case '3': return "7083"; // Bad Herrenalb - case "4": + case '4': return "7084"; // Schömberg b Neuenbürg - case "5": + case '5': return "7085"; // Enzklösterle default: return ""; @@ -15589,24 +15599,24 @@ private static String fromNumber71(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "711"; // Stuttgart - case "2": + case '2': return fromNumber712(number.substring(1)); - case "3": + case '3': return fromNumber713(number.substring(1)); - case "4": + case '4': return fromNumber714(number.substring(1)); - case "5": + case '5': return fromNumber715(number.substring(1)); - case "6": + case '6': return fromNumber716(number.substring(1)); - case "7": + case '7': return fromNumber717(number.substring(1)); - case "8": + case '8': return fromNumber718(number.substring(1)); - case "9": + case '9': return fromNumber719(number.substring(1)); default: return ""; @@ -15618,24 +15628,24 @@ private static String fromNumber712(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7121"; // Reutlingen - case "2": + case '2': return "7122"; // St Johann Württ - case "3": + case '3': return "7123"; // Metzingen Württ - case "4": + case '4': return "7124"; // Trochtelfingen Hohenz - case "5": + case '5': return "7125"; // Bad Urach - case "6": + case '6': return "7126"; // Burladingen-Melchingen - case "7": + case '7': return "7127"; // Neckartenzlingen - case "8": + case '8': return "7128"; // Sonnenbühl - case "9": + case '9': return "7129"; // Lichtenstein Württ default: return ""; @@ -15647,24 +15657,24 @@ private static String fromNumber713(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7130"; // Löwenstein Württ - case "1": + case '1': return "7131"; // Heilbronn Neckar - case "2": + case '2': return "7132"; // Neckarsulm - case "3": + case '3': return "7133"; // Lauffen am Neckar - case "4": + case '4': return "7134"; // Weinsberg - case "5": + case '5': return "7135"; // Brackenheim - case "6": + case '6': return "7136"; // Bad Friedrichshall - case "8": + case '8': return "7138"; // Schwaigern - case "9": + case '9': return "7139"; // Neuenstadt am Kocher default: return ""; @@ -15676,22 +15686,22 @@ private static String fromNumber714(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7141"; // Ludwigsburg Württ - case "2": + case '2': return "7142"; // Bietigheim-Bissingen - case "3": + case '3': return "7143"; // Besigheim - case "4": + case '4': return "7144"; // Marbach am Neckar - case "5": + case '5': return "7145"; // Markgröningen - case "6": + case '6': return "7146"; // Remseck am Neckar - case "7": + case '7': return "7147"; // Sachsenheim Württ - case "8": + case '8': return "7148"; // Grossbottwar default: return ""; @@ -15703,24 +15713,24 @@ private static String fromNumber715(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7150"; // Korntal-Münchingen - case "1": + case '1': return "7151"; // Waiblingen - case "2": + case '2': return "7152"; // Leonberg Württ - case "3": + case '3': return "7153"; // Plochingen - case "4": + case '4': return "7154"; // Kornwestheim - case "6": + case '6': return "7156"; // Ditzingen - case "7": + case '7': return "7157"; // Waldenbuch - case "8": + case '8': return "7158"; // Neuhausen auf den Fildern - case "9": + case '9': return "7159"; // Renningen default: return ""; @@ -15732,18 +15742,18 @@ private static String fromNumber716(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7161"; // Göppingen - case "2": + case '2': return "7162"; // Süßen - case "3": + case '3': return "7163"; // Ebersbach an der Fils - case "4": + case '4': return "7164"; // Boll Kr Göppingen - case "5": + case '5': return "7165"; // Göppingen-Hohenstaufen - case "6": + case '6': return "7166"; // Adelberg default: return ""; @@ -15755,18 +15765,18 @@ private static String fromNumber717(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7171"; // Schwäbisch Gmünd - case "2": + case '2': return "7172"; // Lorch Württ - case "3": + case '3': return "7173"; // Heubach - case "4": + case '4': return "7174"; // Mögglingen - case "5": + case '5': return "7175"; // Leinzell - case "6": + case '6': return "7176"; // Spraitbach default: return ""; @@ -15778,14 +15788,14 @@ private static String fromNumber718(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7181"; // Schorndorf Württ - case "2": + case '2': return "7182"; // Welzheim - case "3": + case '3': return "7183"; // Rudersberg Württ - case "4": + case '4': return "7184"; // Kaisersbach default: return ""; @@ -15797,16 +15807,16 @@ private static String fromNumber719(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7191"; // Backnang - case "2": + case '2': return "7192"; // Murrhardt - case "3": + case '3': return "7193"; // Sulzbach an der Murr - case "4": + case '4': return "7194"; // Spiegelberg - case "5": + case '5': return "7195"; // Winnenden default: return ""; @@ -15818,22 +15828,22 @@ private static String fromNumber72(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber720(number.substring(1)); - case "1": + case '1': return "721"; // Karlsruhe - case "2": + case '2': return fromNumber722(number.substring(1)); - case "3": + case '3': return fromNumber723(number.substring(1)); - case "4": + case '4': return fromNumber724(number.substring(1)); - case "5": + case '5': return fromNumber725(number.substring(1)); - case "6": + case '6': return fromNumber726(number.substring(1)); - case "7": + case '7': return fromNumber727(number.substring(1)); default: return ""; @@ -15845,12 +15855,12 @@ private static String fromNumber720(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7202"; // Karlsbad - case "3": + case '3': return "7203"; // Walzbachtal - case "4": + case '4': return "7204"; // Malsch-Völkersbach default: return ""; @@ -15862,26 +15872,26 @@ private static String fromNumber722(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7220"; // Forbach-Hundsbach - case "1": + case '1': return "7221"; // Baden-Baden - case "2": + case '2': return "7222"; // Rastatt - case "3": + case '3': return "7223"; // Bühl Baden - case "4": + case '4': return "7224"; // Gernsbach - case "5": + case '5': return "7225"; // Gaggenau - case "6": + case '6': return "7226"; // Bühl-Sand - case "7": + case '7': return "7227"; // Lichtenau Baden - case "8": + case '8': return "7228"; // Forbach - case "9": + case '9': return "7229"; // Iffezheim default: return ""; @@ -15893,20 +15903,20 @@ private static String fromNumber723(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7231"; // Pforzheim - case "2": + case '2': return "7232"; // Königsbach-Stein - case "3": + case '3': return "7233"; // Niefern-Öschelbronn - case "4": + case '4': return "7234"; // Tiefenbronn - case "5": + case '5': return "7235"; // Unterreichenbach Kr Calw - case "6": + case '6': return "7236"; // Keltern - case "7": + case '7': return "7237"; // Neulingen Enzkreis default: return ""; @@ -15918,24 +15928,24 @@ private static String fromNumber724(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7240"; // Pfinztal - case "2": + case '2': return "7242"; // Rheinstetten - case "3": + case '3': return "7243"; // Ettlingen - case "4": + case '4': return "7244"; // Weingarten Baden - case "5": + case '5': return "7245"; // Durmersheim - case "6": + case '6': return "7246"; // Malsch Kr Karlsruhe - case "7": + case '7': return "7247"; // Linkenheim-Hochstetten - case "8": + case '8': return "7248"; // Marxzell - case "9": + case '9': return "7249"; // Stutensee default: return ""; @@ -15947,26 +15957,26 @@ private static String fromNumber725(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7250"; // Kraichtal - case "1": + case '1': return "7251"; // Bruchsal - case "2": + case '2': return "7252"; // Bretten - case "3": + case '3': return "7253"; // Bad Schönborn - case "4": + case '4': return "7254"; // Waghäusel - case "5": + case '5': return "7255"; // Graben-Neudorf - case "6": + case '6': return "7256"; // Philippsburg - case "7": + case '7': return "7257"; // Bruchsal-Untergrombach - case "8": + case '8': return "7258"; // Oberderdingen-Flehingen - case "9": + case '9': return "7259"; // Östringen-Odenheim default: return ""; @@ -15978,26 +15988,26 @@ private static String fromNumber726(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7260"; // Sinsheim-Hilsbach - case "1": + case '1': return "7261"; // Sinsheim - case "2": + case '2': return "7262"; // Eppingen - case "3": + case '3': return "7263"; // Waibstadt - case "4": + case '4': return "7264"; // Bad Rappenau - case "5": + case '5': return "7265"; // Angelbachtal - case "6": + case '6': return "7266"; // Kirchardt - case "7": + case '7': return "7267"; // Gemmingen - case "8": + case '8': return "7268"; // Bad Rappenau-Obergimpern - case "9": + case '9': return "7269"; // Sulzfeld Baden default: return ""; @@ -16009,20 +16019,20 @@ private static String fromNumber727(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7271"; // Wörth am Rhein - case "2": + case '2': return "7272"; // Rülzheim - case "3": + case '3': return "7273"; // Hagenbach Pfalz - case "4": + case '4': return "7274"; // Germersheim - case "5": + case '5': return "7275"; // Kandel - case "6": + case '6': return "7276"; // Herxheim bei Landau Pfalz - case "7": + case '7': return "7277"; // Wörth-Büchelberg default: return ""; @@ -16034,26 +16044,26 @@ private static String fromNumber73(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber730(number.substring(1)); - case "1": + case '1': return "731"; // Ulm Donau - case "2": + case '2': return fromNumber732(number.substring(1)); - case "3": + case '3': return fromNumber733(number.substring(1)); - case "4": + case '4': return fromNumber734(number.substring(1)); - case "5": + case '5': return fromNumber735(number.substring(1)); - case "6": + case '6': return fromNumber736(number.substring(1)); - case "7": + case '7': return fromNumber737(number.substring(1)); - case "8": + case '8': return fromNumber738(number.substring(1)); - case "9": + case '9': return fromNumber739(number.substring(1)); default: return ""; @@ -16065,24 +16075,24 @@ private static String fromNumber730(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7300"; // Roggenburg - case "2": + case '2': return "7302"; // Pfaffenhofen a d Roth - case "3": + case '3': return "7303"; // Illertissen - case "4": + case '4': return "7304"; // Blaustein Württ - case "5": + case '5': return "7305"; // Erbach Donau - case "6": + case '6': return "7306"; // Vöhringen Iller - case "7": + case '7': return "7307"; // Senden Iller - case "8": + case '8': return "7308"; // Nersingen - case "9": + case '9': return "7309"; // Weissenhorn default: return ""; @@ -16094,24 +16104,24 @@ private static String fromNumber732(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7321"; // Heidenheim a d Brenz - case "2": + case '2': return "7322"; // Giengen a d Brenz - case "3": + case '3': return "7323"; // Gerstetten - case "4": + case '4': return "7324"; // Herbrechtingen - case "5": + case '5': return "7325"; // Sontheim a d Brenz - case "6": + case '6': return "7326"; // Neresheim - case "7": + case '7': return "7327"; // Dischingen - case "8": + case '8': return "7328"; // Königsbronn - case "9": + case '9': return "7329"; // Steinheim am Albuch default: return ""; @@ -16123,20 +16133,20 @@ private static String fromNumber733(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7331"; // Geislingen an der Steige - case "2": + case '2': return "7332"; // Lauterstein - case "3": + case '3': return "7333"; // Laichingen - case "4": + case '4': return "7334"; // Deggingen - case "5": + case '5': return "7335"; // Wiesensteig - case "6": + case '6': return "7336"; // Lonsee - case "7": + case '7': return "7337"; // Nellingen Alb default: return ""; @@ -16148,20 +16158,20 @@ private static String fromNumber734(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7340"; // Neenstetten - case "3": + case '3': return "7343"; // Buch b Illertissen - case "4": + case '4': return "7344"; // Blaubeuren - case "5": + case '5': return "7345"; // Langenau Württ - case "6": + case '6': return "7346"; // Illerkirchberg - case "7": + case '7': return "7347"; // Dietenheim - case "8": + case '8': return "7348"; // Beimerstetten default: return ""; @@ -16173,22 +16183,22 @@ private static String fromNumber735(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7351"; // Biberach an der Riß - case "2": + case '2': return "7352"; // Ochsenhausen - case "3": + case '3': return "7353"; // Schwendi - case "4": + case '4': return "7354"; // Erolzheim - case "5": + case '5': return "7355"; // Hochdorf Riß - case "6": + case '6': return "7356"; // Schemmerhofen - case "7": + case '7': return "7357"; // Attenweiler - case "8": + case '8': return "7358"; // Eberhardzell-Füramoos default: return ""; @@ -16200,20 +16210,20 @@ private static String fromNumber736(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7361"; // Aalen - case "2": + case '2': return "7362"; // Bopfingen - case "3": + case '3': return "7363"; // Lauchheim - case "4": + case '4': return "7364"; // Oberkochen - case "5": + case '5': return "7365"; // Essingen Württ - case "6": + case '6': return "7366"; // Abtsgmünd - case "7": + case '7': return "7367"; // Aalen-Ebnat default: return ""; @@ -16225,16 +16235,16 @@ private static String fromNumber737(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7371"; // Riedlingen Württ - case "3": + case '3': return "7373"; // Zwiefalten - case "4": + case '4': return "7374"; // Uttenweiler - case "5": + case '5': return "7375"; // Obermarchtal - case "6": + case '6': return "7376"; // Langenenslingen default: return ""; @@ -16246,24 +16256,24 @@ private static String fromNumber738(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7381"; // Münsingen - case "2": + case '2': return "7382"; // Römerstein - case "3": + case '3': return "7383"; // Münsingen-Buttenhausen - case "4": + case '4': return "7384"; // Schelklingen-Hütten - case "5": + case '5': return "7385"; // Gomadingen - case "6": + case '6': return "7386"; // Hayingen - case "7": + case '7': return "7387"; // Hohenstein Württ - case "8": + case '8': return "7388"; // Pfronstetten - case "9": + case '9': return "7389"; // Heroldstatt default: return ""; @@ -16275,16 +16285,16 @@ private static String fromNumber739(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7391"; // Ehingen Donau - case "2": + case '2': return "7392"; // Laupheim - case "3": + case '3': return "7393"; // Munderkingen - case "4": + case '4': return "7394"; // Schelklingen - case "5": + case '5': return "7395"; // Ehingen-Dächingen default: return ""; @@ -16296,24 +16306,24 @@ private static String fromNumber74(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber740(number.substring(1)); - case "1": + case '1': return "741"; // Rottweil - case "2": + case '2': return fromNumber742(number.substring(1)); - case "3": + case '3': return fromNumber743(number.substring(1)); - case "4": + case '4': return fromNumber744(number.substring(1)); - case "5": + case '5': return fromNumber745(number.substring(1)); - case "6": + case '6': return fromNumber746(number.substring(1)); - case "7": + case '7': return fromNumber747(number.substring(1)); - case "8": + case '8': return fromNumber748(number.substring(1)); default: return ""; @@ -16325,12 +16335,12 @@ private static String fromNumber740(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7402"; // Fluorn-Winzeln - case "3": + case '3': return "7403"; // Dunningen - case "4": + case '4': return "7404"; // Epfendorf default: return ""; @@ -16342,24 +16352,24 @@ private static String fromNumber742(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7420"; // Deisslingen - case "2": + case '2': return "7422"; // Schramberg - case "3": + case '3': return "7423"; // Oberndorf am Neckar - case "4": + case '4': return "7424"; // Spaichingen - case "5": + case '5': return "7425"; // Trossingen - case "6": + case '6': return "7426"; // Gosheim - case "7": + case '7': return "7427"; // Schömberg b Balingen - case "8": + case '8': return "7428"; // Rosenfeld - case "9": + case '9': return "7429"; // Egesheim default: return ""; @@ -16371,18 +16381,18 @@ private static String fromNumber743(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7431"; // Albstadt-Ebingen - case "2": + case '2': return "7432"; // Albstadt-Tailfingen - case "3": + case '3': return "7433"; // Balingen - case "4": + case '4': return "7434"; // Winterlingen - case "5": + case '5': return "7435"; // Albstadt-Laufen - case "6": + case '6': return "7436"; // Messstetten-Oberdigisheim default: return ""; @@ -16394,26 +16404,26 @@ private static String fromNumber744(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7440"; // Bad Rippoldsau - case "1": + case '1': return "7441"; // Freudenstadt - case "2": + case '2': return "7442"; // Baiersbronn - case "3": + case '3': return "7443"; // Dornstetten - case "4": + case '4': return "7444"; // Alpirsbach - case "5": + case '5': return "7445"; // Pfalzgrafenweiler - case "6": + case '6': return "7446"; // Lossburg - case "7": + case '7': return "7447"; // Baiersbronn-Schwarzenberg - case "8": + case '8': return "7448"; // Seewald - case "9": + case '9': return "7449"; // Baiersbronn-Obertal default: return ""; @@ -16425,24 +16435,24 @@ private static String fromNumber745(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7451"; // Horb am Neckar - case "2": + case '2': return "7452"; // Nagold - case "3": + case '3': return "7453"; // Altensteig Württ - case "4": + case '4': return "7454"; // Sulz am Neckar - case "5": + case '5': return "7455"; // Dornhan - case "6": + case '6': return "7456"; // Haiterbach - case "7": + case '7': return "7457"; // Rottenburg-Ergenzingen - case "8": + case '8': return "7458"; // Ebhausen - case "9": + case '9': return "7459"; // Nagold-Hochdorf default: return ""; @@ -16454,20 +16464,20 @@ private static String fromNumber746(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7461"; // Tuttlingen - case "2": + case '2': return "7462"; // Immendingen - case "3": + case '3': return "7463"; // Mühlheim an der Donau - case "4": + case '4': return "7464"; // Talheim Kr Tuttlingen - case "5": + case '5': return "7465"; // Emmingen-Liptingen - case "6": + case '6': return "7466"; // Beuron - case "7": + case '7': return "7467"; // Neuhausen ob Eck default: return ""; @@ -16479,22 +16489,22 @@ private static String fromNumber747(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7471"; // Hechingen - case "2": + case '2': return "7472"; // Rottenburg am Neckar - case "3": + case '3': return "7473"; // Mössingen - case "4": + case '4': return "7474"; // Haigerloch - case "5": + case '5': return "7475"; // Burladingen - case "6": + case '6': return "7476"; // Bisingen - case "7": + case '7': return "7477"; // Jungingen b Hechingen - case "8": + case '8': return "7478"; // Hirrlingen default: return ""; @@ -16506,16 +16516,16 @@ private static String fromNumber748(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7482"; // Horb-Dettingen - case "3": + case '3': return "7483"; // Horb-Mühringen - case "4": + case '4': return "7484"; // Simmersfeld - case "5": + case '5': return "7485"; // Empfingen - case "6": + case '6': return "7486"; // Horb-Altheim default: return ""; @@ -16527,24 +16537,24 @@ private static String fromNumber75(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber750(number.substring(1)); - case "1": + case '1': return "751"; // Ravensburg - case "2": + case '2': return fromNumber752(number.substring(1)); - case "3": + case '3': return fromNumber753(number.substring(1)); - case "4": + case '4': return fromNumber754(number.substring(1)); - case "5": + case '5': return fromNumber755(number.substring(1)); - case "6": + case '6': return fromNumber756(number.substring(1)); - case "7": + case '7': return fromNumber757(number.substring(1)); - case "8": + case '8': return fromNumber758(number.substring(1)); default: return ""; @@ -16556,16 +16566,16 @@ private static String fromNumber750(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7502"; // Wolpertswende - case "3": + case '3': return "7503"; // Wilhelmsdorf Württ - case "4": + case '4': return "7504"; // Horgenzell - case "5": + case '5': return "7505"; // Fronreute - case "6": + case '6': return "7506"; // Wangen-Leupolz default: return ""; @@ -16577,20 +16587,20 @@ private static String fromNumber752(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7520"; // Bodnegg - case "2": + case '2': return "7522"; // Wangen im Allgäu - case "4": + case '4': return "7524"; // Bad Waldsee - case "5": + case '5': return "7525"; // Aulendorf - case "7": + case '7': return "7527"; // Wolfegg - case "8": + case '8': return "7528"; // Neukirch b Tettnang - case "9": + case '9': return "7529"; // Waldburg Württ default: return ""; @@ -16602,14 +16612,14 @@ private static String fromNumber753(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7531"; // Konstanz - case "2": + case '2': return "7532"; // Meersburg - case "3": + case '3': return "7533"; // Allensbach - case "4": + case '4': return "7534"; // Reichenau Baden default: return ""; @@ -16621,18 +16631,18 @@ private static String fromNumber754(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7541"; // Friedrichshafen - case "2": + case '2': return "7542"; // Tettnang - case "3": + case '3': return "7543"; // Kressbronn am Bodensee - case "4": + case '4': return "7544"; // Markdorf - case "5": + case '5': return "7545"; // Immenstaad am Bodensee - case "6": + case '6': return "7546"; // Oberteuringen default: return ""; @@ -16644,22 +16654,22 @@ private static String fromNumber755(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7551"; // Überlingen Bodensee - case "2": + case '2': return "7552"; // Pfullendorf - case "3": + case '3': return "7553"; // Salem Baden - case "4": + case '4': return "7554"; // Heiligenberg Baden - case "5": + case '5': return "7555"; // Deggenhausertal - case "6": + case '6': return "7556"; // Uhldingen-Mühlhofen - case "7": + case '7': return "7557"; // Herdwangen-Schönach - case "8": + case '8': return "7558"; // Illmensee default: return ""; @@ -16671,24 +16681,24 @@ private static String fromNumber756(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7561"; // Leutkirch im Allgäu - case "2": + case '2': return "7562"; // Isny im Allgäu - case "3": + case '3': return "7563"; // Kisslegg - case "4": + case '4': return "7564"; // Bad Wurzach - case "5": + case '5': return "7565"; // Aichstetten Kr Ravensburg - case "6": + case '6': return "7566"; // Argenbühl - case "7": + case '7': return "7567"; // Leutkirch-Friesenhofen - case "8": + case '8': return "7568"; // Bad Wurzach-Hauerz - case "9": + case '9': return "7569"; // Isny-Eisenbach default: return ""; @@ -16700,26 +16710,26 @@ private static String fromNumber757(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7570"; // Sigmaringen-Gutenstein - case "1": + case '1': return "7571"; // Sigmaringen - case "2": + case '2': return "7572"; // Mengen Württ - case "3": + case '3': return "7573"; // Stetten am kalten Markt - case "4": + case '4': return "7574"; // Gammertingen - case "5": + case '5': return "7575"; // Messkirch - case "6": + case '6': return "7576"; // Krauchenwies - case "7": + case '7': return "7577"; // Veringenstadt - case "8": + case '8': return "7578"; // Wald Hohenz - case "9": + case '9': return "7579"; // Schwenningen Baden default: return ""; @@ -16731,20 +16741,20 @@ private static String fromNumber758(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7581"; // Saulgau - case "2": + case '2': return "7582"; // Bad Buchau - case "3": + case '3': return "7583"; // Bad Schussenried - case "4": + case '4': return "7584"; // Altshausen - case "5": + case '5': return "7585"; // Ostrach - case "6": + case '6': return "7586"; // Herbertingen - case "7": + case '7': return "7587"; // Hosskirch default: return ""; @@ -16756,24 +16766,24 @@ private static String fromNumber76(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber760(number.substring(1)); - case "1": + case '1': return "761"; // Freiburg im Breisgau - case "2": + case '2': return fromNumber762(number.substring(1)); - case "3": + case '3': return fromNumber763(number.substring(1)); - case "4": + case '4': return fromNumber764(number.substring(1)); - case "5": + case '5': return fromNumber765(number.substring(1)); - case "6": + case '6': return fromNumber766(number.substring(1)); - case "7": + case '7': return fromNumber767(number.substring(1)); - case "8": + case '8': return fromNumber768(number.substring(1)); default: return ""; @@ -16785,8 +16795,8 @@ private static String fromNumber760(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7602"; // Oberried Breisgau default: return ""; @@ -16798,26 +16808,26 @@ private static String fromNumber762(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7620"; // Schopfheim-Gersbach - case "1": + case '1': return "7621"; // Lörrach - case "2": + case '2': return "7622"; // Schopfheim - case "3": + case '3': return "7623"; // Rheinfelden Baden - case "4": + case '4': return "7624"; // Grenzach-Wyhlen - case "5": + case '5': return "7625"; // Zell im Wiesental - case "6": + case '6': return "7626"; // Kandern - case "7": + case '7': return "7627"; // Steinen Kr Lörrach - case "8": + case '8': return "7628"; // Efringen-Kirchen - case "9": + case '9': return "7629"; // Tegernau Baden default: return ""; @@ -16829,18 +16839,18 @@ private static String fromNumber763(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7631"; // Müllheim Baden - case "2": + case '2': return "7632"; // Badenweiler - case "3": + case '3': return "7633"; // Staufen im Breisgau - case "4": + case '4': return "7634"; // Sulzburg - case "5": + case '5': return "7635"; // Schliengen - case "6": + case '6': return "7636"; // Münstertal Schwarzwald default: return ""; @@ -16852,18 +16862,18 @@ private static String fromNumber764(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7641"; // Emmendingen - case "2": + case '2': return "7642"; // Endingen Kaiserstuhl - case "3": + case '3': return "7643"; // Herbolzheim Breisgau - case "4": + case '4': return "7644"; // Kenzingen - case "5": + case '5': return "7645"; // Freiamt - case "6": + case '6': return "7646"; // Weisweil Breisgau default: return ""; @@ -16875,20 +16885,20 @@ private static String fromNumber765(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7651"; // Titisee-Neustadt - case "2": + case '2': return "7652"; // Hinterzarten - case "3": + case '3': return "7653"; // Lenzkirch - case "4": + case '4': return "7654"; // Löffingen - case "5": + case '5': return "7655"; // Feldberg-Altglashütten - case "6": + case '6': return "7656"; // Schluchsee - case "7": + case '7': return "7657"; // Eisenbach Hochschwarzwald default: return ""; @@ -16900,26 +16910,26 @@ private static String fromNumber766(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7660"; // St Peter Schwarzw - case "1": + case '1': return "7661"; // Kirchzarten - case "2": + case '2': return "7662"; // Vogtsburg im Kaiserstuhl - case "3": + case '3': return "7663"; // Eichstetten - case "4": + case '4': return "7664"; // Freiburg-Tiengen - case "5": + case '5': return "7665"; // March Breisgau - case "6": + case '6': return "7666"; // Denzlingen - case "7": + case '7': return "7667"; // Breisach am Rhein - case "8": + case '8': return "7668"; // Ihringen - case "9": + case '9': return "7669"; // St Märgen default: return ""; @@ -16931,18 +16941,18 @@ private static String fromNumber767(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7671"; // Todtnau - case "2": + case '2': return "7672"; // St Blasien - case "3": + case '3': return "7673"; // Schönau im Schwarzwald - case "4": + case '4': return "7674"; // Todtmoos - case "5": + case '5': return "7675"; // Bernau Baden - case "6": + case '6': return "7676"; // Feldberg Schwarzwald default: return ""; @@ -16954,16 +16964,16 @@ private static String fromNumber768(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7681"; // Waldkirch Breisgau - case "2": + case '2': return "7682"; // Elzach - case "3": + case '3': return "7683"; // Simonswald - case "4": + case '4': return "7684"; // Glottertal - case "5": + case '5': return "7685"; // Gutach-Bleibach default: return ""; @@ -16975,22 +16985,22 @@ private static String fromNumber77(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber770(number.substring(1)); - case "1": + case '1': return "771"; // Donaueschingen - case "2": + case '2': return fromNumber772(number.substring(1)); - case "3": + case '3': return fromNumber773(number.substring(1)); - case "4": + case '4': return fromNumber774(number.substring(1)); - case "5": + case '5': return fromNumber775(number.substring(1)); - case "6": + case '6': return fromNumber776(number.substring(1)); - case "7": + case '7': return fromNumber777(number.substring(1)); default: return ""; @@ -17002,22 +17012,22 @@ private static String fromNumber770(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7702"; // Blumberg Baden - case "3": + case '3': return "7703"; // Bonndorf im Schwarzwald - case "4": + case '4': return "7704"; // Geisingen Baden - case "5": + case '5': return "7705"; // Wolterdingen Schwarzw - case "6": + case '6': return "7706"; // Oberbaldingen - case "7": + case '7': return "7707"; // Bräunlingen - case "8": + case '8': return "7708"; // Geisingen-Leipferdingen - case "9": + case '9': return "7709"; // Wutach default: return ""; @@ -17029,26 +17039,26 @@ private static String fromNumber772(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7720"; // Schwenningen a Neckar - case "1": + case '1': return "7721"; // Villingen i Schwarzw - case "2": + case '2': return "7722"; // Triberg im Schwarzwald - case "3": + case '3': return "7723"; // Furtwangen im Schwarzwald - case "4": + case '4': return "7724"; // St Georgen im Schwarzwald - case "5": + case '5': return "7725"; // Königsfeld im Schwarzwald - case "6": + case '6': return "7726"; // Bad Dürrheim - case "7": + case '7': return "7727"; // Vöhrenbach - case "8": + case '8': return "7728"; // Niedereschach - case "9": + case '9': return "7729"; // Tennenbronn default: return ""; @@ -17060,22 +17070,22 @@ private static String fromNumber773(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7731"; // Singen Hohentwiel - case "2": + case '2': return "7732"; // Radolfzell am Bodensee - case "3": + case '3': return "7733"; // Engen Hegau - case "4": + case '4': return "7734"; // Gailingen - case "5": + case '5': return "7735"; // Öhningen - case "6": + case '6': return "7736"; // Tengen - case "8": + case '8': return "7738"; // Steisslingen - case "9": + case '9': return "7739"; // Hilzingen default: return ""; @@ -17087,22 +17097,22 @@ private static String fromNumber774(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7741"; // Tiengen Hochrhein - case "2": + case '2': return "7742"; // Klettgau - case "3": + case '3': return "7743"; // Ühlingen-Birkendorf - case "4": + case '4': return "7744"; // Stühlingen - case "5": + case '5': return "7745"; // Jestetten - case "6": + case '6': return "7746"; // Wutöschingen - case "7": + case '7': return "7747"; // Berau - case "8": + case '8': return "7748"; // Grafenhausen Hochschwarzw default: return ""; @@ -17114,14 +17124,14 @@ private static String fromNumber775(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7751"; // Waldshut - case "3": + case '3': return "7753"; // Albbruck - case "4": + case '4': return "7754"; // Görwihl - case "5": + case '5': return "7755"; // Weilheim Kr Waldshut default: return ""; @@ -17133,16 +17143,16 @@ private static String fromNumber776(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7761"; // Bad Säckingen - case "2": + case '2': return "7762"; // Wehr Baden - case "3": + case '3': return "7763"; // Murg - case "4": + case '4': return "7764"; // Herrischried - case "5": + case '5': return "7765"; // Rickenbach Hotzenw default: return ""; @@ -17154,16 +17164,16 @@ private static String fromNumber777(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7771"; // Stockach - case "3": + case '3': return "7773"; // Bodman-Ludwigshafen - case "4": + case '4': return "7774"; // Eigeltingen - case "5": + case '5': return "7775"; // Mühlingen - case "7": + case '7': return "7777"; // Sauldorf default: return ""; @@ -17175,18 +17185,18 @@ private static String fromNumber78(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber780(number.substring(1)); - case "1": + case '1': return "781"; // Offenburg - case "2": + case '2': return fromNumber782(number.substring(1)); - case "3": + case '3': return fromNumber783(number.substring(1)); - case "4": + case '4': return fromNumber784(number.substring(1)); - case "5": + case '5': return fromNumber785(number.substring(1)); default: return ""; @@ -17198,20 +17208,20 @@ private static String fromNumber780(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7802"; // Oberkirch Baden - case "3": + case '3': return "7803"; // Gengenbach - case "4": + case '4': return "7804"; // Oppenau - case "5": + case '5': return "7805"; // Appenweier - case "6": + case '6': return "7806"; // Bad Peterstal-Griesbach - case "7": + case '7': return "7807"; // Neuried Ortenaukreis - case "8": + case '8': return "7808"; // Hohberg b Offenburg default: return ""; @@ -17223,18 +17233,18 @@ private static String fromNumber782(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7821"; // Lahr Schwarzwald - case "2": + case '2': return "7822"; // Ettenheim - case "3": + case '3': return "7823"; // Seelbach Schutter - case "4": + case '4': return "7824"; // Schwanau - case "5": + case '5': return "7825"; // Kippenheim - case "6": + case '6': return "7826"; // Schuttertal default: return ""; @@ -17246,24 +17256,24 @@ private static String fromNumber783(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7831"; // Hausach - case "2": + case '2': return "7832"; // Haslach im Kinzigtal - case "3": + case '3': return "7833"; // Hornberg Schwarzwaldbahn - case "4": + case '4': return "7834"; // Wolfach - case "5": + case '5': return "7835"; // Zell am Harmersbach - case "6": + case '6': return "7836"; // Schiltach - case "7": + case '7': return "7837"; // Oberharmersbach - case "8": + case '8': return "7838"; // Nordrach - case "9": + case '9': return "7839"; // Schapbach default: return ""; @@ -17275,14 +17285,14 @@ private static String fromNumber784(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7841"; // Achern - case "2": + case '2': return "7842"; // Kappelrodeck - case "3": + case '3': return "7843"; // Renchen - case "4": + case '4': return "7844"; // Rheinau default: return ""; @@ -17294,14 +17304,14 @@ private static String fromNumber785(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7851"; // Kehl - case "2": + case '2': return "7852"; // Willstätt - case "3": + case '3': return "7853"; // Kehl-Bodersweier - case "4": + case '4': return "7854"; // Kehl-Goldscheuer default: return ""; @@ -17313,20 +17323,20 @@ private static String fromNumber79(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber790(number.substring(1)); - case "1": + case '1': return "791"; // Schwäbisch Hall - case "3": + case '3': return fromNumber793(number.substring(1)); - case "4": + case '4': return fromNumber794(number.substring(1)); - case "5": + case '5': return fromNumber795(number.substring(1)); - case "6": + case '6': return fromNumber796(number.substring(1)); - case "7": + case '7': return fromNumber797(number.substring(1)); default: return ""; @@ -17338,16 +17348,16 @@ private static String fromNumber790(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "7903"; // Mainhardt - case "4": + case '4': return "7904"; // Ilshofen - case "5": + case '5': return "7905"; // Langenburg - case "6": + case '6': return "7906"; // Braunsbach - case "7": + case '7': return "7907"; // Schwäbisch Hall-Sulzdorf default: return ""; @@ -17359,26 +17369,26 @@ private static String fromNumber793(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7930"; // Boxberg Baden - case "1": + case '1': return "7931"; // Bad Mergentheim - case "2": + case '2': return "7932"; // Niederstetten Württ - case "3": + case '3': return "7933"; // Creglingen - case "4": + case '4': return "7934"; // Weikersheim - case "5": + case '5': return "7935"; // Schrozberg - case "6": + case '6': return "7936"; // Schrozberg-Bartenstein - case "7": + case '7': return "7937"; // Dörzbach - case "8": + case '8': return "7938"; // Mulfingen Jagst - case "9": + case '9': return "7939"; // Schrozberg-Spielbach default: return ""; @@ -17390,26 +17400,26 @@ private static String fromNumber794(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7940"; // Künzelsau - case "1": + case '1': return "7941"; // Öhringen - case "2": + case '2': return "7942"; // Neuenstein Württ - case "3": + case '3': return "7943"; // Schöntal Jagst - case "4": + case '4': return "7944"; // Kupferzell - case "5": + case '5': return "7945"; // Wüstenrot - case "6": + case '6': return "7946"; // Bretzfeld - case "7": + case '7': return "7947"; // Forchtenberg - case "8": + case '8': return "7948"; // Öhringen-Ohrnberg - case "9": + case '9': return "7949"; // Pfedelbach-Untersteinbach default: return ""; @@ -17421,24 +17431,24 @@ private static String fromNumber795(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7950"; // Schnelldorf - case "1": + case '1': return "7951"; // Crailsheim - case "2": + case '2': return "7952"; // Gerabronn - case "3": + case '3': return "7953"; // Blaufelden - case "4": + case '4': return "7954"; // Kirchberg an der Jagst - case "5": + case '5': return "7955"; // Wallhausen Württ - case "7": + case '7': return "7957"; // Kressberg - case "8": + case '8': return "7958"; // Rot Am See-Brettheim - case "9": + case '9': return "7959"; // Frankenhardt default: return ""; @@ -17450,20 +17460,20 @@ private static String fromNumber796(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7961"; // Ellwangen Jagst - case "2": + case '2': return "7962"; // Fichtenau - case "3": + case '3': return "7963"; // Adelmannsfelden - case "4": + case '4': return "7964"; // Stödtlen - case "5": + case '5': return "7965"; // Ellwangen-Röhlingen - case "6": + case '6': return "7966"; // Unterschneidheim - case "7": + case '7': return "7967"; // Jagstzell default: return ""; @@ -17475,20 +17485,20 @@ private static String fromNumber797(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7971"; // Gaildorf - case "2": + case '2': return "7972"; // Gschwend b Gaildorf - case "3": + case '3': return "7973"; // Obersontheim - case "4": + case '4': return "7974"; // Bühlerzell - case "5": + case '5': return "7975"; // Untergröningen - case "6": + case '6': return "7976"; // Sulzbach-Laufen - case "7": + case '7': return "7977"; // Oberrot b Gaildorf default: return ""; @@ -17500,26 +17510,26 @@ private static String fromNumber8(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber80(number.substring(1)); - case "1": + case '1': return fromNumber81(number.substring(1)); - case "2": + case '2': return fromNumber82(number.substring(1)); - case "3": + case '3': return fromNumber83(number.substring(1)); - case "4": + case '4': return fromNumber84(number.substring(1)); - case "5": + case '5': return fromNumber85(number.substring(1)); - case "6": + case '6': return fromNumber86(number.substring(1)); - case "7": + case '7': return fromNumber87(number.substring(1)); - case "8": + case '8': return fromNumber88(number.substring(1)); - case "9": + case '9': return "89"; // München default: return ""; @@ -17531,22 +17541,22 @@ private static String fromNumber80(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber802(number.substring(1)); - case "3": + case '3': return fromNumber803(number.substring(1)); - case "4": + case '4': return fromNumber804(number.substring(1)); - case "5": + case '5': return fromNumber805(number.substring(1)); - case "6": + case '6': return fromNumber806(number.substring(1)); - case "7": + case '7': return fromNumber807(number.substring(1)); - case "8": + case '8': return fromNumber808(number.substring(1)); - case "9": + case '9': return fromNumber809(number.substring(1)); default: return ""; @@ -17558,26 +17568,26 @@ private static String fromNumber802(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8020"; // Weyarn - case "1": + case '1': return "8021"; // Waakirchen - case "2": + case '2': return "8022"; // Tegernsee - case "3": + case '3': return "8023"; // Bayrischzell - case "4": + case '4': return "8024"; // Holzkirchen - case "5": + case '5': return "8025"; // Miesbach - case "6": + case '6': return "8026"; // Hausham - case "7": + case '7': return "8027"; // Dietramszell - case "8": + case '8': return "8028"; // Fischbachau - case "9": + case '9': return "8029"; // Kreuth b Tegernsee default: return ""; @@ -17589,22 +17599,22 @@ private static String fromNumber803(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8031"; // Rosenheim Oberbay - case "2": + case '2': return "8032"; // Rohrdorf Kr Rosenheim - case "3": + case '3': return "8033"; // Oberaudorf - case "4": + case '4': return "8034"; // Brannenburg - case "5": + case '5': return "8035"; // Raubling - case "6": + case '6': return "8036"; // Stephanskirchen Simssee - case "8": + case '8': return "8038"; // Vogtareuth - case "9": + case '9': return "8039"; // Rott a Inn default: return ""; @@ -17616,16 +17626,16 @@ private static String fromNumber804(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8041"; // Bad Tölz - case "2": + case '2': return "8042"; // Lenggries - case "3": + case '3': return "8043"; // Jachenau - case "5": + case '5': return "8045"; // Lenggries-Fall - case "6": + case '6': return "8046"; // Bad Heilbrunn default: return ""; @@ -17637,20 +17647,20 @@ private static String fromNumber805(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8051"; // Prien a Chiemsee - case "2": + case '2': return "8052"; // Aschau i Chiemgau - case "3": + case '3': return "8053"; // Bad Endorf - case "4": + case '4': return "8054"; // Breitbrunn a Chiemsee - case "5": + case '5': return "8055"; // Halfing - case "6": + case '6': return "8056"; // Eggstätt - case "7": + case '7': return "8057"; // Aschau-Sachrang default: return ""; @@ -17662,20 +17672,20 @@ private static String fromNumber806(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8061"; // Bad Aibling - case "2": + case '2': return "8062"; // Bruckmühl Mangfall - case "3": + case '3': return "8063"; // Feldkirchen-Westerham - case "4": + case '4': return "8064"; // Au b Bad Aibling - case "5": + case '5': return "8065"; // Tuntenhausen-Schönau - case "6": + case '6': return "8066"; // Bad Feilnbach - case "7": + case '7': return "8067"; // Tuntenhausen default: return ""; @@ -17687,18 +17697,18 @@ private static String fromNumber807(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8071"; // Wasserburg a Inn - case "2": + case '2': return "8072"; // Haag i OB - case "3": + case '3': return "8073"; // Gars a Inn - case "4": + case '4': return "8074"; // Schnaitsee - case "5": + case '5': return "8075"; // Amerang - case "6": + case '6': return "8076"; // Pfaffing default: return ""; @@ -17710,18 +17720,18 @@ private static String fromNumber808(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8081"; // Dorfen Stadt - case "2": + case '2': return "8082"; // Schwindegg - case "3": + case '3': return "8083"; // Isen - case "4": + case '4': return "8084"; // Taufkirchen Vils - case "5": + case '5': return "8085"; // Sankt Wolfgang - case "6": + case '6': return "8086"; // Buchbach Oberbay default: return ""; @@ -17733,16 +17743,16 @@ private static String fromNumber809(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8091"; // Kirchseeon - case "2": + case '2': return "8092"; // Grafing b München - case "3": + case '3': return "8093"; // Glonn Kr Ebersberg - case "4": + case '4': return "8094"; // Steinhöring - case "5": + case '5': return "8095"; // Aying default: return ""; @@ -17754,24 +17764,24 @@ private static String fromNumber81(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber810(number.substring(1)); - case "1": + case '1': return "811"; // Hallbergmoos - case "2": + case '2': return fromNumber812(number.substring(1)); - case "3": + case '3': return fromNumber813(number.substring(1)); - case "4": + case '4': return fromNumber814(number.substring(1)); - case "5": + case '5': return fromNumber815(number.substring(1)); - case "6": + case '6': return fromNumber816(number.substring(1)); - case "7": + case '7': return fromNumber817(number.substring(1)); - case "9": + case '9': return fromNumber819(number.substring(1)); default: return ""; @@ -17783,14 +17793,14 @@ private static String fromNumber810(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8102"; // Höhenkirchen-Siegertsbrunn - case "4": + case '4': return "8104"; // Sauerlach - case "5": + case '5': return "8105"; // Gilching - case "6": + case '6': return "8106"; // Vaterstetten default: return ""; @@ -17802,14 +17812,14 @@ private static String fromNumber812(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8121"; // Markt Schwaben - case "2": + case '2': return "8122"; // Erding - case "3": + case '3': return "8123"; // Moosinning - case "4": + case '4': return "8124"; // Forstern Oberbay default: return ""; @@ -17821,22 +17831,22 @@ private static String fromNumber813(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8131"; // Dachau - case "3": + case '3': return "8133"; // Haimhausen Oberbay - case "4": + case '4': return "8134"; // Odelzhausen - case "5": + case '5': return "8135"; // Sulzemoos - case "6": + case '6': return "8136"; // Markt Indersdorf - case "7": + case '7': return "8137"; // Petershausen - case "8": + case '8': return "8138"; // Schwabhausen b Dachau - case "9": + case '9': return "8139"; // Röhrmoos default: return ""; @@ -17848,18 +17858,18 @@ private static String fromNumber814(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8141"; // Fürstenfeldbruck - case "2": + case '2': return "8142"; // Olching - case "3": + case '3': return "8143"; // Inning a Ammersee - case "4": + case '4': return "8144"; // Grafrath - case "5": + case '5': return "8145"; // Mammendorf - case "6": + case '6': return "8146"; // Moorenweis default: return ""; @@ -17871,16 +17881,16 @@ private static String fromNumber815(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8151"; // Starnberg - case "2": + case '2': return "8152"; // Herrsching a Ammersee - case "3": + case '3': return "8153"; // Wessling - case "7": + case '7': return "8157"; // Feldafing - case "8": + case '8': return "8158"; // Tutzing default: return ""; @@ -17892,16 +17902,16 @@ private static String fromNumber816(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8161"; // Freising - case "5": + case '5': return "8165"; // Neufahrn b Freising - case "6": + case '6': return "8166"; // Allershausen Oberbay - case "7": + case '7': return "8167"; // Zolling - case "8": + case '8': return "8168"; // Attenkirchen default: return ""; @@ -17913,18 +17923,18 @@ private static String fromNumber817(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8170"; // Straßlach-Dingharting - case "1": + case '1': return "8171"; // Wolfratshausen - case "6": + case '6': return "8176"; // Egling b Wolfratshausen - case "7": + case '7': return "8177"; // Münsing Starnberger See - case "8": + case '8': return "8178"; // Icking - case "9": + case '9': return "8179"; // Eurasburg a d Loisach default: return ""; @@ -17936,18 +17946,18 @@ private static String fromNumber819(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8191"; // Landsberg a Lech - case "2": + case '2': return "8192"; // Schondorf a Ammersee - case "3": + case '3': return "8193"; // Geltendorf - case "4": + case '4': return "8194"; // Vilgertshofen - case "5": + case '5': return "8195"; // Weil Kr Landsberg a Lech - case "6": + case '6': return "8196"; // Pürgen default: return ""; @@ -17959,26 +17969,26 @@ private static String fromNumber82(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber820(number.substring(1)); - case "1": + case '1': return "821"; // Augsburg - case "2": + case '2': return fromNumber822(number.substring(1)); - case "3": + case '3': return fromNumber823(number.substring(1)); - case "4": + case '4': return fromNumber824(number.substring(1)); - case "5": + case '5': return fromNumber825(number.substring(1)); - case "6": + case '6': return fromNumber826(number.substring(1)); - case "7": + case '7': return fromNumber827(number.substring(1)); - case "8": + case '8': return fromNumber828(number.substring(1)); - case "9": + case '9': return fromNumber829(number.substring(1)); default: return ""; @@ -17990,20 +18000,20 @@ private static String fromNumber820(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8202"; // Althegnenberg - case "3": + case '3': return "8203"; // Grossaitingen - case "4": + case '4': return "8204"; // Mickhausen - case "5": + case '5': return "8205"; // Dasing - case "6": + case '6': return "8206"; // Egling a d Paar - case "7": + case '7': return "8207"; // Affing - case "8": + case '8': return "8208"; // Eurasburg b Augsburg default: return ""; @@ -18015,18 +18025,18 @@ private static String fromNumber822(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8221"; // Günzburg - case "2": + case '2': return "8222"; // Burgau Schwab - case "3": + case '3': return "8223"; // Ichenhausen - case "4": + case '4': return "8224"; // Offingen Donau - case "5": + case '5': return "8225"; // Jettingen-Scheppach - case "6": + case '6': return "8226"; // Bibertal default: return ""; @@ -18038,24 +18048,24 @@ private static String fromNumber823(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8230"; // Gablingen - case "1": + case '1': return "8231"; // Königsbrunn b Augsburg - case "2": + case '2': return "8232"; // Schwabmünchen - case "3": + case '3': return "8233"; // Kissing - case "4": + case '4': return "8234"; // Bobingen - case "6": + case '6': return "8236"; // Fischach - case "7": + case '7': return "8237"; // Aindling - case "8": + case '8': return "8238"; // Gessertshausen - case "9": + case '9': return "8239"; // Langenneufnach default: return ""; @@ -18067,20 +18077,20 @@ private static String fromNumber824(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8241"; // Buchloe - case "3": + case '3': return "8243"; // Fuchstal - case "5": + case '5': return "8245"; // Türkheim Wertach - case "6": + case '6': return "8246"; // Waal - case "7": + case '7': return "8247"; // Bad Wörishofen - case "8": + case '8': return "8248"; // Lamerdingen - case "9": + case '9': return "8249"; // Ettringen Wertach default: return ""; @@ -18092,22 +18102,22 @@ private static String fromNumber825(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8250"; // Hilgertshausen-Tandern - case "1": + case '1': return "8251"; // Aichach - case "2": + case '2': return "8252"; // Schrobenhausen - case "3": + case '3': return "8253"; // Pöttmes - case "4": + case '4': return "8254"; // Altomünster - case "7": + case '7': return "8257"; // Inchenhofen - case "8": + case '8': return "8258"; // Sielenbach - case "9": + case '9': return "8259"; // Schiltberg default: return ""; @@ -18119,22 +18129,22 @@ private static String fromNumber826(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8261"; // Mindelheim - case "2": + case '2': return "8262"; // Mittelneufnach - case "3": + case '3': return "8263"; // Breitenbrunn Schwab - case "5": + case '5': return "8265"; // Pfaffenhausen Schwab - case "6": + case '6': return "8266"; // Kirchheim i Schw - case "7": + case '7': return "8267"; // Dirlewang - case "8": + case '8': return "8268"; // Tussenhausen - case "9": + case '9': return "8269"; // Unteregg b Mindelheim default: return ""; @@ -18146,16 +18156,16 @@ private static String fromNumber827(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8271"; // Meitingen - case "2": + case '2': return "8272"; // Wertingen - case "3": + case '3': return "8273"; // Nordendorf - case "4": + case '4': return "8274"; // Buttenwiesen - case "6": + case '6': return "8276"; // Baar Schwaben default: return ""; @@ -18167,16 +18177,16 @@ private static String fromNumber828(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8281"; // Thannhausen Schwab - case "2": + case '2': return "8282"; // Krumbach Schwaben - case "3": + case '3': return "8283"; // Neuburg a d Kammel - case "4": + case '4': return "8284"; // Ziemetshausen - case "5": + case '5': return "8285"; // Burtenbach default: return ""; @@ -18188,18 +18198,18 @@ private static String fromNumber829(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8291"; // Zusmarshausen - case "2": + case '2': return "8292"; // Dinkelscherben - case "3": + case '3': return "8293"; // Welden b Augsburg - case "4": + case '4': return "8294"; // Horgau - case "5": + case '5': return "8295"; // Altenmünster Schwab - case "6": + case '6': return "8296"; // Villenbach default: return ""; @@ -18211,24 +18221,24 @@ private static String fromNumber83(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber830(number.substring(1)); - case "1": + case '1': return "831"; // Kempten Allgäu - case "2": + case '2': return fromNumber832(number.substring(1)); - case "3": + case '3': return fromNumber833(number.substring(1)); - case "4": + case '4': return fromNumber834(number.substring(1)); - case "6": + case '6': return fromNumber836(number.substring(1)); - case "7": + case '7': return fromNumber837(number.substring(1)); - case "8": + case '8': return fromNumber838(number.substring(1)); - case "9": + case '9': return fromNumber839(number.substring(1)); default: return ""; @@ -18240,14 +18250,14 @@ private static String fromNumber830(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8302"; // Görisried - case "3": + case '3': return "8303"; // Waltenhofen - case "4": + case '4': return "8304"; // Wildpoldsried - case "6": + case '6': return "8306"; // Ronsberg default: return ""; @@ -18259,24 +18269,24 @@ private static String fromNumber832(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8320"; // Missen-Wilhams - case "1": + case '1': return "8321"; // Sonthofen - case "2": + case '2': return "8322"; // Oberstdorf - case "3": + case '3': return "8323"; // Immenstadt i Allgäu - case "4": + case '4': return "8324"; // Hindelang - case "5": + case '5': return "8325"; // Oberstaufen-Thalkirchdorf - case "6": + case '6': return "8326"; // Fischen i Allgäu - case "7": + case '7': return "8327"; // Rettenberg - case "8": + case '8': return "8328"; // Balderschwang default: return ""; @@ -18288,24 +18298,24 @@ private static String fromNumber833(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8330"; // Legau - case "1": + case '1': return "8331"; // Memmingen - case "2": + case '2': return "8332"; // Ottobeuren - case "3": + case '3': return "8333"; // Babenhausen Schwab - case "4": + case '4': return "8334"; // Bad Grönenbach - case "5": + case '5': return "8335"; // Fellheim - case "6": + case '6': return "8336"; // Erkheim - case "7": + case '7': return "8337"; // Altenstadt Iller - case "8": + case '8': return "8338"; // Böhen default: return ""; @@ -18317,26 +18327,26 @@ private static String fromNumber834(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8340"; // Baisweil - case "1": + case '1': return "8341"; // Kaufbeuren - case "2": + case '2': return "8342"; // Marktoberdorf - case "3": + case '3': return "8343"; // Aitrang - case "4": + case '4': return "8344"; // Westendorf b Kaufbeuren - case "5": + case '5': return "8345"; // Stöttwang - case "6": + case '6': return "8346"; // Pforzen - case "7": + case '7': return "8347"; // Friesenried - case "8": + case '8': return "8348"; // Bidingen - case "9": + case '9': return "8349"; // Stötten a Auerberg default: return ""; @@ -18348,24 +18358,24 @@ private static String fromNumber836(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8361"; // Nesselwang - case "2": + case '2': return "8362"; // Füssen - case "3": + case '3': return "8363"; // Pfronten - case "4": + case '4': return "8364"; // Seeg - case "5": + case '5': return "8365"; // Wertach - case "6": + case '6': return "8366"; // Oy-Mittelberg - case "7": + case '7': return "8367"; // Roßhaupten Forggensee - case "8": + case '8': return "8368"; // Halblech - case "9": + case '9': return "8369"; // Rückholz default: return ""; @@ -18377,24 +18387,24 @@ private static String fromNumber837(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8370"; // Wiggensbach - case "2": + case '2': return "8372"; // Obergünzburg - case "3": + case '3': return "8373"; // Altusried - case "4": + case '4': return "8374"; // Dietmannsried - case "5": + case '5': return "8375"; // Weitnau - case "6": + case '6': return "8376"; // Sulzberg Allgäu - case "7": + case '7': return "8377"; // Unterthingau - case "8": + case '8': return "8378"; // Buchenberg b Kempten - case "9": + case '9': return "8379"; // Waltenhofen-Oberdorf default: return ""; @@ -18406,26 +18416,26 @@ private static String fromNumber838(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8380"; // Achberg - case "1": + case '1': return "8381"; // Lindenberg i Allgäu - case "2": + case '2': return "8382"; // Lindau Bodensee - case "3": + case '3': return "8383"; // Grünenbach Allgäu - case "4": + case '4': return "8384"; // Röthenbach Allgäu - case "5": + case '5': return "8385"; // Hergatz - case "6": + case '6': return "8386"; // Oberstaufen - case "7": + case '7': return "8387"; // Weiler-Simmerberg - case "8": + case '8': return "8388"; // Hergensweiler - case "9": + case '9': return "8389"; // Weissensberg default: return ""; @@ -18437,14 +18447,14 @@ private static String fromNumber839(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8392"; // Markt Rettenbach - case "3": + case '3': return "8393"; // Holzgünz - case "4": + case '4': return "8394"; // Lautrach - case "5": + case '5': return "8395"; // Tannheim Württ default: return ""; @@ -18456,20 +18466,20 @@ private static String fromNumber84(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber840(number.substring(1)); - case "1": + case '1': return "841"; // Ingolstadt Donau - case "2": + case '2': return fromNumber842(number.substring(1)); - case "3": + case '3': return fromNumber843(number.substring(1)); - case "4": + case '4': return fromNumber844(number.substring(1)); - case "5": + case '5': return fromNumber845(number.substring(1)); - case "6": + case '6': return fromNumber846(number.substring(1)); default: return ""; @@ -18481,18 +18491,18 @@ private static String fromNumber840(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8402"; // Münchsmünster - case "3": + case '3': return "8403"; // Pförring - case "4": + case '4': return "8404"; // Oberdolling - case "5": + case '5': return "8405"; // Stammham b Ingolstadt - case "6": + case '6': return "8406"; // Böhmfeld - case "7": + case '7': return "8407"; // Grossmehring default: return ""; @@ -18504,18 +18514,18 @@ private static String fromNumber842(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8421"; // Eichstätt Bay - case "2": + case '2': return "8422"; // Dollnstein - case "3": + case '3': return "8423"; // Titting - case "4": + case '4': return "8424"; // Nassenfels - case "6": + case '6': return "8426"; // Walting Kr Eichstätt - case "7": + case '7': return "8427"; // Wellheim default: return ""; @@ -18527,16 +18537,16 @@ private static String fromNumber843(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8431"; // Neuburg a d Donau - case "2": + case '2': return "8432"; // Burgheim - case "3": + case '3': return "8433"; // Königsmoos - case "4": + case '4': return "8434"; // Rennertshofen - case "5": + case '5': return "8435"; // Ehekirchen default: return ""; @@ -18548,18 +18558,18 @@ private static String fromNumber844(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8441"; // Pfaffenhofen a d Ilm - case "2": + case '2': return "8442"; // Wolnzach - case "3": + case '3': return "8443"; // Hohenwart Paar - case "4": + case '4': return "8444"; // Schweitenkirchen - case "5": + case '5': return "8445"; // Gerolsbach - case "6": + case '6': return "8446"; // Pörnbach default: return ""; @@ -18571,22 +18581,22 @@ private static String fromNumber845(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8450"; // Ingolstadt-Zuchering - case "2": + case '2': return "8452"; // Geisenfeld - case "3": + case '3': return "8453"; // Reichertshofen Oberbay - case "4": + case '4': return "8454"; // Karlshuld - case "6": + case '6': return "8456"; // Lenting - case "7": + case '7': return "8457"; // Vohburg a d Donau - case "8": + case '8': return "8458"; // Gaimersheim - case "9": + case '9': return "8459"; // Manching default: return ""; @@ -18598,26 +18608,26 @@ private static String fromNumber846(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8460"; // Berching-Holnstein - case "1": + case '1': return "8461"; // Beilngries - case "2": + case '2': return "8462"; // Berching - case "3": + case '3': return "8463"; // Greding - case "4": + case '4': return "8464"; // Dietfurt a d Altmühl - case "5": + case '5': return "8465"; // Kipfenberg - case "6": + case '6': return "8466"; // Denkendorf Oberbay - case "7": + case '7': return "8467"; // Kinding - case "8": + case '8': return "8468"; // Altmannstein-Pondorf - case "9": + case '9': return "8469"; // Freystadt-Burggriesbach default: return ""; @@ -18629,24 +18639,24 @@ private static String fromNumber85(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber850(number.substring(1)); - case "1": + case '1': return "851"; // Passau - case "3": + case '3': return fromNumber853(number.substring(1)); - case "4": + case '4': return fromNumber854(number.substring(1)); - case "5": + case '5': return fromNumber855(number.substring(1)); - case "6": + case '6': return fromNumber856(number.substring(1)); - case "7": + case '7': return fromNumber857(number.substring(1)); - case "8": + case '8': return fromNumber858(number.substring(1)); - case "9": + case '9': return fromNumber859(number.substring(1)); default: return ""; @@ -18658,22 +18668,22 @@ private static String fromNumber850(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8501"; // Thyrnau - case "2": + case '2': return "8502"; // Fürstenzell - case "3": + case '3': return "8503"; // Neuhaus a Inn - case "4": + case '4': return "8504"; // Tittling - case "5": + case '5': return "8505"; // Hutthurm - case "6": + case '6': return "8506"; // Bad Höhenstadt - case "7": + case '7': return "8507"; // Neuburg a Inn - case "9": + case '9': return "8509"; // Ruderting default: return ""; @@ -18685,22 +18695,22 @@ private static String fromNumber853(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8531"; // Pocking - case "2": + case '2': return "8532"; // Griesbach i Rottal - case "3": + case '3': return "8533"; // Rotthalmünster - case "4": + case '4': return "8534"; // Tettenweis - case "5": + case '5': return "8535"; // Haarbach - case "6": + case '6': return "8536"; // Kößlarn - case "7": + case '7': return "8537"; // Bad Füssing-Aigen - case "8": + case '8': return "8538"; // Pocking-Hartkirchen default: return ""; @@ -18712,24 +18722,24 @@ private static String fromNumber854(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8541"; // Vilshofen Niederbay - case "2": + case '2': return "8542"; // Ortenburg - case "3": + case '3': return "8543"; // Aidenbach - case "4": + case '4': return "8544"; // Eging a See - case "5": + case '5': return "8545"; // Hofkirchen Bay - case "6": + case '6': return "8546"; // Windorf-Otterskirchen - case "7": + case '7': return "8547"; // Osterhofen-Gergweis - case "8": + case '8': return "8548"; // Vilshofen-Sandbach - case "9": + case '9': return "8549"; // Vilshofen-Pleinting default: return ""; @@ -18741,24 +18751,24 @@ private static String fromNumber855(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8550"; // Philippsreut - case "1": + case '1': return "8551"; // Freyung - case "2": + case '2': return "8552"; // Grafenau Niederbay - case "3": + case '3': return "8553"; // Spiegelau - case "4": + case '4': return "8554"; // Schönberg Niederbay - case "5": + case '5': return "8555"; // Perlesreut - case "6": + case '6': return "8556"; // Haidmühle - case "7": + case '7': return "8557"; // Mauth - case "8": + case '8': return "8558"; // Hohenau Niederbay default: return ""; @@ -18770,16 +18780,16 @@ private static String fromNumber856(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8561"; // Pfarrkirchen Niederbay - case "2": + case '2': return "8562"; // Triftern - case "3": + case '3': return "8563"; // Bad Birnbach Rottal - case "4": + case '4': return "8564"; // Johanniskirchen - case "5": + case '5': return "8565"; // Dietersburg-Baumgarten default: return ""; @@ -18791,14 +18801,14 @@ private static String fromNumber857(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8571"; // Simbach a Inn - case "2": + case '2': return "8572"; // Tann Niederbay - case "3": + case '3': return "8573"; // Ering - case "4": + case '4': return "8574"; // Wittibreut default: return ""; @@ -18810,18 +18820,18 @@ private static String fromNumber858(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8581"; // Waldkirchen Niederbay - case "2": + case '2': return "8582"; // Röhrnbach - case "3": + case '3': return "8583"; // Neureichenau - case "4": + case '4': return "8584"; // Breitenberg Niederbay - case "5": + case '5': return "8585"; // Grainet - case "6": + case '6': return "8586"; // Hauzenberg default: return ""; @@ -18833,12 +18843,12 @@ private static String fromNumber859(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8591"; // Obernzell - case "2": + case '2': return "8592"; // Wegscheid Niederbay - case "3": + case '3': return "8593"; // Untergriesbach default: return ""; @@ -18850,22 +18860,22 @@ private static String fromNumber86(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "861"; // Traunstein - case "2": + case '2': return fromNumber862(number.substring(1)); - case "3": + case '3': return fromNumber863(number.substring(1)); - case "4": + case '4': return fromNumber864(number.substring(1)); - case "5": + case '5': return fromNumber865(number.substring(1)); - case "6": + case '6': return fromNumber866(number.substring(1)); - case "7": + case '7': return fromNumber867(number.substring(1)); - case "8": + case '8': return fromNumber868(number.substring(1)); default: return ""; @@ -18877,18 +18887,18 @@ private static String fromNumber862(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8621"; // Trostberg - case "2": + case '2': return "8622"; // Tacherting- Peterskirchen - case "3": + case '3': return "8623"; // Kirchweidach - case "4": + case '4': return "8624"; // Obing - case "8": + case '8': return "8628"; // Kienberg Oberbay - case "9": + case '9': return "8629"; // Palling default: return ""; @@ -18900,24 +18910,24 @@ private static String fromNumber863(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8630"; // Oberneukirchen - case "1": + case '1': return "8631"; // Mühldorf a Inn - case "3": + case '3': return "8633"; // Tüßling - case "4": + case '4': return "8634"; // Garching a d Alz - case "5": + case '5': return "8635"; // Pleiskirchen - case "6": + case '6': return "8636"; // Ampfing - case "7": + case '7': return "8637"; // Lohkirchen - case "8": + case '8': return "8638"; // Waldkraiburg - case "9": + case '9': return "8639"; // Neumarkt-Sankt Veit default: return ""; @@ -18929,14 +18939,14 @@ private static String fromNumber864(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8640"; // Reit Im Winkl - case "1": + case '1': return "8641"; // Grassau Kr Traunstein - case "2": + case '2': return "8642"; // Übersee - case "9": + case '9': return "8649"; // Schleching default: return ""; @@ -18948,18 +18958,18 @@ private static String fromNumber865(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8650"; // Marktschellenberg - case "1": + case '1': return "8651"; // Bad Reichenhall - case "2": + case '2': return "8652"; // Berchtesgaden - case "4": + case '4': return "8654"; // Freilassing - case "6": + case '6': return "8656"; // Anger - case "7": + case '7': return "8657"; // Ramsau b Berchtesgaden default: return ""; @@ -18971,22 +18981,22 @@ private static String fromNumber866(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8661"; // Grabenstätt Chiemsee - case "2": + case '2': return "8662"; // Siegsdorf Kr Traunstein - case "3": + case '3': return "8663"; // Ruhpolding - case "4": + case '4': return "8664"; // Chieming - case "5": + case '5': return "8665"; // Inzell - case "6": + case '6': return "8666"; // Teisendorf - case "7": + case '7': return "8667"; // Seeon-Seebruck - case "9": + case '9': return "8669"; // Traunreut default: return ""; @@ -18998,16 +19008,16 @@ private static String fromNumber867(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8670"; // Reischach Kr Altötting - case "1": + case '1': return "8671"; // Altötting - case "7": + case '7': return "8677"; // Burghausen Salzach - case "8": + case '8': return "8678"; // Marktl - case "9": + case '9': return "8679"; // Burgkirchen a d Alz default: return ""; @@ -19019,20 +19029,20 @@ private static String fromNumber868(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8681"; // Waging a See - case "2": + case '2': return "8682"; // Laufen Salzach - case "3": + case '3': return "8683"; // Tittmoning - case "4": + case '4': return "8684"; // Fridolfing - case "5": + case '5': return "8685"; // Kirchanschöring - case "6": + case '6': return "8686"; // Petting - case "7": + case '7': return "8687"; // Taching-Tengling default: return ""; @@ -19044,24 +19054,24 @@ private static String fromNumber87(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber870(number.substring(1)); - case "1": + case '1': return "871"; // Landshut - case "2": + case '2': return fromNumber872(number.substring(1)); - case "3": + case '3': return fromNumber873(number.substring(1)); - case "4": + case '4': return fromNumber874(number.substring(1)); - case "5": + case '5': return fromNumber875(number.substring(1)); - case "6": + case '6': return fromNumber876(number.substring(1)); - case "7": + case '7': return fromNumber877(number.substring(1)); - case "8": + case '8': return fromNumber878(number.substring(1)); default: return ""; @@ -19073,22 +19083,22 @@ private static String fromNumber870(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8702"; // Wörth a d Isar - case "3": + case '3': return "8703"; // Essenbach - case "4": + case '4': return "8704"; // Altdorf-Pfettrach - case "5": + case '5': return "8705"; // Altfraunhofen - case "6": + case '6': return "8706"; // Vilsheim - case "7": + case '7': return "8707"; // Adlkofen - case "8": + case '8': return "8708"; // Weihmichl-Unterneuhausen - case "9": + case '9': return "8709"; // Eching Niederbay default: return ""; @@ -19100,22 +19110,22 @@ private static String fromNumber872(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8721"; // Eggenfelden - case "2": + case '2': return "8722"; // Gangkofen - case "3": + case '3': return "8723"; // Arnstorf - case "4": + case '4': return "8724"; // Massing - case "5": + case '5': return "8725"; // Wurmannsquick - case "6": + case '6': return "8726"; // Schönau Niederbay - case "7": + case '7': return "8727"; // Falkenberg Niederbay - case "8": + case '8': return "8728"; // Geratskirchen default: return ""; @@ -19127,16 +19137,16 @@ private static String fromNumber873(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8731"; // Dingolfing - case "2": + case '2': return "8732"; // Frontenhausen - case "3": + case '3': return "8733"; // Mengkofen - case "4": + case '4': return "8734"; // Reisbach Niederbay - case "5": + case '5': return "8735"; // Gangkofen-Kollbach default: return ""; @@ -19148,16 +19158,16 @@ private static String fromNumber874(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8741"; // Vilsbiburg - case "2": + case '2': return "8742"; // Velden Vils - case "3": + case '3': return "8743"; // Geisenhausen - case "4": + case '4': return "8744"; // Gerzen - case "5": + case '5': return "8745"; // Bodenkirchen default: return ""; @@ -19169,16 +19179,16 @@ private static String fromNumber875(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8751"; // Mainburg - case "2": + case '2': return "8752"; // Au i d Hallertau - case "3": + case '3': return "8753"; // Elsendorf Niederbay - case "4": + case '4': return "8754"; // Volkenschwand - case "6": + case '6': return "8756"; // Nandlstadt default: return ""; @@ -19190,16 +19200,16 @@ private static String fromNumber876(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8761"; // Moosburg a d Isar - case "2": + case '2': return "8762"; // Wartenberg Oberbay - case "4": + case '4': return "8764"; // Mauern Kr Freising - case "5": + case '5': return "8765"; // Bruckberg Niederbay - case "6": + case '6': return "8766"; // Gammelsdorf default: return ""; @@ -19211,14 +19221,14 @@ private static String fromNumber877(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8771"; // Ergoldsbach - case "2": + case '2': return "8772"; // Mallersdorf-Pfaffenberg - case "3": + case '3': return "8773"; // Neufahrn i NB - case "4": + case '4': return "8774"; // Bayerbach b Ergoldsbach default: return ""; @@ -19230,16 +19240,16 @@ private static String fromNumber878(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8781"; // Rottenburg a d Laaber - case "2": + case '2': return "8782"; // Pfeffenhausen - case "3": + case '3': return "8783"; // Rohr i NB - case "4": + case '4': return "8784"; // Hohenthann - case "5": + case '5': return "8785"; // Rottenburg-Oberroning default: return ""; @@ -19251,18 +19261,18 @@ private static String fromNumber88(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber880(number.substring(1)); - case "1": + case '1': return "881"; // Weilheim i OB - case "2": + case '2': return fromNumber882(number.substring(1)); - case "4": + case '4': return fromNumber884(number.substring(1)); - case "5": + case '5': return fromNumber885(number.substring(1)); - case "6": + case '6': return fromNumber886(number.substring(1)); default: return ""; @@ -19274,22 +19284,22 @@ private static String fromNumber880(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8801"; // Seeshaupt - case "2": + case '2': return "8802"; // Huglfing - case "3": + case '3': return "8803"; // Peissenberg - case "5": + case '5': return "8805"; // Hohenpeissenberg - case "6": + case '6': return "8806"; // Utting a Ammersee - case "7": + case '7': return "8807"; // Dießen a Ammersee - case "8": + case '8': return "8808"; // Pähl - case "9": + case '9': return "8809"; // Wessobrunn default: return ""; @@ -19301,16 +19311,16 @@ private static String fromNumber882(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8821"; // Garmisch-Partenkirchen - case "2": + case '2': return "8822"; // Oberammergau - case "3": + case '3': return "8823"; // Mittenwald - case "4": + case '4': return "8824"; // Oberau Loisach - case "5": + case '5': return "8825"; // Krün default: return ""; @@ -19322,14 +19332,14 @@ private static String fromNumber884(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8841"; // Murnau a Staffelsee - case "5": + case '5': return "8845"; // Bad Kohlgrub - case "6": + case '6': return "8846"; // Uffing a Staffelsee - case "7": + case '7': return "8847"; // Obersöchering default: return ""; @@ -19341,14 +19351,14 @@ private static String fromNumber885(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8851"; // Kochel a See - case "6": + case '6': return "8856"; // Penzberg - case "7": + case '7': return "8857"; // Benediktbeuern - case "8": + case '8': return "8858"; // Kochel-Walchensee default: return ""; @@ -19360,18 +19370,18 @@ private static String fromNumber886(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8860"; // Bernbeuren - case "1": + case '1': return "8861"; // Schongau - case "2": + case '2': return "8862"; // Steingaden Oberbay - case "7": + case '7': return "8867"; // Rottenbuch Oberbay - case "8": + case '8': return "8868"; // Schwabsoien - case "9": + case '9': return "8869"; // Kinsau default: return ""; @@ -19383,26 +19393,26 @@ private static String fromNumber9(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber90(number.substring(1)); - case "1": + case '1': return fromNumber91(number.substring(1)); - case "2": + case '2': return fromNumber92(number.substring(1)); - case "3": + case '3': return fromNumber93(number.substring(1)); - case "4": + case '4': return fromNumber94(number.substring(1)); - case "5": + case '5': return fromNumber95(number.substring(1)); - case "6": + case '6': return fromNumber96(number.substring(1)); - case "7": + case '7': return fromNumber97(number.substring(1)); - case "8": + case '8': return fromNumber98(number.substring(1)); - case "9": + case '9': return fromNumber99(number.substring(1)); default: return ""; @@ -19414,14 +19424,14 @@ private static String fromNumber90(String number) { return ""; } - switch (number.substring(0, 1)) { - case "6": + switch (number.charAt(0)) { + case '6': return "906"; // Donauwörth - case "7": + case '7': return fromNumber907(number.substring(1)); - case "8": + case '8': return fromNumber908(number.substring(1)); - case "9": + case '9': return fromNumber909(number.substring(1)); default: return ""; @@ -19433,24 +19443,24 @@ private static String fromNumber907(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9070"; // Tapfheim - case "1": + case '1': return "9071"; // Dillingen a d Donau - case "2": + case '2': return "9072"; // Lauingen Donau - case "3": + case '3': return "9073"; // Gundelfingen a d Donau - case "4": + case '4': return "9074"; // Höchstädt a d Donau - case "5": + case '5': return "9075"; // Glött - case "6": + case '6': return "9076"; // Wittislingen - case "7": + case '7': return "9077"; // Bachhagel - case "8": + case '8': return "9078"; // Mertingen default: return ""; @@ -19462,26 +19472,26 @@ private static String fromNumber908(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9080"; // Harburg Schwaben - case "1": + case '1': return "9081"; // Nördlingen - case "2": + case '2': return "9082"; // Oettingen i Bay - case "3": + case '3': return "9083"; // Möttingen - case "4": + case '4': return "9084"; // Bissingen Schwab - case "5": + case '5': return "9085"; // Alerheim - case "6": + case '6': return "9086"; // Fremdingen - case "7": + case '7': return "9087"; // Marktoffingen - case "8": + case '8': return "9088"; // Mönchsdeggingen - case "9": + case '9': return "9089"; // Bissingen-Unterringingen default: return ""; @@ -19493,20 +19503,20 @@ private static String fromNumber909(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9090"; // Rain Lech - case "1": + case '1': return "9091"; // Monheim Schwab - case "2": + case '2': return "9092"; // Wemding - case "3": + case '3': return "9093"; // Polsingen - case "4": + case '4': return "9094"; // Tagmersheim - case "7": + case '7': return "9097"; // Marxheim - case "9": + case '9': return "9099"; // Kaisheim default: return ""; @@ -19518,26 +19528,26 @@ private static String fromNumber91(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber910(number.substring(1)); - case "1": + case '1': return "911"; // Nürnberg - case "2": + case '2': return fromNumber912(number.substring(1)); - case "3": + case '3': return fromNumber913(number.substring(1)); - case "4": + case '4': return fromNumber914(number.substring(1)); - case "5": + case '5': return fromNumber915(number.substring(1)); - case "6": + case '6': return fromNumber916(number.substring(1)); - case "7": + case '7': return fromNumber917(number.substring(1)); - case "8": + case '8': return fromNumber918(number.substring(1)); - case "9": + case '9': return fromNumber919(number.substring(1)); default: return ""; @@ -19549,20 +19559,20 @@ private static String fromNumber910(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9101"; // Langenzenn - case "2": + case '2': return "9102"; // Wilhermsdorf - case "3": + case '3': return "9103"; // Cadolzburg - case "4": + case '4': return "9104"; // Emskirchen - case "5": + case '5': return "9105"; // Grosshabersdorf - case "6": + case '6': return "9106"; // Markt Erlbach - case "7": + case '7': return "9107"; // Trautskirchen default: return ""; @@ -19574,20 +19584,20 @@ private static String fromNumber912(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9120"; // Leinburg - case "2": + case '2': return "9122"; // Schwabach - case "3": + case '3': return "9123"; // Lauf a d Pegnitz - case "6": + case '6': return "9126"; // Eckental - case "7": + case '7': return "9127"; // Rosstal Mittelfr - case "8": + case '8': return "9128"; // Feucht - case "9": + case '9': return "9129"; // Wendelstein default: return ""; @@ -19599,16 +19609,16 @@ private static String fromNumber913(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9131"; // Erlangen - case "2": + case '2': return "9132"; // Herzogenaurach - case "3": + case '3': return "9133"; // Baiersdorf Mittelfr - case "4": + case '4': return "9134"; // Neunkirchen a Brand - case "5": + case '5': return "9135"; // Heßdorf Mittelfr default: return ""; @@ -19620,24 +19630,24 @@ private static String fromNumber914(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9141"; // Weißenburg i Bay - case "2": + case '2': return "9142"; // Treuchtlingen - case "3": + case '3': return "9143"; // Pappenheim Mittelfr - case "4": + case '4': return "9144"; // Pleinfeld - case "5": + case '5': return "9145"; // Solnhofen - case "6": + case '6': return "9146"; // Markt Berolzheim - case "7": + case '7': return "9147"; // Nennslingen - case "8": + case '8': return "9148"; // Ettenstatt - case "9": + case '9': return "9149"; // Weissenburg-Suffersheim default: return ""; @@ -19649,22 +19659,22 @@ private static String fromNumber915(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9151"; // Hersbruck - case "2": + case '2': return "9152"; // Hartenstein Mittelfr - case "3": + case '3': return "9153"; // Schnaittach - case "4": + case '4': return "9154"; // Pommelsbrunn - case "5": + case '5': return "9155"; // Simmelsdorf - case "6": + case '6': return "9156"; // Neuhaus a d Pegnitz - case "7": + case '7': return "9157"; // Alfeld Mittelfr - case "8": + case '8': return "9158"; // Offenhausen Mittelfr default: return ""; @@ -19676,20 +19686,20 @@ private static String fromNumber916(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9161"; // Neustadt a d Aisch - case "2": + case '2': return "9162"; // Scheinfeld - case "3": + case '3': return "9163"; // Dachsbach - case "4": + case '4': return "9164"; // Langenfeld Mittelfr - case "5": + case '5': return "9165"; // Sugenheim - case "6": + case '6': return "9166"; // Münchsteinach - case "7": + case '7': return "9167"; // Oberscheinfeld default: return ""; @@ -19701,26 +19711,26 @@ private static String fromNumber917(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9170"; // Schwanstetten - case "1": + case '1': return "9171"; // Roth Mittelfr - case "2": + case '2': return "9172"; // Georgensgmünd - case "3": + case '3': return "9173"; // Thalmässing - case "4": + case '4': return "9174"; // Hilpoltstein - case "5": + case '5': return "9175"; // Spalt - case "6": + case '6': return "9176"; // Allersberg - case "7": + case '7': return "9177"; // Heideck - case "8": + case '8': return "9178"; // Abenberg Mittelfr - case "9": + case '9': return "9179"; // Freystadt default: return ""; @@ -19732,26 +19742,26 @@ private static String fromNumber918(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9180"; // Pyrbaum - case "1": + case '1': return "9181"; // Neumarkt i d Opf - case "2": + case '2': return "9182"; // Velburg - case "3": + case '3': return "9183"; // Burgthann - case "4": + case '4': return "9184"; // Deining Oberpf - case "5": + case '5': return "9185"; // Mühlhausen Oberpf - case "6": + case '6': return "9186"; // Lauterhofen Oberpf - case "7": + case '7': return "9187"; // Altdorf b Nürnberg - case "8": + case '8': return "9188"; // Postbauer-Heng - case "9": + case '9': return "9189"; // Berg b Neumarkt i d Opf default: return ""; @@ -19763,26 +19773,26 @@ private static String fromNumber919(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9190"; // Heroldsbach - case "1": + case '1': return "9191"; // Forchheim Oberfr - case "2": + case '2': return "9192"; // Gräfenberg - case "3": + case '3': return "9193"; // Höchstadt a d Aisch - case "4": + case '4': return "9194"; // Ebermannstadt - case "5": + case '5': return "9195"; // Adelsdorf Mittelfr - case "6": + case '6': return "9196"; // Wiesenttal - case "7": + case '7': return "9197"; // Egloffstein - case "8": + case '8': return "9198"; // Heiligenstadt i Ofr - case "9": + case '9': return "9199"; // Kunreuth default: return ""; @@ -19794,26 +19804,26 @@ private static String fromNumber92(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber920(number.substring(1)); - case "1": + case '1': return "921"; // Bayreuth - case "2": + case '2': return fromNumber922(number.substring(1)); - case "3": + case '3': return fromNumber923(number.substring(1)); - case "4": + case '4': return fromNumber924(number.substring(1)); - case "5": + case '5': return fromNumber925(number.substring(1)); - case "6": + case '6': return fromNumber926(number.substring(1)); - case "7": + case '7': return fromNumber927(number.substring(1)); - case "8": + case '8': return fromNumber928(number.substring(1)); - case "9": + case '9': return fromNumber929(number.substring(1)); default: return ""; @@ -19825,24 +19835,24 @@ private static String fromNumber920(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9201"; // Gesees - case "2": + case '2': return "9202"; // Waischenfeld - case "3": + case '3': return "9203"; // Neudrossenfeld - case "4": + case '4': return "9204"; // Plankenfels - case "5": + case '5': return "9205"; // Vorbach - case "6": + case '6': return "9206"; // Mistelgau-Obernsees - case "7": + case '7': return "9207"; // Königsfeld Oberfr - case "8": + case '8': return "9208"; // Bindlach - case "9": + case '9': return "9209"; // Emtmannsberg default: return ""; @@ -19854,22 +19864,22 @@ private static String fromNumber922(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9220"; // Kasendorf-Azendorf - case "1": + case '1': return "9221"; // Kulmbach - case "2": + case '2': return "9222"; // Presseck - case "3": + case '3': return "9223"; // Rugendorf - case "5": + case '5': return "9225"; // Stadtsteinach - case "7": + case '7': return "9227"; // Neuenmarkt - case "8": + case '8': return "9228"; // Thurnau - case "9": + case '9': return "9229"; // Mainleus default: return ""; @@ -19881,20 +19891,20 @@ private static String fromNumber923(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9231"; // Marktredwitz - case "2": + case '2': return "9232"; // Wunsiedel - case "3": + case '3': return "9233"; // Arzberg Oberfr - case "4": + case '4': return "9234"; // Neusorg - case "5": + case '5': return "9235"; // Thierstein - case "6": + case '6': return "9236"; // Nagel - case "8": + case '8': return "9238"; // Röslau default: return ""; @@ -19906,18 +19916,18 @@ private static String fromNumber924(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9241"; // Pegnitz - case "2": + case '2': return "9242"; // Gößweinstein - case "3": + case '3': return "9243"; // Pottenstein - case "4": + case '4': return "9244"; // Betzenstein - case "5": + case '5': return "9245"; // Obertrubach - case "6": + case '6': return "9246"; // Pegnitz-Trockau default: return ""; @@ -19929,20 +19939,20 @@ private static String fromNumber925(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9251"; // Münchberg - case "2": + case '2': return "9252"; // Helmbrechts - case "3": + case '3': return "9253"; // Weissenstadt - case "4": + case '4': return "9254"; // Gefrees - case "5": + case '5': return "9255"; // Marktleugast - case "6": + case '6': return "9256"; // Stammbach - case "7": + case '7': return "9257"; // Zell Oberfr default: return ""; @@ -19954,26 +19964,26 @@ private static String fromNumber926(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9260"; // Wilhelmsthal Oberfr - case "1": + case '1': return "9261"; // Kronach - case "2": + case '2': return "9262"; // Wallenfels - case "3": + case '3': return "9263"; // Ludwigsstadt - case "4": + case '4': return "9264"; // Küps - case "5": + case '5': return "9265"; // Pressig - case "6": + case '6': return "9266"; // Mitwitz - case "7": + case '7': return "9267"; // Nordhalben - case "8": + case '8': return "9268"; // Teuschnitz - case "9": + case '9': return "9269"; // Tettau Kr Kronach default: return ""; @@ -19985,26 +19995,26 @@ private static String fromNumber927(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9270"; // Creussen - case "1": + case '1': return "9271"; // Thurnau-Alladorf - case "2": + case '2': return "9272"; // Fichtelberg - case "3": + case '3': return "9273"; // Bad Berneck i Fichtelgebirge - case "4": + case '4': return "9274"; // Hollfeld - case "5": + case '5': return "9275"; // Speichersdorf - case "6": + case '6': return "9276"; // Bischofsgrün - case "7": + case '7': return "9277"; // Warmensteinach - case "8": + case '8': return "9278"; // Weidenberg - case "9": + case '9': return "9279"; // Mistelgau default: return ""; @@ -20016,26 +20026,26 @@ private static String fromNumber928(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9280"; // Selbitz Oberfr - case "1": + case '1': return "9281"; // Hof Saale - case "2": + case '2': return "9282"; // Naila - case "3": + case '3': return "9283"; // Rehau - case "4": + case '4': return "9284"; // Schwarzenbach a d Saale - case "5": + case '5': return "9285"; // Kirchenlamitz - case "6": + case '6': return "9286"; // Oberkotzau - case "7": + case '7': return "9287"; // Selb - case "8": + case '8': return "9288"; // Bad Steben - case "9": + case '9': return "9289"; // Schwarzenbach a Wald default: return ""; @@ -20047,14 +20057,14 @@ private static String fromNumber929(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9292"; // Konradsreuth - case "3": + case '3': return "9293"; // Berg Oberfr - case "4": + case '4': return "9294"; // Regnitzlosau - case "5": + case '5': return "9295"; // Töpen default: return ""; @@ -20066,26 +20076,26 @@ private static String fromNumber93(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber930(number.substring(1)); - case "1": + case '1': return "931"; // Würzburg - case "2": + case '2': return fromNumber932(number.substring(1)); - case "3": + case '3': return fromNumber933(number.substring(1)); - case "4": + case '4': return fromNumber934(number.substring(1)); - case "5": + case '5': return fromNumber935(number.substring(1)); - case "6": + case '6': return fromNumber936(number.substring(1)); - case "7": + case '7': return fromNumber937(number.substring(1)); - case "8": + case '8': return fromNumber938(number.substring(1)); - case "9": + case '9': return fromNumber939(number.substring(1)); default: return ""; @@ -20097,16 +20107,16 @@ private static String fromNumber930(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9302"; // Rottendorf Unterfr - case "3": + case '3': return "9303"; // Eibelstadt - case "5": + case '5': return "9305"; // Estenfeld - case "6": + case '6': return "9306"; // Kist - case "7": + case '7': return "9307"; // Altertheim default: return ""; @@ -20118,16 +20128,16 @@ private static String fromNumber932(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9321"; // Kitzingen - case "3": + case '3': return "9323"; // Iphofen - case "4": + case '4': return "9324"; // Dettelbach - case "5": + case '5': return "9325"; // Kleinlangheim - case "6": + case '6': return "9326"; // Markt Einersheim default: return ""; @@ -20139,24 +20149,24 @@ private static String fromNumber933(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9331"; // Ochsenfurt - case "2": + case '2': return "9332"; // Marktbreit - case "3": + case '3': return "9333"; // Sommerhausen - case "4": + case '4': return "9334"; // Giebelstadt - case "5": + case '5': return "9335"; // Aub Kr Würzburg - case "6": + case '6': return "9336"; // Bütthard - case "7": + case '7': return "9337"; // Gaukönigshofen - case "8": + case '8': return "9338"; // Röttingen Unterfr - case "9": + case '9': return "9339"; // Ippesheim default: return ""; @@ -20168,26 +20178,26 @@ private static String fromNumber934(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9340"; // Königheim-Brehmen - case "1": + case '1': return "9341"; // Tauberbischofsheim - case "2": + case '2': return "9342"; // Wertheim - case "3": + case '3': return "9343"; // Lauda-Königshofen - case "4": + case '4': return "9344"; // Gerchsheim - case "5": + case '5': return "9345"; // Külsheim Baden - case "6": + case '6': return "9346"; // Grünsfeld - case "7": + case '7': return "9347"; // Wittighausen - case "8": + case '8': return "9348"; // Werbach-Gamburg - case "9": + case '9': return "9349"; // Werbach-Wenkheim default: return ""; @@ -20199,26 +20209,26 @@ private static String fromNumber935(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9350"; // Eussenheim-Hundsbach - case "1": + case '1': return "9351"; // Gemünden a Main - case "2": + case '2': return "9352"; // Lohr a Main - case "3": + case '3': return "9353"; // Karlstadt - case "4": + case '4': return "9354"; // Rieneck - case "5": + case '5': return "9355"; // Frammersbach - case "6": + case '6': return "9356"; // Burgsinn - case "7": + case '7': return "9357"; // Gräfendorf Bay - case "8": + case '8': return "9358"; // Gössenheim - case "9": + case '9': return "9359"; // Karlstadt-Wiesenfeld default: return ""; @@ -20230,20 +20240,20 @@ private static String fromNumber936(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9360"; // Thüngen - case "3": + case '3': return "9363"; // Arnstein Unterfr - case "4": + case '4': return "9364"; // Zellingen - case "5": + case '5': return "9365"; // Rimpar - case "6": + case '6': return "9366"; // Geroldshausen Unterfr - case "7": + case '7': return "9367"; // Unterpleichfeld - case "9": + case '9': return "9369"; // Uettingen default: return ""; @@ -20255,22 +20265,22 @@ private static String fromNumber937(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9371"; // Miltenberg - case "2": + case '2': return "9372"; // Klingenberg a Main - case "3": + case '3': return "9373"; // Amorbach - case "4": + case '4': return "9374"; // Eschau - case "5": + case '5': return "9375"; // Freudenberg Baden - case "6": + case '6': return "9376"; // Collenberg - case "7": + case '7': return "9377"; // Freudenberg-Boxtal - case "8": + case '8': return "9378"; // Eichenbühl-Riedern default: return ""; @@ -20282,18 +20292,18 @@ private static String fromNumber938(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9381"; // Volkach - case "2": + case '2': return "9382"; // Gerolzhofen - case "3": + case '3': return "9383"; // Wiesentheid - case "4": + case '4': return "9384"; // Schwanfeld - case "5": + case '5': return "9385"; // Kolitzheim - case "6": + case '6': return "9386"; // Prosselsheim default: return ""; @@ -20305,22 +20315,22 @@ private static String fromNumber939(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9391"; // Marktheidenfeld - case "2": + case '2': return "9392"; // Faulbach Unterfr - case "3": + case '3': return "9393"; // Rothenfels Unterfr - case "4": + case '4': return "9394"; // Esselbach - case "5": + case '5': return "9395"; // Triefenstein - case "6": + case '6': return "9396"; // Urspringen b Lohr - case "7": + case '7': return "9397"; // Wertheim-Dertingen - case "8": + case '8': return "9398"; // Birkenfeld b Würzburg default: return ""; @@ -20332,26 +20342,26 @@ private static String fromNumber94(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber940(number.substring(1)); - case "1": + case '1': return "941"; // Regensburg - case "2": + case '2': return fromNumber942(number.substring(1)); - case "3": + case '3': return fromNumber943(number.substring(1)); - case "4": + case '4': return fromNumber944(number.substring(1)); - case "5": + case '5': return fromNumber945(number.substring(1)); - case "6": + case '6': return fromNumber946(number.substring(1)); - case "7": + case '7': return fromNumber947(number.substring(1)); - case "8": + case '8': return fromNumber948(number.substring(1)); - case "9": + case '9': return fromNumber949(number.substring(1)); default: return ""; @@ -20363,24 +20373,24 @@ private static String fromNumber940(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9401"; // Neutraubling - case "2": + case '2': return "9402"; // Regenstauf - case "3": + case '3': return "9403"; // Donaustauf - case "4": + case '4': return "9404"; // Nittendorf - case "5": + case '5': return "9405"; // Bad Abbach - case "6": + case '6': return "9406"; // Mintraching - case "7": + case '7': return "9407"; // Wenzenbach - case "8": + case '8': return "9408"; // Altenthann - case "9": + case '9': return "9409"; // Pielenhofen default: return ""; @@ -20392,24 +20402,24 @@ private static String fromNumber942(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9420"; // Feldkirchen Niederbay - case "1": + case '1': return "9421"; // Straubing - case "2": + case '2': return "9422"; // Bogen Niederbay - case "3": + case '3': return "9423"; // Geiselhöring - case "4": + case '4': return "9424"; // Strasskirchen - case "6": + case '6': return "9426"; // Oberschneiding - case "7": + case '7': return "9427"; // Leiblfing - case "8": + case '8': return "9428"; // Kirchroth - case "9": + case '9': return "9429"; // Rain Niederbay default: return ""; @@ -20421,20 +20431,20 @@ private static String fromNumber943(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9431"; // Schwandorf - case "3": + case '3': return "9433"; // Nabburg - case "4": + case '4': return "9434"; // Bodenwöhr - case "5": + case '5': return "9435"; // Schwarzenfeld - case "6": + case '6': return "9436"; // Nittenau - case "8": + case '8': return "9438"; // Fensterbach - case "9": + case '9': return "9439"; // Neunburg-Kemnath default: return ""; @@ -20446,22 +20456,22 @@ private static String fromNumber944(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9441"; // Kelheim - case "2": + case '2': return "9442"; // Riedenburg - case "3": + case '3': return "9443"; // Abensberg - case "4": + case '4': return "9444"; // Siegenburg - case "5": + case '5': return "9445"; // Neustadt a d Donau - case "6": + case '6': return "9446"; // Altmannstein - case "7": + case '7': return "9447"; // Essing - case "8": + case '8': return "9448"; // Hausen Niederbay default: return ""; @@ -20473,14 +20483,14 @@ private static String fromNumber945(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9451"; // Schierling - case "2": + case '2': return "9452"; // Langquaid - case "3": + case '3': return "9453"; // Thalmassing - case "4": + case '4': return "9454"; // Aufhausen Oberpf default: return ""; @@ -20492,24 +20502,24 @@ private static String fromNumber946(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9461"; // Roding - case "2": + case '2': return "9462"; // Falkenstein Oberpf - case "3": + case '3': return "9463"; // Wald Oberpf - case "4": + case '4': return "9464"; // Walderbach - case "5": + case '5': return "9465"; // Neukirchen-Balbini - case "6": + case '6': return "9466"; // Stamsried - case "7": + case '7': return "9467"; // Michelsneukirchen - case "8": + case '8': return "9468"; // Zell Oberpf - case "9": + case '9': return "9469"; // Roding-Neubäu default: return ""; @@ -20521,14 +20531,14 @@ private static String fromNumber947(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9471"; // Burglengenfeld - case "2": + case '2': return "9472"; // Hohenfels Oberpf - case "3": + case '3': return "9473"; // Kallmünz - case "4": + case '4': return "9474"; // Schmidmühlen default: return ""; @@ -20540,14 +20550,14 @@ private static String fromNumber948(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9480"; // Sünching - case "1": + case '1': return "9481"; // Pfatter - case "2": + case '2': return "9482"; // Wörth a d Donau - case "4": + case '4': return "9484"; // Brennberg default: return ""; @@ -20559,20 +20569,20 @@ private static String fromNumber949(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9491"; // Hemau - case "2": + case '2': return "9492"; // Parsberg - case "3": + case '3': return "9493"; // Beratzhausen - case "5": + case '5': return "9495"; // Breitenbrunn Oberpf - case "7": + case '7': return "9497"; // Seubersdorf i d Opf - case "8": + case '8': return "9498"; // Laaber - case "9": + case '9': return "9499"; // Painten default: return ""; @@ -20584,22 +20594,22 @@ private static String fromNumber95(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber950(number.substring(1)); - case "1": + case '1': return "951"; // Bamberg - case "2": + case '2': return fromNumber952(number.substring(1)); - case "3": + case '3': return fromNumber953(number.substring(1)); - case "4": + case '4': return fromNumber954(number.substring(1)); - case "5": + case '5': return fromNumber955(number.substring(1)); - case "6": + case '6': return fromNumber956(number.substring(1)); - case "7": + case '7': return fromNumber957(number.substring(1)); default: return ""; @@ -20611,14 +20621,14 @@ private static String fromNumber950(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9502"; // Frensdorf - case "3": + case '3': return "9503"; // Oberhaid Oberfr - case "4": + case '4': return "9504"; // Stadelhofen - case "5": + case '5': return "9505"; // Litzendorf default: return ""; @@ -20630,24 +20640,24 @@ private static String fromNumber952(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9521"; // Hassfurt - case "2": + case '2': return "9522"; // Eltmann - case "3": + case '3': return "9523"; // Hofheim i Ufr - case "4": + case '4': return "9524"; // Zeil a Main - case "5": + case '5': return "9525"; // Königsberg i Bay - case "6": + case '6': return "9526"; // Riedbach - case "7": + case '7': return "9527"; // Knetzgau - case "8": + case '8': return "9528"; // Donnersdorf - case "9": + case '9': return "9529"; // Oberaurach default: return ""; @@ -20659,18 +20669,18 @@ private static String fromNumber953(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9531"; // Ebern - case "2": + case '2': return "9532"; // Maroldsweisach - case "3": + case '3': return "9533"; // Untermerzbach - case "4": + case '4': return "9534"; // Burgpreppach - case "5": + case '5': return "9535"; // Pfarrweisach - case "6": + case '6': return "9536"; // Kirchlauter default: return ""; @@ -20682,22 +20692,22 @@ private static String fromNumber954(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9542"; // Schesslitz - case "3": + case '3': return "9543"; // Hirschaid - case "4": + case '4': return "9544"; // Baunach - case "5": + case '5': return "9545"; // Buttenheim - case "6": + case '6': return "9546"; // Burgebrach - case "7": + case '7': return "9547"; // Zapfendorf - case "8": + case '8': return "9548"; // Mühlhausen Mittelfr - case "9": + case '9': return "9549"; // Lisberg default: return ""; @@ -20709,18 +20719,18 @@ private static String fromNumber955(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9551"; // Burgwindheim - case "2": + case '2': return "9552"; // Burghaslach - case "3": + case '3': return "9553"; // Ebrach Oberfr - case "4": + case '4': return "9554"; // Untersteinbach Unterfr - case "5": + case '5': return "9555"; // Schlüsselfeld-Aschbach - case "6": + case '6': return "9556"; // Geiselwind default: return ""; @@ -20732,26 +20742,26 @@ private static String fromNumber956(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9560"; // Grub a Forst - case "1": + case '1': return "9561"; // Coburg - case "2": + case '2': return "9562"; // Sonnefeld - case "3": + case '3': return "9563"; // Rödental - case "4": + case '4': return "9564"; // Bad Rodach - case "5": + case '5': return "9565"; // Untersiemau - case "6": + case '6': return "9566"; // Meeder - case "7": + case '7': return "9567"; // Seßlach-Gemünda - case "8": + case '8': return "9568"; // Neustadt b Coburg - case "9": + case '9': return "9569"; // Sesslach default: return ""; @@ -20763,18 +20773,18 @@ private static String fromNumber957(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9571"; // Lichtenfels Bay - case "2": + case '2': return "9572"; // Burgkunstadt - case "3": + case '3': return "9573"; // Staffelstein Oberfr - case "4": + case '4': return "9574"; // Marktzeuln - case "5": + case '5': return "9575"; // Weismain - case "6": + case '6': return "9576"; // Lichtenfels-Isling default: return ""; @@ -20786,24 +20796,24 @@ private static String fromNumber96(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber960(number.substring(1)); - case "1": + case '1': return "961"; // Weiden i d Opf - case "2": + case '2': return fromNumber962(number.substring(1)); - case "3": + case '3': return fromNumber963(number.substring(1)); - case "4": + case '4': return fromNumber964(number.substring(1)); - case "5": + case '5': return fromNumber965(number.substring(1)); - case "6": + case '6': return fromNumber966(number.substring(1)); - case "7": + case '7': return fromNumber967(number.substring(1)); - case "8": + case '8': return fromNumber968(number.substring(1)); default: return ""; @@ -20815,20 +20825,20 @@ private static String fromNumber960(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9602"; // Neustadt a d Waldnaab - case "3": + case '3': return "9603"; // Floss - case "4": + case '4': return "9604"; // Wernberg-Köblitz - case "5": + case '5': return "9605"; // Weiherhammer - case "6": + case '6': return "9606"; // Pfreimd - case "7": + case '7': return "9607"; // Luhe-Wildenau - case "8": + case '8': return "9608"; // Kohlberg Oberpf default: return ""; @@ -20840,20 +20850,20 @@ private static String fromNumber962(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9621"; // Amberg Oberpf - case "2": + case '2': return "9622"; // Hirschau Oberpf - case "4": + case '4': return "9624"; // Ensdorf Oberpf - case "5": + case '5': return "9625"; // Kastl b Amberg - case "6": + case '6': return "9626"; // Hohenburg - case "7": + case '7': return "9627"; // Freudenberg Oberpf - case "8": + case '8': return "9628"; // Ursensollen default: return ""; @@ -20865,24 +20875,24 @@ private static String fromNumber963(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9631"; // Tirschenreuth - case "2": + case '2': return "9632"; // Waldsassen - case "3": + case '3': return "9633"; // Mitterteich - case "4": + case '4': return "9634"; // Wiesau - case "5": + case '5': return "9635"; // Bärnau - case "6": + case '6': return "9636"; // Plößberg - case "7": + case '7': return "9637"; // Falkenberg Oberpf - case "8": + case '8': return "9638"; // Neualbenreuth - case "9": + case '9': return "9639"; // Mähring default: return ""; @@ -20894,22 +20904,22 @@ private static String fromNumber964(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9641"; // Grafenwöhr - case "2": + case '2': return "9642"; // Kemnath Stadt - case "3": + case '3': return "9643"; // Auerbach i d Opf - case "4": + case '4': return "9644"; // Pressath - case "5": + case '5': return "9645"; // Eschenbach i d Opf - case "6": + case '6': return "9646"; // Freihung - case "7": + case '7': return "9647"; // Kirchenthumbach - case "8": + case '8': return "9648"; // Neustadt a Kulm default: return ""; @@ -20921,24 +20931,24 @@ private static String fromNumber965(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9651"; // Vohenstrauss - case "2": + case '2': return "9652"; // Waidhaus - case "3": + case '3': return "9653"; // Eslarn - case "4": + case '4': return "9654"; // Pleystein - case "5": + case '5': return "9655"; // Tännesberg - case "6": + case '6': return "9656"; // Moosbach b Vohenstrauß - case "7": + case '7': return "9657"; // Waldthurn - case "8": + case '8': return "9658"; // Georgenberg - case "9": + case '9': return "9659"; // Leuchtenberg default: return ""; @@ -20950,18 +20960,18 @@ private static String fromNumber966(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9661"; // Sulzbach-Rosenberg - case "2": + case '2': return "9662"; // Vilseck - case "3": + case '3': return "9663"; // Neukirchen b Sulzbach-Rosenberg - case "4": + case '4': return "9664"; // Hahnbach - case "5": + case '5': return "9665"; // Königstein Oberpf - case "6": + case '6': return "9666"; // Illschwang default: return ""; @@ -20973,20 +20983,20 @@ private static String fromNumber967(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9671"; // Oberviechtach - case "2": + case '2': return "9672"; // Neunburg vorm Wald - case "3": + case '3': return "9673"; // Tiefenbach Oberpf - case "4": + case '4': return "9674"; // Schönsee - case "5": + case '5': return "9675"; // Altendorf a Nabburg - case "6": + case '6': return "9676"; // Winklarn - case "7": + case '7': return "9677"; // Oberviechtach-Pullenried default: return ""; @@ -20998,12 +21008,12 @@ private static String fromNumber968(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9681"; // Windischeschenbach - case "2": + case '2': return "9682"; // Erbendorf - case "3": + case '3': return "9683"; // Friedenfels default: return ""; @@ -21015,20 +21025,20 @@ private static String fromNumber97(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber970(number.substring(1)); - case "1": + case '1': return "971"; // Bad Kissingen - case "2": + case '2': return fromNumber972(number.substring(1)); - case "3": + case '3': return fromNumber973(number.substring(1)); - case "4": + case '4': return fromNumber974(number.substring(1)); - case "6": + case '6': return fromNumber976(number.substring(1)); - case "7": + case '7': return fromNumber977(number.substring(1)); default: return ""; @@ -21040,12 +21050,12 @@ private static String fromNumber970(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9701"; // Sandberg Unterfr - case "4": + case '4': return "9704"; // Euerdorf - case "8": + case '8': return "9708"; // Bad Bocklet default: return ""; @@ -21057,26 +21067,26 @@ private static String fromNumber972(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9720"; // Üchtelhausen - case "1": + case '1': return "9721"; // Schweinfurt - case "2": + case '2': return "9722"; // Werneck - case "3": + case '3': return "9723"; // Röthlein - case "4": + case '4': return "9724"; // Stadtlauringen - case "5": + case '5': return "9725"; // Poppenhausen Unterfr - case "6": + case '6': return "9726"; // Euerbach - case "7": + case '7': return "9727"; // Schonungen-Marktsteinach - case "8": + case '8': return "9728"; // Wülfershausen Unterfr - case "9": + case '9': return "9729"; // Grettstadt default: return ""; @@ -21088,20 +21098,20 @@ private static String fromNumber973(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9732"; // Hammelburg - case "3": + case '3': return "9733"; // Münnerstadt - case "4": + case '4': return "9734"; // Burkardroth - case "5": + case '5': return "9735"; // Massbach - case "6": + case '6': return "9736"; // Oberthulba - case "7": + case '7': return "9737"; // Wartmannsroth - case "8": + case '8': return "9738"; // Rottershausen default: return ""; @@ -21113,22 +21123,22 @@ private static String fromNumber974(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9741"; // Bad Brückenau - case "2": + case '2': return "9742"; // Kalbach Rhön - case "4": + case '4': return "9744"; // Zeitlofs-Detter - case "5": + case '5': return "9745"; // Wildflecken - case "6": + case '6': return "9746"; // Zeitlofs - case "7": + case '7': return "9747"; // Geroda Bay - case "8": + case '8': return "9748"; // Motten - case "9": + case '9': return "9749"; // Oberbach Unterfr default: return ""; @@ -21140,18 +21150,18 @@ private static String fromNumber976(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9761"; // Bad Königshofen i Grabfeld - case "2": + case '2': return "9762"; // Saal a d Saale - case "3": + case '3': return "9763"; // Sulzdorf a d Lederhecke - case "4": + case '4': return "9764"; // Höchheim - case "5": + case '5': return "9765"; // Trappstadt - case "6": + case '6': return "9766"; // Grosswenkheim default: return ""; @@ -21163,24 +21173,24 @@ private static String fromNumber977(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9771"; // Bad Neustadt a d Saale - case "2": + case '2': return "9772"; // Bischofsheim a d Rhön - case "3": + case '3': return "9773"; // Unsleben - case "4": + case '4': return "9774"; // Oberelsbach - case "5": + case '5': return "9775"; // Schönau a d Brend - case "6": + case '6': return "9776"; // Mellrichstadt - case "7": + case '7': return "9777"; // Ostheim v d Rhön - case "8": + case '8': return "9778"; // Fladungen - case "9": + case '9': return "9779"; // Nordheim v d Rhön default: return ""; @@ -21192,22 +21202,22 @@ private static String fromNumber98(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber980(number.substring(1)); - case "1": + case '1': return "981"; // Ansbach - case "2": + case '2': return fromNumber982(number.substring(1)); - case "3": + case '3': return fromNumber983(number.substring(1)); - case "4": + case '4': return fromNumber984(number.substring(1)); - case "5": + case '5': return fromNumber985(number.substring(1)); - case "6": + case '6': return fromNumber986(number.substring(1)); - case "7": + case '7': return fromNumber987(number.substring(1)); default: return ""; @@ -21219,14 +21229,14 @@ private static String fromNumber980(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9802"; // Ansbach-Katterbach - case "3": + case '3': return "9803"; // Colmberg - case "4": + case '4': return "9804"; // Aurach - case "5": + case '5': return "9805"; // Burgoberbach default: return ""; @@ -21238,24 +21248,24 @@ private static String fromNumber982(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9820"; // Lehrberg - case "2": + case '2': return "9822"; // Bechhofen a d Heide - case "3": + case '3': return "9823"; // Leutershausen - case "4": + case '4': return "9824"; // Dietenhofen - case "5": + case '5': return "9825"; // Herrieden - case "6": + case '6': return "9826"; // Weidenbach Mittelfr - case "7": + case '7': return "9827"; // Lichtenau Mittelfr - case "8": + case '8': return "9828"; // Rügland - case "9": + case '9': return "9829"; // Flachslanden default: return ""; @@ -21267,20 +21277,20 @@ private static String fromNumber983(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9831"; // Gunzenhausen - case "2": + case '2': return "9832"; // Wassertrüdingen - case "3": + case '3': return "9833"; // Heidenheim Mittelfr - case "4": + case '4': return "9834"; // Theilenhofen - case "5": + case '5': return "9835"; // Ehingen Mittelfr - case "6": + case '6': return "9836"; // Gunzenhausen-Cronheim - case "7": + case '7': return "9837"; // Haundorf default: return ""; @@ -21292,22 +21302,22 @@ private static String fromNumber984(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9841"; // Bad Windsheim - case "2": + case '2': return "9842"; // Uffenheim - case "3": + case '3': return "9843"; // Burgbernheim - case "4": + case '4': return "9844"; // Obernzenn - case "5": + case '5': return "9845"; // Oberdachstetten - case "6": + case '6': return "9846"; // Ipsheim - case "7": + case '7': return "9847"; // Ergersheim - case "8": + case '8': return "9848"; // Simmershofen default: return ""; @@ -21319,20 +21329,20 @@ private static String fromNumber985(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9851"; // Dinkelsbühl - case "2": + case '2': return "9852"; // Feuchtwangen - case "3": + case '3': return "9853"; // Wilburgstetten - case "4": + case '4': return "9854"; // Wittelshofen - case "5": + case '5': return "9855"; // Dentlein a Forst - case "6": + case '6': return "9856"; // Dürrwangen - case "7": + case '7': return "9857"; // Schopfloch Mittelfr default: return ""; @@ -21344,16 +21354,16 @@ private static String fromNumber986(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9861"; // Rothenburg ob der Tauber - case "5": + case '5': return "9865"; // Adelshofen Mittelfr - case "7": + case '7': return "9867"; // Geslau - case "8": + case '8': return "9868"; // Schillingsfürst - case "9": + case '9': return "9869"; // Wettringen Mittelfr default: return ""; @@ -21365,18 +21375,18 @@ private static String fromNumber987(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9871"; // Windsbach - case "2": + case '2': return "9872"; // Heilsbronn - case "3": + case '3': return "9873"; // Abenberg-Wassermungenau - case "4": + case '4': return "9874"; // Neuendettelsau - case "5": + case '5': return "9875"; // Wolframs-Eschenbach - case "6": + case '6': return "9876"; // Rohr Mittelfr default: return ""; @@ -21388,22 +21398,22 @@ private static String fromNumber99(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber990(number.substring(1)); - case "1": + case '1': return "991"; // Deggendorf - case "2": + case '2': return fromNumber992(number.substring(1)); - case "3": + case '3': return fromNumber993(number.substring(1)); - case "4": + case '4': return fromNumber994(number.substring(1)); - case "5": + case '5': return fromNumber995(number.substring(1)); - case "6": + case '6': return fromNumber996(number.substring(1)); - case "7": + case '7': return fromNumber997(number.substring(1)); default: return ""; @@ -21415,20 +21425,20 @@ private static String fromNumber990(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9901"; // Hengersberg Bay - case "3": + case '3': return "9903"; // Schöllnach - case "4": + case '4': return "9904"; // Lalling - case "5": + case '5': return "9905"; // Bernried Niederbay - case "6": + case '6': return "9906"; // Mariaposching - case "7": + case '7': return "9907"; // Zenting - case "8": + case '8': return "9908"; // Schöfweg default: return ""; @@ -21440,26 +21450,26 @@ private static String fromNumber992(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9920"; // Bischofsmais - case "1": + case '1': return "9921"; // Regen - case "2": + case '2': return "9922"; // Zwiesel - case "3": + case '3': return "9923"; // Teisnach - case "4": + case '4': return "9924"; // Bodenmais - case "5": + case '5': return "9925"; // Bayerisch Eisenstein - case "6": + case '6': return "9926"; // Frauenau - case "7": + case '7': return "9927"; // Kirchberg Wald - case "8": + case '8': return "9928"; // Kirchdorf i Wald - case "9": + case '9': return "9929"; // Ruhmannsfelden default: return ""; @@ -21471,20 +21481,20 @@ private static String fromNumber993(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9931"; // Plattling - case "2": + case '2': return "9932"; // Osterhofen - case "3": + case '3': return "9933"; // Wallersdorf - case "5": + case '5': return "9935"; // Stephansposching - case "6": + case '6': return "9936"; // Wallerfing - case "7": + case '7': return "9937"; // Oberpöring - case "8": + case '8': return "9938"; // Moos Niederbay default: return ""; @@ -21496,22 +21506,22 @@ private static String fromNumber994(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9941"; // Kötzting - case "2": + case '2': return "9942"; // Viechtach - case "3": + case '3': return "9943"; // Lam Oberpf - case "4": + case '4': return "9944"; // Miltach - case "5": + case '5': return "9945"; // Arnbruck - case "6": + case '6': return "9946"; // Hohenwarth b Kötzing - case "7": + case '7': return "9947"; // Neukirchen b Hl Blut - case "8": + case '8': return "9948"; // Eschlkam default: return ""; @@ -21523,18 +21533,18 @@ private static String fromNumber995(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9951"; // Landau a d Isar - case "2": + case '2': return "9952"; // Eichendorf - case "3": + case '3': return "9953"; // Pilsting - case "4": + case '4': return "9954"; // Simbach Niederbay - case "5": + case '5': return "9955"; // Mamming - case "6": + case '6': return "9956"; // Eichendorf-Aufhausen default: return ""; @@ -21546,18 +21556,18 @@ private static String fromNumber996(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9961"; // Mitterfels - case "2": + case '2': return "9962"; // Schwarzach Niederbay - case "3": + case '3': return "9963"; // Konzell - case "4": + case '4': return "9964"; // Stallwang - case "5": + case '5': return "9965"; // Sankt Englmar - case "6": + case '6': return "9966"; // Wiesenfelden default: return ""; @@ -21569,27 +21579,28 @@ private static String fromNumber997(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9971"; // Cham - case "2": + case '2': return "9972"; // Waldmünchen - case "3": + case '3': return "9973"; // Furth i Wald - case "4": + case '4': return "9974"; // Traitsching - case "5": + case '5': return "9975"; // Waldmünchen-Geigant - case "6": + case '6': return "9976"; // Rötz - case "7": + case '7': return "9977"; // Arnschwang - case "8": + case '8': return "9978"; // Schönthal Oberpf default: return ""; } } + /* End of generated code. */ From a6832b11082d95d8bcf7f32bae91ef3bb9b851b4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 22 May 2024 15:51:03 +0200 Subject: [PATCH 08/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../IsPossibleNumberWithReasonTest.groovy | 12 ++++++++++++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 1948c2f..109c516 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -77,14 +77,20 @@ class IsPossibleNumberWithReasonTest extends Specification { "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 110 @@ -109,14 +115,20 @@ class IsPossibleNumberWithReasonTest extends Specification { "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 112 diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 89a8955..55daccc 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -77,14 +77,20 @@ class IsValidNumberTest extends Specification { // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "0110" | "DE" | false | false + "0175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | false | true "0203 110555" | "DE" | false | true "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false + "+49175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | false | true "+49203 110555" | "DE" | false | true "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false + "+49175 110" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | false | true "+49203 110555" | "FR" | false | true // end of 110 @@ -109,14 +115,20 @@ class IsValidNumberTest extends Specification { "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "0112" | "DE" | false | false "0112 556677" | "DE" | false | false + "0175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | false | true "0203 112555" | "DE" | false | true "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false + "+49175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | false | true "+49203 112555" | "DE" | false | true "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false + "+49175 112" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | false | true "+49203 112555" | "FR" | false | true // end of 112 From b9b3c43c8966ae35abc8a8bcd04921364d5581d0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 30 May 2024 17:47:41 +0200 Subject: [PATCH 09/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../GermanAreaCodeExtractor/mobil.py | 95 ++++++++++ .../PhoneNumberValidatorImpl.java | 93 ++++++---- .../numberplans/NumberPlan.java | 36 ++++ .../constants/DeFixedLineNumberPlan.java | 175 ++++++++++++++++++ .../constants/GermanAreaCodeExtractor.java | 3 + .../PhoneNumberValidatorImplTest.groovy | 66 ++++++- .../IsPossibleNumberWithReasonTest.groovy | 33 +++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 45 +++-- 8 files changed, 489 insertions(+), 57 deletions(-) create mode 100644 src/generators/GermanAreaCodeExtractor/mobil.py diff --git a/src/generators/GermanAreaCodeExtractor/mobil.py b/src/generators/GermanAreaCodeExtractor/mobil.py new file mode 100644 index 0000000..44f774b --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/mobil.py @@ -0,0 +1,95 @@ +import csv + +last_ndc = "xxx" + + +def add(leaf, keypart, name): + if len(keypart) == 1: + leaf[keypart] = name + else: + if not keypart[0] in leaf: + leaf[keypart[0]] = {} + add(leaf[keypart[0]], keypart[1:], name) + + +def print_function(leaf, prefix): + for k in leaf: + if isinstance(leaf[k], dict): + print_function(leaf[k], prefix + k) + else: + ndc = prefix+k + l = 7 + if ndc.startswith("15"): + l = 11 - len(ndc) + if ndc == '176': + l = 8 + if ndc == '160': + print(' Map.entry("' + ndc + '", new NDCDetails(7, 8, false, 1)), // ' + leaf[k]) + print(' // NDC 160 uses first digit of number for deviating ranges with different length') + for i in range(10): + if i == 9: + l = 8 + else: + l = 7 + print(' Map.entry("' + ndc + str(i) +'", new NDCDetails(' + str(l) + ', ' + str(l) + ', false)), // ' + leaf[k]) + else: + if ndc == last_ndc: + print(' Map.entry("' + ndc + '", new NDCDetails(' + str(l) + ', ' + str(l) + ', false)) // ' + leaf[k]) + else: + print(' Map.entry("'+ndc+'", new NDCDetails('+str(l)+', '+str(l)+', false)), // '+ leaf[k]) + + + + +# Start, creating a dictonary for placing the Numberplan as a tree +onkz = {} + +# Website for used mobile NDCs: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html +with open('mobile_ndcs.html', newline='') as f: + data = f.read().replace('\n', '') + data = data.split("Liste der zugeteilten Rufnummernblöcke / Mobile Dienste")[1] + data = data.split("")[1] + data = data.split("")[0] + data = data.split("")[2] + + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('', ",") + data = data.replace('', ",") + data = data.replace('', "{+}") + data = data.replace('&', "&") + data = data.replace(' ', " ") + data = data.replace(' ', " ") + data = data.replace(', ', ",") + data = data.replace(',', "{:}") + + data = data.replace('15-', "15") + mf_ndcs = data.split('{+}') + + for mf_ndc in mf_ndcs: + ndc = mf_ndc.split('{:}') + if len(ndc) == 2: + last_ndc = ndc[0] + add(onkz, ndc[0], ndc[1]) + +onkz = dict(sorted(onkz.items())) + +# print code from three +print_function(onkz, "") + + + + + diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index a2f8756..457a514 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -79,22 +79,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after CC: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } } } else { @@ -114,23 +123,32 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after CC: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } } } @@ -158,24 +176,37 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after Nac: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithOutNac.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + + String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } - // Todo: Own Length test + + // As fallback check by libPhone PhoneNumberValidationResult fallBackResult = wrapper.validate(); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index b491780..a295a3c 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -80,6 +80,42 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn return ""; } + public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { + return -1; + } + + public int getNationDestinationCodeMaximumNumberLength(String ndc, String number) { + return -1; + } + + public int getDefaultMinimalNumberLength() { + return -1; + } + + public int getDefaultMaximumNumberLength() { + return -1; + } + + public boolean isNumberTooShortForNationalDestinationCode(String ndc, String number) { + int minLength = getNationDestinationCodeMinimalNumberLength(ndc, number); + if (minLength == -1) { + minLength = getDefaultMinimalNumberLength(); + } + return ((minLength != -1) && (minLength>number.length())); + } + + public boolean isNumberTooLongForNationalDestinationCode(String ndc, String number) { + int maxLength = getNationDestinationCodeMaximumNumberLength(ndc, number); + if (maxLength == -1) { + maxLength = getDefaultMaximumNumberLength(); + } + return ((maxLength != -1) && (maxLength NDC_DETAILS; + + static { + NDC_DETAILS = Map.ofEntries( + /* https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/LaengeRufnummernbloecke/start.html */ + /* + The following Code is generated by the python script: src/generators/GermanAreaCodeExtractor/mobile.py + it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new + code and past it between the comments below. + + TODO: special NDC need to be added to the script (mobile is done) + */ + + /* + * Generation started + */ + Map.entry("15019", new NDCDetails(6, 6, false)), // Tismi BV + Map.entry("15020", new NDCDetails(6, 6, false)), // Legos - Local Exchange Global Operation Services + Map.entry("1511", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1512", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1514", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1515", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1516", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1517", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("15180", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15181", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15182", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15183", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15310", new NDCDetails(6, 6, false)), // MTEL Deutschland GmbH + Map.entry("1520", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1521", new NDCDetails(7, 7, false)), // Lycamobile Europe Ltd. + Map.entry("1522", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1523", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1525", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1526", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1529", new NDCDetails(7, 7, false)), // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH ) + Map.entry("15510", new NDCDetails(6, 6, false)), // Lebara Limited + Map.entry("15511", new NDCDetails(6, 6, false)), // Lebara Limited + Map.entry("15560", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15561", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15562", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15563", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15564", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15565", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15566", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15567", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15568", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15569", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15630", new NDCDetails(6, 6, false)), // multiConnect GmbH + Map.entry("15678", new NDCDetails(6, 6, false)), // Argon Networks UG + Map.entry("15679", new NDCDetails(6, 6, false)), // Argon Networks UG + Map.entry("15700", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15701", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15702", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15703", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15704", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15706", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("1573", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1575", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1577", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1578", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("15888", new NDCDetails(6, 6, false)), // TelcoVillage GmbH + Map.entry("1590", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("160", new NDCDetails(7, 8, false, 1)), // Telekom Deutschland GmbH + // NDC 160 uses first digit of number for deviating ranges with different length + Map.entry("1600", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1601", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1602", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1603", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1604", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1605", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1606", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1607", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1608", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1609", new NDCDetails(8, 8, false)), // Telekom Deutschland GmbH + Map.entry("162", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("163", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("170", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("171", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("172", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("173", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("174", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("175", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("176", new NDCDetails(8, 8, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("177", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("178", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("179", new NDCDetails(7, 7, false)) // Telefónica Germany GmbH & Co. OHG + /* + * Generation ended + */ + ); + } + /** * Constant for German short numbers in fixed-line as extracted from the details above */ private static final Map SHORT_NUMBER_CODES = SHORT_NUMBER_CODES_DETAILS.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().length)); + + public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { + + if (NDC_DETAILS.containsKey(ndc)) { + + NDCDetails details = NDC_DETAILS.get(ndc); + + if ((details.lengthOfNumberPrefix > 0) && (number != null) && (number.length()>=details.lengthOfNumberPrefix)) { + for (int i=details.lengthOfNumberPrefix; i>0; i--){ + String ndcWithPrefix = ndc + number.substring(0, i); + if (NDC_DETAILS.containsKey(ndcWithPrefix)) { + return NDC_DETAILS.get(ndcWithPrefix).minNumberLength; + } + } + } + + return details.minNumberLength; + } + + return -1; + } + + public int getNationDestinationCodeMaximumNumberLength(String ndc, String number) { + if (NDC_DETAILS.containsKey(ndc)) { + + NDCDetails details = NDC_DETAILS.get(ndc); + + if ((details.lengthOfNumberPrefix > 0) && (number != null) && (number.length()>=details.lengthOfNumberPrefix)) { + for (int i=details.lengthOfNumberPrefix; i>0; i--){ + String ndcWithPrefix = ndc + number.substring(0, i); + if (NDC_DETAILS.containsKey(ndcWithPrefix)) { + return NDC_DETAILS.get(ndcWithPrefix).maxNumberLength; + } + } + } + + return details.maxNumberLength; + } + + return -1; + } + + public int getDefaultMinimalNumberLength() { + return 2; // VW in Wolfsburg (NDC: 5361) Number: 90 + } + + public int getDefaultMaximumNumberLength() { + return 11; // National number is max 13 digits long, while shortest NDC is 2 digits, so 11 left for the number itself. + } + + @Override + public boolean isNDCOptional(String ndc) { + if (NDC_DETAILS.containsKey(ndc)) { + return NDC_DETAILS.get(ndc).isOptional; + } + + return GermanAreaCodeExtractor.isNDCOptional(ndc); + } + @Override public boolean isUsableWithIDPandCCfromOutside(String number) { return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index 9e123ce..aedd38b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -10,6 +10,9 @@ public class GermanAreaCodeExtractor { TODO: special NDC need to be added to the script (mobile is done) */ + public static Boolean isNDCOptional(String number) { + return ! (number.startsWith("1")); + } /* Start of generated code diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 0539399..1128d52 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -81,25 +81,79 @@ class PhoneNumberValidatorImplTest extends Specification { "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49175 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // end of 110 } + def "validate police short code 112 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // short code for Police (112) is not dial-able internationally nor does it has additional numbers + "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "112556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + // end of 112 + } } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 109c516..a03d2cd 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -75,23 +75,32 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 110 } @@ -113,22 +122,32 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 112 diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 55daccc..9dfcab7 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -76,21 +76,31 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "110556677" | "DE" | false | false "0110" | "DE" | false | false - "0175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110" | "DE" | false | false + "0175 110555" | "DE" | false | false + "0175 1105555" | "DE" | true | false + "0175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555555" | "DE" | false | false "0203 110" | "DE" | false | true "0203 110555" | "DE" | false | true "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false - "+49175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "DE" | false | false + "+49175 110555" | "DE" | false | false + "+49175 1105555" | "DE" | true | false + "+49175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "DE" | false | false "+49203 110" | "DE" | false | true "+49203 110555" | "DE" | false | true "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false - "+49175 110" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "FR" | false | false + "+49175 110555" | "FR" | false | false + "+49175 1105555" | "FR" | true | false + "+49175 11055555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "FR" | false | false "+49203 110" | "FR" | false | true "+49203 110555" | "FR" | false | true // end of 110 @@ -113,22 +123,31 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "112556677" | "DE" | false | false "0112" | "DE" | false | false - "0112 556677" | "DE" | false | false - "0175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112" | "DE" | false | false + "0175 112555" | "DE" | false | false + "0175 1125555" | "DE" | true | false + "0175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 112555555" | "DE" | false | false "0203 112" | "DE" | false | true "0203 112555" | "DE" | false | true "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false - "+49175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112" | "DE" | false | false + "+49175 112555" | "DE" | false | false + "+49175 1125555" | "DE" | true | false + "+49175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 112555555" | "DE" | false | false "+49203 112" | "DE" | false | true "+49203 112555" | "DE" | false | true "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false - "+49175 112" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112" | "FR" | false | false + "+49175 112555" | "FR" | false | false + "+49175 1125555" | "FR" | true | false + "+49175 11255555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 112555555" | "FR" | false | false "+49203 112" | "FR" | false | true "+49203 112555" | "FR" | false | true // end of 112 From f69a8265a6b04f9bdbbdd97355c0f9cfb3ec81c4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 11:01:48 +0200 Subject: [PATCH 10/98] Introducing INVALID_PREFIX_OF_SUBSCRIBER_NUMBER and reorganize expected results for 110 and 112 short code tests. Also add test to check a subscriber number is not starting with a digit equaling NAC, when (used) NDC not mandatory. --- .../PhoneNumberValidatorImpl.java | 87 +++++++---- .../PhoneNumberValidationResult.java | 6 + .../PhoneNumberValidatorImplTest.groovy | 145 +++++++++++------- .../IsPossibleNumberWithReasonTest.groovy | 25 +++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 26 ++++ 5 files changed, 204 insertions(+), 85 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 457a514..82e011a 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -71,11 +71,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // Check for ShortNumber directly after CC String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } + if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after CC: @@ -90,12 +92,21 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { @@ -115,11 +126,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // Check for ShortNumber directly after CC String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } + if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after CC: @@ -134,12 +147,21 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { @@ -168,11 +190,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // check if a shortnumber is used directly after NAC and if that is allowed String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNAC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } + if (numberWithOutNac.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithNAC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after Nac: @@ -181,22 +205,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - - String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { return PhoneNumberValidationResult.TOO_SHORT; } @@ -233,7 +266,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } else { - return PhoneNumberValidationResult.INVALID_LENGTH; + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index 7e81d7e..ed8a6ba 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -102,6 +102,12 @@ public enum PhoneNumberValidationResult { /** The number has an invalid national destination code (aka NDC) for this region or the specific number must not be used with used NDC. */ INVALID_NATIONAL_DESTINATION_CODE(ValidationResult.INVALID_LENGTH), + /** The subscriber number starts with digits which makes the number invalid, e.g. overlapping special numbers when NDC is optional, so those numbers could not be distinct in digit by digit calling from those special numbers + * - If Region is using NAC and NDC is optional, the number must not start with NAC + * - IF Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers + * */ + INVALID_PREFIX_OF_SUBSCRIBER_NUMBER(ValidationResult.INVALID_LENGTH), + /** The number is shorter than all valid numbers for this region or used NDC. */ TOO_SHORT(ValidationResult.TOO_SHORT), diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 1128d52..8ae498f 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -15,6 +15,7 @@ */ package de.telekom.phonenumbernormalizer +import com.google.i18n.phonenumbers.PhoneNumberUtil import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult import spock.lang.Specification @@ -26,6 +27,30 @@ class PhoneNumberValidatorImplTest extends Specification { target = new PhoneNumberValidatorImpl() } + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, countryCode, expectedResult) { + given: + + + when: + "get number isPossibleNumberWithReason: $number" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | countryCode | expectedResult + "0203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // after CCC+mandatory NDC number may start with digit equal to NAC + } + def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { given: @@ -77,35 +102,37 @@ class PhoneNumberValidatorImplTest extends Specification { number | regionCode | expectedResult // short code for Police (110) is not dial-able internationally nor does it has additional numbers - "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH - "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "110556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // end of 110 } @@ -123,35 +150,37 @@ class PhoneNumberValidatorImplTest extends Specification { number | regionCode | expectedResult // short code for Police (112) is not dial-able internationally nor does it has additional numbers - "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "112556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH - "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "112556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // end of 112 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index a03d2cd..7f49eb1 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -7608,6 +7608,31 @@ class IsPossibleNumberWithReasonTest extends Specification { "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true } + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, regionCode, expectedResult, expectingFail) { + given: + + def phoneNumber = phoneUtil.parse(number, regionCode) + + when: + "get number isPossibleNumberWithReason: $number" + + def result = phoneUtil.isPossibleNumberWithReason(phoneNumber) + + then: + "is number expected: $expectedResult" + this.logResult(result, expectedResult, expectingFail, number, regionCode) + + where: + + number | regionCode | expectedResult | expectingFail + "0203056677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after CCC+mandatory NDC number may start with digit equal to NAC + } + def "check if original lib fixed non check of NAC"(String number, regionCode, expectedResult, expectingFail) { given: diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 9dfcab7..c399264 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -7354,4 +7354,30 @@ class IsValidNumberTest extends Specification { "0998" | "DE" | false | false "0999" | "DE" | false | false } + + + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, regionCode, expectedResult, expectingFail) { + given: + + def phoneNumber = phoneUtil.parse(number, regionCode) + + when: + "get number isPossibleNumberWithReason: $number" + + def result = phoneUtil.isValidNumber(phoneNumber) + + then: + "is number expected: $expectedResult" + this.logResult(result, expectedResult, expectingFail, number, regionCode) + + where: + + number | regionCode | expectedResult | expectingFail + "0203056677" | "DE" | false | true // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | false | true // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | false | true // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | true | false // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | true | false // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | true | false // after CCC+mandatory NDC number may start with digit equal to NAC + } } \ No newline at end of file From b1b7490e2bde483a0ab7f4761afaa405e07d4d17 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 11/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImpl.java | 24 +++++++-- .../constants/DeFixedLineNumberPlan.java | 2 +- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ .../IsPossibleNumberWithReasonTest.groovy | 31 ++++++++---- .../PhoneNumberUtil/IsValidNumberTest.groovy | 33 +++++++++---- 5 files changed, 115 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 82e011a..12ebc29 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -75,7 +75,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } } // else path of invalid NDC is checked explicitly here after also for non short number cases. } @@ -96,7 +100,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } } else { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; @@ -130,7 +138,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; + } } } // else path of invalid NDC is checked explicitly here after also for non short number cases. } @@ -151,7 +163,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; + } } } else { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index f1f9b6f..f56d761 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -98,7 +98,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { private static final Map SHORT_NUMBER_CODES_DETAILS = Map.of( "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), - "115", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 8ae498f..362526d 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -185,4 +185,53 @@ class PhoneNumberValidatorImplTest extends Specification { } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 7f49eb1..9cc3940 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -170,20 +170,33 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // not valid by BnetzA definition from within Germany - "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // TODO: Maybe IS_POSSIBLE_LOCAL_ONLY is also acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49203115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49203115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - // 155 does not have additional digits - "115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 1155555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49203 115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 115 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index c399264..a7950e2 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -167,23 +167,36 @@ class IsValidNumberTest extends Specification { where: - number | regionCode | expectedResult | expectingFail + number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "115556677" | "DE" | true | true "0115" | "DE" | false | false // not valid by BnetzA definition from within Germany - "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203115" | "DE" | true | false - "+49203115" | "DE" | true | false - "+49203115" | "FR" | true | false - // 155 does not have additional digits - "115555" | "DE" | false | false "0115 556677" | "DE" | false | false + "0175 115" | "DE" | false | false + "0175 115555" | "DE" | false | false + "0175 1155555" | "DE" | true | false + "0175 11555555" | "DE" | false | true + "0175 115555555" | "DE" | false | false + "0203 115" | "DE" | true | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "0203 115555" | "DE" | false | true + "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | false | false - "+49115 556677" | "FR" | false | false + "+49175 115" | "DE" | false | false + "+49175 115555" | "DE" | false | false + "+49175 1155555" | "DE" | true | false + "+49175 11555555" | "DE" | false | true + "+49175 115555555" | "DE" | false | false + "+49203 115" | "DE" | true | false "+49203 115555" | "DE" | false | true + "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49115 556677" | "FR" | false | false + "+49175 115" | "FR" | false | false + "+49175 115555" | "FR" | false | false + "+49175 1155555" | "FR" | true | false + "+49175 11555555" | "FR" | false | true + "+49175 115555555" | "FR" | false | false + "+49203 115" | "FR" | true | false "+49203 115555" | "FR" | false | true // end of 115 } From 664a31b4d8bac19a3c054c6ccbac5cd30beb35fd Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 12/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../PhoneNumberValidatorImpl.java | 171 ++++++++---------- .../numberplans/NumberPlan.java | 25 +++ .../numberplans/ShortCodeUseable.java | 12 ++ .../PhoneNumberValidatorImplTest.groovy | 2 +- 4 files changed, 112 insertions(+), 98 deletions(-) create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 12ebc29..a71bbac 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -16,10 +16,7 @@ package de.telekom.phonenumbernormalizer; import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType; -import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; -import de.telekom.phonenumbernormalizer.numberplans.NumberPlanFactory; -import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; -import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; +import de.telekom.phonenumbernormalizer.numberplans.*; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +35,29 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { private static final Logger LOGGER = LoggerFactory.getLogger(PhoneNumberValidatorImpl.class); + private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberplan, String numberToCheck, ShortCodeUseable mainSet, ShortCodeUseable oppositeSet, + PhoneNumberValidationResult notUseableInMainSet, PhoneNumberValidationResult useableOnlyInMainSet, + PhoneNumberValidationResult longerThanShortCode) { + String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); + if (shortNumberKey.length() > 0) { + if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsable(mainSet, shortNumberKey)) { + return notUseableInMainSet; + } else { + if (numberplan.isUsable(oppositeSet, shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return useableOnlyInMainSet; + } + } + } else { + return longerThanShortCode; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { @@ -65,23 +85,14 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (regionCountryCode.equals(numberCountryCode)) { // Calling within the country - if (numberplan!=null) { - // Check for ShortNumber directly after CC - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - if (numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterCC!=null) { + return isShortCodeDirectlyAfterCC; } // Check for NDC after CC: @@ -94,22 +105,15 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - if (numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterCCandNDC!=null) { + return isShortCodeDirectlyAfterCCandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { @@ -131,20 +135,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // calling from outside the country if (numberplan!=null) { - // Check for ShortNumber directly after CC - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - if (numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; - } - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterCC!=null) { + return isShortCodeDirectlyAfterCC; } // Check for NDC after CC: @@ -157,22 +153,15 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - if (numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; - } - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterCCandNDC!=null) { + return isShortCodeDirectlyAfterCCandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { @@ -204,17 +193,16 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan!=null) { // check if a shortnumber is used directly after NAC and if that is allowed - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); - if (shortNumberKey.length() > 0) { - if (numberWithOutNac.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithNAC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + + PhoneNumberValidationResult isShortCodeDirectlyAfterNAC = checkShortCodeOverlapping(numberplan, numberWithOutNac, + ShortCodeUseable.WITH_NAC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterNAC!=null) { + return isShortCodeDirectlyAfterNAC; } + // Check for NDC after Nac: String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); @@ -224,28 +212,22 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterNACandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_NAC_AND_NDC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterNACandNDC!=null) { + return isShortCodeDirectlyAfterNACandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { return PhoneNumberValidationResult.TOO_SHORT; } @@ -274,17 +256,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } - String shortNumberKey = numberplan.startingWithShortNumberKey(wrapper.getDialableNumber()); - if (shortNumberKey.length()>0) { - if (!numberplan.isUsableDirectly(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_LENGTH; - } else { - if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } + PhoneNumberValidationResult isShortCodeDirectly = checkShortCodeOverlapping(numberplan, wrapper.getDialableNumber(), + ShortCodeUseable.DIRECTLY, null, + PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectly!=null) { + return isShortCodeDirectly; } return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index a295a3c..0be7406 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -144,6 +144,31 @@ public boolean isUsableDirectly(String number) { } + public boolean isUsable(ShortCodeUseable how, String number) { + + if (how == null) { + return false; + } + + switch (how) { + case WITH_IDP_AND_CC_FROM_OUTSIDE: + return isUsableWithIDPandCCfromOutside(number); + case WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE: + return isUsableWithIDPandCCandNDCfromOutside(number); + case WITH_IDP_AND_CC_FROM_INSIDE: + return isUsableWithIDPandCCfromInside(number); + case WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE: + return isUsableWithIDPandCCandNDCfromInside(number); + case WITH_NAC: + return isUsableWithNAC(number); + case WITH_NAC_AND_NDC: + return isUsableWithNACandNDC(number); + case DIRECTLY: + return isUsableDirectly(number); + } + return false; + } + /** * Finds the longest prefix of a short number rule of the current number plan, at the beginning of a number. * diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java new file mode 100644 index 0000000..5f3c8cb --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java @@ -0,0 +1,12 @@ +package de.telekom.phonenumbernormalizer.numberplans; + +public enum ShortCodeUseable { + + WITH_IDP_AND_CC_FROM_OUTSIDE(), + WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE(), + WITH_IDP_AND_CC_FROM_INSIDE(), + WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE(), + WITH_NAC(), + WITH_NAC_AND_NDC(), + DIRECTLY(); +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 362526d..e17fa0c 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -208,7 +208,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From bb46ef8bfe7b9670e7d35eab82ec893165368949 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:38:15 +0200 Subject: [PATCH 13/98] Optimize Validation Code by moving duplicate code structure into checkExitCodeUsingNumber method --- .../PhoneNumberValidatorImpl.java | 207 +++++++----------- 1 file changed, 76 insertions(+), 131 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index a71bbac..b71d50b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -58,6 +58,58 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp } + private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, + ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, + ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, + PhoneNumberValidationResult invalidInitialExitCode, + PhoneNumberValidationResult mainSetResult){ + if (numberplan!=null) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, + mainSetIDPCC, oppositeSetIDPCC, + invalidInitialExitCode, mainSetResult, null); + + if (isShortCodeDirectlyAfterInitalExitCode!=null) { + return isShortCodeDirectlyAfterInitalExitCode; + } + + // Check for NDC after InitalExitCode: + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); + + if (Objects.equals(ndc, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + mainSetIDPCCNDC, oppositeSetIDPCCNDC, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { + return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } + + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { @@ -82,105 +134,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutCountryCode = wrapper.removeIDP().substring(numberCountryCode.length()); + // using IDP as initial Exit Code + PhoneNumberValidationResult isIDPNumberValid; + if (regionCountryCode.equals(numberCountryCode)) { // Calling within the country - - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, - ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, - PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); - - if (isShortCodeDirectlyAfterCC!=null) { - return isShortCodeDirectlyAfterCC; - } - - // Check for NDC after CC: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterCCandNDC!=null) { - return isShortCodeDirectlyAfterCCandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - + isIDPNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY); } else { - + // replacing the number plan by the one specified by the number's CC numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, numberCountryCode); // calling from outside the country - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, - ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, - PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, null); - - if (isShortCodeDirectlyAfterCC!=null) { - return isShortCodeDirectlyAfterCC; - } - - // Check for NDC after CC: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterCCandNDC!=null) { - return isShortCodeDirectlyAfterCCandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } + isIDPNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY); + } + if (isIDPNumberValid != null) { + return isIDPNumberValid; } - // return wrapper.validate(); } else { // No Country Exit Code has been used, so no CC is following. if (Objects.equals(wrapper.getNationalAccessCode(), "")) { @@ -194,51 +172,18 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan!=null) { // check if a shortnumber is used directly after NAC and if that is allowed - PhoneNumberValidationResult isShortCodeDirectlyAfterNAC = checkShortCodeOverlapping(numberplan, numberWithOutNac, + // using NAC as initial Exit Code + PhoneNumberValidationResult isNACNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithOutNac, ShortCodeUseable.WITH_NAC, null, - PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + ShortCodeUseable.WITH_NAC_AND_NDC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY); - if (isShortCodeDirectlyAfterNAC!=null) { - return isShortCodeDirectlyAfterNAC; + if (isNACNumberValid != null) { + return isNACNumberValid; } - - - // Check for NDC after Nac: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterNACandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_NAC_AND_NDC, null, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterNACandNDC!=null) { - return isShortCodeDirectlyAfterNACandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - - // As fallback check by libPhone PhoneNumberValidationResult fallBackResult = wrapper.validate(); From b83ae4fe5b03d37b22ff35e2ba2171ae87214653 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:43:27 +0200 Subject: [PATCH 14/98] Adding todo in Validation Code to support not yet supported PhoneNumberValidationResult types. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index b71d50b..adaa239 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -214,9 +214,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } } - // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); - - // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + // TODO: PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_VPN_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_VPN_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY + // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX return wrapper.validate(); } From e5c4aa22bcc52c1eba0cfb9c44842f4a3b7b797b Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 8 Jun 2024 17:56:11 +0200 Subject: [PATCH 15/98] Update Comments on 110 & 112 & 115 number checks to explain reason and link to issues reported to google Added new issue for 115 and updated issue status information. --- REPORTED_ISSUES.md | 14 ++ .../PhoneNumberValidatorImplTest.groovy | 2 +- .../IsPossibleNumberWithReasonTest.groovy | 153 +++++++++--------- .../PhoneNumberUtil/IsValidNumberTest.groovy | 54 +++---- 4 files changed, 119 insertions(+), 104 deletions(-) diff --git a/REPORTED_ISSUES.md b/REPORTED_ISSUES.md index 48026ba..5d699cf 100644 --- a/REPORTED_ISSUES.md +++ b/REPORTED_ISSUES.md @@ -13,6 +13,8 @@ However, it’s possible that this has caused confusion about which parts of the This issue addresses special short codes used for phone number directory assistant services. This issue has been resolved. +Google [fixed](https://github.com/google/libphonenumber/pull/2601/files#diff-1887949025d4940ce0f39cc4ba17666b5d93be2f143867b77c26bcddb36ac696R3400) ít with [8.12.21](https://github.com/google/libphonenumber/pull/2601) on 15.05.2024. + ### 2021-03-25 - [Germany (DE, +49): 116xxx Short Number valid vs. assigned](https://issuetracker.google.com/issues/183669955) This issue pertains to the EU-wide special social number short code definition. Although the regulation clearly defines a range, PhoneLib is not validating against that range, but against a list of currently assigned/operated numbers. At least for the German number space, as mentioned in the initial issue discussion (see first one above), the library is only partly or even completely checking the whole range in other EU number spaces. @@ -50,6 +52,18 @@ We have provided Ludwighafen in our labeling data. Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8e5b3fb2cb4a7ed9856289ea12d54947bfaa10549e6c1058fec7f3a1359dbbR3260) ít with [8.13.37](https://github.com/google/libphonenumber/pull/3473) on 15.05.2024. +### 2024-05-22 - [Emergency Numbers must not be used with National Destination Code in Germany fixed line](https://issuetracker.google.com/issues/341947688) + +BnetzA [described emergency short codes 110 & 112 as numbers without local NDC](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/np_nummernraum.pdf?__blob=publicationFile&v=1), since NDC is optional in fixed line, no number might start with those three digits (otherwise using such a number without NDC would trigger the emergency call). In mobile networks NDC is mandatory, so a number might start with those three digits, since NDC would be a prefix. Real live examples have been found. + +Google acknowledged the issue, but marked it as "**Won't fix (Intended behavior)**" because "*We will definitely think about it but it is not a priority right now. Also we have already mentioned about the complexity and invalid or false positive numbers in our XML file of Germany https://github.com/google/libphonenumber/blob/30db8f67a1c06b3ab052497477be1d9f18312387/resources/PhoneNumberMetadata.xml#L8126*" on 27.05.2024 +Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8e5b3fb2cb4a7ed9856289ea12d54947bfaa10549e6c1058fec7f3a1359dbbR3260) ít with [8.13.37](https://github.com/google/libphonenumber/pull/3473) on 15.05.2024. + +### 2024-06-08 - [Government Service Numbers may be used with National Destination Code in Germany fixed line, but subscriber numbers may not start with it](https://issuetracker.google.com/issues/345753226) + +BnetzA [described government short codes 115](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1), no number might start with those three digits (otherwise using such a number would trigger the short code). Furthermore the short code might be called with IDP and Country code (**+49115**) but from outside Germany and not from within - here the used region must have an influence on the evaluation. + + ### 2024-09-03 - [German Mobile number length validation for range 17x inconsistently differentiated in 8.13.43](https://issuetracker.google.com/issues/364179199) Previous to Version 8.13.43 any German number within the range 17x was identified valid for both length 10 & 11. Now the 11 length case (176) is differentiated, that 176 is not validated valid with 10 digits. But 170-175, 177-179 is still validated valid for both length, but should be only valid with length of 10. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index e17fa0c..02a9c97 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -184,7 +184,6 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 112 } - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { given: @@ -234,4 +233,5 @@ class PhoneNumberValidatorImplTest extends Specification { } + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 9cc3940..73f5412 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -75,33 +75,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked - "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 // end of 110 } @@ -122,34 +123,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked - "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 // end of 112 } @@ -170,34 +171,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // not valid by BnetzA definition from within Germany - "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 NDC must not start with 115 + "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "0175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "0203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 + "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 NDC must not start with 115 + "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49175 1155555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49203 115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 // end of 115 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index a7950e2..678906d 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -81,28 +81,28 @@ class IsValidNumberTest extends Specification { "0175 110" | "DE" | false | false "0175 110555" | "DE" | false | false "0175 1105555" | "DE" | true | false - "0175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 110555555" | "DE" | false | false - "0203 110" | "DE" | false | true - "0203 110555" | "DE" | false | true + "0203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "0203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false "+49175 110" | "DE" | false | false "+49175 110555" | "DE" | false | false "+49175 1105555" | "DE" | true | false - "+49175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 110555555" | "DE" | false | false - "+49203 110" | "DE" | false | true - "+49203 110555" | "DE" | false | true + "+49203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false "+49175 110" | "FR" | false | false "+49175 110555" | "FR" | false | false "+49175 1105555" | "FR" | true | false - "+49175 11055555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 110555555" | "FR" | false | false - "+49203 110" | "FR" | false | true - "+49203 110555" | "FR" | false | true + "+49203 110" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 // end of 110 } @@ -120,7 +120,7 @@ class IsValidNumberTest extends Specification { where: - number | regionCode | expectedResult | expectingFail + number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "112556677" | "DE" | false | false @@ -128,28 +128,28 @@ class IsValidNumberTest extends Specification { "0175 112" | "DE" | false | false "0175 112555" | "DE" | false | false "0175 1125555" | "DE" | true | false - "0175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 112555555" | "DE" | false | false - "0203 112" | "DE" | false | true - "0203 112555" | "DE" | false | true + "0203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "0203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false "+49175 112" | "DE" | false | false "+49175 112555" | "DE" | false | false "+49175 1125555" | "DE" | true | false - "+49175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 112555555" | "DE" | false | false - "+49203 112" | "DE" | false | true - "+49203 112555" | "DE" | false | true + "+49203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false "+49175 112" | "FR" | false | false "+49175 112555" | "FR" | false | false "+49175 1125555" | "FR" | true | false - "+49175 11255555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11255555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 112555555" | "FR" | false | false - "+49203 112" | "FR" | false | true - "+49203 112555" | "FR" | false | true + "+49203 112" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 // end of 112 } @@ -170,34 +170,34 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers - "115556677" | "DE" | true | true + "115556677" | "DE" | true | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "0115" | "DE" | false | false // not valid by BnetzA definition from within Germany "0115 556677" | "DE" | false | false "0175 115" | "DE" | false | false "0175 115555" | "DE" | false | false "0175 1155555" | "DE" | true | false - "0175 11555555" | "DE" | false | true + "0175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 115555555" | "DE" | false | false "0203 115" | "DE" | true | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203 115555" | "DE" | false | true + "0203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | false | false "+49175 115" | "DE" | false | false "+49175 115555" | "DE" | false | false "+49175 1155555" | "DE" | true | false - "+49175 11555555" | "DE" | false | true + "+49175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 115555555" | "DE" | false | false "+49203 115" | "DE" | true | false - "+49203 115555" | "DE" | false | true - "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49115" | "FR" | true | true // see https://issuetracker.google.com/issues/345753226 - https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html "+49115 556677" | "FR" | false | false "+49175 115" | "FR" | false | false "+49175 115555" | "FR" | false | false "+49175 1155555" | "FR" | true | false - "+49175 11555555" | "FR" | false | true + "+49175 11555555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 115555555" | "FR" | false | false "+49203 115" | "FR" | true | false - "+49203 115555" | "FR" | false | true + "+49203 115555" | "FR" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 // end of 115 } From da5983914a07de2607d0f885048d152da7bbf086 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 16/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImpl.java | 22 +++-- .../constants/DeFixedLineNumberPlan.java | 2 +- .../PhoneNumberValidatorImplTest.groovy | 88 ++++++++++++++++++- .../IsPossibleNumberWithReasonTest.groovy | 30 +++++++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 30 +++++++ 5 files changed, 165 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index adaa239..937ecc4 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -37,7 +37,7 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberplan, String numberToCheck, ShortCodeUseable mainSet, ShortCodeUseable oppositeSet, PhoneNumberValidationResult notUseableInMainSet, PhoneNumberValidationResult useableOnlyInMainSet, - PhoneNumberValidationResult longerThanShortCode) { + PhoneNumberValidationResult longerThanShortCode, PhoneNumberValidationResult shorterThanShortCode) { String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); if (shortNumberKey.length() > 0) { if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { @@ -51,7 +51,19 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp } } } else { - return longerThanShortCode; + if (!numberplan.isUsable(mainSet, shortNumberKey) || !numberplan.isUsable(oppositeSet, shortNumberKey)) { + if (numberToCheck.length() < numberplan.getShortCodeLength(shortNumberKey)) { + return shorterThanShortCode; + } else { + return longerThanShortCode; + } + } else { + if (numberToCheck.length() < numberplan.getShortCodeLength(shortNumberKey)) { + return PhoneNumberValidationResult.TOO_SHORT; + } else { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; // similar to TOO_LONG, but more accurate + } + } } } return null; @@ -67,7 +79,7 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, mainSetIDPCC, oppositeSetIDPCC, - invalidInitialExitCode, mainSetResult, null); + invalidInitialExitCode, mainSetResult, null, null); if (isShortCodeDirectlyAfterInitalExitCode!=null) { return isShortCodeDirectlyAfterInitalExitCode; @@ -86,7 +98,7 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, mainSetIDPCCNDC, oppositeSetIDPCCNDC, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { return isShortCodeDirectlyAfterInitalExitCodeandNDC; @@ -203,7 +215,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneNumberValidationResult isShortCodeDirectly = checkShortCodeOverlapping(numberplan, wrapper.getDialableNumber(), ShortCodeUseable.DIRECTLY, null, - PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER, PhoneNumberValidationResult.TOO_SHORT); if (isShortCodeDirectly!=null) { return isShortCodeDirectly; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index f56d761..4935c87 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -99,7 +99,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), - "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "116", new ShortNumberDetails(6, true, false, true, false, false, false, true), "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 02a9c97..bcc375c 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -229,9 +229,95 @@ class PhoneNumberValidatorImplTest extends Specification { "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 + // end of 1105 } + def "validate EU social short codes 116xxx in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // 116 is mentioned in number plan as 1160 and 1161 but in special ruling a full 6 digit number block: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/116xyz/StrukturAusgestNrBereich_Id11155pdf.pdf?__blob=publicationFile&v=4 + // 116xyz is nationally and internationally reachable - special check 116000 as initial number, 116116 as assigned number and 116999 as max legal number + "116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits + "116000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (not assigned yet but in BnetzA defined range) + "116116" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (already assigned) + "116999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (not assigned yet but in BnetzA defined range) + "1165566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "11655" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits + // https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/116xyz/116116.html + // NAC + 116xxx + // see no. 7: national 0116116 is not a valid number, but may be replaced by 116116 by the operator - caller could reach target. ( T-Mobile is doing so currently 03.11.2023 - no guarantee for the future nor for any other operator. Best practice, assuming call will not reach target=. + "0116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116 5566" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0116 55" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0175 116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 116555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1165555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11655555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 116555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "0203116" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "0203116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "0203116 55" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + + // using IDP+CC within the region + "+49116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + "+49116000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116116" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code & assigned and is Valid with IDP & CC + "+49116999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC (TOO_LONG would be too general, the SN can't start with the short code) + "+49116 55" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + + "+49175 116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1165555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11655555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "+49203116" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116 55" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + + // using IDP+CC from outside the region + "+49116" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + "+49116000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116116" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code & assigned and is Valid with IDP & CC + "+49116999" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC (TOO_LONG would be too general, the SN can't start with the short code) + "+49116 55" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + + "+49175 116" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1165555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11655555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "+49203116" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116116" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116 55" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 1105 + } } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 73f5412..0a95c8a 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -235,6 +235,13 @@ class IsPossibleNumberWithReasonTest extends Specification { "0116 5566" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0116 55" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // NAC + NDC (mobile) + 116xxx + "0175 116" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "0175 116555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "0175 1165555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11655555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "0175 116555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + // NAC + NDC (e.g. for Duisburg) + 116xxx "0203116" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203116000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -251,6 +258,13 @@ class IsPossibleNumberWithReasonTest extends Specification { "+49116 5566" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "+49116 55" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + // CC + NDC (mobile) + 116xxx + "+49175 116" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 116555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 1165555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11655555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + // CC + NDC (e.g. for Duisburg) + 116xxx "+49203116" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203116000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -266,6 +280,22 @@ class IsPossibleNumberWithReasonTest extends Specification { "+49116999" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false "+49116 5566" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "+49116 55" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + + // CC + NDC (mobile) + 116xxx from outside Germany + "+49175 116" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 116555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 1165555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11655555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + + // CC + NDC (e.g. for Duisburg) + 116xxx from outside Germany + "+49203116" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116116" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116 5566" | "FR " | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116 55" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // end of 116 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 678906d..9b276d7 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -234,6 +234,13 @@ class IsValidNumberTest extends Specification { "0116 5566" | "DE" | false | false "0116 55" | "DE" | false | false + // NAC + NDC (mobile) + 116xxx + "0175 116" | "DE" | false | false + "0175 116555" | "DE" | false | false + "0175 1165555" | "DE" | true | false + "0175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 116555555" | "DE" | false | false + // NAC + NDC (e.g. for Duisburg) + 116xxx "0203116" | "DE" | false | true "0203116000" | "DE" | false | true @@ -250,6 +257,13 @@ class IsValidNumberTest extends Specification { "+49116 5566" | "DE" | false | false "+49116 55" | "DE" | false | false + // CC + NDC (mobile) + 116xxx + "+49175 116" | "DE" | false | false + "+49175 116555" | "DE" | false | false + "+49175 1165555" | "DE" | true | false + "+49175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "DE" | false | false + // CC + NDC (e.g. for Duisburg) + 116xxx "+49203116" | "DE" | false | true "+49203116000" | "DE" | false | true @@ -265,6 +279,22 @@ class IsValidNumberTest extends Specification { "+49116999" | "FR" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "+49116 5566" | "FR" | false | false "+49116 55" | "FR" | false | false + + // CC + NDC (mobile) + 116xxx from outside Germany + "+49175 116" | "FR" | false | false + "+49175 116555" | "FR" | false | false + "+49175 1165555" | "FR" | true | false + "+49175 11655555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "FR" | false | false + + // CC + NDC (e.g. for Duisburg) + 116xxx from outside Germany + "+49203116" | "FR" | false | true + "+49203116000" | "FR" | false | true + "+49203116116" | "FR" | false | true + "+49203116999" | "FR" | false | true + "+49203116 5566" | "FR" | false | true + "+49203116 55" | "FR" | false | true + // end of 116 } From 705985d111223e61375f7eeca2a5e322cdfc9361 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 21 Jun 2024 22:13:36 +0200 Subject: [PATCH 17/98] Issue for +49115 resubmitted --- REPORTED_ISSUES.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/REPORTED_ISSUES.md b/REPORTED_ISSUES.md index 5d699cf..d7fed49 100644 --- a/REPORTED_ISSUES.md +++ b/REPORTED_ISSUES.md @@ -63,6 +63,11 @@ Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8 BnetzA [described government short codes 115](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1), no number might start with those three digits (otherwise using such a number would trigger the short code). Furthermore the short code might be called with IDP and Country code (**+49115**) but from outside Germany and not from within - here the used region must have an influence on the evaluation. +Google since 09.07.2024, the Issue is not publicly accessible anymore - we wrote a [post in the Google discussion group](https://groups.google.com/g/libphonenumber-discuss/c/WQv244-PVmI). + +### 2024-06-16 - [+49115 German Government short number with IDP+CC is only valid from outside Germany but not within (so IS_POSSIBLE_LOCAL_ONLY is also wrong)](https://issuetracker.google.com/issues/347356467) + +Since the previous Issue "disappeared" without notice, we assume, it was structural too similar to the emergencies number issue and the reviewer did not recordnized the differences. So we reported the main difference - again and this time the issue is at least accepted. But the reviewer comment seems only to focus on the short number call-ability from outside the country and not that IDP+CC+115 must not be used from inside. ### 2024-09-03 - [German Mobile number length validation for range 17x inconsistently differentiated in 8.13.43](https://issuetracker.google.com/issues/364179199) From 9d0a7ccd95903469b2a21ac3cfe81d84a1704b88 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 23 Jun 2024 17:04:57 +0200 Subject: [PATCH 18/98] Adding Validation test for 118(y)xx call assitant. Adapting Validation Code to handle short code definition which marks a short code as reserve (not valid at all) and introducing a new result type: INVALID_RESERVE_NUMBER --- .../PhoneNumberValidatorImpl.java | 22 ++ .../numberplans/NumberPlan.java | 4 + .../PhoneNumberValidationResult.java | 5 +- .../constants/DeFixedLineNumberPlan.java | 28 ++- .../PhoneNumberValidatorImplTest.groovy | 188 +++++++++++++++++- .../IsPossibleNumberWithReasonTest.groovy | 83 +++++++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 82 +++++++- 7 files changed, 406 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 937ecc4..50d6a1b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -40,6 +40,10 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp PhoneNumberValidationResult longerThanShortCode, PhoneNumberValidationResult shorterThanShortCode) { String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); if (shortNumberKey.length() > 0) { + if (numberplan.isReserved(shortNumberKey)) { + return null; + } + if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { if (!numberplan.isUsable(mainSet, shortNumberKey)) { return notUseableInMainSet; @@ -102,6 +106,10 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } else { + if (numberplan.isReserved(numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } // when NDC is optional, then number must not start with NAC again. @@ -219,6 +227,19 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (isShortCodeDirectly!=null) { return isShortCodeDirectly; + } else { + if (numberplan.isReserved(wrapper.getDialableNumber())) { + Integer lengthMatch = numberplan.isMatchingLength(wrapper.getDialableNumber()); + if (lengthMatch!=null) { + if (lengthMatch>0) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (lengthMatch<0) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } } return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; @@ -232,6 +253,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY // TODO: PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX + // TODO: PhoneNumberValidationResult.INVALID_RESERVE_NUMBER return wrapper.validate(); } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 0be7406..57fc744 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -116,6 +116,10 @@ public boolean isNDCOptional(String ndc) { return true; } + public boolean isReserved(String number) {return false; } + + public Integer isMatchingLength(String number) {return null;} + public boolean isUsableWithIDPandCCfromOutside(String number) { return false; } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index ed8a6ba..c2ab969 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -104,10 +104,13 @@ public enum PhoneNumberValidationResult { /** The subscriber number starts with digits which makes the number invalid, e.g. overlapping special numbers when NDC is optional, so those numbers could not be distinct in digit by digit calling from those special numbers * - If Region is using NAC and NDC is optional, the number must not start with NAC - * - IF Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers + * - If Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers * */ INVALID_PREFIX_OF_SUBSCRIBER_NUMBER(ValidationResult.INVALID_LENGTH), + /** The region is using a definition for a number (range), which matches for the number, but the definition is marked as reserve for future use. So currently it is not a valid number */ + INVALID_RESERVE_NUMBER(ValidationResult.INVALID_LENGTH), + /** The number is shorter than all valid numbers for this region or used NDC. */ TOO_SHORT(ValidationResult.TOO_SHORT), diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 4935c87..e0ea687 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -100,7 +100,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), "116", new ShortNumberDetails(6, true, false, true, false, false, false, true), - "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "1180", new ShortNumberDetails(6, false, false, false, false, false, false, false), // 1180xx is currently just reserved for future used "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); @@ -262,6 +262,32 @@ public boolean isNDCOptional(String ndc) { return GermanAreaCodeExtractor.isNDCOptional(ndc); } + @Override + public boolean isReserved(String number) { + // if the number is not usable at all, but it is defined so it is reserved (not valid yet - but maybe in the future) + ShortNumberDetails numberDetails = SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)); + if (numberDetails == null) { + return false; + } + return !(numberDetails.usableWithIDPandCCfromOutside || + numberDetails.usableWithIDPandCCandNDCfromOutside || + numberDetails.usableWithIDPandCCfromInside || + numberDetails.usableWithIDPandCCandNDCfromInside || + numberDetails.usableWithNAC || + numberDetails.usableWithNACandNDC || + numberDetails.usableDirectly); + } + + @Override + public Integer isMatchingLength(String number) { + ShortNumberDetails numberDetails = SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)); + if (numberDetails == null) { + return null; + } + return numberDetails.length - number.length(); + } + + @Override public boolean isUsableWithIDPandCCfromOutside(String number) { return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index bcc375c..61e2e20 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -316,7 +316,193 @@ class PhoneNumberValidatorImplTest extends Specification { "+49203116999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used "+49203116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong "+49203116 55" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 1105 + // end of 116xxx + } + + def "validate German Call Assistant short codes in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/118xy/118xyNummernplan.pdf?__blob=publicationFile&v=1 + // it is mentioned, that those numbers are nationally reachable - which excludes them from locally, so no local number should work this way because without NDC it could not be seperated from the national number + // implicitly it could also mean that those numbers are not routed from outside germany + + // 118 is starting part and in general 5 digits long - except if the 4th digit is 0, than it is six digits long + "118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "1180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "118000" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER + "118099" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER + "1180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "1181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11810" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // Call Assistant of Deutsche Telekom - will be retired on 01.12.2024 see https://www.telekom.com/de/blog/konzern/artikel/telekom-stellt-auskunftsdienste-ein-1065536 + "11833" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "1189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // Tested on 26.12.2023 - 11833 works on TMD, but neither 011833 nor +4911833 is working on T-Mobile Germany + // NAC + 118(y)xx belongs to the number reserve of NAC + 11 + + "0118" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01180" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011800" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0118000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0118099" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01180000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01181" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "011833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0118100" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01189" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0118999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // NAC + NDC (e.g. for Duisburg) + 118(y)xx + "0203118" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031180" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311800" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "0203118000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "0203118099" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031181" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "020311833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031189" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118099" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751180000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "017511800000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "01751181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511810" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511833" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118100" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751181000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // special for mobile + "017511810000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "01751189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511899" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118999" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751189999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // special for mobile + "017511899999" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // CC + 118(y)xx + "+49118" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911800" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118099" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491181" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911810" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+4911833" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118100" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491189" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911899" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // CC + NDC (e.g. for Duisburg) + 118(y)xx + "+49203118" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311800" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+49203118000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031181" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4920311833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031189" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118099" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751180000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+4917511800000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511810" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511833" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118100" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751181000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511810000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511899" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118999" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751189999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511899999" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // CC + 118(y)xx from outside Germany + "+49118" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911800" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118099" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491181" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911810" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+4911833" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118100" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491189" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911899" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311800" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+49203118000" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180000" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031181" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311810" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4920311833" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118100" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031189" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311899" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118999" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751180" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511800" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118099" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751180000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+4917511800000" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751181" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511810" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511833" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118100" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751181000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511810000" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751189" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511899" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118999" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751189999" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511899999" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // end of 118 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 0a95c8a..764cce5 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -323,11 +323,12 @@ class IsPossibleNumberWithReasonTest extends Specification { "118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "1180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "11800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "118000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "118000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // since it is reserve INVALID_LENGTH could also be possible + "118099" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // since it is reserve INVALID_LENGTH could also be possible "1180000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "1181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "11810" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - // Call Assistant of Deutsche Telekom + // Call Assistant of Deutsche Telekom - will be retired on 01.12.2024 see https://www.telekom.com/de/blog/konzern/artikel/telekom-stellt-auskunftsdienste-ein-1065536 "11833" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false "118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "1189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true @@ -341,6 +342,7 @@ class IsPossibleNumberWithReasonTest extends Specification { "01180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "011800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "01180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "01181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "011810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -355,6 +357,7 @@ class IsPossibleNumberWithReasonTest extends Specification { "02031180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "020311800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0203118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "02031180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "02031181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "020311810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -364,11 +367,32 @@ class IsPossibleNumberWithReasonTest extends Specification { "020311899" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203118999" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118099" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751180000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "017511800000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "01751181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511810" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511833" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751181000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "017511810000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "01751189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511899" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751189999" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "017511899999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // CC + 118(y)xx "+49118" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -392,11 +416,32 @@ class IsPossibleNumberWithReasonTest extends Specification { "+4920311899" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203118999" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118099" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+4917511800000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511810" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511833" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751181000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511810000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511899" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751189999" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511899999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // CC + 118(y)xx from outside Germany "+49118" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911800" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49118099" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491181" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911810" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -406,6 +451,40 @@ class IsPossibleNumberWithReasonTest extends Specification { "+4911899" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031180" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311800" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031180000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031181" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311810" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311833" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118100" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031189" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311899" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511800" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118099" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180000" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+4917511800000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751181" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511810" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511833" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118100" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751181000" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511810000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751189" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511899" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118999" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751189999" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511899999" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // end of 118 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 9b276d7..db65cd4 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -322,7 +322,8 @@ class IsValidNumberTest extends Specification { "118" | "DE" | false | false "1180" | "DE" | false | false "11800" | "DE" | false | false - "118000" | "DE" | true | true + "118000" | "DE" | false | false // since its just reserve + "118099" | "DE" | false | false // since its just reserve "1180000" | "DE" | false | false "1181" | "DE" | false | false "11810" | "DE" | true | true @@ -340,6 +341,7 @@ class IsValidNumberTest extends Specification { "01180" | "DE" | false | false "011800" | "DE" | false | false "0118000" | "DE" | false | false + "0118099" | "DE" | false | false "01180000" | "DE" | false | false "01181" | "DE" | false | false "011810" | "DE" | false | false @@ -354,6 +356,7 @@ class IsValidNumberTest extends Specification { "02031180" | "DE" | false | true "020311800" | "DE" | false | true "0203118000" | "DE" | false | true + "0203118099" | "DE" | false | true "02031180000" | "DE" | false | true "02031181" | "DE" | false | true "020311810" | "DE" | false | true @@ -363,11 +366,32 @@ class IsValidNumberTest extends Specification { "020311899" | "DE" | false | true "0203118999" | "DE" | false | true + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | false | false + "01751180" | "DE" | false | false + "017511800" | "DE" | false | false + "0175118000" | "DE" | false | false + "0175118099" | "DE" | false | false + "01751180000" | "DE" | true | false + "017511800000" | "DE" | false | true // special for mobile + "01751181" | "DE" | false | false + "017511810" | "DE" | false | false + "017511833" | "DE" | false | false + "0175118100" | "DE" | false | false + "01751181000" | "DE" | true | false // special for mobile + "017511810000" | "DE" | false | true // special for mobile + "01751189" | "DE" | false | false + "017511899" | "DE" | false | false + "0175118999" | "DE" | false | false + "01751189999" | "DE" | true | false // special for mobile + "017511899999" | "DE" | false | true // special for mobile + // CC + 118(y)xx "+49118" | "DE" | false | false "+491180" | "DE" | false | false "+4911800" | "DE" | false | false "+49118000" | "DE" | false | false + "+49118099" | "DE" | false | false "+491180000" | "DE" | false | false "+491181" | "DE" | false | false "+4911810" | "DE" | false | false @@ -382,6 +406,7 @@ class IsValidNumberTest extends Specification { "+492031180" | "DE" | false | true "+4920311800" | "DE" | false | true "+49203118000" | "DE" | false | true + "+49203118099" | "DE" | false | true "+492031180000" | "DE" | false | true "+492031181" | "DE" | false | true "+4920311810" | "DE" | false | true @@ -391,11 +416,32 @@ class IsValidNumberTest extends Specification { "+4920311899" | "DE" | false | true "+49203118999" | "DE" | false | true + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | false | false + "+491751180" | "DE" | false | false + "+4917511800" | "DE" | false | false + "+49175118000" | "DE" | false | false + "+49175118099" | "DE" | false | false + "+491751180000" | "DE" | true | false + "+4917511800000" | "DE" | false | true // special for mobile + "+491751181" | "DE" | false | false + "+4917511810" | "DE" | false | false + "+4917511833" | "DE" | false | false + "+49175118100" | "DE" | false | false + "+491751181000" | "DE" | true | false // special for mobile + "+4917511810000" | "DE" | false | true // special for mobile + "+491751189" | "DE" | false | false + "+4917511899" | "DE" | false | false + "+49175118999" | "DE" | false | false + "+491751189999" | "DE" | true | false // special for mobile + "+4917511899999" | "DE" | false | true // special for mobile + // CC + 118(y)xx from outside Germany "+49118" | "FR" | false | false "+491180" | "FR" | false | false "+4911800" | "FR" | false | false "+49118000" | "FR" | false | false + "+49118099" | "FR" | false | false "+491180000" | "FR" | false | false "+491181" | "FR" | false | false "+4911810" | "FR" | false | false @@ -405,6 +451,40 @@ class IsValidNumberTest extends Specification { "+4911899" | "FR" | false | false "+49118999" | "FR" | false | false + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | false | true + "+492031180" | "FR" | false | true + "+4920311800" | "FR" | false | true + "+49203118000" | "FR" | false | true + "+49203118099" | "FR" | false | true + "+492031180000" | "FR" | false | true + "+492031181" | "FR" | false | true + "+4920311810" | "FR" | false | true + "+4920311833" | "FR" | false | true + "+49203118100" | "FR" | false | true + "+492031189" | "FR" | false | true + "+4920311899" | "FR" | false | true + "+49203118999" | "FR" | false | true + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | false | false + "+491751180" | "FR" | false | false + "+4917511800" | "FR" | false | false + "+49175118000" | "FR" | false | false + "+49175118099" | "FR" | false | false + "+491751180000" | "FR" | true | false + "+4917511800000" | "FR" | false | true // special for mobile + "+491751181" | "FR" | false | false + "+4917511810" | "FR" | false | false + "+4917511833" | "FR" | false | false + "+49175118100" | "FR" | false | false + "+491751181000" | "FR" | true | false // special for mobile + "+4917511810000" | "FR" | false | true // special for mobile + "+491751189" | "FR" | false | false + "+4917511899" | "FR" | false | false + "+49175118999" | "FR" | false | false + "+491751189999" | "FR" | true | false // special for mobile + "+4917511899999" | "FR" | false | true // special for mobile // end of 118 } From b76d1043f7a843a3fcd94b0e0e2f0ad97fc87504 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 19/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 18a2298..dc2e5e4 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,6 +1220,71 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 350ffe35fbb044a15937d3ab2270fac37b70e064 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 20/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 4 -- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 50d6a1b..f99ac71 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -133,10 +133,6 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { - if (number == null || number.length()==0) { - return PhoneNumberValidationResult.INVALID_LENGTH; - } - PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); // TODO: change parameter regionCode to deviceContext diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index dc2e5e4..676df63 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1285,6 +1285,71 @@ public boolean startsWithNAC() { } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 94848ec62b99fbfbb9a3b10714c8ee3b9bbba148 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 21/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 676df63..d02dbd0 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1324,11 +1324,84 @@ public boolean startsWithIDP() { return false; } + // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" String idp = this.getInternationalDialingPrefix(); return isIDPUsed(this.dialableNumber, idp); } + private int parseCountryCode(boolean alsoFromRegionCode) { + Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); + + // Using PhoneLib to extract Country Code from Number + if (tempNumber!=null) { + int result = tempNumber.getCountryCode(); + if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (alsoFromRegionCode) { + return result; + } else { + return 0; + } + } + if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { + return result; + } + } + return 0; + } + + public String getCountryCode(boolean alsoFromRegionCode) { + int parsedCountryCode = parseCountryCode(alsoFromRegionCode); + if (parsedCountryCode>0) { + return String.valueOf(parsedCountryCode); + } + + // FallBack Extraction: + String numberWithoutIDP = removeIDP(); + String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); + + if (countryCode.length()>0) { + return countryCode; + } + + if (alsoFromRegionCode) { + int regionCountryCode = getCountryCodeForRegion(this.regionCode); + if (regionCountryCode>0) { + return String.valueOf(regionCountryCode); + } + } + + return ""; + } + + public String removeNAC() { + if (dialableNumber == null) { + return ""; + } + if (startsWithNAC()) { + return dialableNumber.substring(getNationalAccessCode().length()); + } else { + return ""; + } + } + + public String removeIDP() { + if (dialableNumber == null) { + return ""; + } + if (dialableNumber.startsWith("+")) { + return dialableNumber.substring(1); + } + + if (dialableNumber.startsWith(getInternationalDialingPrefix())) { + return dialableNumber.substring(getInternationalDialingPrefix().length()); + } + + return ""; + } + /** * Checks if the number starts with the NAC of the initializing region * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. @@ -1343,11 +1416,9 @@ public boolean startsWithNAC() { if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { return false; - } return dialableNumber.startsWith(nac); - } /** From 850c3593536b15d514a9b4618813a2fe3d741b19 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 30 May 2024 17:47:41 +0200 Subject: [PATCH 22/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index f99ac71..50d6a1b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -133,6 +133,10 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + if (number == null || number.length()==0) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); // TODO: change parameter regionCode to deviceContext From 761310a9d77b9b318d4cb5ff1add10f88085356e Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 23/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 61e2e20..23a9a39 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -506,4 +506,53 @@ class PhoneNumberValidatorImplTest extends Specification { } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From 88be199f48a94fe9e6ce325d3e1904c0215e379e Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 24/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 23a9a39..244575e 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -529,7 +529,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From e5ad7c3b4ae385271931d03e4d9fa167e514ba07 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:38:15 +0200 Subject: [PATCH 25/98] Optimize Validation Code by moving duplicate code structure into checkExitCodeUsingNumber method --- .../PhoneNumberValidatorImpl.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 50d6a1b..959e28e 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -130,6 +130,58 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra } + private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, + ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, + ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, + PhoneNumberValidationResult invalidInitialExitCode, + PhoneNumberValidationResult mainSetResult){ + if (numberplan!=null) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, + mainSetIDPCC, oppositeSetIDPCC, + invalidInitialExitCode, mainSetResult, null); + + if (isShortCodeDirectlyAfterInitalExitCode!=null) { + return isShortCodeDirectlyAfterInitalExitCode; + } + + // Check for NDC after InitalExitCode: + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); + + if (Objects.equals(ndc, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + mainSetIDPCCNDC, oppositeSetIDPCCNDC, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { + return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } + + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { From f261f9e5aab08cc42d5566877382310eb5c83352 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 8 Jun 2024 17:56:11 +0200 Subject: [PATCH 26/98] Update Comments on 110 & 112 & 115 number checks to explain reason and link to issues reported to google Added new issue for 115 and updated issue status information. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 244575e..fb671c7 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -554,5 +554,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 110 } - } From 8bc9b71dd2ea6909ad6a939f3e488b8561653de4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 27/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImpl.java | 53 ------------------- .../constants/DeFixedLineNumberPlan.java | 3 -- .../PhoneNumberValidatorImplTest.groovy | 2 +- 3 files changed, 1 insertion(+), 57 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 959e28e..863244c 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -129,59 +129,6 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra return null; } - - private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, - ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, - ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, - PhoneNumberValidationResult invalidInitialExitCode, - PhoneNumberValidationResult mainSetResult){ - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, - mainSetIDPCC, oppositeSetIDPCC, - invalidInitialExitCode, mainSetResult, null); - - if (isShortCodeDirectlyAfterInitalExitCode!=null) { - return isShortCodeDirectlyAfterInitalExitCode; - } - - // Check for NDC after InitalExitCode: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - mainSetIDPCCNDC, oppositeSetIDPCCNDC, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { - return isShortCodeDirectlyAfterInitalExitCodeandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - return null; - } - - @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index e0ea687..6f48a71 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -342,9 +342,6 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn if (nsn.length()<2) { return ""; } - - - } // Geographic Area Codes return GermanAreaCodeExtractor.fromNumber(nsn); diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index fb671c7..0e3237b 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -551,7 +551,7 @@ class PhoneNumberValidatorImplTest extends Specification { "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 + // end of 115 } } From 465cb12ea56f4abed531333df1c3050b9c45c8ff Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 28/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index d02dbd0..199ac6f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1421,6 +1421,71 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 801616283c0569020600cc76f621009c547a22a0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 29/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 266 ------------------ 1 file changed, 266 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 199ac6f..4e132f9 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1175,17 +1175,6 @@ public String getCountryCode(boolean alsoFromRegionCode) { return ""; } - public String removeNAC() { - if (dialableNumber == null) { - return ""; - } - if (startsWithNAC()) { - return dialableNumber.substring(getNationalAccessCode().length()); - } else { - return ""; - } - } - public String removeIDP() { if (dialableNumber == null) { return ""; @@ -1220,162 +1209,6 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - private int parseCountryCode(boolean alsoFromRegionCode) { - Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); - - // Using PhoneLib to extract Country Code from Number - if (tempNumber!=null) { - int result = tempNumber.getCountryCode(); - if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { - if (alsoFromRegionCode) { - return result; - } else { - return 0; - } - } - if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || - (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || - (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { - return result; - } - } - return 0; - } - - public String getCountryCode(boolean alsoFromRegionCode) { - int parsedCountryCode = parseCountryCode(alsoFromRegionCode); - if (parsedCountryCode>0) { - return String.valueOf(parsedCountryCode); - } - - // FallBack Extraction: - String numberWithoutIDP = removeIDP(); - String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); - - if (countryCode.length()>0) { - return countryCode; - } - - if (alsoFromRegionCode) { - int regionCountryCode = getCountryCodeForRegion(this.regionCode); - if (regionCountryCode>0) { - return String.valueOf(regionCountryCode); - } - } - - return ""; - } - public String removeNAC() { if (dialableNumber == null) { return ""; @@ -1387,105 +1220,6 @@ public String removeNAC() { } } - public String removeIDP() { - if (dialableNumber == null) { - return ""; - } - if (dialableNumber.startsWith("+")) { - return dialableNumber.substring(1); - } - - if (dialableNumber.startsWith(getInternationalDialingPrefix())) { - return dialableNumber.substring(getInternationalDialingPrefix().length()); - } - - return ""; - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - } - - return dialableNumber.startsWith(nac); - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From cf11847c393aace3c0957368210088b1ae1b4c13 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 30/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 0e3237b..e365ba6 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -554,4 +554,53 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 115 } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From 81dd450d0d718e63a6f581ffd47e2584f830ac32 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 31/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index e365ba6..c7d5b89 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -577,7 +577,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From fce00890894aae17af1702074ad926e27150910f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 32/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImplTest.groovy | 98 ------------------- 1 file changed, 98 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index c7d5b89..5ee4e99 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,102 +505,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } - - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 115 - } - - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 - } - - } From cf9029832c752b294b35206b8c29abe337fc4264 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 33/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 2 +- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 863244c..68c53e6 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -254,7 +254,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX // TODO: PhoneNumberValidationResult.INVALID_RESERVE_NUMBER - return wrapper.validate(); + return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 4e132f9..1781892 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,6 +1220,71 @@ public String removeNAC() { } } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From ed89bd6935bcca9558d1b44fba065e64f30ee013 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 34/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 1781892..5612b07 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1285,6 +1285,71 @@ public boolean startsWithNAC() { } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From f38bcd9126c3cc3dd5f6c6de36bfb92f385578e0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 35/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 130 ------------------ 1 file changed, 130 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 5612b07..4e132f9 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,136 +1220,6 @@ public String removeNAC() { } } - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From fdb475adb3f9d2c561421ac88833c09ae7f1aaf9 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:43 +0200 Subject: [PATCH 36/98] Starting Validator. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 68c53e6..8faac91 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -138,9 +138,6 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); - // TODO: change parameter regionCode to deviceContext - NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); - if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used From 11e4eaec4bc195bb59e5dbde40afb01e7872a852 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 37/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 5ee4e99..8725479 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,4 +505,53 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From 648ff8d3dd53602cf644f839641536ad98c83bfd Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 38/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 8725479..2cfb4af 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -528,7 +528,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From fb3d25fa9bedfd10f56e093e52f784771a9e88da Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 39/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImplTest.groovy | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 2cfb4af..5ee4e99 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,53 +505,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 - } - - } From 3af3064a3b54a3e3d184d21453a5af71242934ed Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 5 Oct 2024 23:18:55 +0200 Subject: [PATCH 40/98] Merging 1.3.1 with Validator C --- .../PhoneNumberValidatorImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 8faac91..ec648c1 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -138,6 +138,9 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + // TODO: change parameter regionCode to deviceContext + NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); + if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used @@ -204,10 +207,10 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneNumberValidationResult fallBackResult = wrapper.validate(); if ( (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE) || - (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || - // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: - ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) - ) { + (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || + // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: + ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) + ) { return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; } } else { @@ -254,4 +257,4 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number return wrapper.validate(); } -} +} \ No newline at end of file From f1d3ec47a5c9f7b2627c337048726940c02d1ec0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 24 Oct 2024 12:17:11 +0200 Subject: [PATCH 41/98] Use PhoneLib 8.13.48 and prepare release (#85) * Use PhoneLib 8.13.48 and prepare release - Fixing 17(0-5&7-9) length validation: Adapting Tests - Change in Problems identifying mobile length 17x+Infix for VoiceMail: Adapting Tests * Update Central Repository --- REPORTED_ISSUES.md | 5 +- pom.xml | 8 +- .../PhoneNumberUtil/IsValidNumberTest.groovy | 360 +++++++++--------- 3 files changed, 193 insertions(+), 180 deletions(-) diff --git a/REPORTED_ISSUES.md b/REPORTED_ISSUES.md index 48026ba..6560aeb 100644 --- a/REPORTED_ISSUES.md +++ b/REPORTED_ISSUES.md @@ -54,4 +54,7 @@ Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8 Previous to Version 8.13.43 any German number within the range 17x was identified valid for both length 10 & 11. Now the 11 length case (176) is differentiated, that 176 is not validated valid with 10 digits. But 170-175, 177-179 is still validated valid for both length, but should be only valid with length of 10. -Google stated it is aware and will bring changes after investigation that users are not unblock. \ No newline at end of file +Google stated it is aware and will bring changes after investigation that users are not unblock. + +Google [fixed](https://github.com/google/libphonenumber/pull/3671/files#diff-5061a7d3c54ba589aacce00dcee1ce92e098c40034749bcae4c8a4780bb40233) it with [8.13.48](https://github.com/google/libphonenumber/pull/3671) on 16.10.2024 +While normal mobile numbers are now aligend, voicemail numbers length is still problematic (BUG needs to be reported!). diff --git a/pom.xml b/pom.xml index 2627d3b..0a6864f 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ normalizer Phonenumber Normalizer Library to work with phonenumbers, especially to fix googles PhoneLib ignoring German Landline specifics. - 1.3.1-SNAPSHOT + 1.3.1 jar https://github.com/telekom/phonenumber-normalizer @@ -86,7 +86,7 @@ com.googlecode.libphonenumber libphonenumber - 8.13.47 + 8.13.48 @@ -150,7 +150,7 @@ com.googlecode.libphonenumber geocoder - 2.241 + 2.242 test @@ -425,7 +425,7 @@ ossrh Central Repository OSSRH - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ \ No newline at end of file diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 96011d2..24d2c96 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -1678,140 +1678,140 @@ class IsValidNumberTest extends Specification { // // 0170 // - "01700" | "DE" | [false, false, true, false, false, false, true, false] - "017010" | "DE" | [false, false, true, false, false, false, true, false] - "017011" | "DE" | [false, false, true, false, false, false, true, false] - "017012" | "DE" | [false, false, true, false, false, false, true, false] + "01700" | "DE" | [false, false, false, false, false, false, false, false] + "017010" | "DE" | [false, false, false, false, false, false, false, false] + "017011" | "DE" | [false, false, false, false, false, false, false, false] + "017012" | "DE" | [false, false, false, false, false, false, false, false] // 017013 is reserved for voicemail - see tests below - "017014" | "DE" | [false, false, true, false, false, false, true, false] - "017015" | "DE" | [false, false, true, false, false, false, true, false] - "017016" | "DE" | [false, false, true, false, false, false, true, false] - "017017" | "DE" | [false, false, true, false, false, false, true, false] - "017018" | "DE" | [false, false, true, false, false, false, true, false] - "017019" | "DE" | [false, false, true, false, false, false, true, false] - "01702" | "DE" | [false, false, true, false, false, false, true, false] - "01703" | "DE" | [false, false, true, false, false, false, true, false] - "01704" | "DE" | [false, false, true, false, false, false, true, false] - "01705" | "DE" | [false, false, true, false, false, false, true, false] - "01706" | "DE" | [false, false, true, false, false, false, true, false] - "01707" | "DE" | [false, false, true, false, false, false, true, false] - "01708" | "DE" | [false, false, true, false, false, false, true, false] - "01709" | "DE" | [false, false, true, false, false, false, true, false] + "017014" | "DE" | [false, false, false, false, false, false, false, false] + "017015" | "DE" | [false, false, false, false, false, false, false, false] + "017016" | "DE" | [false, false, false, false, false, false, false, false] + "017017" | "DE" | [false, false, false, false, false, false, false, false] + "017018" | "DE" | [false, false, false, false, false, false, false, false] + "017019" | "DE" | [false, false, false, false, false, false, false, false] + "01702" | "DE" | [false, false, false, false, false, false, false, false] + "01703" | "DE" | [false, false, false, false, false, false, false, false] + "01704" | "DE" | [false, false, false, false, false, false, false, false] + "01705" | "DE" | [false, false, false, false, false, false, false, false] + "01706" | "DE" | [false, false, false, false, false, false, false, false] + "01707" | "DE" | [false, false, false, false, false, false, false, false] + "01708" | "DE" | [false, false, false, false, false, false, false, false] + "01709" | "DE" | [false, false, false, false, false, false, false, false] // // 0171 // - "01710" | "DE" | [false, false, true, false, false, false, true, false] - "017110" | "DE" | [false, false, true, false, false, false, true, false] - "017111" | "DE" | [false, false, true, false, false, false, true, false] - "017112" | "DE" | [false, false, true, false, false, false, true, false] + "01710" | "DE" | [false, false, false, false, false, false, false, false] + "017110" | "DE" | [false, false, false, false, false, false, false, false] + "017111" | "DE" | [false, false, false, false, false, false, false, false] + "017112" | "DE" | [false, false, false, false, false, false, false, false] // 017113 is reserved for voicemail - see tests below - "017114" | "DE" | [false, false, true, false, false, false, true, false] - "017115" | "DE" | [false, false, true, false, false, false, true, false] - "017116" | "DE" | [false, false, true, false, false, false, true, false] - "017117" | "DE" | [false, false, true, false, false, false, true, false] - "017118" | "DE" | [false, false, true, false, false, false, true, false] - "017119" | "DE" | [false, false, true, false, false, false, true, false] - "01712" | "DE" | [false, false, true, false, false, false, true, false] - "01713" | "DE" | [false, false, true, false, false, false, true, false] - "01714" | "DE" | [false, false, true, false, false, false, true, false] - "01715" | "DE" | [false, false, true, false, false, false, true, false] - "01716" | "DE" | [false, false, true, false, false, false, true, false] - "01717" | "DE" | [false, false, true, false, false, false, true, false] - "01718" | "DE" | [false, false, true, false, false, false, true, false] - "01719" | "DE" | [false, false, true, false, false, false, true, false] + "017114" | "DE" | [false, false, false, false, false, false, false, false] + "017115" | "DE" | [false, false, false, false, false, false, false, false] + "017116" | "DE" | [false, false, false, false, false, false, false, false] + "017117" | "DE" | [false, false, false, false, false, false, false, false] + "017118" | "DE" | [false, false, false, false, false, false, false, false] + "017119" | "DE" | [false, false, false, false, false, false, false, false] + "01712" | "DE" | [false, false, false, false, false, false, false, false] + "01713" | "DE" | [false, false, false, false, false, false, false, false] + "01714" | "DE" | [false, false, false, false, false, false, false, false] + "01715" | "DE" | [false, false, false, false, false, false, false, false] + "01716" | "DE" | [false, false, false, false, false, false, false, false] + "01717" | "DE" | [false, false, false, false, false, false, false, false] + "01718" | "DE" | [false, false, false, false, false, false, false, false] + "01719" | "DE" | [false, false, false, false, false, false, false, false] // // 0172 // - "01720" | "DE" | [false, false, true, false, false, false, true, false] - "01721" | "DE" | [false, false, true, false, false, false, true, false] - "01722" | "DE" | [false, false, true, false, false, false, true, false] - "01723" | "DE" | [false, false, true, false, false, false, true, false] - "01724" | "DE" | [false, false, true, false, false, false, true, false] + "01720" | "DE" | [false, false, false, false, false, false, false, false] + "01721" | "DE" | [false, false, false, false, false, false, false, false] + "01722" | "DE" | [false, false, false, false, false, false, false, false] + "01723" | "DE" | [false, false, false, false, false, false, false, false] + "01724" | "DE" | [false, false, false, false, false, false, false, false] // 017250 is reserved for voicemail - see tests below - "017251" | "DE" | [false, false, true, false, false, false, true, false] - "017252" | "DE" | [false, false, true, false, false, false, true, false] - "017253" | "DE" | [false, false, true, false, false, false, true, false] - "017254" | "DE" | [false, false, true, false, false, false, true, false] + "017251" | "DE" | [false, false, false, false, false, false, false, false] + "017252" | "DE" | [false, false, false, false, false, false, false, false] + "017253" | "DE" | [false, false, false, false, false, false, false, false] + "017254" | "DE" | [false, false, false, false, false, false, false, false] // 017255 is reserved for voicemail - see tests below - "017256" | "DE" | [false, false, true, false, false, false, true, false] - "017257" | "DE" | [false, false, true, false, false, false, true, false] - "017258" | "DE" | [false, false, true, false, false, false, true, false] - "017259" | "DE" | [false, false, true, false, false, false, true, false] - "01726" | "DE" | [false, false, true, false, false, false, true, false] - "01727" | "DE" | [false, false, true, false, false, false, true, false] - "01728" | "DE" | [false, false, true, false, false, false, true, false] - "01729" | "DE" | [false, false, true, false, false, false, true, false] + "017256" | "DE" | [false, false, false, false, false, false, false, false] + "017257" | "DE" | [false, false, false, false, false, false, false, false] + "017258" | "DE" | [false, false, false, false, false, false, false, false] + "017259" | "DE" | [false, false, false, false, false, false, false, false] + "01726" | "DE" | [false, false, false, false, false, false, false, false] + "01727" | "DE" | [false, false, false, false, false, false, false, false] + "01728" | "DE" | [false, false, false, false, false, false, false, false] + "01729" | "DE" | [false, false, false, false, false, false, false, false] // // 0173 // - "01730" | "DE" | [false, false, true, false, false, false, true, false] - "01731" | "DE" | [false, false, true, false, false, false, true, false] - "01732" | "DE" | [false, false, true, false, false, false, true, false] - "01733" | "DE" | [false, false, true, false, false, false, true, false] - "01734" | "DE" | [false, false, true, false, false, false, true, false] + "01730" | "DE" | [false, false, false, false, false, false, false, false] + "01731" | "DE" | [false, false, false, false, false, false, false, false] + "01732" | "DE" | [false, false, false, false, false, false, false, false] + "01733" | "DE" | [false, false, false, false, false, false, false, false] + "01734" | "DE" | [false, false, false, false, false, false, false, false] // 017350 is reserved for voicemail - see tests below - "017351" | "DE" | [false, false, true, false, false, false, true, false] - "017352" | "DE" | [false, false, true, false, false, false, true, false] - "017353" | "DE" | [false, false, true, false, false, false, true, false] - "017354" | "DE" | [false, false, true, false, false, false, true, false] + "017351" | "DE" | [false, false, false, false, false, false, false, false] + "017352" | "DE" | [false, false, false, false, false, false, false, false] + "017353" | "DE" | [false, false, false, false, false, false, false, false] + "017354" | "DE" | [false, false, false, false, false, false, false, false] // 017355 is reserved for voicemail - see tests below - "017356" | "DE" | [false, false, true, false, false, false, true, false] - "017357" | "DE" | [false, false, true, false, false, false, true, false] - "017358" | "DE" | [false, false, true, false, false, false, true, false] - "017359" | "DE" | [false, false, true, false, false, false, true, false] - "01736" | "DE" | [false, false, true, false, false, false, true, false] - "01737" | "DE" | [false, false, true, false, false, false, true, false] - "01738" | "DE" | [false, false, true, false, false, false, true, false] - "01739" | "DE" | [false, false, true, false, false, false, true, false] + "017356" | "DE" | [false, false, false, false, false, false, false, false] + "017357" | "DE" | [false, false, false, false, false, false, false, false] + "017358" | "DE" | [false, false, false, false, false, false, false, false] + "017359" | "DE" | [false, false, false, false, false, false, false, false] + "01736" | "DE" | [false, false, false, false, false, false, false, false] + "01737" | "DE" | [false, false, false, false, false, false, false, false] + "01738" | "DE" | [false, false, false, false, false, false, false, false] + "01739" | "DE" | [false, false, false, false, false, false, false, false] // // 0174 // - "01740" | "DE" | [false, false, true, false, false, false, true, false] - "01741" | "DE" | [false, false, true, false, false, false, true, false] - "01742" | "DE" | [false, false, true, false, false, false, true, false] - "01743" | "DE" | [false, false, true, false, false, false, true, false] - "01744" | "DE" | [false, false, true, false, false, false, true, false] + "01740" | "DE" | [false, false, false, false, false, false, false, false] + "01741" | "DE" | [false, false, false, false, false, false, false, false] + "01742" | "DE" | [false, false, false, false, false, false, false, false] + "01743" | "DE" | [false, false, false, false, false, false, false, false] + "01744" | "DE" | [false, false, false, false, false, false, false, false] // 017450 is reserved for voicemail - see tests below - "017451" | "DE" | [false, false, true, false, false, false, true, false] - "017452" | "DE" | [false, false, true, false, false, false, true, false] - "017453" | "DE" | [false, false, true, false, false, false, true, false] - "017454" | "DE" | [false, false, true, false, false, false, true, false] + "017451" | "DE" | [false, false, false, false, false, false, false, false] + "017452" | "DE" | [false, false, false, false, false, false, false, false] + "017453" | "DE" | [false, false, false, false, false, false, false, false] + "017454" | "DE" | [false, false, false, false, false, false, false, false] // 017455 is reserved for voicemail - see tests below - "017456" | "DE" | [false, false, true, false, false, false, true, false] - "017457" | "DE" | [false, false, true, false, false, false, true, false] - "017458" | "DE" | [false, false, true, false, false, false, true, false] - "017459" | "DE" | [false, false, true, false, false, false, true, false] - "01746" | "DE" | [false, false, true, false, false, false, true, false] - "01747" | "DE" | [false, false, true, false, false, false, true, false] - "01748" | "DE" | [false, false, true, false, false, false, true, false] - "01749" | "DE" | [false, false, true, false, false, false, true, false] + "017456" | "DE" | [false, false, false, false, false, false, false, false] + "017457" | "DE" | [false, false, false, false, false, false, false, false] + "017458" | "DE" | [false, false, false, false, false, false, false, false] + "017459" | "DE" | [false, false, false, false, false, false, false, false] + "01746" | "DE" | [false, false, false, false, false, false, false, false] + "01747" | "DE" | [false, false, false, false, false, false, false, false] + "01748" | "DE" | [false, false, false, false, false, false, false, false] + "01749" | "DE" | [false, false, false, false, false, false, false, false] // // 0175 // - "01750" | "DE" | [false, false, true, false, false, false, true, false] - "017510" | "DE" | [false, false, true, false, false, false, true, false] - "017511" | "DE" | [false, false, true, false, false, false, true, false] - "017512" | "DE" | [false, false, true, false, false, false, true, false] + "01750" | "DE" | [false, false, false, false, false, false, false, false] + "017510" | "DE" | [false, false, false, false, false, false, false, false] + "017511" | "DE" | [false, false, false, false, false, false, false, false] + "017512" | "DE" | [false, false, false, false, false, false, false, false] // 017513 is reserved for voicemail - see tests below - "017514" | "DE" | [false, false, true, false, false, false, true, false] - "017515" | "DE" | [false, false, true, false, false, false, true, false] - "017516" | "DE" | [false, false, true, false, false, false, true, false] - "017517" | "DE" | [false, false, true, false, false, false, true, false] - "017518" | "DE" | [false, false, true, false, false, false, true, false] - "017519" | "DE" | [false, false, true, false, false, false, true, false] - "01752" | "DE" | [false, false, true, false, false, false, true, false] - "01753" | "DE" | [false, false, true, false, false, false, true, false] - "01754" | "DE" | [false, false, true, false, false, false, true, false] - "01755" | "DE" | [false, false, true, false, false, false, true, false] - "01756" | "DE" | [false, false, true, false, false, false, true, false] - "01757" | "DE" | [false, false, true, false, false, false, true, false] - "01758" | "DE" | [false, false, true, false, false, false, true, false] - "01759" | "DE" | [false, false, true, false, false, false, true, false] + "017514" | "DE" | [false, false, false, false, false, false, false, false] + "017515" | "DE" | [false, false, false, false, false, false, false, false] + "017516" | "DE" | [false, false, false, false, false, false, false, false] + "017517" | "DE" | [false, false, false, false, false, false, false, false] + "017518" | "DE" | [false, false, false, false, false, false, false, false] + "017519" | "DE" | [false, false, false, false, false, false, false, false] + "01752" | "DE" | [false, false, false, false, false, false, false, false] + "01753" | "DE" | [false, false, false, false, false, false, false, false] + "01754" | "DE" | [false, false, false, false, false, false, false, false] + "01755" | "DE" | [false, false, false, false, false, false, false, false] + "01756" | "DE" | [false, false, false, false, false, false, false, false] + "01757" | "DE" | [false, false, false, false, false, false, false, false] + "01758" | "DE" | [false, false, false, false, false, false, false, false] + "01759" | "DE" | [false, false, false, false, false, false, false, false] // // 0176 @@ -1839,71 +1839,71 @@ class IsValidNumberTest extends Specification { // // 0177 // - "01770" | "DE" | [false, false, true, false, false, false, true, false] - "01771" | "DE" | [false, false, true, false, false, false, true, false] - "01772" | "DE" | [false, false, true, false, false, false, true, false] - "01773" | "DE" | [false, false, true, false, false, false, true, false] - "01774" | "DE" | [false, false, true, false, false, false, true, false] - "01775" | "DE" | [false, false, true, false, false, false, true, false] - "01776" | "DE" | [false, false, true, false, false, false, true, false] - "01777" | "DE" | [false, false, true, false, false, false, true, false] - "01778" | "DE" | [false, false, true, false, false, false, true, false] - "017790" | "DE" | [false, false, true, false, false, false, true, false] - "017791" | "DE" | [false, false, true, false, false, false, true, false] - "017792" | "DE" | [false, false, true, false, false, false, true, false] - "017793" | "DE" | [false, false, true, false, false, false, true, false] - "017794" | "DE" | [false, false, true, false, false, false, true, false] - "017795" | "DE" | [false, false, true, false, false, false, true, false] - "017796" | "DE" | [false, false, true, false, false, false, true, false] - "017797" | "DE" | [false, false, true, false, false, false, true, false] - "017798" | "DE" | [false, false, true, false, false, false, true, false] + "01770" | "DE" | [false, false, false, false, false, false, false, false] + "01771" | "DE" | [false, false, false, false, false, false, false, false] + "01772" | "DE" | [false, false, false, false, false, false, false, false] + "01773" | "DE" | [false, false, false, false, false, false, false, false] + "01774" | "DE" | [false, false, false, false, false, false, false, false] + "01775" | "DE" | [false, false, false, false, false, false, false, false] + "01776" | "DE" | [false, false, false, false, false, false, false, false] + "01777" | "DE" | [false, false, false, false, false, false, false, false] + "01778" | "DE" | [false, false, false, false, false, false, false, false] + "017790" | "DE" | [false, false, false, false, false, false, false, false] + "017791" | "DE" | [false, false, false, false, false, false, false, false] + "017792" | "DE" | [false, false, false, false, false, false, false, false] + "017793" | "DE" | [false, false, false, false, false, false, false, false] + "017794" | "DE" | [false, false, false, false, false, false, false, false] + "017795" | "DE" | [false, false, false, false, false, false, false, false] + "017796" | "DE" | [false, false, false, false, false, false, false, false] + "017797" | "DE" | [false, false, false, false, false, false, false, false] + "017798" | "DE" | [false, false, false, false, false, false, false, false] // 017799 is reserved for voicemail - see tests below // // 0178 // - "01780" | "DE" | [false, false, true, false, false, false, true, false] - "01781" | "DE" | [false, false, true, false, false, false, true, false] - "01782" | "DE" | [false, false, true, false, false, false, true, false] - "01783" | "DE" | [false, false, true, false, false, false, true, false] - "01784" | "DE" | [false, false, true, false, false, false, true, false] - "01785" | "DE" | [false, false, true, false, false, false, true, false] - "01786" | "DE" | [false, false, true, false, false, false, true, false] - "01787" | "DE" | [false, false, true, false, false, false, true, false] - "01788" | "DE" | [false, false, true, false, false, false, true, false] - "017890" | "DE" | [false, false, true, false, false, false, true, false] - "017891" | "DE" | [false, false, true, false, false, false, true, false] - "017892" | "DE" | [false, false, true, false, false, false, true, false] - "017893" | "DE" | [false, false, true, false, false, false, true, false] - "017894" | "DE" | [false, false, true, false, false, false, true, false] - "017895" | "DE" | [false, false, true, false, false, false, true, false] - "017896" | "DE" | [false, false, true, false, false, false, true, false] - "017897" | "DE" | [false, false, true, false, false, false, true, false] - "017898" | "DE" | [false, false, true, false, false, false, true, false] + "01780" | "DE" | [false, false, false, false, false, false, false, false] + "01781" | "DE" | [false, false, false, false, false, false, false, false] + "01782" | "DE" | [false, false, false, false, false, false, false, false] + "01783" | "DE" | [false, false, false, false, false, false, false, false] + "01784" | "DE" | [false, false, false, false, false, false, false, false] + "01785" | "DE" | [false, false, false, false, false, false, false, false] + "01786" | "DE" | [false, false, false, false, false, false, false, false] + "01787" | "DE" | [false, false, false, false, false, false, false, false] + "01788" | "DE" | [false, false, false, false, false, false, false, false] + "017890" | "DE" | [false, false, false, false, false, false, false, false] + "017891" | "DE" | [false, false, false, false, false, false, false, false] + "017892" | "DE" | [false, false, false, false, false, false, false, false] + "017893" | "DE" | [false, false, false, false, false, false, false, false] + "017894" | "DE" | [false, false, false, false, false, false, false, false] + "017895" | "DE" | [false, false, false, false, false, false, false, false] + "017896" | "DE" | [false, false, false, false, false, false, false, false] + "017897" | "DE" | [false, false, false, false, false, false, false, false] + "017898" | "DE" | [false, false, false, false, false, false, false, false] // 017899 is reserved for voicemail - see tests below // // 0179 // - "01790" | "DE" | [false, false, true, false, false, false, true, false] - "01791" | "DE" | [false, false, true, false, false, false, true, false] - "01792" | "DE" | [false, false, true, false, false, false, true, false] - "017930" | "DE" | [false, false, true, false, false, false, true, false] - "017931" | "DE" | [false, false, true, false, false, false, true, false] - "017932" | "DE" | [false, false, true, false, false, false, true, false] + "01790" | "DE" | [false, false, false, false, false, false, false, false] + "01791" | "DE" | [false, false, false, false, false, false, false, false] + "01792" | "DE" | [false, false, false, false, false, false, false, false] + "017930" | "DE" | [false, false, false, false, false, false, false, false] + "017931" | "DE" | [false, false, false, false, false, false, false, false] + "017932" | "DE" | [false, false, false, false, false, false, false, false] // 017933 is reserved for voicemail - see tests below - "017934" | "DE" | [false, false, true, false, false, false, true, false] - "017935" | "DE" | [false, false, true, false, false, false, true, false] - "017936" | "DE" | [false, false, true, false, false, false, true, false] - "017937" | "DE" | [false, false, true, false, false, false, true, false] - "017938" | "DE" | [false, false, true, false, false, false, true, false] - "017939" | "DE" | [false, false, true, false, false, false, true, false] - "01794" | "DE" | [false, false, true, false, false, false, true, false] - "01795" | "DE" | [false, false, true, false, false, false, true, false] - "01796" | "DE" | [false, false, true, false, false, false, true, false] - "01797" | "DE" | [false, false, true, false, false, false, true, false] - "01798" | "DE" | [false, false, true, false, false, false, true, false] - "01799" | "DE" | [false, false, true, false, false, false, true, false] + "017934" | "DE" | [false, false, false, false, false, false, false, false] + "017935" | "DE" | [false, false, false, false, false, false, false, false] + "017936" | "DE" | [false, false, false, false, false, false, false, false] + "017937" | "DE" | [false, false, false, false, false, false, false, false] + "017938" | "DE" | [false, false, false, false, false, false, false, false] + "017939" | "DE" | [false, false, false, false, false, false, false, false] + "01794" | "DE" | [false, false, false, false, false, false, false, false] + "01795" | "DE" | [false, false, false, false, false, false, false, false] + "01796" | "DE" | [false, false, false, false, false, false, false, false] + "01797" | "DE" | [false, false, false, false, false, false, false, false] + "01798" | "DE" | [false, false, false, false, false, false, false, false] + "01799" | "DE" | [false, false, false, false, false, false, false, false] } def "check if original lib fixed isValid for German Mobile 17 range with voicemail infix"(String numberUntilInfix, regionCode, boolean[] expectingFails) { @@ -1917,8 +1917,18 @@ class IsValidNumberTest extends Specification { numberUntilInfix + "99999999", numberUntilInfix + "999999999"] - Boolean[] expectedResults = [false, true, true, false, - false, true, true, false] + Boolean[] expectedResults; + + // https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/LaengeRufnummernbloecke/start.html + // x: 6 length 8 otherwise 7 + if (numberUntilInfix.startsWith("0176")) { + expectedResults = [false, false, true, false, + false, false, true, false] + } + + expectedResults = [false, true, false, false, + false, true, false, false] + when: Boolean[] results = [] @@ -1936,51 +1946,51 @@ class IsValidNumberTest extends Specification { numberUntilInfix | regionCode | expectingFails // see https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/start.html // especially https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/Mobile%20Dienste/Nummernplan-2018-03-02.pdf?__blob=publicationFile&v=1 - // 017xyyyyyyy(y) x = block code, yyyyyyy(y) variable line lenx of 7 - 8 digits + // 017xyyyyyyy(y) x = block code, yyyyyyy(y) variable line len of 7 - 8 digits denping on x=6 // // 0170 // - "017013" | "DE" | [true, false, false, false, true, false, false, false] + "017013" | "DE" | [false, false, true, false, false, false, true, false] // // 0171 // - "017113" | "DE" | [true, false, false, false, true, false, false, false] + "017113" | "DE" | [false, false, true, false, false, false, true, false] // // 0172 // - "017250" | "DE" | [true, true, true, false, true, true, true, false] - "017255" | "DE" | [true, false,false, false, true, false, false, false] + "017250" | "DE" | [false, true, false, false, false, true, false, false] + "017255" | "DE" | [false, false, true, false, false, false, true, false] // // 0173 // - "017350" | "DE" | [true, true, true, false, true, true, true, false] - "017355" | "DE" | [true, false, false, false, true, false, false, false] + "017350" | "DE" | [false, true, false, false, false, true, false, false] + "017355" | "DE" | [false, false, true, false, false, false, true, false] // // 0174 // - "017450" | "DE" | [true, true, true, false, true, true, true, false] - "017455" | "DE" | [true, false, false, false, true, false, false, false] + "017450" | "DE" | [false, true, false, false, false, true, false, false] + "017455" | "DE" | [false, false, true, false, false, false, true, false] // // 0175 // - "017513" | "DE" | [true, false, false, false, true, false, false, false] + "017513" | "DE" | [false, false, true, false, false, false, true, false] // // 0176 // - "017633" | "DE" | [true, false, false, false, true, false, false, false] + "017633" | "DE" | [true, false, true, false, true, false, true, false] // // 0177 // - "017799" | "DE" | [true, false, false, false, true, false, false, false] + "017799" | "DE" | [false, false, true, false, false, false, true, false] // // 0178 // - "017899" | "DE" | [true, false, false, false, true, false, false, false] + "017899" | "DE" | [false, false, true, false, false, false, true, false] // // 0179 // - "017933" | "DE" | [true, false, false, false, true, false, false, false] + "017933" | "DE" | [false, false, true, false, false, false, true, false] } def "check if original lib fixed isValid for German ServiceNumbers 180 range"(String reserve, regionCode, boolean[] expectingFails) { From 31b9ecd517a2c69d73cb035e37a6263a26def6d4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 24 Oct 2024 12:33:46 +0200 Subject: [PATCH 42/98] Update deploy.yml try to fix deployment bug --- .github/workflows/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d5bb34c..d34af99 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,10 +21,10 @@ jobs: with: java-version: '11' server-id: ossrh - server-username: MAVEN_USERNAME - server-password: MAVEN_PASSWORD + server-username: ${{ secrets.OSSRH_USERNAME }} + server-password: ${{ secrets.OSSRH_TOKEN }} gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} - gpg-passphrase: MAVEN_GPG_PASSPHRASE + gpg-passphrase: ${{ secrets.MAVEN_GPG_PASSPHRASE }} - name: Deploy with Maven run: mvn -B clean deploy -Pci-cd env: From f62abd2856f5d3f353924c6ea3bebcbfd9760bba Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 24 Oct 2024 12:45:41 +0200 Subject: [PATCH 43/98] Update maven.yml Upgrade to new action for checkout --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 95b13b8..806e91b 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 11 uses: actions/setup-java@v3 with: From 86cc95935c337dccb1f5396aa9c3499a23b20a55 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 24 Oct 2024 12:49:02 +0200 Subject: [PATCH 44/98] Update maven.yml Update to use new setup-java action --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 806e91b..693216e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' From 1c83c69aae1374d935c0100c999f20bf9c7e8e22 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 24 Oct 2024 12:53:17 +0200 Subject: [PATCH 45/98] Update deploy.yml update to newest actions --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d34af99..89e5589 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -15,9 +15,9 @@ jobs: cat <(echo -e "${{ secrets.OSSRH_GPG_SECRET_KEY }}") | gpg --batch --import # Verify gpg secret key gpg --list-secret-keys --keyid-format LONG - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Maven Central Repository - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: java-version: '11' server-id: ossrh From 70a63e66cfbcfb4c34d8173cb2b8c0bffda29c4d Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 25 Oct 2024 21:44:10 +0200 Subject: [PATCH 46/98] Update deploy.yml --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 89e5589..832a4d7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,6 +20,7 @@ jobs: uses: actions/setup-java@v4 with: java-version: '11' + distribution: 'temurin' server-id: ossrh server-username: ${{ secrets.OSSRH_USERNAME }} server-password: ${{ secrets.OSSRH_TOKEN }} From 20973c66bd2e4f0314ce4b3bd2f3e5f1a4451c8e Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 25 Oct 2024 21:53:02 +0200 Subject: [PATCH 47/98] Update pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0a6864f..4321416 100644 --- a/pom.xml +++ b/pom.xml @@ -425,7 +425,7 @@ ossrh Central Repository OSSRH - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + https://oss.sonatype.org/service/local/staging/deploy/maven2/ - \ No newline at end of file + From 5dddf0faf2f1033482b4decdc8459b2756b9e391 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 25 Oct 2024 22:06:35 +0200 Subject: [PATCH 48/98] Update deploy.yml --- .github/workflows/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 832a4d7..10bff65 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,10 +22,10 @@ jobs: java-version: '11' distribution: 'temurin' server-id: ossrh - server-username: ${{ secrets.OSSRH_USERNAME }} - server-password: ${{ secrets.OSSRH_TOKEN }} + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} - gpg-passphrase: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Deploy with Maven run: mvn -B clean deploy -Pci-cd env: From 6be3947166e9fef32342ac42edad51b42bf3ea22 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 7 Nov 2024 11:00:12 +0100 Subject: [PATCH 49/98] Use PhoneLib 8.13.49 and prepare release --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4321416..1ef0edf 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ normalizer Phonenumber Normalizer Library to work with phonenumbers, especially to fix googles PhoneLib ignoring German Landline specifics. - 1.3.1 + 1.3.2 jar https://github.com/telekom/phonenumber-normalizer @@ -86,7 +86,7 @@ com.googlecode.libphonenumber libphonenumber - 8.13.48 + 8.13.49 @@ -150,7 +150,7 @@ com.googlecode.libphonenumber geocoder - 2.242 + 2.243 test From 5d9de6d68da3229bee5b726163d6e154753d5adf Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 1 May 2024 14:57:11 +0200 Subject: [PATCH 50/98] Prepare new class PhoneNumberValidator - currently just reusing PhoneLibWrapper to access PhoneLib logic. First testcase set taken from PhoneNumberNormalizer as starting point. Define expected behaviour and outcomment all testcases which currently do not work. Those can be used to test logic addition to capture more detailed behaviour than phone lib. After standard cases work, next phase will be to include special testcases from PhoneNumberUtil test folder. --- .../PhoneNumberValidator.java | 33 ++++ .../PhoneNumberValidatorImpl.java | 48 +++++ .../numberplans/PhoneLibWrapper.java | 53 ++++++ .../PhoneNumberValidationResult.java | 18 ++ .../PhoneNumberValidatorImplTest.groovy | 69 +++++++ .../numberplans/PhoneLibWrapperTest.groovy | 178 ++++++++++-------- 6 files changed, 319 insertions(+), 80 deletions(-) create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java create mode 100644 src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java new file mode 100644 index 0000000..e6d14bd --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java @@ -0,0 +1,33 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer; + +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; +import de.telekom.phonenumbernormalizer.dto.DeviceContext; + +/** + * An interface for dependency injection - for direct use within your code just use {@link PhoneNumberValidatorImpl}. + */ +public interface PhoneNumberValidator { + + /** + * Validates the number using PhoneLib with some additions to compensate. + * @param number plain number to validate + * @param regionCode ISO2 code of the country, which number-plan is used for normalization + * @return PhoneNumberValidationResult reason if the number is possible (and maybe its limited context) or why not. + */ + PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode); +} diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java new file mode 100644 index 0000000..66584e2 --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -0,0 +1,48 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer; + +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; +import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +/** + * Concrete implementation of {@link PhoneNumberValidator} using {@link PhoneLibWrapper} to validate a number by mitigating some inaccuracies when it comes to number plans of optional NDC and NAC as zero. + */ +@RequiredArgsConstructor +@Component +public class PhoneNumberValidatorImpl implements PhoneNumberValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(PhoneNumberValidatorImpl.class); + + + @Override + public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + + // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); + + // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + + return wrapper.validate(); + } + +} diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index cb80983..a760d7d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -349,4 +349,57 @@ public static String getRegionCodeForCountryCode(String countryCode) { } } + + /** + * Using PhoneLib to check the number by isPossibleWithReason code. If number has been parsed during initialization + * this is a straight invocation, so no compensation of some inaccuracy is done here. Otherwise, parsing is done + * locally and exceptions are directly mapped to a result. + *

+ * @return PhoneNumberUtil.ValidationResult which is PhoneLib isPossible Reason code + * + * @see PhoneLibWrapper#PhoneLibWrapper(String, String) + */ + private PhoneNumberUtil.ValidationResult isPossibleWithReason() { + if (semiNormalizedNumber == null) { + try { + Phonenumber.PhoneNumber tempNumber = phoneUtil.parse(dialableNumber, regionCode); + return phoneUtil.isPossibleNumberWithReason(tempNumber); + // international prefix is added by the lib even if it's not valid in the number plan. + } catch (NumberParseException e) { + LOGGER.info("could not parse normalize number: {}", dialableNumber); + LOGGER.debug("{}", e.getMessage()); + + switch (e.getErrorType()) { + case INVALID_COUNTRY_CODE: + return PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE; + case TOO_SHORT_NSN: + return PhoneNumberUtil.ValidationResult.TOO_SHORT; + case TOO_SHORT_AFTER_IDD: + return PhoneNumberUtil.ValidationResult.TOO_SHORT; + case TOO_LONG: + return PhoneNumberUtil.ValidationResult.TOO_LONG; + default: + // NOT_A_NUMBER + return PhoneNumberUtil.ValidationResult.INVALID_LENGTH; + } + } + } + return phoneUtil.isPossibleNumberWithReason(semiNormalizedNumber); + } + + + /** + * Using PhoneLib to check the number by isPossibleWithReason code by internal wrapper method isPossibleWithReason + * and map the result to PhoneNumberValidationResult type + * + * @return PhoneNumberValidationResult + * + * @see PhoneLibWrapper#isPossibleWithReason() + * @see PhoneNumberValidationResult + */ + public PhoneNumberValidationResult validate() { + return PhoneNumberValidationResult.byPhoneLibValidationResult(isPossibleWithReason()); + } + + } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index c108a3d..d2e204f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -143,6 +143,24 @@ public ValidationResult getPhoneLibValidationResult() { return phoneLibResult; } + public static PhoneNumberValidationResult byPhoneLibValidationResult(ValidationResult result) { + switch(result){ + case IS_POSSIBLE: + return PhoneNumberValidationResult.IS_POSSIBLE; + case IS_POSSIBLE_LOCAL_ONLY: + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + case INVALID_LENGTH: + return PhoneNumberValidationResult.INVALID_LENGTH; + case INVALID_COUNTRY_CODE: + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + case TOO_SHORT: + return PhoneNumberValidationResult.TOO_SHORT; + case TOO_LONG: + return PhoneNumberValidationResult.TOO_LONG; + } + return null; + } + /** * Returns if the validation result identifies a possible number regardless of calling limitations * @return boolean true for any IS_POSSIBLE(_xxx) enum value diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy new file mode 100644 index 0000000..b25dbc5 --- /dev/null +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -0,0 +1,69 @@ +/* + * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer + +import de.telekom.phonenumbernormalizer.dto.DeviceContext +import de.telekom.phonenumbernormalizer.dto.DeviceContextDto +import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult +import spock.lang.Specification + +class PhoneNumberValidatorImplTest extends Specification { + + PhoneNumberValidator target + + def "setup"() { + target = new PhoneNumberValidatorImpl() + } + + def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { + given: + + when: + "validate number: $number for country: $countryCode" + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + number | countryCode | expectedResult + null | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + // NDC+ national Romania numbers might be longer than 9 digits + "0040(0176) 3 0 6 9 6541" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040 176 3 0 6 9 6542" | "DE" | PhoneNumberValidationResult.TOO_LONG + "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + // "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + // "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + // "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + // "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + // "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + } + +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy index 8cc7151..cee9586 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy @@ -29,84 +29,84 @@ class PhoneLibWrapperTest extends Specification { def "national number and leading zeros"( number, regionCode, expectedResult) { given: - def result = "" - def pn = null - try { - pn = phoneUtil.parse(number, regionCode) - } catch (NumberParseException e) { - result = e.errorType.toString() - } + def result = "" + def pn = null + try { + pn = phoneUtil.parse(number, regionCode) + } catch (NumberParseException e) { + result = e.errorType.toString() + } when: - if (pn != null) { - result = PhoneLibWrapper.nationalPhoneNumberWithoutNationalPrefix(pn) - } + if (pn != null) { + result = PhoneLibWrapper.nationalPhoneNumberWithoutNationalPrefix(pn) + } then: - result == expectedResult + result == expectedResult where: - number | regionCode | expectedResult - "+49203556677" | "DE" | "203556677" - "0203556677" | "DE" | "203556677" - "203556677" | "DE" | "203556677" - "556677" | "DE" | "556677" - - "3784000" | "US" | "3784000" - "14253784000" | "US" | "4253784000" - "+14253784000" | "US" | "4253784000" - "01114253784000"| "US" | "4253784000" - - //special Short Code only valid in Australia, but retain in parsing for the others - "000" | "AU" | "000" - "000" | "DE" | "000" - "000" | "US" | "000" - "000" | "IT" | "000" - // shorter zero check - "00" | "AU" | "00" - "00" | "DE" | "TOO_SHORT_AFTER_IDD" // because IDC in Germany is 00 - "00" | "US" | "00" - "00" | "IT" | "TOO_SHORT_AFTER_IDD" // because IDC in Italy is 00 - //shorter zero check - just current PhoneLib behavior - "0" | "AU" | "NOT_A_NUMBER" // because its to short - "0" | "DE" | "NOT_A_NUMBER" // because its to short - "0" | "US" | "NOT_A_NUMBER" // because its to short - "0" | "IT" | "NOT_A_NUMBER" // because its to short - //shorter 1 check - just current PhoneLib behavior - "1" | "AU" | "NOT_A_NUMBER" // because its to short - "1" | "DE" | "NOT_A_NUMBER" // because its to short - "1" | "US" | "NOT_A_NUMBER" // because its to short - "1" | "IT" | "NOT_A_NUMBER" // because its to short - //shorter zero check - just current PhoneLib behavior - "01" | "AU" | "01" - "01" | "DE" | "01" - "01" | "US" | "01" - "01" | "IT" | "01" - - //Special Italian leading Zero within national number (and not) - "012345678" | "IT" | "012345678" - "+39012345678" | "IT" | "012345678" - "0039012345678" | "IT" | "012345678" - "+39012345678" | "DE" | "012345678" //Italy called from Germany - "0039012345678" | "DE" | "012345678" //Italy called from Germany - "+39012345678" | "US" | "012345678" //Italy called from North America - "01139012345678"| "US" | "012345678" //Italy called from North America - "312345678" | "IT" | "312345678" - "+39312345678" | "IT" | "312345678" - "0039312345678" | "IT" | "312345678" - "+39312345678" | "DE" | "312345678" //Italy called from Germany - "0039312345678" | "DE" | "312345678" //Italy called from Germany - "+39312345678" | "US" | "312345678" //Italy called from North America - "01139312345678"| "US" | "312345678" //Italy called from North America + number | regionCode | expectedResult + "+49203556677" | "DE" | "203556677" + "0203556677" | "DE" | "203556677" + "203556677" | "DE" | "203556677" + "556677" | "DE" | "556677" + + "3784000" | "US" | "3784000" + "14253784000" | "US" | "4253784000" + "+14253784000" | "US" | "4253784000" + "01114253784000"| "US" | "4253784000" + + //special Short Code only valid in Australia, but retain in parsing for the others + "000" | "AU" | "000" + "000" | "DE" | "000" + "000" | "US" | "000" + "000" | "IT" | "000" + // shorter zero check + "00" | "AU" | "00" + "00" | "DE" | "TOO_SHORT_AFTER_IDD" // because IDC in Germany is 00 + "00" | "US" | "00" + "00" | "IT" | "TOO_SHORT_AFTER_IDD" // because IDC in Italy is 00 + //shorter zero check - just current PhoneLib behavior + "0" | "AU" | "NOT_A_NUMBER" // because its to short + "0" | "DE" | "NOT_A_NUMBER" // because its to short + "0" | "US" | "NOT_A_NUMBER" // because its to short + "0" | "IT" | "NOT_A_NUMBER" // because its to short + //shorter 1 check - just current PhoneLib behavior + "1" | "AU" | "NOT_A_NUMBER" // because its to short + "1" | "DE" | "NOT_A_NUMBER" // because its to short + "1" | "US" | "NOT_A_NUMBER" // because its to short + "1" | "IT" | "NOT_A_NUMBER" // because its to short + //shorter zero check - just current PhoneLib behavior + "01" | "AU" | "01" + "01" | "DE" | "01" + "01" | "US" | "01" + "01" | "IT" | "01" + + //Special Italian leading Zero within national number (and not) + "012345678" | "IT" | "012345678" + "+39012345678" | "IT" | "012345678" + "0039012345678" | "IT" | "012345678" + "+39012345678" | "DE" | "012345678" //Italy called from Germany + "0039012345678" | "DE" | "012345678" //Italy called from Germany + "+39012345678" | "US" | "012345678" //Italy called from North America + "01139012345678"| "US" | "012345678" //Italy called from North America + "312345678" | "IT" | "312345678" + "+39312345678" | "IT" | "312345678" + "0039312345678" | "IT" | "312345678" + "+39312345678" | "DE" | "312345678" //Italy called from Germany + "0039312345678" | "DE" | "312345678" //Italy called from Germany + "+39312345678" | "US" | "312345678" //Italy called from North America + "01139312345678"| "US" | "312345678" //Italy called from North America } def "isNormalizingTried"( number, regionCode, expectedResult) { given: - target = new PhoneLibWrapper(number, regionCode) + target = new PhoneLibWrapper(number, regionCode) when: "isNormalizingTried: $number and $regionCode" - def result = target.isNormalizingTried() + def result = target.isNormalizingTried() then: "it should be: $expectedResult" - result == expectedResult + result == expectedResult where: number | regionCode | expectedResult @@ -246,42 +246,42 @@ class PhoneLibWrapperTest extends Specification { def "private extendNumberByDefaultAreaCodeAndCountryCode null"() { given: - target = new PhoneLibWrapper(null, "DE") + target = new PhoneLibWrapper(null, "DE") when: - def result = target.extendNumberByDefaultAreaCodeAndCountryCode(null, null) + def result = target.extendNumberByDefaultAreaCodeAndCountryCode(null, null) then: - assert result == null + assert result == null } def "parseNumber"( number, regionCode, expectedResult) { given: - target = new PhoneLibWrapper(number, regionCode) + target = new PhoneLibWrapper(number, regionCode) when: "parseNumber: $number and $regionCode" - def result = target.parseNumber(number, regionCode) + def result = target.parseNumber(number, regionCode) then: "it should normalize the number to: $expectedResult" - result == expectedResult + result == expectedResult where: - number | regionCode | expectedResult - null | null | null - "" | "" | null + number | regionCode | expectedResult + null | null | null + "" | "" | null } def "exception check for getMetadataForRegion: phoneUtil == null"(){ given: - //overriding read only attribute by .metaClass. access - target = new PhoneLibWrapper(null, "49") - target.metaClass.phoneUtil = null + //overriding read only attribute by .metaClass. access + target = new PhoneLibWrapper(null, "49") + target.metaClass.phoneUtil = null when: - def result = target.getMetadataForRegion() + def result = target.getMetadataForRegion() then: - assert result == null + assert result == null } def "getRegionCodeForCountryCode"(countryCode, expectedResult) { @@ -299,7 +299,25 @@ class PhoneLibWrapperTest extends Specification { "" | PhoneLibWrapper.UNKNOWN_REGIONCODE "invalid" | PhoneLibWrapper.UNKNOWN_REGIONCODE "49" | "DE" + } + def "test parsing within validate"(String number, String regionCode, expectedResult) { + given: + target = new PhoneLibWrapper(number, regionCode) + + when: + def result = target.isPossibleWithReason() + + then: + result == expectedResult + + where: + number | regionCode | expectedResult + "XXX" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH // NOT_A_NUMBER + "+99123456" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE // INVALID_COUNTRY_CODE + "+491" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT // TOO_SHORT_NSN + "0049" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT // TOO_SHORT_AFTER_IDD + "+492031234567891011" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG // TOO_LONG } } From c7ca9c4b1fbc13ff44ea04b98ecb4c93ace314e0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 1 May 2024 14:59:27 +0200 Subject: [PATCH 51/98] Update copyright year of initial setting --- .../de/telekom/phonenumbernormalizer/PhoneNumberValidator.java | 2 +- .../telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java | 2 +- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- .../numberplans/PhoneLibWrapperTest.groovy | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java index e6d14bd..272e3fe 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidator.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 66584e2..e407849 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index b25dbc5..47122ed 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy index cee9586..a3171ca 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Deutsche Telekom AG (opensource@telekom.de) + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From d18de770ac7884b345b6c4c9f60537d7750bd122 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 52/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 25 +++- .../numberplans/PhoneLibWrapper.java | 119 +++++++++++++++++- .../PhoneNumberValidatorImplTest.groovy | 24 ++-- 3 files changed, 149 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index e407849..60409fa 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -36,13 +36,36 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + if (number == null || number.length()==0) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + if (wrapper.startsWithIDP()) { // Country Exit Code is part + // IDP indicates CC is used + return wrapper.validate(); + //return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + // No Country Exit Code has been used, so no CC is following. + if (wrapper.getNationalAccessCode()=="") { + // no NAC is used in region + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } else { + // NAC can be used in region + if (wrapper.startsWithNAC()) { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + } + } + // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; - return wrapper.validate(); + // return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index a760d7d..fce333d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -28,7 +28,8 @@ /** * Wrapper around the PhoneLib library from Google *

- * Using reflection to access internal information to know if a region has a nation prefix & which one it is. + * Using reflection to access internal information to know if a region has a nation prefix & which one it is or + * which IDP is used. *

* Providing own NumberPlans logic as an alternative to PhoneLib ShortNumber. *

@@ -97,7 +98,7 @@ public class PhoneLibWrapper { */ public PhoneLibWrapper(String number, String regionCode) { this.regionCode = regionCode; - this.metadata = getMetadataForRegion(); + this.metadata = getMetadataForRegion(this.regionCode); if (number != null) { this.dialableNumber = PhoneNumberUtil.normalizeDiallableCharsOnly(number); @@ -231,6 +232,71 @@ static boolean isSpecialFormat(String value) { return ("+".equals(value.substring(0, 1))) || ("*".equals(value.substring(0, 1))); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed @@ -248,17 +314,58 @@ private static Phonenumber.PhoneNumber parseNumber(String number, String regionC } } + + private static String internationalDialingPrefix(Phonemetadata.PhoneMetadata metadata) { + if (metadata == null) { + return null; + } + return metadata.getInternationalPrefix(); + } + /** - * The National Access Code used before the National Destination Code in the given region from PhoneLib - * @return NAC of given {@link PhoneLibWrapper#regionCode} + * The International Dialing Prefix used in the given region from PhoneLib + * @return IDP of given {@link PhoneLibWrapper#regionCode} */ - public String getNationalAccessCode() { + public String getInternationalDialingPrefix() { + return internationalDialingPrefix(this.metadata); + } + + /** + * The International Dialing Prefix used in the given region from PhoneLib + * + * @param regionCode the Region which NAC is requested. + * @return IDP of given regionCode + */ + static public String getInternationalDialingPrefix(String regionCode) { + return internationalDialingPrefix(getMetadataForRegion(regionCode)); + } + + + private static String nationalAccessCode(Phonemetadata.PhoneMetadata metadata) { if (metadata == null) { return null; } return metadata.getNationalPrefix(); } + /** + * The National Access Code used before the National Destination Code in the given region from PhoneLib + * @return NAC of given {@link PhoneLibWrapper#regionCode} + */ + public String getNationalAccessCode() { + return nationalAccessCode(this.metadata); + } + + /** + * The National Access Code used before the National Destination Code in the given region from PhoneLib + * + * @param regionCode the Region which NAC is requested. + * @return NAC of given regionCode + */ + static public String getNationalAccessCode(String regionCode) { + return nationalAccessCode(getMetadataForRegion(regionCode)); + } + /** * From PhoneLib, if a National Access Code is used before the National Destination Code in the given region * @return if given {@link PhoneLibWrapper#regionCode} is using NAC @@ -273,7 +380,7 @@ public boolean hasRegionNationalAccessCode() { * and Google rejected suggestion to make it public, because they did not see our need in correcting normalization. * @return {@link Phonemetadata.PhoneMetadata} of {@link PhoneLibWrapper#regionCode} */ - private Phonemetadata.PhoneMetadata getMetadataForRegion() { + static private Phonemetadata.PhoneMetadata getMetadataForRegion(String regionCode) { try { Method m = phoneUtil.getClass().getDeclaredMethod("getMetadataForRegion", String.class); // violating encupsulation is intended by this method, so no need for SONAR code smell warning here diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 47122ed..7144941 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -49,21 +49,21 @@ class PhoneNumberValidatorImplTest extends Specification { "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - // "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - // "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - // "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - // "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - // "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - // "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY } } From c3f85f3052858310a37bcfe234dfd502b1713c27 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:44:23 +0200 Subject: [PATCH 53/98] Create Area Code Extractor (NDC) for Germany. --- .../NVONB.INTERNET.20220727.ONB.csv | 5204 ++++ .../GermanAreaCodeExtractor/main.py | 82 + .../constants/GermanAreaCodeExtractor.java | 21596 ++++++++++++++++ .../GermanAreaCodeExtractorTest.groovy | 44 + 4 files changed, 26926 insertions(+) create mode 100644 src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv create mode 100644 src/generators/GermanAreaCodeExtractor/main.py create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java create mode 100644 src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy diff --git a/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv b/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv new file mode 100644 index 0000000..4e805f5 --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/NVONB.INTERNET.20220727.ONB.csv @@ -0,0 +1,5204 @@ +Ortsnetzkennzahl;Ortsnetzname;KennzeichenAktiv +201;Essen;1 +202;Wuppertal;1 +203;Duisburg;1 +2041;Bottrop;1 +2043;Gladbeck;1 +2045;Bottrop-Kirchhellen;1 +2051;Velbert;1 +2052;Velbert-Langenberg;1 +2053;Velbert-Neviges;1 +2054;Essen-Kettwig;1 +2056;Heiligenhaus;1 +2058;Wülfrath;1 +2064;Dinslaken;1 +2065;Duisburg-Rheinhausen;1 +2066;Duisburg-Homberg;1 +208;Oberhausen Rheinl;1 +209;Gelsenkirchen;1 +2102;Ratingen;1 +2103;Hilden;1 +2104;Mettmann;1 +211;Düsseldorf;1 +212;Solingen;1 +2129;Haan Rheinl;1 +2131;Neuss;1 +2132;Meerbusch-Büderich;1 +2133;Dormagen;1 +2137;Neuss-Norf;1 +214;Leverkusen;1 +2150;Meerbusch-Lank;1 +2151;Krefeld;1 +2152;Kempen;1 +2153;Nettetal-Lobberich;1 +2154;Willich;1 +2156;Willich-Anrath;1 +2157;Nettetal-Kaldenkirchen;1 +2158;Grefrath b Krefeld;1 +2159;Meerbusch-Osterath;1 +2161;Mönchengladbach;1 +2162;Viersen;1 +2163;Schwalmtal Niederrhein;1 +2164;Jüchen-Otzenrath;1 +2165;Jüchen;1 +2166;Mönchengladbach-Rheydt;1 +2171;Leverkusen-Opladen;1 +2173;Langenfeld Rheinland;1 +2174;Burscheid Rheinl;1 +2175;Leichlingen Rheinland;1 +2181;Grevenbroich;1 +2182;Grevenbroich-Kapellen;1 +2183;Rommerskirchen;1 +2191;Remscheid;1 +2192;Hückeswagen;1 +2193;Dabringhausen;1 +2195;Radevormwald;1 +2196;Wermelskirchen;1 +2202;Bergisch Gladbach;1 +2203;Köln-Porz;1 +2204;Bensberg;1 +2205;Rösrath;1 +2206;Overath;1 +2207;Kürten-Dürscheid;1 +2208;Niederkassel;1 +221;Köln;1 +2222;Bornheim Rheinl;1 +2223;Königswinter;1 +2224;Bad Honnef;1 +2225;Meckenheim Rheinl;1 +2226;Rheinbach;1 +2227;Bornheim-Merten;1 +2228;Remagen-Rolandseck;1 +2232;Brühl Rheinl;1 +2233;Hürth Rheinl;1 +2234;Frechen;1 +2235;Erftstadt;1 +2236;Wesseling Rheinl;1 +2237;Kerpen Rheinl-Türnich;1 +2238;Pulheim;1 +2241;Siegburg;1 +2242;Hennef Sieg;1 +2243;Eitorf;1 +2244;Königswinter-Oberpleis;1 +2245;Much;1 +2246;Lohmar Rheinland;1 +2247;Neunkirchen-Seelscheid;1 +2248;Hennef-Uckerath;1 +2251;Euskirchen;1 +2252;Zülpich;1 +2253;Bad Münstereifel;1 +2254;Weilerswist;1 +2255;Euskirchen-Flamersheim;1 +2256;Mechernich-Satzvey;1 +2257;Reckerscheid;1 +2261;Gummersbach;1 +2262;Wiehl;1 +2263;Engelskirchen;1 +2264;Marienheide;1 +2265;Reichshof-Eckenhagen;1 +2266;Lindlar;1 +2267;Wipperfürth;1 +2268;Kürten;1 +2269;Kierspe-Rönsahl;1 +2271;Bergheim Erft;1 +2272;Bedburg Erft;1 +2273;Kerpen-Horrem;1 +2274;Elsdorf Rheinl;1 +2275;Kerpen-Buir;1 +228;Bonn;1 +2291;Waldbröl;1 +2292;Windeck Sieg;1 +2293;Nümbrecht;1 +2294;Morsbach Sieg;1 +2295;Ruppichteroth;1 +2296;Reichshof-Brüchermühle;1 +2297;Wildbergerhütte;1 +2301;Holzwickede;1 +2302;Witten;1 +2303;Unna;1 +2304;Schwerte;1 +2305;Castrop-Rauxel;1 +2306;Lünen;1 +2307;Kamen;1 +2308;Unna-Hemmerde;1 +2309;Waltrop;1 +231;Dortmund;1 +2323;Herne;1 +2324;Hattingen Ruhr;1 +2325;Wanne-Eickel;1 +2327;Bochum-Wattenscheid;1 +2330;Herdecke;1 +2331;Hagen Westf;1 +2332;Gevelsberg;1 +2333;Ennepetal;1 +2334;Hagen-Hohenlimburg;1 +2335;Wetter Ruhr;1 +2336;Schwelm;1 +2337;Hagen-Dahl;1 +2338;Breckerfeld;1 +2339;Sprockhövel-Haßlinghausen;1 +234;Bochum;1 +2351;Lüdenscheid;1 +2352;Altena Westf;1 +2353;Halver;1 +2354;Meinerzhagen;1 +2355;Schalksmühle;1 +2357;Herscheid Westf;1 +2358;Meinerzhagen-Valbert;1 +2359;Kierspe;1 +2360;Haltern-Lippramsdorf;1 +2361;Recklinghausen;1 +2362;Dorsten;1 +2363;Datteln;1 +2364;Haltern Westf;1 +2365;Marl;1 +2366;Herten Westf;1 +2367;Henrichenburg;1 +2368;Oer-Erkenschwick;1 +2369;Dorsten-Wulfen;1 +2371;Iserlohn;1 +2372;Hemer;1 +2373;Menden Sauerland;1 +2374;Iserlohn-Letmathe;1 +2375;Balve;1 +2377;Wickede Ruhr;1 +2378;Fröndenberg-Langschede;1 +2379;Menden-Asbeck;1 +2381;Hamm Westf;1 +2382;Ahlen Westf;1 +2383;Bönen;1 +2384;Welver;1 +2385;Hamm-Rhynern;1 +2387;Drensteinfurt-Walstedde;1 +2388;Hamm-Uentrop;1 +2389;Werne;1 +2391;Plettenberg;1 +2392;Werdohl;1 +2393;Sundern-Allendorf;1 +2394;Neuenrade-Affeln;1 +2395;Finnentrop-Rönkhausen;1 +2401;Baesweiler;1 +2402;Stolberg Rheinl;1 +2403;Eschweiler Rheinl;1 +2404;Alsdorf Rheinl;1 +2405;Würselen;1 +2406;Herzogenrath;1 +2407;Herzogenrath-Kohlscheid;1 +2408;Aachen-Kornelimünster;1 +2409;Stolberg-Gressenich;1 +241;Aachen;1 +2421;Düren;1 +2422;Kreuzau;1 +2423;Langerwehe;1 +2424;Vettweiss;1 +2425;Nideggen-Embken;1 +2426;Nörvenich;1 +2427;Nideggen;1 +2428;Niederzier;1 +2429;Hürtgenwald;1 +2431;Erkelenz;1 +2432;Wassenberg;1 +2433;Hückelhoven;1 +2434;Wegberg;1 +2435;Erkelenz-Lövenich;1 +2436;Wegberg-Rödgen;1 +2440;Nettersheim-Tondorf;1 +2441;Kall;1 +2443;Mechernich;1 +2444;Schleiden-Gemünd;1 +2445;Schleiden Eifel;1 +2446;Heimbach Eifel;1 +2447;Dahlem b Kall;1 +2448;Hellenthal-Rescheid;1 +2449;Blankenheim Ahr;1 +2451;Geilenkirchen;1 +2452;Heinsberg Rheinl;1 +2453;Heinsberg-Randerath;1 +2454;Gangelt;1 +2455;Waldfeucht;1 +2456;Selfkant;1 +2461;Jülich;1 +2462;Linnich;1 +2463;Titz;1 +2464;Aldenhoven b Jülich;1 +2465;Inden;1 +2471;Roetgen Eifel;1 +2472;Monschau;1 +2473;Simmerath;1 +2474;Nideggen-Schmidt;1 +2482;Hellenthal;1 +2484;Mechernich-Eiserfey;1 +2485;Schleiden-Dreiborn;1 +2486;Nettersheim;1 +2501;Münster-Hiltrup;1 +2502;Nottuln;1 +2504;Telgte;1 +2505;Altenberge Westf;1 +2506;Münster-Wolbeck;1 +2507;Havixbeck;1 +2508;Drensteinfurt;1 +2509;Nottuln-Appelhülsen;1 +251;Münster;1 +2520;Wadersloh-Diestedde;1 +2521;Beckum;1 +2522;Oelde;1 +2523;Wadersloh;1 +2524;Ennigerloh;1 +2525;Beckum-Neubeckum;1 +2526;Sendenhorst;1 +2527;Lippetal-Lippborg;1 +2528;Ennigerloh-Enniger;1 +2529;Oelde-Stromberg;1 +2532;Ostbevern;1 +2533;Münster-Nienberge;1 +2534;Münster-Roxel;1 +2535;Sendenhorst-Albersloh;1 +2536;Münster-Albachten;1 +2538;Drensteinfurt-Rinkerode;1 +2541;Coesfeld;1 +2542;Gescher;1 +2543;Billerbeck Westf;1 +2545;Rosendahl-Darfeld;1 +2546;Coesfeld-Lette;1 +2547;Rosendahl-Osterwick;1 +2548;Dülmen-Rorup;1 +2551;Steinfurt-Burgsteinfurt;1 +2552;Steinfurt-Borghorst;1 +2553;Ochtrup;1 +2554;Laer Kr Steinfurt;1 +2555;Schöppingen;1 +2556;Metelen;1 +2557;Wettringen Kr Steinfurt;1 +2558;Horstmar;1 +2561;Ahaus;1 +2562;Gronau Westfalen;1 +2563;Stadtlohn;1 +2564;Vreden;1 +2565;Gronau-Epe;1 +2566;Legden;1 +2567;Ahaus-Alstätte;1 +2568;Heek;1 +2571;Greven Westf;1 +2572;Emsdetten;1 +2573;Nordwalde;1 +2574;Saerbeck;1 +2575;Greven-Reckenfeld;1 +2581;Warendorf;1 +2582;Everswinkel;1 +2583;Sassenberg;1 +2584;Warendorf-Milte;1 +2585;Warendorf-Hoetmar;1 +2586;Beelen;1 +2587;Ennigerloh-Westkirchen;1 +2588;Harsewinkel-Greffen;1 +2590;Dülmen-Buldern;1 +2591;Lüdinghausen;1 +2592;Selm;1 +2593;Ascheberg Westf;1 +2594;Dülmen;1 +2595;Olfen;1 +2596;Nordkirchen;1 +2597;Senden Westf;1 +2598;Senden-Ottmarsbocholt;1 +2599;Ascheberg-Herbern;1 +2601;Nauort;1 +2602;Montabaur;1 +2603;Bad Ems;1 +2604;Nassau Lahn;1 +2605;Löf;1 +2606;Winningen Mosel;1 +2607;Kobern-Gondorf;1 +2608;Welschneudorf;1 +261;Koblenz a Rhein;1 +2620;Neuhäusel Westerw;1 +2621;Lahnstein;1 +2622;Bendorf Rhein;1 +2623;Ransbach-Baumbach;1 +2624;Höhr-Grenzhausen;1 +2625;Ochtendung;1 +2626;Selters Westferwald;1 +2627;Braubach;1 +2628;Rhens;1 +2630;Mülheim-Kärlich;1 +2631;Neuwied;1 +2632;Andernach;1 +2633;Brohl-Lützing;1 +2634;Rengsdorf;1 +2635;Rheinbrohl;1 +2636;Burgbrohl;1 +2637;Weissenthurm;1 +2638;Waldbreitbach;1 +2639;Anhausen Kr Neuwied;1 +2641;Bad Neuenahr-Ahrweiler;1 +2642;Remagen;1 +2643;Altenahr;1 +2644;Linz am Rhein;1 +2645;Vettelschoss;1 +2646;Königsfeld Eifel;1 +2647;Kesseling;1 +2651;Mayen;1 +2652;Mendig;1 +2653;Kaisersesch;1 +2654;Polch;1 +2655;Weibern;1 +2656;Virneburg;1 +2657;Uersfeld;1 +2661;Bad Marienberg Westerwald;1 +2662;Hachenburg;1 +2663;Westerburg Westerw;1 +2664;Rennerod;1 +2666;Freilingen Westerw;1 +2667;Stein-Neukirch;1 +2671;Cochem;1 +2672;Treis-Karden;1 +2673;Ellenz-Poltersdorf;1 +2674;Bad Bertrich;1 +2675;Ediger-Eller;1 +2676;Ulmen;1 +2677;Lutzerath;1 +2678;Büchel b Cochem;1 +2680;Mündersbach;1 +2681;Altenkirchen Westerwald;1 +2682;Hamm Sieg;1 +2683;Asbach Westerw;1 +2684;Puderbach Westerw;1 +2685;Flammersfeld;1 +2686;Weyerbusch;1 +2687;Horhausen Westerwald;1 +2688;Kroppach;1 +2689;Dierdorf;1 +2691;Adenau;1 +2692;Kelberg;1 +2693;Antweiler;1 +2694;Wershofen;1 +2695;Insul;1 +2696;Nohn Eifel;1 +2697;Blankenheim-Ahrhütte;1 +271;Siegen;1 +2721;Lennestadt;1 +2722;Attendorn;1 +2723;Kirchhundem;1 +2724;Finnentrop-Serkenrode;1 +2725;Lennestadt-Oedingen;1 +2732;Kreuztal;1 +2733;Hilchenbach;1 +2734;Freudenberg Westf;1 +2735;Neunkirchen Siegerl;1 +2736;Burbach Siegerl;1 +2737;Netphen-Deuz;1 +2738;Netphen;1 +2739;Wilnsdorf;1 +2741;Betzdorf;1 +2742;Wissen;1 +2743;Daaden;1 +2744;Herdorf;1 +2745;Brachbach Sieg;1 +2747;Molzhain;1 +2750;Diedenshausen;1 +2751;Bad Berleburg;1 +2752;Bad Laasphe;1 +2753;Erndtebrück;1 +2754;Bad Laasphe-Feudingen;1 +2755;Bad Berleburg-Schwarzenau;1 +2758;Bad Berleburg-Girkhausen;1 +2759;Bad Berleburg-Aue;1 +2761;Olpe Biggesee;1 +2762;Wenden Südsauerland;1 +2763;Drolshagen-Bleche;1 +2764;Welschen Ennest;1 +2770;Eschenburg;1 +2771;Dillenburg;1 +2772;Herborn Hess;1 +2773;Haiger;1 +2774;Dietzhölztal;1 +2775;Driedorf;1 +2776;Bad Endbach-Hartenrod;1 +2777;Breitscheid Hess;1 +2778;Siegbach;1 +2779;Greifenstein-Beilstein;1 +2801;Xanten;1 +2802;Alpen;1 +2803;Wesel-Büderich;1 +2804;Xanten-Marienbaum;1 +281;Wesel;1 +2821;Kleve Niederrhein;1 +2822;Emmerich;1 +2823;Goch;1 +2824;Kalkar;1 +2825;Uedem;1 +2826;Kranenburg Niederrhein;1 +2827;Goch-Hassum;1 +2828;Emmerich-Elten;1 +2831;Geldern;1 +2832;Kevelaer;1 +2833;Kerken;1 +2834;Straelen;1 +2835;Issum;1 +2836;Wachtendonk;1 +2837;Weeze;1 +2838;Sonsbeck;1 +2839;Straelen-Herongen;1 +2841;Moers;1 +2842;Kamp-Lintfort;1 +2843;Rheinberg;1 +2844;Rheinberg-Orsoy;1 +2845;Neukirchen-Vluyn;1 +2850;Rees-Haldern;1 +2851;Rees;1 +2852;Hamminkeln;1 +2853;Schermbeck;1 +2855;Voerde Niederrhein;1 +2856;Hamminkeln-Brünen;1 +2857;Rees-Mehr;1 +2858;Hünxe;1 +2859;Wesel-Bislich;1 +2861;Borken Westf;1 +2862;Südlohn;1 +2863;Velen;1 +2864;Reken;1 +2865;Raesfeld;1 +2866;Dorsten-Rhade;1 +2867;Heiden Kr Borken;1 +2871;Bocholt;1 +2872;Rhede Westf;1 +2873;Isselburg-Werth;1 +2874;Isselburg;1 +2902;Warstein;1 +2903;Meschede-Freienohl;1 +2904;Bestwig;1 +2905;Bestwig-Ramsbeck;1 +291;Meschede;1 +2921;Soest;1 +2922;Werl;1 +2923;Lippetal-Herzfeld;1 +2924;Möhnesee;1 +2925;Warstein-Allagen;1 +2927;Neuengeseke;1 +2928;Soest-Ostönnen;1 +2931;Arnsberg;1 +2932;Neheim-Hüsten;1 +2933;Sundern Sauerland;1 +2934;Sundern-Altenhellefeld;1 +2935;Sundern-Hachen;1 +2937;Arnsberg-Oeventrop;1 +2938;Ense;1 +2941;Lippstadt;1 +2942;Geseke;1 +2943;Erwitte;1 +2944;Rietberg-Mastholte;1 +2945;Lippstadt-Benninghausen;1 +2947;Anröchte;1 +2948;Lippstadt-Rebbeke;1 +2951;Büren;1 +2952;Rüthen;1 +2953;Wünnenberg;1 +2954;Rüthen-Oestereiden;1 +2955;Büren-Wewelsburg;1 +2957;Wünnenberg-Haaren;1 +2958;Büren-Harth;1 +2961;Brilon;1 +2962;Olsberg;1 +2963;Brilon-Messinghausen;1 +2964;Brilon-Alme;1 +2971;Schmallenberg-Dorlar;1 +2972;Schmallenberg;1 +2973;Eslohe Sauerland;1 +2974;Schmallenberg-Fredeburg;1 +2975;Schmallenberg-Oberkirchen;1 +2977;Schmallenberg-Bödefeld;1 +2981;Winterberg Westf;1 +2982;Medebach;1 +2983;Winterberg-Siedlinghausen;1 +2984;Hallenberg;1 +2985;Winterberg-Niedersfeld;1 +2991;Marsberg-Bredelar;1 +2992;Marsberg;1 +2993;Marsberg-Canstein;1 +2994;Marsberg-Westheim;1 +30;Berlin;1 +3301;Oranienburg;1 +3302;Hennigsdorf;1 +3303;Birkenwerder;1 +3304;Velten;1 +33051;Nassenheide;1 +33052;Leegebruch;0 +33053;Zehlendorf Kr Oberhavel;1 +33054;Liebenwalde;1 +33055;Kremmen;1 +33056;Mühlenbeck Kr Oberhavel;1 +3306;Gransee;1 +3307;Zehdenick;1 +33080;Marienthal Kr Oberhavel;1 +33082;Menz Kr Oberhavel;1 +33083;Schulzendorf Kr Oberhavel;1 +33084;Gutengermendorf;1 +33085;Seilershof;1 +33086;Grieben Kr Oberhavel;1 +33087;Bredereiche;1 +33088;Falkenthal;1 +33089;Himmelpfort;1 +33093;Fürstenberg Havel;1 +33094;Löwenberg;1 +331;Potsdam;1 +33200;Bergholz-Rehbrücke;1 +33201;Gross Glienicke;1 +33202;Töplitz;1 +33203;Kleinmachnow;1 +33204;Beelitz Mark;1 +33205;Michendorf;1 +33206;Fichtenwalde;1 +33207;Gross Kreutz;1 +33208;Fahrland;1 +33209;Caputh;1 +3321;Nauen Brandenb;1 +3322;Falkensee;1 +33230;Börnicke Kr Havelland;1 +33231;Pausin;1 +33232;Brieselang;1 +33233;Ketzin;1 +33234;Wustermark;1 +33235;Friesack;1 +33237;Paulinenaue;1 +33238;Senzke;1 +33239;Gross Behnitz;1 +3327;Werder Havel;1 +3328;Teltow;1 +3329;Stahnsdorf;1 +3331;Angermünde;1 +3332;Schwedt/Oder;1 +33331;Casekow;1 +33332;Gartz Oder;1 +33333;Tantow;1 +33334;Greiffenberg;1 +33335;Pinnow Kr Uckermark;1 +33336;Passow Kr Uckermark;1 +33337;Altkünkendorf;1 +33338;Stolpe/Oder;1 +3334;Eberswalde;1 +3335;Finowfurt;1 +33361;Joachimsthal;1 +33362;Liepe Kr Barnim;1 +33363;Altenhof Kr Barnim;1 +33364;Gross Ziethen Kr Barnim;1 +33365;Lüdersdorf Kr Barnim;1 +33366;Chorin;1 +33367;Friedrichswalde Brandenb;1 +33368;Hohensaaten;1 +33369;Oderberg;1 +3337;Biesenthal Brandenb;1 +3338;Bernau Brandenb;1 +33393;Gross Schönebeck Kr Barnim;1 +33394;Blumberg Kr Barnim;1 +33395;Zerpenschleuse;1 +33396;Klosterfelde;1 +33397;Wandlitz;1 +33398;Werneuchen;1 +3341;Strausberg;1 +3342;Neuenhagen b Berlin;1 +33432;Müncheberg;1 +33433;Buckow Märk Schweiz;1 +33434;Herzfelde b Strausberg;1 +33435;Rehfelde;1 +33436;Prötzel;1 +33437;Reichenberg b Strausberg;1 +33438;Altlandsberg;1 +33439;Fredersdorf-Vogelsdorf;1 +3344;Bad Freienwalde;1 +33451;Heckelberg;1 +33452;Neulewin;1 +33454;Wölsickendorf/Wollenberg;1 +33456;Wriezen;1 +33457;Altreetz;1 +33458;Falkenberg Mark;1 +3346;Seelow;1 +33470;Lietzen;1 +33472;Golzow b Seelow;1 +33473;Zechin;1 +33474;Neutrebbin;1 +33475;Letschin;1 +33476;Neuhardenberg;1 +33477;Trebnitz b Müncheberg;1 +33478;Gross Neuendorf;1 +33479;Küstrin-Kietz;1 +335;Frankfurt (Oder);1 +33601;Podelzig;1 +33602;Alt Zeschdorf;1 +33603;Falkenhagen b Seelow;1 +33604;Lebus;1 +33605;Boossen;1 +33606;Müllrose;1 +33607;Briesen Mark;1 +33608;Jacobsdorf Mark;1 +33609;Brieskow-Finkenheerd;1 +3361;Fürstenwalde Spree;1 +3362;Erkner;1 +33631;Bad Saarow-Pieskow;1 +33632;Hangelsberg;1 +33633;Spreenhagen;1 +33634;Berkenbrück Kr Oder-Spree;1 +33635;Arensdorf Kr Oder-Spree;1 +33636;Steinhöfel Kr Oder-Spree;1 +33637;Beerfelde;1 +33638;Rüdersdorf b Berlin;1 +3364;Eisenhüttenstadt;1 +33652;Neuzelle;1 +33653;Ziltendorf;1 +33654;Fünfeichen;1 +33655;Grunow Kr Oder-Spree;1 +33656;Bahro;1 +33657;Steinsdorf Brandenb;1 +3366;Beeskow;1 +33671;Lieberose;1 +33672;Pfaffendorfb Beeskow;1 +33673;Weichensdorf;1 +33674;Trebatsch;1 +33675;Tauche;1 +33676;Friedland b Beeskow;1 +33677;Glienicke b Beeskow;1 +33678;Storkow Mark;1 +33679;Wendisch Rietz;1 +33701;Grossbeeren;1 +33702;Wünsdorf;1 +33703;Sperenberg;1 +33704;Baruth Mark;1 +33708;Rangsdorf;1 +3371;Luckenwalde;1 +3372;Jüterbog;1 +33731;Trebbin;1 +33732;Hennickendorf b Luckenwalde;1 +33733;Stülpe;1 +33734;Felgentreu;1 +33741;Niedergörsdorf;1 +33742;Oehna Brandenb;1 +33743;Blönsdorf;1 +33744;Hohenseefeld;1 +33745;Petkus;1 +33746;Werbig b Jüterbog;1 +33747;Marzahna;1 +33748;Treuenbrietzen;1 +3375;Königs Wusterhausen;1 +33760;Münchehofe Kr Dahme-Spreewald;1 +33762;Zeuthen;1 +33763;Bestensee;1 +33764;Mittenwalde Mark;1 +33765;Märkisch Buchholz;1 +33766;Teupitz;1 +33767;Friedersdorf b Berlin;1 +33768;Prieros;1 +33769;Töpchin;1 +3377;Zossen Brandenb;1 +3378;Ludwigsfelde;1 +3379;Mahlow;1 +3381;Brandenburg an der Havel;1 +3382;Lehnin;1 +33830;Ziesar;1 +33831;Weseram;1 +33832;Rogäsen;1 +33833;Wollin b Brandenburg;1 +33834;Pritzerbe;1 +33835;Golzow b Brandenburg;1 +33836;Butzow b Brandenburg;1 +33837;Brielow;1 +33838;Päwesin;1 +33839;Wusterwitz;1 +33841;Belzig;1 +33843;Niemegk;1 +33844;Brück Brandenb;1 +33845;Borkheide;1 +33846;Dippmannsdorf;1 +33847;Görzke;1 +33848;Raben;1 +33849;Wiesenburg Mark;1 +3385;Rathenow;1 +3386;Premnitz;1 +33870;Zollchow b Rathenow;1 +33872;Hohennauen;1 +33873;Grosswudicke;1 +33874;Stechow Brandenb;1 +33875;Rhinow;1 +33876;Buschow;1 +33877;Nitzahn;1 +33878;Nennhausen;1 +3391;Neuruppin;1 +33920;Walsleben b Neuruppin;1 +33921;Zechlinerhütte;1 +33922;Karwesee;1 +33923;Flecken Zechlin;1 +33924;Rägelin;1 +33925;Wustrau-Altfriesack;1 +33926;Herzberg Mark;1 +33927;Linum;0 +33928;Wildberg Brandenb;1 +33929;Gühlen-Glienicke;1 +33931;Rheinsberg Mark;1 +33932;Fehrbellin;1 +33933;Lindow Mark;1 +3394;Wittstock Dosse;1 +3395;Pritzwalk;1 +33962;Heiligengrabe;1 +33963;Wulfersdorf b Wittstock;1 +33964;Fretzdorf;1 +33965;Herzsprung b Wittstock;1 +33966;Dranse;1 +33967;Freyenstein;1 +33968;Meyenburg Kr Prignitz;1 +33969;Stepenitz;1 +33970;Neustadt Dosse;1 +33971;Kyritz Brandenb;1 +33972;Breddin;1 +33973;Zernitz b Neustadt Dosse;1 +33974;Dessow;1 +33975;Dannenwalde Kr Prignitz;1 +33976;Wutike;1 +33977;Gumtow;1 +33978;Segeletz;1 +33979;Wusterhausen Dosse;1 +33981;Putlitz;1 +33982;Hoppenrade Kr Prignitz;1 +33983;Gross Pankow Kr Prignitz;1 +33984;Blumenthal b Pritzwalk;1 +33986;Falkenhagen Kr Prignitz;1 +33989;Sadenbeck;1 +340;Dessau Anh;1 +341;Leipzig;1 +34202;Delitzsch;1 +34203;Zwenkau;1 +34204;Schkeuditz;1 +34205;Markranstädt;1 +34206;Rötha;1 +34207;Zwochau;1 +34208;Löbnitz B Delitzsch;1 +3421;Torgau;1 +34221;Schildau Gneisenaustadt;1 +34222;Arzberg b Torgau;1 +34223;Dommitzsch;1 +34224;Belgern Sachs;1 +3423;Eilenburg;1 +34241;Jesewitz;1 +34242;Hohenpriessnitz;1 +34243;Bad Düben;1 +34244;Mockrehna;1 +3425;Wurzen;1 +34261;Kühren b Wurzen;1 +34262;Falkenhain b Wurzen;1 +34263;Hohburg;1 +34291;Borsdorf;1 +34292;Brandis b Wurzen;1 +34293;Naunhof b Grimma;1 +34294;Rackwitz;1 +34295;Krensitz;1 +34296;Groitzsch b Pegau;1 +34297;Liebertwolkwitz;1 +34298;Taucha b Leipzig;1 +34299;Gaschwitz;1 +3431;Döbeln;1 +34321;Leisnig;1 +34322;Rosswein;1 +34324;Ostrau Sachs;1 +34325;Mochau-Lüttewitz;1 +34327;Waldheim Sachs;1 +34328;Hartha b Döbeln;1 +3433;Borna Stadt;1 +34341;Geithain;1 +34342;Neukieritzsch;1 +34343;Regis-Breitingen;1 +34344;Kohren-Sahlis;1 +34345;Bad Lausick;1 +34346;Narsdorf;1 +34347;Oelzschau b Borna;1 +34348;Frohburg;1 +3435;Oschatz;1 +34361;Dahlen Sachs;1 +34362;Mügeln b Oschatz;1 +34363;Cavertitz;1 +34364;Wermsdorf;1 +3437;Grimma;1 +34381;Colditz;1 +34382;Nerchau;1 +34383;Trebsen Mulde;1 +34384;Grossbothen;1 +34385;Mutzschen;1 +34386;Dürrweitzschen B Grimma;1 +3441;Zeitz;1 +34422;Osterfeld;1 +34423;Heuckewalde;1 +34424;Reuden b Zeitz;1 +34425;Droyssig;1 +34426;Kayna;1 +3443;Weissenfels Sachs-Anh;1 +34441;Hohenmölsen;1 +34443;Teuchern;1 +34444;Lützen;1 +34445;Stößen;1 +34446;Grosskorbetha;1 +3445;Naumburg Saale;1 +34461;Nebra Unstrut;1 +34462;Laucha Unstrut;1 +34463;Bad Kösen;1 +34464;Freyburg Unstrut;1 +34465;Bad Bibra;1 +34466;Janisroda;1 +34467;Eckartsberga;1 +3447;Altenburg Thür;1 +3448;Meuselwitz Thür;1 +34491;Schmölln Thür;1 +34492;Lucka;1 +34493;Gößnitz Thür;1 +34494;Ehrenhain;1 +34495;Dobitschen;1 +34496;Nöbdenitz;1 +34497;Langenleuba-Niederhain;1 +34498;Rositz;1 +345;Halle Saale;1 +34600;Ostrau Saalkreis;1 +34601;Teutschenthal;1 +34602;Landsberg Sachs-Anh;1 +34603;Nauendorf Sachs-Anh;1 +34604;Niemberg;1 +34605;Gröbers;1 +34606;Teicha Sachs-Anh;1 +34607;Wettin;1 +34609;Salzmünde;1 +3461;Merseburg Saale;1 +3462;Bad Dürrenberg;1 +34632;Mücheln Geiseltal;1 +34633;Braunsbedra;1 +34635;Bad Lauchstädt;1 +34636;Schafstädt;1 +34637;Frankleben;1 +34638;Zöschen;1 +34639;Wallendorf Luppe;1 +3464;Sangerhausen;1 +34651;Rossla;1 +34652;Allstedt;1 +34653;Rottleberode;1 +34654;Stolberg Harz;1 +34656;Wallhausen Sachs-Anh;1 +34658;Hayn Harz;1 +34659;Blankenheim b Sangerhausen;1 +3466;Artern Unstrut;1 +34671;Bad Frankenhausen Kyffhäuser;1 +34672;Rossleben;1 +34673;Heldrungen;1 +34691;Könnern;1 +34692;Alsleben Saale;1 +3471;Bernburg Saale;1 +34721;Nienburg Saale;1 +34722;Preusslitz;1 +3473;Aschersleben Sachs-Anh;1 +34741;Frose;1 +34742;Sylda;1 +34743;Ermsleben;1 +34745;Winningen Sachs-Anh;1 +34746;Giersleben;1 +3475;Lutherstadt Eisleben;1 +3476;Hettstedt Sachs-Anh;1 +34771;Querfurt;1 +34772;Helbra;1 +34773;Schwittersdorf;1 +34774;Röblingen am See;1 +34775;Wippra;1 +34776;Rothenschirmbach;1 +34779;Abberode;1 +34781;Greifenhagen;1 +34782;Mansfeld Südharz;1 +34783;Gerbstedt;1 +34785;Sandersleben;1 +34901;Roßlau Elbe;1 +34903;Coswig Anhalt;1 +34904;Oranienbaum;1 +34905;Wörlitz;1 +34906;Raguhn;1 +34907;Jeber-Bergfrieden;1 +34909;Aken Elbe;1 +3491;Lutherstadt Wittenberg;1 +34920;Kropstädt;1 +34921;Kemberg;1 +34922;Mühlanger;1 +34923;Cobbelsdorf;1 +34924;Zahna;1 +34925;Bad Schmiedeberg;1 +34926;Pretzsch Elbe;1 +34927;Globig-Bleddin;1 +34928;Seegrehna;1 +34929;Straach;1 +3493;Bitterfeld;1 +3494;Wolfen;1 +34953;Gräfenhainichen;1 +34954;Roitzsch b Bitterfeld;1 +34955;Gossa;1 +34956;Zörbig;1 +3496;Köthen Anhalt;1 +34973;Osternienburg;1 +34975;Görzig Kr Köthen;1 +34976;Gröbzig;1 +34977;Quellendorf;1 +34978;Radegast Kr Köthen;1 +34979;Wulfen Sachs-Anh;1 +3501;Pirna;1 +35020;Struppen;1 +35021;Königstein Sächs Schweiz;1 +35022;Bad Schandau;1 +35023;Bad Gottleuba;1 +35024;Stadt Wehlen;1 +35025;Liebstadt;1 +35026;Dürrröhrsdorf-Dittersbach;1 +35027;Weesenstein;1 +35028;Krippen;1 +35032;Langenhennersdorf;1 +35033;Rosenthal Sächs Schweiz;1 +3504;Dippoldiswalde;1 +35052;Kipsdorf Kurort;1 +35053;Glashütte Sachs;1 +35054;Lauenstein Sachs;1 +35055;Höckendorf b Dippoldiswalde;1 +35056;Altenberg Sachs;1 +35057;Hermsdorf Erzgeb;1 +35058;Pretzschendorf;1 +351;Dresden;1 +35200;Arnsdorf b Dresden;1 +35201;Langebrück;1 +35202;Klingenberg Sachs;1 +35203;Tharandt;1 +35204;Wilsdruff;1 +35205;Ottendorf-Okrilla;1 +35206;Kreischa b Dresden;1 +35207;Moritzburg;1 +35208;Radeburg;1 +35209;Mohorn;1 +3521;Meissen;1 +3522;Grossenhain Sachs;1 +3523;Coswig b Dresden;1 +35240;Tauscha b Großenhain;1 +35241;Lommatzsch;1 +35242;Nossen;1 +35243;Weinböhla;1 +35244;Krögis;1 +35245;Burkhardswalde-Munzig;1 +35246;Ziegenhain Sachs;1 +35247;Zehren Sachs;1 +35248;Schönfeld b Großenhain;1 +35249;Basslitz;1 +3525;Riesa;1 +35263;Gröditz b Riesa;1 +35264;Strehla;1 +35265;Glaubitz;1 +35266;Heyda b Riesa;1 +35267;Diesbar-Seusslitz;1 +35268;Stauchitz;1 +3528;Radeberg;1 +3529;Heidenau Sachs;1 +3531;Finsterwalde;1 +35322;Doberlug-Kirchhain;1 +35323;Sonnewalde;1 +35324;Crinitz;1 +35325;Rückersdorf b Finsterwalde;1 +35326;Schönborn Kr Elbe-Elster;1 +35327;Priessen;1 +35329;Dollenchen;1 +3533;Elsterwerda;1 +35341;Bad Liebenwerda;1 +35342;Mühlberg Elbe;1 +35343;Hirschfeld b Elsterwerda;1 +3535;Herzberg Elster;1 +35361;Schlieben;1 +35362;Schönewalde b Herzberg;1 +35363;Fermerswalde;1 +35364;Lebusa;1 +35365;Falkenberg Elster;1 +3537;Jessen Elster;1 +35383;Elster Elbe;1 +35384;Steinsdorf b Jessen;1 +35385;Annaburg;1 +35386;Prettin;1 +35387;Seyda;1 +35388;Klöden;1 +35389;Holzdorf Elster;1 +3541;Calau;1 +3542;Lübbenau Spreewald;1 +35433;Vetschau;1 +35434;Altdöbern;1 +35435;Gollmitz b Calau;1 +35436;Laasow b Calau;1 +35439;Zinnitz;1 +3544;Luckau Brandenb;1 +35451;Dahme Brandenb;1 +35452;Golssen;1 +35453;Drahnsdorf;1 +35454;Uckro;1 +35455;Walddrehna;1 +35456;Terpt;1 +3546;Lübben Spreewald;1 +35471;Birkenhainchen;1 +35472;Schlepzig;1 +35473;Neu Lübbenau;1 +35474;Schönwalde b Lübben;1 +35475;Straupitz;1 +35476;Wittmannsdorf-Bückchen;1 +35477;Rietzneuendorf-Friedrichshof;1 +35478;Goyatz;1 +355;Cottbus;1 +35600;Döbern NL;1 +35601;Peitz;1 +35602;Drebkau;1 +35603;Burg Spreewald;1 +35604;Krieschow;1 +35605;Komptendorf;1 +35606;Briesen b Cottbus;1 +35607;Jänschwalde;1 +35608;Gross Ossnig;1 +35609;Drachhausen;1 +3561;Guben;1 +3562;Forst Lausitz;1 +3563;Spremberg;1 +3564;Schwarze Pumpe;1 +35691;Bärenklau NL;1 +35692;Kerkwitz;1 +35693;Lauschütz;1 +35694;Gosda b Klinge;1 +35695;Simmersdorf;1 +35696;Briesnig;1 +35697;Bagenz;1 +35698;Hornow;1 +3571;Hoyerswerda;1 +35722;Lauta b Hoyerswerda;1 +35723;Bernsdorf OL;1 +35724;Lohsa;1 +35725;Wittichenau;1 +35726;Groß Särchen;1 +35727;Burghammer;1 +35728;Uhyst Spree;1 +3573;Senftenberg;1 +3574;Lauchhammer;1 +35751;Welzow;1 +35752;Ruhland;1 +35753;Großräschen;1 +35754;Klettwitz;1 +35755;Ortrand;1 +35756;Hosena;1 +3576;Weisswasser;1 +35771;Bad Muskau;1 +35772;Rietschen;1 +35773;Schleife;1 +35774;Boxberg Sachs;1 +35775;Pechern;1 +3578;Kamenz;1 +35792;Ossling;1 +35793;Elstra;1 +35795;Königsbrück;1 +35796;Panschwitz-Kuckau;1 +35797;Schwepnitz;1 +3581;Görlitz;1 +35820;Zodel;1 +35822;Hagenwerder;1 +35823;Ostritz;1 +35825;Kodersdorf;1 +35826;Königshain b Görlitz;1 +35827;Nieder-Seifersdorf;1 +35828;Reichenbach OL;1 +35829;Gersdorf b Görlitz;1 +3583;Zittau;1 +35841;Großschönau Sachs;1 +35842;Oderwitz;1 +35843;Hirschfelde b Zittau;1 +35844;Oybin Kurort;1 +3585;Löbau;1 +3586;Neugersdorf Sachs;1 +35872;Neusalza-Spremberg;1 +35873;Herrnhut;1 +35874;Bernstadt a d Eigen;1 +35875;Obercunnersdorf b Löbau;1 +35876;Weissenberg Sachs;1 +35877;Cunewalde;1 +3588;Niesky;1 +35891;Rothenburg OL;1 +35892;Horka OL;1 +35893;Mücka;1 +35894;Hähnichen;1 +35895;Klitten;1 +3591;Bautzen;1 +3592;Kirschau;1 +35930;Seitschen;1 +35931;Königswartha;1 +35932;Guttau;1 +35933;Neschwitz;1 +35934;Grossdubrau;1 +35935;Kleinwelka;1 +35936;Sohland Spree;1 +35937;Prischwitz;1 +35938;Großpostwitz OL;1 +35939;Hochkirch;1 +3594;Bischofswerda;1 +35951;Neukirch Lausitz;1 +35952;Großröhrsdorf OL;1 +35953;Burkau;1 +35954;Grossharthau;1 +35955;Pulsnitz;1 +3596;Neustadt i Sa;1 +35971;Sebnitz;1 +35973;Stolpen;1 +35974;Hinterhermsdorf;1 +35975;Hohnstein;1 +3601;Mühlhausen Thür;1 +36020;Ebeleben;1 +36021;Schlotheim;1 +36022;Grossengottern;1 +36023;Horsmar;1 +36024;Diedorf b Mühlhausen Thür;1 +36025;Körner;1 +36026;Struth b Mühlhausen Thür;1 +36027;Lengenfeld Unterm Stein;1 +36028;Kammerforst Thür;1 +36029;Menteroda;1 +3603;Bad Langensalza;1 +36041;Bad Tennstedt;1 +36042;Tonna;1 +36043;Kirchheilingen;1 +3605;Leinefelde;1 +3606;Heiligenstadt Heilbad;1 +36071;Teistungen;1 +36072;Weißenborn-Lüderode;1 +36074;Worbis;1 +36075;Dingelstädt Eichsfeld;1 +36076;Niederorschel;1 +36077;Grossbodungen;1 +36081;Arenshausen;1 +36082;Ershausen;1 +36083;Uder;1 +36084;Heuthen;1 +36085;Reinholterode;1 +36087;Wüstheuterode;1 +361;Erfurt;1 +36200;Elxleben b Arnstadt;1 +36201;Walschleben;1 +36202;Neudietendorf;1 +36203;Vieselbach;1 +36204;Stotternheim;1 +36205;Gräfenroda;1 +36206;Grossfahner;1 +36207;Plaue Thür;1 +36208;Ermstedt;1 +36209;Klettbach;1 +3621;Gotha Thür;1 +3622;Waltershausen Thür;1 +3623;Friedrichroda;1 +3624;Ohrdruf;1 +36252;Tambach-Dietharz Thür Wald;1 +36253;Georgenthal Thür Wald;1 +36254;Friedrichswerth;1 +36255;Goldbach b Gotha;1 +36256;Wechmar;1 +36257;Luisenthal Thür;1 +36258;Friemar;1 +36259;Tabarz Thür Wald;1 +3628;Arnstadt;1 +3629;Stadtilm;1 +3631;Nordhausen Thür;1 +3632;Sondershausen;1 +36330;Grossberndten;1 +36331;Ilfeld;1 +36332;Ellrich;1 +36333;Heringen Helme;1 +36334;Wolkramshausen;1 +36335;Grosswechsungen;1 +36336;Klettenberg;1 +36337;Schiedungen;1 +36338;Bleicherode;1 +3634;Sömmerda;1 +3635;Kölleda;1 +3636;Greussen;1 +36370;Grossenehrich;1 +36371;Schlossvippach;1 +36372;Kleinneuhausen;1 +36373;Buttstädt;1 +36374;Weissensee;1 +36375;Kindelbrück;1 +36376;Straussfurt;1 +36377;Rastenberg;1 +36378;Ostramondra;1 +36379;Holzengel;1 +3641;Jena;1 +36421;Camburg;1 +36422;Reinstädt Thür;1 +36423;Orlamünde;1 +36424;Kahla Thür;1 +36425;Isserstedt;1 +36426;Ottendorf b Stadtroda;1 +36427;Dornburg Saale;1 +36428;Stadtroda;1 +3643;Weimar Thür;1 +3644;Apolda;1 +36450;Kranichfeld;1 +36451;Buttelstedt;1 +36452;Berlstedt;1 +36453;Mellingen;1 +36454;Magdala;1 +36458;Bad Berka;1 +36459;Blankenhain Thür;1 +36461;Bad Sulza;1 +36462;Ossmannstedt;1 +36463;Gebstedt;1 +36464;Wormstedt;1 +36465;Oberndorf b Apolda;1 +3647;Pößneck;1 +36481;Neustadt an der Orla;1 +36482;Triptis;1 +36483;Ziegenrück;1 +36484;Knau b Pößneck;1 +365;Gera;1 +36601;Hermsdorf Thür;1 +36602;Ronneburg Thür;1 +36603;Weida;1 +36604;Münchenbernsdorf;1 +36605;Bad Köstritz;1 +36606;Kraftsdorf;1 +36607;Niederpöllnitz;1 +36608;Seelingstädt b Gera;1 +3661;Greiz;1 +36621;Elsterberg b Plauen;1 +36622;Triebes;1 +36623;Berga Elster;1 +36624;Teichwolframsdorf;1 +36625;Langenwetzendorf;1 +36626;Auma;1 +36628;Zeulenroda;1 +3663;Schleiz;1 +36640;Remptendorf;1 +36642;Harra;1 +36643;Thimmendorf;1 +36644;Hirschberg Saale;1 +36645;Mühltroff;1 +36646;Tanna b Schleiz;1 +36647;Saalburg Thür;1 +36648;Dittersdorf b Schleiz;1 +36649;Gefell b Schleiz;1 +36651;Lobenstein;1 +36652;Wurzbach;1 +36653;Lehesten Thür Wald;1 +36691;Eisenberg Thür;1 +36692;Bürgel;1 +36693;Crossen an der Elster;1 +36694;Schkölen Thür;1 +36695;Söllmnitz;1 +36701;Lichte;1 +36702;Lauscha;1 +36703;Gräfenthal;1 +36704;Steinheid;1 +36705;Oberweißbach Thür Wald;1 +3671;Saalfeld Saale;1 +3672;Rudolstadt;1 +36730;Sitzendorf;1 +36731;Unterloquitz;1 +36732;Könitz;1 +36733;Kaulsdorf;1 +36734;Leutenberg;1 +36735;Probstzella;1 +36736;Arnsgereuth;1 +36737;Drognitz;1 +36738;Königsee;1 +36739;Rottenbach;1 +36741;Bad Blankenburg;1 +36742;Uhlstädt;1 +36743;Teichel;1 +36744;Remda;1 +3675;Sonneberg Thür;1 +36761;Heubisch;1 +36762;Steinach Thür;1 +36764;Neuhaus-Schierschnitz;1 +36766;Schalkau;1 +3677;Ilmenau Thür;1 +36781;Grossbreitenbach;1 +36782;Schmiedefeld a Rennsteig;1 +36783;Gehren Thür;1 +36784;Stützerbach;1 +36785;Gräfinau-Angstedt;1 +3679;Neuhaus a Rennweg;1 +3681;Suhl;1 +3682;Zella-Mehlis;1 +3683;Schmalkalden;1 +36840;Trusetal;1 +36841;Schleusingen;1 +36842;Oberhof Thür;1 +36843;Benshausen;1 +36844;Rohr Thür;1 +36845;Gehlberg;1 +36846;Suhl-Dietzhausen;1 +36847;Steinbach-Hallenberg;1 +36848;Wernshausen;1 +36849;Kleinschmalkalden;1 +3685;Hildburghausen;1 +3686;Eisfeld;1 +36870;Masserberg;1 +36871;Bad Colberg-Heldburg;1 +36873;Themar;1 +36874;Schönbrunn b Hildburghaus;1 +36875;Straufhain-Streufdorf;1 +36878;Oberland;1 +3691;Eisenach Thür;1 +36920;Grossenlupnitz;1 +36921;Wutha-Farnroda;1 +36922;Gerstungen;1 +36923;Treffurt;1 +36924;Mihla;1 +36925;Marksuhl;1 +36926;Creuzburg;1 +36927;Unterellen;1 +36928;Neuenhof Thür;1 +36929;Ruhla;1 +3693;Meiningen;1 +36940;Oepfershausen;1 +36941;Wasungen;1 +36943;Bettenhausen Thür;1 +36944;Rentwertshausen;1 +36945;Henneberg;1 +36946;Erbenhausen Thür;1 +36947;Jüchsen;1 +36948;Römhild;1 +36949;Obermaßfeld-Grimmenthal;1 +3695;Bad Salzungen;1 +36961;Bad Liebenstein;1 +36962;Vacha;1 +36963;Dorndorf Rhön;1 +36964;Dermbach Rhön;1 +36965;Stadtlengsfeld;1 +36966;Kaltennordheim;1 +36967;Geisa;1 +36968;Rossdorf Rhön;1 +36969;Merkers;1 +371;Chemnitz Sachs;1 +37200;Wittgensdorf b Chemnitz;1 +37202;Claussnitz b Chemnitz;1 +37203;Gersdorf b Chemnitz;1 +37204;Lichtenstein Sachs;1 +37206;Frankenberg Sachs;1 +37207;Hainichen Sachs;1 +37208;Auerswalde;1 +37209;Einsiedel b Chemnitz;1 +3721;Meinersdorf;1 +3722;Limbach-Oberfrohna;1 +3723;Hohenstein-Ernstthal;1 +3724;Burgstädt;1 +3725;Zschopau;1 +3726;Flöha;1 +3727;Mittweida;1 +37291;Augustusburg;1 +37292;Oederan;1 +37293;Eppendorf Sachs;1 +37294;Grünhainichen;1 +37295;Lugau Erzgeb;1 +37296;Stollberg Erzgeb;1 +37297;Thum Sachs;1 +37298;Oelsnitz Erzgeb;1 +3731;Freiberg Sachs;1 +37320;Mulda Sachs;1 +37321;Frankenstein Sachs;1 +37322;Brand-Erbisdorf;1 +37323;Lichtenberg Erzgeb;1 +37324;Reinsberg Sachs;1 +37325;Niederbobritzsch;1 +37326;Frauenstein Sachs;1 +37327;Rechenberg-Bienenmühle;1 +37328;Grossschirma;1 +37329;Grosshartmannsdorf;1 +3733;Annaberg-Buchholz;1 +37341;Ehrenfriedersdorf;1 +37342;Cranzahl;1 +37343;Jöhstadt;1 +37344;Crottendorf Sachs;1 +37346;Geyer;1 +37347;Bärenstein Kr Annaberg;1 +37348;Oberwiesenthal Kurort;1 +37349;Scheibenberg;1 +3735;Marienberg Sachs;1 +37360;Olbernhau;1 +37361;Neuhausen Erzgeb;1 +37362;Seiffen Erzgeb;1 +37363;Zöblitz;1 +37364;Reitzenhain Erzgeb;1 +37365;Sayda;1 +37366;Rübenau;1 +37367;Lengefeld Erzgeb;1 +37368;Deutschneudorf;1 +37369;Wolkenstein;1 +3737;Rochlitz;1 +37381;Penig;1 +37382;Geringswalde;1 +37383;Lunzenau;1 +37384;Wechselburg;1 +3741;Plauen;1 +37421;Oelsnitz Vogtl;1 +37422;Markneukirchen;1 +37423;Adorf Vogtl;1 +37430;Eichigt;1 +37431;Mehltheuer Vogtl;1 +37432;Pausa Vogtl;1 +37433;Gutenfürst;1 +37434;Bobenneukirchen;1 +37435;Reuth b Plauen;1 +37436;Weischlitz;1 +37437;Bad Elster;1 +37438;Bad Brambach;1 +37439;Jocketa;1 +3744;Auerbach Vogtl;1 +3745;Falkenstein Vogtl;1 +37462;Rothenkirchen Vogtl;1 +37463;Bergen Vogtl;1 +37464;Schöneck Vogtl;1 +37465;Tannenbergsthal Vogtl;1 +37467;Klingenthal Sachs;1 +37468;Treuen Vogtl;1 +375;Zwickau;1 +37600;Neumark Sachs;1 +37601;Mülsen Skt Jacob;1 +37602;Kirchberg Sachs;1 +37603;Wildenfels;1 +37604;Mosel;1 +37605;Hartenstein Sachs;1 +37606;Lengenfeld Vogtl;1 +37607;Ebersbrunn Sachs;1 +37608;Waldenburg Sachs;1 +37609;Wolkenburg Mulde;1 +3761;Werdau Sachs;1 +3762;Crimmitschau;1 +3763;Glauchau;1 +3764;Meerane;1 +3765;Reichenbach Vogtl;1 +3771;Aue Sachs;1 +3772;Schneeberg Erzgeb;1 +3773;Johanngeorgenstadt;1 +3774;Schwarzenberg;1 +37752;Eibenstock;1 +37754;Zwönitz;1 +37755;Schönheide Erzgeb;1 +37756;Breitenbrunn Erzgeb;1 +37757;Rittersgrün;1 +381;Rostock;1 +38201;Gelbensande;1 +38202;Volkenshagen;1 +38203;Bad Doberan;1 +38204;Broderstorf;1 +38205;Tessin b Rostock;1 +38206;Graal-Müritz Seeheilbad;1 +38207;Stäbelow;1 +38208;Kavelstorf;1 +38209;Sanitz b Rostock;1 +3821;Ribnitz-Damgarten;1 +38220;Wustrow Ostseebad;1 +38221;Marlow;1 +38222;Semlow;1 +38223;Saal Vorpom;1 +38224;Gresenhorst;1 +38225;Trinwillershagen;1 +38226;Dierhagen Ostseebad;1 +38227;Lüdershagen b Barth;1 +38228;Dettmannsdorf-Kölzow;1 +38229;Bad Sülze;1 +38231;Barth;1 +38232;Zingst Ostseebad;1 +38233;Prerow Ostseebad;1 +38234;Born a Darß;1 +38292;Kröpelin;1 +38293;Kühlungsborn Ostseebad;1 +38294;Neubukow;1 +38295;Satow b Bad Doberan;1 +38296;Rerik Ostseebad;1 +38297;Moitin;1 +38300;Insel Hiddensee;1 +38301;Putbus;1 +38302;Sagard;1 +38303;Sellin Ostseebad;1 +38304;Garz Rügen;1 +38305;Gingst;1 +38306;Samtens;1 +38307;Poseritz;1 +38308;Göhren Rügen;1 +38309;Trent;1 +3831;Stralsund;1 +38320;Tribsees;1 +38321;Martensdorf b Stralsund;1 +38322;Richtenberg;1 +38323;Prohn;1 +38324;Velgast;1 +38325;Rolofshagen;1 +38326;Grimmen;1 +38327;Elmenhorst Vorpom;1 +38328;Miltzow;1 +38331;Rakow Vorpom;1 +38332;Gross Bisdorf;1 +38333;Horst b Grimmen;1 +38334;Grammendorf;1 +3834;Greifswald;1 +38351;Mesekenhagen;1 +38352;Kemnitz b Greifswald;1 +38353;Gützkow b Greifswald;1 +38354;Wusterhusen;1 +38355;Züssow;1 +38356;Behrenhoff;1 +3836;Wolgast;1 +38370;Kröslin;1 +38371;Karlshagen;1 +38372;Usedom;1 +38373;Katzow;1 +38374;Lassan b Wolgast;1 +38375;Koserow;1 +38376;Zirchow;1 +38377;Zinnowitz;1 +38378;Heringsdorf Seebad;1 +38379;Benz Usedom;1 +3838;Bergen auf Rügen;1 +38391;Altenkirchen Rügen;1 +38392;Sassnitz;1 +38393;Binz Ostseebad;1 +3841;Wismar Meckl;1 +38422;Neukloster;1 +38423;Bad Kleinen;1 +38424;Bobitz;1 +38425;Kirchdorf Poel;1 +38426;Neuburg-Steinhausen;1 +38427;Blowatz;1 +38428;Hohenkirchen b Wismar;1 +38429;Glasin;1 +3843;Güstrow;1 +3844;Schwaan;1 +38450;Tarnow b Bützow;1 +38451;Hoppenrade b Güstrow;1 +38452;Lalendorf;1 +38453;Mistorf;1 +38454;Kritzkow;1 +38455;Plaaz;1 +38456;Langhagen b Güstrow;1 +38457;Krakow am See;1 +38458;Zehna;1 +38459;Laage;1 +38461;Bützow;1 +38462;Baumgarten Meckl;1 +38464;Bernitt;1 +38466;Jürgenshagen;1 +3847;Sternberg;1 +38481;Witzin;1 +38482;Warin;1 +38483;Brüel;1 +38484;Ventschow;1 +38485;Dabel;1 +38486;Gustävel;1 +38488;Demen;1 +385;Schwerin Meckl;1 +3860;Raben Steinfeld;1 +3861;Plate;1 +3863;Crivitz;1 +3865;Holthusen;1 +3866;Cambs;1 +3867;Lübstorf;1 +3868;Rastow;1 +3869;Dümmer;1 +3871;Parchim;1 +38720;Grebbin;1 +38721;Ziegendorf;1 +38722;Raduhn;1 +38723;Kladrum;1 +38724;Siggelkow;1 +38725;Gross Godems;1 +38726;Spornitz;1 +38727;Mestlin;1 +38728;Domsühl;1 +38729;Marnitz;1 +38731;Lübz;1 +38732;Gallin b Lübz;1 +38733;Karbow-Vietlübbe;1 +38735;Plau am See;1 +38736;Goldberg Meckl;1 +38737;Ganzlin;1 +38738;Karow b Lübz;1 +3874;Ludwigslust Meckl;1 +38750;Malliss;1 +38751;Picher;1 +38752;Zierzow b Ludwigslust;1 +38753;Wöbbelin;1 +38754;Leussow b Ludwigslust;1 +38755;Eldena;1 +38756;Grabow Meckl;1 +38757;Neustadt-Glewe;1 +38758;Dömitz;1 +38759;Tewswoos;1 +3876;Perleberg;1 +3877;Wittenberge;1 +38780;Lanz Brandenb;1 +38781;Mellen;1 +38782;Reetz b Perleberg;1 +38783;Dallmin;1 +38784;Kleinow Kr Prignitz;1 +38785;Berge b Perleberg;1 +38787;Glöwen;1 +38788;Gross Warnow;1 +38789;Wolfshagen b Perleberg;1 +38791;Bad Wilsnack;1 +38792;Lenzen (Elbe);1 +38793;Dergenthin;1 +38794;Cumlosen;1 +38796;Viesecke;1 +38797;Karstädt Kr Prignitz;1 +3881;Grevesmühlen;1 +38821;Lüdersdorf Meckl;1 +38822;Diedrichshagen b Grevesmühlen;1 +38823;Selmsdorf;1 +38824;Mallentin;1 +38825;Klütz;1 +38826;Dassow;1 +38827;Kalkhorst;1 +38828;Schönberg Meckl;1 +3883;Hagenow;1 +38841;Neuhaus Elbe;1 +38842;Lüttenmark;1 +38843;Bennin;1 +38844;Gülze;1 +38845;Kaarssen;1 +38847;Boizenburg Elbe;1 +38848;Vellahn;1 +38850;Gammelin;1 +38851;Zarrentin Meckl;1 +38852;Wittenburg;1 +38853;Drönnewitz b Hagenow;1 +38854;Redefin;1 +38855;Lübtheen;1 +38856;Pritzier b Hagenow;1 +38858;Lassahn;1 +38859;Alt Zachun;1 +3886;Gadebusch;1 +38871;Mühlen Eichsen;1 +38872;Rehna;1 +38873;Carlow;1 +38874;Lützow;1 +38875;Schlagsdorf b Gadebusch;1 +38876;Roggendorf;1 +39000;Beetzendorf;1 +39001;Apenburg;1 +39002;Oebisfelde;1 +39003;Jübar;1 +39004;Köckte b Gardelegen;1 +39005;Kusey;1 +39006;Miesterhorst;1 +39007;Tangeln;1 +39008;Kunrau;1 +39009;Badel;1 +3901;Salzwedel;1 +3902;Diesdorf Altm;1 +39030;Brunau;1 +39031;Dähre;1 +39032;Mahlsdorf b Salzwedel;1 +39033;Wallstawe;1 +39034;Fleetmark;1 +39035;Kuhfelde;1 +39036;Binde;1 +39037;Pretzier;1 +39038;Henningen;1 +39039;Bonese;1 +3904;Haldensleben;1 +39050;Bartensleben;1 +39051;Calvörde;1 +39052;Erxleben b Haldensleben;1 +39053;Süplingen;1 +39054;Flechtingen;1 +39055;Hörsingen;1 +39056;Klüden;1 +39057;Rätzlingen Sachs-Anh;1 +39058;Uthmöden;1 +39059;Wegenstedt;1 +39061;Weferlingen;1 +39062;Bebertal;1 +3907;Gardelegen;1 +39080;Kalbe Milde;1 +39081;Kakerbeck Sachs-Anh;1 +39082;Mieste;1 +39083;Messdorf;1 +39084;Lindstedt;1 +39085;Zichtau;1 +39086;Jävenitz;1 +39087;Jerchel Altmark;1 +39088;Letzlingen;1 +39089;Bismark Altmark;1 +3909;Klötze Altmark;1 +391;Magdeburg;1 +39200;Gommern;1 +39201;Wolmirstedt;1 +39202;Gross Ammensleben;1 +39203;Barleben;1 +39204;Niederndodeleben;1 +39205;Langenweddingen;1 +39206;Eichenbarleben;1 +39207;Colbitz;1 +39208;Loitsche;1 +39209;Wanzleben;1 +3921;Burg b Magdeburg;1 +39221;Möckern b Magdeburg;1 +39222;Möser;1 +39223;Theessen;1 +39224;Büden;1 +39225;Altengrabow;1 +39226;Hohenziatz;1 +3923;Zerbst;1 +39241;Leitzkau;1 +39242;Prödel;1 +39243;Nedlitz b Zerbst;1 +39244;Steutz;1 +39245;Loburg;1 +39246;Lindau Anh;1 +39247;Güterglück;1 +39248;Dobritz;1 +3925;Stassfurt;1 +39262;Güsten Anh;1 +39263;Unseburg;1 +39264;Kroppenstedt;1 +39265;Löderburg;1 +39266;Förderstedt;1 +39267;Schneidlingen;1 +39268;Egeln;1 +3928;Schönebeck Elbe;1 +39291;Calbe Saale;1 +39292;Biederitz;1 +39293;Dreileben;1 +39294;Gross Rosenburg;1 +39295;Zuchau;1 +39296;Welsleben;1 +39297;Eickendorf Kr Schönebeck;1 +39298;Barby Elbe;1 +3931;Stendal;1 +39320;Schinne;1 +39321;Arneburg;1 +39322;Tangermünde;1 +39323;Schönhausen Elbe;1 +39324;Kläden b Stendal;1 +39325;Vinzelberg;1 +39327;Klietz;1 +39328;Rochau;1 +39329;Möringen;1 +3933;Genthin;1 +39341;Redekin;1 +39342;Gladau;1 +39343;Jerichow;1 +39344;Güsen;1 +39345;Parchen;1 +39346;Tucheim;1 +39347;Kade;1 +39348;Klitsche;1 +39349;Parey Elbe;1 +3935;Tangerhütte;1 +39361;Lüderitz;1 +39362;Grieben b Tangerhütte;1 +39363;Angern;1 +39364;Dolle;1 +39365;Bellingen b Stendal;1 +39366;Kehnert;1 +3937;Osterburg Altmark;1 +39382;Kamern;1 +39383;Sandau Elbe;1 +39384;Arendsee Altmark;1 +39386;Seehausen Altmark;1 +39387;Havelberg;1 +39388;Goldbeck Altm;1 +39389;Schollene;1 +39390;Iden;1 +39391;Lückstedt;1 +39392;Rönnebeck Sachs-Ahn;1 +39393;Werben Elbe;1 +39394;Hohenberg-Krusemark;1 +39395;Wanzer;1 +39396;Neukirchen Altmark;1 +39397;Geestgottberg;1 +39398;Gross Garz;1 +39399;Kleinau;1 +39400;Wefensleben;1 +39401;Neuwegersleben;1 +39402;Völpke;1 +39403;Gröningen Sachs-Ahn;1 +39404;Ausleben;1 +39405;Hötensleben;1 +39406;Harbke;1 +39407;Seehausen Börde;1 +39408;Hadmersleben;1 +39409;Eilsleben;1 +3941;Halberstadt;1 +39421;Osterwieck;1 +39422;Badersleben;1 +39423;Wegeleben;1 +39424;Schwanebeck Sachs-Anh;1 +39425;Dingelstedt a Huy;1 +39426;Hessen;1 +39427;Ströbeck;1 +39428;Pabstorf;1 +3943;Wernigerode;1 +3944;Blankenburg Harz;1 +39451;Wasserleben;1 +39452;Ilsenburg;1 +39453;Derenburg;1 +39454;Elbingerode Harz;1 +39455;Schierke;1 +39456;Altenbrak;1 +39457;Benneckenstein Harz;1 +39458;Heudeber;1 +39459;Hasselfelde;1 +3946;Quedlinburg;1 +3947;Thale;1 +39481;Hedersleben b Aschersleben;1 +39482;Gatersleben;1 +39483;Ballenstedt;1 +39484;Harzgerode;1 +39485;Gernrode Harz;1 +39487;Friedrichsbrunn;1 +39488;Güntersberge;1 +39489;Strassberg Harz;1 +3949;Oschersleben Bode;1 +395;Neubrandenburg;1 +39600;Zwiedorf;1 +39601;Friedland Meckl;1 +39602;Kleeth;1 +39603;Burg Stargard;1 +39604;Wildberg b Altentreptow;1 +39605;Gross Nemerow;1 +39606;Glienke;1 +39607;Kotelow;1 +39608;Staven;1 +3961;Altentreptow;1 +3962;Penzlin b Waren;1 +3963;Woldegk;1 +3964;Bredenfelde b Strasburg;1 +3965;Burow b Altentreptow;1 +3966;Cölpin;1 +3967;Oertzenhof b Strasburg;1 +3968;Schönbeck Meckl;1 +3969;Siedenbollentin;1 +3971;Anklam;1 +39721;Liepen b Anklam;1 +39722;Sarnow b Anklam;1 +39723;Krien;1 +39724;Klein Bünzow;1 +39726;Ducherow;1 +39727;Spantekow;1 +39728;Medow b Anklam;1 +3973;Pasewalk;1 +39740;Nechlin;1 +39741;Jatznick;1 +39742;Brüssow b Pasewalk;1 +39743;Zerrenthin;1 +39744;Rothenklempenow;1 +39745;Hetzdorf b Strasburg;1 +39746;Krackow;1 +39747;Züsedom;1 +39748;Viereck;1 +39749;Grambow b Pasewalk;1 +39751;Penkun;1 +39752;Blumenhagen b Strasburg;1 +39753;Strasburg;1 +39754;Löcknitz Vorpom;1 +3976;Torgelow b Ueckermünde;1 +39771;Ueckermünde;1 +39772;Rothemühl;1 +39773;Altwarp;1 +39774;Mönkebude;1 +39775;Ahlbeck b Torgelow;1 +39776;Hintersee;1 +39777;Borkenfriede;1 +39778;Ferdinandshof b Torgelow;1 +39779;Eggesin;1 +3981;Neustrelitz;1 +39820;Triepkendorf;1 +39821;Carpin;1 +39822;Kratzeburg;1 +39823;Rechlin;1 +39824;Hohenzieritz;1 +39825;Wokuhl;1 +39826;Blankensee b Neustrelitz;1 +39827;Schwarz b Neustrelitz;1 +39828;Wustrow Kr Mecklenburg-Strelitz;1 +39829;Blankenförde;1 +39831;Feldberg Meckl;1 +39832;Wesenberg Meckl;1 +39833;Mirow Kr Neustrelitz;1 +3984;Prenzlau;1 +39851;Göritz b Prenzlau;1 +39852;Schönermark b Prenzlau;1 +39853;Holzendorf b Prenzlau;1 +39854;Kleptow;1 +39855;Parmen-Weggun;1 +39856;Beenz b Prenzlau;1 +39857;Drense;1 +39858;Bietikow;1 +39859;Fürstenwerder;1 +39861;Gramzow b Prenzlau;1 +39862;Schmölln b Prenzlau;1 +39863;Seehausen b Prenzlau;1 +3987;Templin;1 +39881;Ringenwalde b Templin;1 +39882;Gollin;1 +39883;Groß Dölln;1 +39884;Hassleben b Prenzlau;1 +39885;Jakobshagen;1 +39886;Milmersdorf;1 +39887;Gerswalde;1 +39888;Lychen;1 +39889;Boitzenburg;1 +3991;Waren Müritz;1 +39921;Ankershagen;1 +39922;Dambeck b Röbel;1 +39923;Priborn;1 +39924;Stuer;1 +39925;Wredenhagen;1 +39926;Grabowhöfe;1 +39927;Nossentiner Hütte;1 +39928;Möllenhagen;1 +39929;Jabel b Waren;1 +39931;Röbel Müritz;1 +39932;Malchow b Waren;1 +39933;Vollrathsruhe;1 +39934;Groß Plasten;1 +3994;Malchin;1 +39951;Faulenrost;1 +39952;Grammentin;1 +39953;Schwinkendorf;1 +39954;Stavenhagen Reuterstadt;1 +39955;Jürgenstorf Meckl;1 +39956;Neukalen;1 +39957;Gielow;1 +39959;Dargun;1 +3996;Teterow;1 +39971;Gnoien;1 +39972;Walkendorf;1 +39973;Altkalen;1 +39975;Thürkow;1 +39976;Groß Bützin;1 +39977;Jördenstorf;1 +39978;Gross Roge;1 +3998;Demmin;1 +39991;Daberkow;1 +39992;Görmin;1 +39993;Hohenmocker;1 +39994;Metschow;1 +39995;Nossendorf;1 +39996;Törpin;1 +39997;Jarmen;1 +39998;Loitz b Demmin;1 +39999;Tutow;1 +40;Hamburg;1 +4101;Pinneberg;1 +4102;Ahrensburg;1 +4103;Wedel;1 +4104;Aumühle b Hamburg;1 +4105;Seevetal;1 +4106;Quickborn Kr Pinneberg;1 +4107;Siek Kr Stormarn;1 +4108;Rosengarten Kr Harburg;1 +4109;Tangstedt Bz Hamburg;1 +4120;Ellerhoop;1 +4121;Elmshorn;1 +4122;Uetersen;1 +4123;Barmstedt;1 +4124;Glückstadt;1 +4125;Seestermühe;1 +4126;Horst Holstein;1 +4127;Westerhorn;1 +4128;Kollmar;1 +4129;Haseldorf;1 +4131;Lüneburg;1 +4132;Amelinghausen;1 +4133;Wittorf Kr Lünebeburg;1 +4134;Embsen Kr Lünebeburg;1 +4135;Kirchgellersen;1 +4136;Scharnebeck;1 +4137;Barendorf;1 +4138;Betzendorf Kr Lünebeburg;1 +4139;Hohnstorf Elbe;1 +4140;Estorf Kr Stade;1 +4141;Stade;1 +4142;Steinkirchen Kr Stade;1 +4143;Drochtersen;1 +4144;Himmelpforten;1 +4146;Stade-Bützfleth;1 +4148;Drochtersen-Assel;1 +4149;Fredenbeck;1 +4151;Schwarzenbek;1 +4152;Geesthacht;1 +4153;Lauenburg Elbe;1 +4154;Trittau;1 +4155;Büchen;1 +4156;Talkau;1 +4158;Roseburg;1 +4159;Basthorst;1 +4161;Buxtehude;1 +4162;Jork;1 +4163;Horneburg Niederelbe;1 +4164;Harsefeld;1 +4165;Hollenstedt Nordheide;1 +4166;Ahlerstedt;1 +4167;Apensen;1 +4168;Neu Wulmstorf-Elstorf;1 +4169;Sauensiek;1 +4171;Winsen Luhe;1 +4172;Salzhausen;1 +4173;Wulfsen;1 +4174;Stelle Kr Harburg;1 +4175;Egestorf Nordheide;1 +4176;Marschacht;1 +4177;Drage Elbe;1 +4178;Radbruch;1 +4179;Winsen-Tönnhausen;1 +4180;Königsmoor;1 +4181;Buchholz in der Nordheide;1 +4182;Tostedt;1 +4183;Jesteburg;1 +4184;Hanstedt Nordheide;1 +4185;Marxen Auetal;1 +4186;Buchholz-Trelde;1 +4187;Holm-Seppensen;1 +4188;Welle Nordheide;1 +4189;Undeloh;1 +4191;Kaltenkirchen Holst;1 +4192;Bad Bramstedt;1 +4193;Henstedt-Ulzburg;1 +4194;Sievershütten;1 +4195;Hartenholm;1 +4202;Achim b Bremen;1 +4203;Weyhe b Bremen;1 +4204;Thedinghausen;1 +4205;Ottersberg;1 +4206;Stuhr-Heiligenrode;1 +4207;Oyten;1 +4208;Grasberg;1 +4209;Schwanewede;1 +421;Bremen;1 +4221;Delmenhorst;1 +4222;Ganderkesee;1 +4223;Ganderkesee-Bookholzberg;1 +4224;Gross Ippener;1 +4230;Verden-Walle;1 +4231;Verden Aller;1 +4232;Langwedel Kr Verden;1 +4233;Blender;1 +4234;Dörverden;1 +4235;Langwedel-Etelsen;1 +4236;Kirchlinteln;1 +4237;Bendingbostel;1 +4238;Neddenaverbergen;1 +4239;Dörverden-Westen;1 +4240;Syke-Heiligenfelde;1 +4241;Bassum;1 +4242;Syke;1 +4243;Twistringen;1 +4244;Harpstedt;1 +4245;Neuenkirchen b Bassum;1 +4246;Twistringen-Heiligenloh;1 +4247;Affinghausen;1 +4248;Bassum-Neubruchhausen;1 +4249;Bassum-Nordwohlde;1 +4251;Hoya;1 +4252;Bruchhausen-Vilsen;1 +4253;Asendorf Kr Diepholz;1 +4254;Eystrup;1 +4255;Martfeld;1 +4256;Hilgermissen;1 +4257;Schweringen;1 +4258;Schwarme;1 +4260;Visselhövede-Wittorf;1 +4261;Rotenburg Wümme;1 +4262;Visselhövede;1 +4263;Scheessel;1 +4264;Sottrum Kr Rotenburg;1 +4265;Fintel;1 +4266;Brockel;1 +4267;Lauenbrück;1 +4268;Bötersen;1 +4269;Ahausen-Kirchwalsede;1 +4271;Sulingen;1 +4272;Siedenburg;1 +4273;Kirchdorf b Sulingen;1 +4274;Varrel b Sulingen;1 +4275;Ehrenburg;1 +4276;Borstel b Sulingen;1 +4277;Schwaförden;1 +4281;Zeven;1 +4282;Sittensen;1 +4283;Tarmstedt;1 +4284;Selsingen;1 +4285;Rhade b Zeven;1 +4286;Gyhum;1 +4287;Heeslingen-Boitzen;1 +4288;Horstedt Kr Rotenburg;1 +4289;Kirchtimke;1 +4292;Ritterhude;1 +4293;Ottersberg-Fischerhude;1 +4294;Riede Kr Verden;1 +4295;Emtinghausen;1 +4296;Schwanewede-Aschwarden;1 +4297;Ottersberg-Posthausen;1 +4298;Lilienthal;1 +4302;Kirchbarkau;1 +4303;Schlesen;1 +4305;Westensee;1 +4307;Raisdorf;1 +4308;Schwedeneck;1 +431;Kiel;1 +4320;Heidmühlen;1 +4321;Neumünster;1 +4322;Bordesholm;1 +4323;Bornhöved;1 +4324;Brokstedt;1 +4326;Wankendorf;1 +4327;Grossenaspe;1 +4328;Rickling;1 +4329;Langwedel Holst;1 +4330;Emkendorf;1 +4331;Rendsburg;1 +4332;Hamdorf b Rendsburg;1 +4333;Erfde;1 +4334;Bredenbek b Rendsburg;1 +4335;Hohn b Rendsburg;1 +4336;Owschlag;1 +4337;Jevenstedt;1 +4338;Alt Duvenstedt;1 +4339;Christiansholm;1 +4340;Achterwehr;1 +4342;Preetz Kr Plön;1 +4343;Laboe;1 +4344;Schönberg Holstein;1 +4346;Gettorf;1 +4347;Flintbek;1 +4348;Schönkirchen;1 +4349;Dänischenhagen;1 +4351;Eckernförde;1 +4352;Damp;1 +4353;Ascheffel;1 +4354;Fleckeby;1 +4355;Rieseby;1 +4356;Gross Wittensee;1 +4357;Sehestedt Eider;1 +4358;Loose b Eckernförde;1 +4361;Oldenburg in Holstein;1 +4362;Heiligenhafen;1 +4363;Lensahn;1 +4364;Dahme Kr Ostholstein;1 +4365;Heringsdorf Holst;1 +4366;Grömitz-Cismar;1 +4367;Grossenbrode;1 +4371;Burg auf Fehmarn;1 +4372;Westfehmarn;1 +4381;Lütjenburg;1 +4382;Wangels;1 +4383;Grebin;1 +4384;Selent;1 +4385;Hohenfelde b Kiel;1 +4392;Nortorf b Neumünster;1 +4393;Boostedt;1 +4394;Bokhorst;1 +4401;Brake Unterweser;1 +4402;Rastede;1 +4403;Bad Zwischenahn;1 +4404;Elsfleth;1 +4405;Edewecht;1 +4406;Berne;1 +4407;Wardenburg;1 +4408;Hude Oldenburg;1 +4409;Westerstede-Ocholt;1 +441;Oldenburg (Oldb);1 +4421;Wilhelmshaven;1 +4422;Sande Kr Friesl;1 +4423;Fedderwarden;1 +4425;Wangerland-Hooksiel;1 +4426;Wangerland-Horumersiel;1 +4431;Wildeshausen;1 +4432;Dötlingen-Brettorf;1 +4433;Dötlingen;1 +4434;Colnrade;1 +4435;Grossenkneten;1 +4441;Vechta;1 +4442;Lohne Oldenburg;1 +4443;Dinklage;1 +4444;Goldenstedt;1 +4445;Visbek Kr Vechta;1 +4446;Bakum Kr Vechta;1 +4447;Vechta-Langförden;1 +4451;Varel Jadebusen;1 +4452;Zetel-Neuenburg;1 +4453;Zetel;1 +4454;Jade;1 +4455;Jade-Schweiburg;1 +4456;Varel-Altjührden;1 +4458;Wiefelstede-Spohle;1 +4461;Jever;1 +4462;Wittmund;1 +4463;Wangerland;1 +4464;Wittmund-Carolinensiel;1 +4465;Friedeburg Ostfriesl;1 +4466;Wittmund-Ardorf;1 +4467;Wittmund-Funnix;1 +4468;Friedeburg-Reepsholt;1 +4469;Wangerooge;1 +4471;Cloppenburg;1 +4472;Lastrup;1 +4473;Emstek;1 +4474;Garrel;1 +4475;Molbergen;1 +4477;Lastrup-Hemmelte;1 +4478;Cappeln Oldenburg;1 +4479;Molbergen-Peheim;1 +4480;Ovelgönne-Strückhausen;1 +4481;Hatten-Sandkrug;1 +4482;Hatten;1 +4483;Ovelgönne-Großenmeer;1 +4484;Hude-Wüsting;1 +4485;Elsfleth-Huntorf;1 +4486;Edewecht-Friedrichsfehn;1 +4487;Grossenkneten-Huntlosen;1 +4488;Westerstede;1 +4489;Apen;1 +4491;Friesoythe;1 +4492;Saterland;1 +4493;Friesoythe-Gehlenberg;1 +4494;Bösel Oldenburg;1 +4495;Friesoythe-Thüle;1 +4496;Friesoythe-Markhausen;1 +4497;Barßel-Harkebrügge;1 +4498;Saterland-Ramsloh;1 +4499;Barssel;1 +4501;Kastorf Holst;1 +4502;Lübeck-Travemünde;1 +4503;Timmendorfer Strand;1 +4504;Ratekau;1 +4505;Stockelsdorf-Curau;1 +4506;Stockelsdorf-Krumbeck;1 +4508;Krummesse;1 +4509;Groß Grönau;1 +451;Lübeck;1 +4521;Eutin;1 +4522;Plön;1 +4523;Malente;1 +4524;Scharbeutz-Pönitz;1 +4525;Ahrensbök;1 +4526;Ascheberg Holstein;1 +4527;Bosau;1 +4528;Schönwalde am Bungsberg;1 +4529;Süsel-Bujendorf;1 +4531;Bad Oldesloe;1 +4532;Bargteheide;1 +4533;Reinfeld Holstein;1 +4534;Steinburg Kr Storman;1 +4535;Nahe;1 +4536;Steinhorst Lauenb;1 +4537;Sülfeld Holst;1 +4539;Westerau;1 +4541;Ratzeburg;1 +4542;Mölln Lauenb;1 +4543;Nusse;1 +4544;Berkenthin;1 +4545;Seedorf Lauenb;1 +4546;Mustin Lauenburg;1 +4547;Gudow Lauenb;1 +4550;Bühnsdorf;1 +4551;Bad Segeberg;1 +4552;Leezen;1 +4553;Geschendorf;1 +4554;Wahlstedt;1 +4555;Seedorf b Bad Segeberg;1 +4556;Ahrensbök-Gnissau;1 +4557;Blunk;1 +4558;Todesfelde;1 +4559;Wensin;1 +4561;Neustadt in Holstein;1 +4562;Grömitz;1 +4563;Scharbeutz-Haffkrug;1 +4564;Schashagen;1 +4602;Freienwill;1 +4603;Havetoft;1 +4604;Grossenwiehe;1 +4605;Medelby;1 +4606;Wanderup;1 +4607;Janneby;1 +4608;Handewitt;1 +4609;Eggebek;1 +461;Flensburg;1 +4621;Schleswig;1 +4622;Taarstedt;1 +4623;Böklund;1 +4624;Kropp;1 +4625;Jübek;1 +4626;Treia;1 +4627;Dörpstedt;1 +4630;Barderup;1 +4631;Glücksburg Ostsee;1 +4632;Steinbergkirche;1 +4633;Satrup;1 +4634;Husby;1 +4635;Sörup;1 +4636;Langballig;1 +4637;Sterup;1 +4638;Tarp;1 +4639;Schafflund;1 +4641;Süderbrarup;1 +4642;Kappeln Schlei;1 +4643;Gelting Angeln;1 +4644;Karby;1 +4646;Mohrkirch;1 +4651;Sylt;1 +4661;Niebüll;1 +4662;Leck;1 +4663;Süderlügum;1 +4664;Neukirchen b Niebüll;1 +4665;Emmelsbüll-Horsbüll;1 +4666;Ladelund;1 +4667;Dagebüll;1 +4668;Klanxbüll;1 +4671;Bredstedt;1 +4672;Langenhorn;1 +4673;Joldelund;1 +4674;Ockholm;1 +4681;Wyk auf Föhr;1 +4682;Amrum;1 +4683;Oldsum;1 +4684;Langeneß Hallig;1 +4702;Sandstedt;1 +4703;Loxstedt-Donnern;1 +4704;Drangstedt;1 +4705;Wremen;1 +4706;Schiffdorf;1 +4707;Langen-Neuenwalde;1 +4708;Ringstedt;1 +471;Bremerhaven;1 +4721;Cuxhaven;1 +4722;Cuxhaven-Altenbruch;1 +4723;Cuxhaven-Altenwalde;1 +4724;Cuxhaven-Lüdingworth;1 +4725;Helgoland;1 +4731;Nordenham;1 +4732;Stadland-Rodenkirchen;1 +4733;Butjadingen-Burhave;1 +4734;Stadland-Seefeld;1 +4735;Butjadingen-Stollhamm;1 +4736;Butjadingen-Tossens;1 +4737;Stadland-Schwei;1 +4740;Loxstedt-Dedesdorf;1 +4741;Nordholz b Bremerhaven;1 +4742;Dorum;1 +4743;Langen b Bremerhaven;1 +4744;Loxstedt;1 +4745;Bad Bederkesa;1 +4746;Hagen b Bremerhaven;1 +4747;Beverstedt;1 +4748;Stubben b Bremerhaven;1 +4749;Schiffdorf-Geestenseth;1 +4751;Otterndorf;1 +4752;Neuhaus Oste;1 +4753;Balje;1 +4754;Bülkau;1 +4755;Ihlienworth;1 +4756;Odisheim;1 +4757;Wanna;1 +4758;Nordleda;1 +4761;Bremervörde;1 +4762;Kutenholz;1 +4763;Gnarrenburg;1 +4764;Gnarrenburg-Klenkendorf;1 +4765;Ebersdorf b Bremervörde;1 +4766;Basdahl;1 +4767;Bremervörde-Bevern;1 +4768;Hipstedt;1 +4769;Bremervörde-Iselersheim;1 +4770;Wischhafen;1 +4771;Hemmoor;1 +4772;Oberndorf Oste;1 +4773;Lamstedt;1 +4774;Hechthausen;1 +4775;Grossenwörden;1 +4776;Osten-Altendorf;1 +4777;Cadenberge;1 +4778;Wingst;1 +4779;Freiburg Elbe;1 +4791;Osterholz-Scharmbeck;1 +4792;Worpswede;1 +4793;Hambergen;1 +4794;Worpswede-Ostersode;1 +4795;Garlstedt;1 +4796;Teufelsmoor;1 +4802;Wrohm;1 +4803;Pahlen;1 +4804;Nordhastedt;1 +4805;Schafstedt;1 +4806;Sarzbüttel;1 +481;Heide Holst;1 +4821;Itzehoe;1 +4822;Kellinghusen;1 +4823;Wilster;1 +4824;Krempe;1 +4825;Burg Dithmarschen;1 +4826;Hohenlockstedt;1 +4827;Wacken;1 +4828;Lägerdorf;1 +4829;Wewelsfleth;1 +4830;Süderhastedt;1 +4832;Meldorf;1 +4833;Wesselburen;1 +4834;Büsum;1 +4835;Albersdorf Holst;1 +4836;Hennstedt Dithm;1 +4837;Neuenkirchen Dithm;1 +4838;Tellingstedt;1 +4839;Wöhrden Dithm;1 +4841;Husum Nordsee;1 +4842;Nordstrand;1 +4843;Viöl;1 +4844;Pellworm;1 +4845;Ostenfeld Husum;1 +4846;Hattstedt;1 +4847;Oster-Ohrstedt;1 +4848;Rantrum;1 +4849;Hooge;1 +4851;Marne;1 +4852;Brunsbüttel;1 +4853;Sankt Michaelisdonn;1 +4854;Friedrichskoog;1 +4855;Eddelak;1 +4856;Kronprinzenkoog;1 +4857;Barlt;1 +4858;Sankt Margarethen Holst;1 +4859;Windbergen;1 +4861;Tönning;1 +4862;Garding;1 +4863;Sankt Peter-Ording;1 +4864;Oldenswort;1 +4865;Osterhever;1 +4871;Hohenwestedt;1 +4872;Hanerau-Hademarschen;1 +4873;Aukrug;1 +4874;Todenbüttel;1 +4875;Stafstedt;1 +4876;Reher Holst;1 +4877;Hennstedt b Itzehoe;1 +4881;Friedrichstadt;1 +4882;Lunden;1 +4883;Süderstapel;1 +4884;Schwabstedt;1 +4885;Bergenhusen;1 +4892;Schenefeld Mittelholst;1 +4893;Hohenaspe;1 +4902;Jemgum-Ditzum;1 +4903;Wymeer;1 +491;Leer Ostfriesland;1 +4920;Wirdum;1 +4921;Emden Stadt;1 +4922;Borkum;1 +4923;Krummhörn-Pewsum;1 +4924;Moormerland-Oldersum;1 +4925;Hinte;1 +4926;Krummhörn-Greetsiel;1 +4927;Krummhörn-Loquard;1 +4928;Ihlow-Riepe;1 +4929;Ihlow Kr Aurich;1 +4931;Norden;1 +4932;Norderney;1 +4933;Dornum Ostfriesl;1 +4934;Marienhafe;1 +4935;Juist;1 +4936;Grossheide;1 +4938;Hagermarsch;1 +4939;Baltrum;1 +4941;Aurich;1 +4942;Südbrookmerland;1 +4943;Grossefehn;1 +4944;Wiesmoor;1 +4945;Grossefehn-Timmel;1 +4946;Grossefehn-Bagband;1 +4947;Aurich-Ogenbargen;1 +4948;Wiesmoor-Marcardsmoor;1 +4950;Holtland;1 +4951;Weener;1 +4952;Rhauderfehn;1 +4953;Bunde;1 +4954;Moormerland;1 +4955;Westoverledingen;1 +4956;Uplengen;1 +4957;Detern;1 +4958;Jemgum;1 +4959;Dollart;1 +4961;Papenburg;1 +4962;Papenburg-Aschendorf;1 +4963;Dörpen;1 +4964;Rhede Ems;1 +4965;Surwold;1 +4966;Neubörger;1 +4967;Rhauderfehn-Burlage;1 +4968;Neulehe;1 +4971;Esens;1 +4972;Langeoog;1 +4973;Wittmund-Burhafe;1 +4974;Neuharlingersiel;1 +4975;Westerholt Ostfriesl;1 +4976;Spiekeroog;1 +4977;Blomberg Ostfriesl;1 +5021;Nienburg Weser;1 +5022;Wietzen;1 +5023;Liebenau Kr Nieburg Weser;1 +5024;Rohrsen Kr Nienburg Weser;1 +5025;Estorf Weser;1 +5026;Steimbke;1 +5027;Linsburg;1 +5028;Pennigsehl;1 +5031;Wunstorf;1 +5032;Neustadt am Rübenberge;1 +5033;Wunstorf-Grossenheidorn;1 +5034;Neustadt-Hagen;1 +5035;Gross Munzel;1 +5036;Neustadt-Schneeren;1 +5037;Bad Rehburg;1 +5041;Springe Deister;1 +5042;Bad Münder am Deister;1 +5043;Lauenau;1 +5044;Springe-Eldagsen;1 +5045;Springe-Bennigsen;1 +5051;Bergen Kr Celle;1 +5052;Hermannsburg;1 +5053;Faßberg-Müden;1 +5054;Bergen-Sülze;1 +5055;Fassberg;1 +5056;Winsen-Meissendorf;1 +5060;Bodenburg;1 +5062;Holle b Hildesheim;1 +5063;Bad Salzdetfurth;1 +5064;Groß Düngen;1 +5065;Sibbesse;1 +5066;Sarstedt;1 +5067;Bockenem;1 +5068;Elze Leine;1 +5069;Nordstemmen;1 +5071;Schwarmstedt;1 +5072;Neustadt-Mandelsloh;1 +5073;Neustadt-Esperke;1 +5074;Rodewald;1 +5082;Langlingen;1 +5083;Hohne b Celle;1 +5084;Hambühren;1 +5085;Burgdorf-Ehlershausen;1 +5086;Celle-Scheuen;1 +5101;Pattensen;1 +5102;Laatzen;1 +5103;Wennigsen Deister;1 +5105;Barsinghausen;1 +5108;Gehrden Han;1 +5109;Ronnenberg;1 +511;Hannover;1 +5121;Hildesheim;1 +5123;Schellerten;1 +5126;Algermissen;1 +5127;Harsum;1 +5128;Hohenhameln;1 +5129;Söhlde;1 +5130;Wedemark;1 +5131;Garbsen;1 +5132;Lehrte;1 +5135;Burgwedel-Fuhrberg;1 +5136;Burgdorf Kr Hannover;1 +5137;Seelze;1 +5138;Sehnde;1 +5139;Burgwedel;1 +5141;Celle;1 +5142;Eschede;1 +5143;Winsen Aller;1 +5144;Wathlingen;1 +5145;Beedenbostel;1 +5146;Wietze;1 +5147;Uetze-Hänigsen;1 +5148;Steinhorst Niedersachs;1 +5149;Wienhausen;1 +5151;Hameln;1 +5152;Hessisch Oldendorf;1 +5153;Salzhemmendorf;1 +5154;Aerzen;1 +5155;Emmerthal;1 +5156;Coppenbrügge;1 +5157;Emmerthal-Börry;1 +5158;Hemeringen;1 +5159;Coppenbrügge-Bisperode;1 +5161;Walsrode;1 +5162;Fallingbostel;1 +5163;Fallingbostel-Dorfmark;1 +5164;Hodenhagen;1 +5165;Rethem Aller;1 +5166;Walsrode-Kirchboitzen;1 +5167;Walsrode-Westenholz;1 +5168;Walsrode-Stellichte;1 +5171;Peine;1 +5172;Ilsede;1 +5173;Uetze;1 +5174;Lahstedt;1 +5175;Lehrte-Arpke;1 +5176;Edemissen;1 +5177;Edemissen-Abbensen;1 +5181;Alfeld Leine;1 +5182;Gronau Leine;1 +5183;Lamspringe;1 +5184;Freden Leine;1 +5185;Duingen;1 +5186;Salzhemmendorf-Wallensen;1 +5187;Delligsen;1 +5190;Soltau-Emmingen;1 +5191;Soltau;1 +5192;Munster;1 +5193;Schneverdingen;1 +5194;Bispingen;1 +5195;Neuenkirchen b Soltau;1 +5196;Wietzendorf;1 +5197;Soltau-Frielingen;1 +5198;Schneverdingen-Wintermoor;1 +5199;Schneverdingen-Heber;1 +5201;Halle Westf;1 +5202;Oerlinghausen;1 +5203;Werther Westf;1 +5204;Steinhagen Westf;1 +5205;Bielefeld-Sennestadt;1 +5206;Bielefeld-Jöllenbeck;1 +5207;Schloss Holte-Stukenbrock;1 +5208;Leopoldshöhe;1 +5209;Gütersloh-Friedrichsdorf;1 +521;Bielefeld;1 +5221;Herford;1 +5222;Bad Salzuflen;1 +5223;Bünde;1 +5224;Enger Westf;1 +5225;Spenge;1 +5226;Bruchmühlen Westf;1 +5228;Vlotho-Exter;1 +5231;Detmold;1 +5232;Lage Lippe;1 +5233;Steinheim Westf;1 +5234;Horn-Bad Meinberg;1 +5235;Blomberg Lippe;1 +5236;Blomberg-Grossenmarpe;1 +5237;Augustdorf;1 +5238;Nieheim-Himmighausen;1 +5241;Gütersloh;1 +5242;Rheda-Wiedenbrück;1 +5244;Rietberg;1 +5245;Herzebrock-Clarholz;1 +5246;Verl;1 +5247;Harsewinkel;1 +5248;Langenberg Kr Gütersloh;1 +5250;Delbrück Westf;1 +5251;Paderborn;1 +5252;Bad Lippspringe;1 +5253;Bad Driburg;1 +5254;Paderborn-Schloss Neuhaus;1 +5255;Altenbeken;1 +5257;Hövelhof;1 +5258;Salzkotten;1 +5259;Bad Driburg-Neuenheerse;1 +5261;Lemgo;1 +5262;Extertal;1 +5263;Barntrup;1 +5264;Kalletal;1 +5265;Dörentrup;1 +5266;Lemgo-Kirchheide;1 +5271;Höxter;1 +5272;Brakel Westf;1 +5273;Beverungen;1 +5274;Nieheim;1 +5275;Höxter-Ottbergen;1 +5276;Marienmünster;1 +5277;Höxter-Fürstenau;1 +5278;Höxter-Ovenhausen;1 +5281;Bad Pyrmont;1 +5282;Schieder-Schwalenberg;1 +5283;Lügde-Rischenau;1 +5284;Schwalenberg;1 +5285;Bad Pyrmont-Kleinenberg;1 +5286;Ottenstein Niedersachs;1 +5292;Lichtenau-Atteln;1 +5293;Paderborn-Dahl;1 +5294;Hövelhof-Espeln;1 +5295;Lichtenau Westf;1 +5300;Salzgitter-Üfingen;1 +5301;Lehre-Essenrode;1 +5302;Vechelde;1 +5303;Wendeburg;1 +5304;Meine;1 +5305;Sickte;1 +5306;Cremlingen;1 +5307;Braunschweig-Wenden;1 +5308;Lehre;1 +5309;Lehre-Wendhausen;1 +531;Braunschweig;1 +5320;Torfhaus;1 +5321;Goslar;1 +5322;Bad Harzburg;1 +5323;Clausthal-Zellerfeld;1 +5324;Vienenburg;1 +5325;Goslar-Hahnenklee;1 +5326;Langelsheim;1 +5327;Bad Grund Harz;1 +5328;Altenau Harz;1 +5329;Schulenberg im Oberharz;1 +5331;Wolfenbüttel;1 +5332;Schöppenstedt;1 +5333;Dettum;1 +5334;Hornburg Kr Wolfenbüttel;1 +5335;Schladen;1 +5336;Semmenstedt;1 +5337;Kissenbrück;1 +5339;Gielde;1 +5341;Salzgitter;1 +5344;Lengede;1 +5345;Baddeckenstedt;1 +5346;Liebenburg;1 +5347;Burgdorf b Salzgitter;1 +5351;Helmstedt;1 +5352;Schöningen;1 +5353;Königslutter am Elm;1 +5354;Jerxheim;1 +5355;Frellstedt;1 +5356;Helmstedt-Barmke;1 +5357;Grasleben;1 +5358;Bahrdorf-Mackendorf;1 +5361;Wolfsburg;1 +5362;Wolfsburg-Fallersleben;1 +5363;Wolfsburg-Vorsfelde;1 +5364;Velpke;1 +5365;Wolfsburg-Neindorf;1 +5366;Jembke;1 +5367;Rühen;1 +5368;Parsau;1 +5371;Gifhorn;1 +5372;Meinersen;1 +5373;Hillerse Kr Gifhorn;1 +5374;Isenbüttel;1 +5375;Müden Aller;1 +5376;Wesendorf Kr Gifhorn;1 +5377;Ehra-Lessien;1 +5378;Sassenburg-Platendorf;1 +5379;Sassenburg-Grussendorf;1 +5381;Seesen;1 +5382;Bad Gandersheim;1 +5383;Lutter am Barenberge;1 +5384;Seesen-Groß Rhüden;1 +5401;Georgsmarienhütte;1 +5402;Bissendorf Kr Osnabrück;1 +5403;Bad Iburg;1 +5404;Westerkappeln;1 +5405;Hasbergen Kr Osnabrück;1 +5406;Belm;1 +5407;Wallenhorst;1 +5409;Hilter am Teutoburger Wald;1 +541;Osnabrück;1 +5421;Dissen am Teutoburger Wald;1 +5422;Melle;1 +5423;Versmold;1 +5424;Bad Rothenfelde;1 +5425;Borgholzhausen;1 +5426;Glandorf;1 +5427;Melle-Buer;1 +5428;Melle-Neuenkirchen;1 +5429;Melle-Wellingholzhausen;1 +5431;Quakenbrück;1 +5432;Löningen;1 +5433;Badbergen;1 +5434;Essen Oldenburg;1 +5435;Berge b Quakenbrück;1 +5436;Nortrup;1 +5437;Menslage;1 +5438;Bakum-Lüsche;1 +5439;Bersenbrück;1 +5441;Diepholz;1 +5442;Barnstorf Kr Diepholz;1 +5443;Lemförde;1 +5444;Wagenfeld;1 +5445;Drebber;1 +5446;Rehden;1 +5447;Lembruch;1 +5448;Barver;1 +5451;Ibbenbüren;1 +5452;Mettingen Westf;1 +5453;Recke;1 +5454;Hörstel-Riesenbeck;1 +5455;Tecklenburg-Brochterbeck;1 +5456;Westerkappeln-Velpe;1 +5457;Hopsten-Schale;1 +5458;Hopsten;1 +5459;Hörstel;1 +5461;Bramsche Hase;1 +5462;Ankum;1 +5464;Alfhausen;1 +5465;Neuenkirchen b Bramsche;1 +5466;Merzen;1 +5467;Voltlage;1 +5468;Bramsche-Engter;1 +5471;Bohmte;1 +5472;Bad Essen;1 +5473;Ostercappeln;1 +5474;Stemwede-Dielingen;1 +5475;Bohmte-Hunteburg;1 +5476;Ostercappeln-Venne;1 +5481;Lengerich Westf;1 +5482;Tecklenburg;1 +5483;Lienen;1 +5484;Lienen-Kattenvenne;1 +5485;Ladbergen;1 +5491;Damme Dümmer;1 +5492;Steinfeld Oldenburg;1 +5493;Neuenkirchen Kr Vechta;1 +5494;Holdorf Niedersachs;1 +5495;Vörden Kr Vechta;1 +5502;Dransfeld;1 +5503;Nörten-Hardenberg;1 +5504;Friedland Kr Göttingen;1 +5505;Hardegsen;1 +5506;Adelebsen;1 +5507;Ebergötzen;1 +5508;Gleichen-Rittmarshausen;1 +5509;Rosdorf Kr Göttingen;1 +551;Göttingen;1 +5520;Braunlage;1 +5521;Herzberg am Harz;1 +5522;Osterode am Harz;1 +5523;Bad Sachsa;1 +5524;Bad Lauterberg im Harz;1 +5525;Walkenried;1 +5527;Duderstadt;1 +5528;Gieboldehausen;1 +5529;Rhumspringe;1 +5531;Holzminden;1 +5532;Stadtoldendorf;1 +5533;Bodenwerder;1 +5534;Eschershausen a d Lenne;1 +5535;Polle;1 +5536;Holzminden-Neuhaus;1 +5541;Hann. Münden;1 +5542;Witzenhausen;1 +5543;Staufenberg Niedersachs;1 +5544;Reinhardshagen;1 +5545;Hedemünden;1 +5546;Scheden;1 +5551;Northeim;1 +5552;Katlenburg;1 +5553;Kalefeld;1 +5554;Moringen;1 +5555;Moringen-Fredelsloh;1 +5556;Lindau Harz;1 +5561;Einbeck;1 +5562;Dassel-Markoldendorf;1 +5563;Kreiensen;1 +5564;Dassel;1 +5565;Einbeck-Wenzen;1 +5571;Uslar;1 +5572;Bodenfelde;1 +5573;Uslar-Volpriehausen;1 +5574;Oberweser;1 +5582;Sankt Andreasberg;1 +5583;Braunlage-Hohegeiss;1 +5584;Hattorf am Harz;1 +5585;Herzberg-Sieber;1 +5586;Wieda;1 +5592;Gleichen-Bremke;1 +5593;Bovenden-Lenglern;1 +5594;Bovenden-Reyershausen;1 +5601;Schauenburg;1 +5602;Hessisch Lichtenau;1 +5603;Gudensberg;1 +5604;Grossalmerode;1 +5605;Kaufungen Hess;1 +5606;Zierenberg;1 +5607;Fuldatal;1 +5608;Söhrewald;1 +5609;Ahnatal;1 +561;Kassel;1 +5621;Bad Wildungen;1 +5622;Fritzlar;1 +5623;Edertal;1 +5624;Bad Emstal;1 +5625;Naumburg Hess;1 +5626;Bad Zwesten;1 +5631;Korbach;1 +5632;Willingen Upland;1 +5633;Diemelsee;1 +5634;Waldeck-Sachsenhausen;1 +5635;Vöhl;1 +5636;Lichtenfels-Goddelsheim;1 +5641;Warburg;1 +5642;Warburg-Scherfede;1 +5643;Borgentreich;1 +5644;Willebadessen-Peckelsheim;1 +5645;Borgentreich-Borgholz;1 +5646;Willebadessen;1 +5647;Lichtenau-Kleinenberg;1 +5648;Brakel-Gehrden;1 +5650;Cornberg;1 +5651;Eschwege;1 +5652;Bad Sooden-Allendorf;1 +5653;Sontra;1 +5654;Herleshausen;1 +5655;Wanfried;1 +5656;Waldkappel;1 +5657;Meissner;1 +5658;Wehretal;1 +5659;Ringgau;1 +5661;Melsungen;1 +5662;Felsberg Hess;1 +5663;Spangenberg;1 +5664;Morschen;1 +5665;Guxhagen;1 +5671;Hofgeismar;1 +5672;Bad Karlshafen;1 +5673;Immenhausen Hess;1 +5674;Grebenstein;1 +5675;Trendelburg;1 +5676;Liebenau Hess;1 +5677;Calden-Westuffeln;1 +5681;Homberg Efze;1 +5682;Borken Hessen;1 +5683;Wabern Hess;1 +5684;Frielendorf;1 +5685;Knüllwald;1 +5686;Schwarzenborn Knüll;1 +5691;Bad Arolsen;1 +5692;Wolfhagen;1 +5693;Volkmarsen;1 +5694;Diemelstadt;1 +5695;Twistetal;1 +5696;Bad Arolsen-Landau;1 +5702;Petershagen-Lahde;1 +5703;Hille;1 +5704;Petershagen-Friedewalde;1 +5705;Petershagen-Windheim;1 +5706;Porta Westfalica;1 +5707;Petershagen Weser;1 +571;Minden Westf;1 +5721;Stadthagen;1 +5722;Bückeburg;1 +5723;Bad Nenndorf;1 +5724;Obernkirchen;1 +5725;Lindhorst b Stadthagen;1 +5726;Wiedensahl;1 +5731;Bad Oeynhausen;1 +5732;Löhne;1 +5733;Vlotho;1 +5734;Bergkirchen Westf;1 +5741;Lübbecke;1 +5742;Preussisch Oldendorf;1 +5743;Espelkamp-Gestringen;1 +5744;Hüllhorst;1 +5745;Stemwede-Levern;1 +5746;Rödinghausen;1 +5751;Rinteln;1 +5752;Auetal-Hattendorf;1 +5753;Auetal-Bernsen;1 +5754;Extertal-Bremke;1 +5755;Kalletal-Varenholz;1 +5761;Stolzenau;1 +5763;Uchte;1 +5764;Steyerberg;1 +5765;Raddestorf;1 +5766;Rehburg-Loccum;1 +5767;Warmsen;1 +5768;Petershagen-Heimsen;1 +5769;Steyerberg-Voigtei;1 +5771;Rahden Westf;1 +5772;Espelkamp;1 +5773;Stemwede-Wehdem;1 +5774;Wagenfeld-Ströhen;1 +5775;Diepenau;1 +5776;Preussisch Ströhen;1 +5777;Diepenau-Essern;1 +5802;Wrestedt;1 +5803;Rosche;1 +5804;Rätzlingen Kr Uelzen;1 +5805;Oetzen;1 +5806;Barum b Bad Bevensen;1 +5807;Altenmedingen;1 +5808;Gerdau;1 +581;Uelzen;1 +5820;Suhlendorf;1 +5821;Bad Bevensen;1 +5822;Ebstorf;1 +5823;Bienenbüttel;1 +5824;Bad Bodenteich;1 +5825;Wieren;1 +5826;Suderburg;1 +5827;Unterlüß;1 +5828;Himbergen;1 +5829;Wriedel;1 +5831;Wittingen;1 +5832;Hankensbüttel;1 +5833;Brome;1 +5834;Wittingen-Knesebeck;1 +5835;Wahrenholz;1 +5836;Wittingen-Radenbeck;1 +5837;Sprakensehl;1 +5838;Gross Oesingen;1 +5839;Wittingen-Ohrdorf;1 +5840;Schnackenburg;1 +5841;Lüchow Wendland;1 +5842;Schnega;1 +5843;Wustrow Wendland;1 +5844;Clenze;1 +5845;Bergen Dumme;1 +5846;Gartow Niedersachs;1 +5848;Trebel;1 +5849;Waddeweitz;1 +5850;Neetze;1 +5851;Dahlenburg;1 +5852;Bleckede;1 +5853;Neu Darchau;1 +5854;Bleckede-Barskamp;1 +5855;Nahrendorf;1 +5857;Bleckede-Brackede;1 +5858;Hitzacker-Wietzetze;1 +5859;Thomasburg;1 +5861;Dannenberg Elbe;1 +5862;Hitzacker Elbe;1 +5863;Zernien;1 +5864;Jameln;1 +5865;Gusborn;1 +5872;Stoetze;1 +5873;Eimke;1 +5874;Soltendieck;1 +5875;Emmendorf;1 +5882;Gorleben;1 +5883;Lemgow;1 +5901;Fürstenau b Bramsche;1 +5902;Freren;1 +5903;Emsbüren;1 +5904;Lengerich Emsl;1 +5905;Beesten;1 +5906;Lünne;1 +5907;Geeste;1 +5908;Wietmarschen-Lohne;1 +5909;Wettrup;1 +591;Lingen (Ems);1 +5921;Nordhorn;1 +5922;Bad Bentheim;1 +5923;Schüttorf;1 +5924;Bad Bentheim-Gildehaus;1 +5925;Wietmarschen;1 +5926;Engden;1 +5931;Meppen;1 +5932;Haren Ems;1 +5933;Lathen;1 +5934;Haren-Rütenbrock;1 +5935;Twist-Schöninghsdorf;1 +5936;Twist;1 +5937;Geeste-Gross Hesepe;1 +5939;Sustrum;1 +5941;Neuenhaus Dinkel;1 +5942;Uelsen;1 +5943;Emlichheim;1 +5944;Hoogstede;1 +5945;Wilsum;1 +5946;Georgsdorf;1 +5947;Laar Vechte;1 +5948;Itterbeck;1 +5951;Werlte;1 +5952;Sögel;1 +5953;Börger;1 +5954;Lorup;1 +5955;Esterwegen;1 +5956;Rastdorf;1 +5957;Lindern Oldenburg;1 +5961;Haselünne;1 +5962;Herzlake;1 +5963;Bawinkel;1 +5964;Lähden;1 +5965;Klein Berssen;1 +5966;Meppen-Apeldorn;1 +5971;Rheine;1 +5973;Neuenkirchen Kr Steinfurt;1 +5975;Rheine-Mesum;1 +5976;Salzbergen;1 +5977;Spelle;1 +5978;Hörstel-Dreierwalde;1 +6002;Ober-Mörlen;1 +6003;Rosbach v d Höhe;1 +6004;Lich-Eberstadt;1 +6007;Rosbach-Rodheim;1 +6008;Echzell;1 +6020;Heigenbrücken;1 +6021;Aschaffenburg;1 +6022;Obernburg a Main;1 +6023;Alzenau i Ufr;1 +6024;Schöllkrippen;1 +6026;Grossostheim;1 +6027;Stockstadt a Main;1 +6028;Sulzbach a Main;1 +6029;Mömbris;1 +6031;Friedberg Hess;1 +6032;Bad Nauheim;1 +6033;Butzbach;1 +6034;Wöllstadt;1 +6035;Reichelsheim Wetterau;1 +6036;Wölfersheim;1 +6039;Karben;1 +6041;Glauburg;1 +6042;Büdingen Hess;1 +6043;Nidda;1 +6044;Schotten Hess;1 +6045;Gedern;1 +6046;Ortenberg Hess;1 +6047;Altenstadt Hess;1 +6048;Büdingen-Eckartshausen;1 +6049;Kefenrod;1 +6050;Biebergemünd;1 +6051;Gelnhausen;1 +6052;Bad Orb;1 +6053;Wächtersbach;1 +6054;Birstein;1 +6055;Freigericht;1 +6056;Bad Soden-Salmünster;1 +6057;Flörsbachtal;1 +6058;Gründau;1 +6059;Jossgrund;1 +6061;Michelstadt;1 +6062;Erbach Odenw;1 +6063;Bad König;1 +6066;Michelstadt-Vielbrunn;1 +6068;Beerfelden;1 +6071;Dieburg;1 +6073;Babenhausen Hess;1 +6074;Rödermark;1 +6078;Gross-Umstadt;1 +6081;Usingen;1 +6082;Niederreifenberg;1 +6083;Weilrod;1 +6084;Schmitten Taunus;1 +6085;Waldsolms;1 +6086;Grävenwiesbach;1 +6087;Waldems;1 +6092;Heimbuchenthal;1 +6093;Laufach;1 +6094;Weibersbrunn;1 +6095;Bessenbach;1 +6096;Wiesen Unterfr;1 +6101;Bad Vilbel;1 +6102;Neu-Isenburg;1 +6103;Langen Hess;1 +6104;Heusenstamm;1 +6105;Mörfelden-Walldorf;1 +6106;Rodgau;1 +6107;Kelsterbach;1 +6108;Mühlheim am Main;1 +6109;Frankfurt-Bergen-Enkheim;1 +611;Wiesbaden;1 +6120;Aarbergen;1 +6122;Hofheim-Wallau;1 +6123;Eltville am Rhein;1 +6124;Bad Schwalbach;1 +6126;Idstein;1 +6127;Niedernhausen Taunus;1 +6128;Taunusstein;1 +6129;Schlangenbad;1 +6130;Schwabenheim an der Selz;1 +6131;Mainz;1 +6132;Ingelheim am Rhein;1 +6133;Oppenheim;1 +6134;Mainz-Kastel;1 +6135;Bodenheim Rhein;1 +6136;Nieder-Olm;1 +6138;Mommenheim;1 +6139;Budenheim;1 +6142;Rüsselsheim;1 +6144;Bischofsheim b Rüsselsheim;1 +6145;Flörsheim am Main;1 +6146;Hochheim am Main;1 +6147;Trebur;1 +6150;Weiterstadt;1 +6151;Darmstadt;1 +6152;Gross-Gerau;1 +6154;Ober-Ramstadt;1 +6155;Griesheim Hess;1 +6157;Pfungstadt;1 +6158;Riedstadt;1 +6159;Messel;1 +6161;Brensbach;1 +6162;Reinheim Odenw;1 +6163;Höchst i Odw;1 +6164;Reichelsheim Odenwald;1 +6165;Breuberg;1 +6166;Fischbachtal;1 +6167;Modautal;1 +6171;Oberursel Taunus;1 +6172;Bad Homburg v d Höhe;1 +6173;Kronberg im Taunus;1 +6174;Königstein im Taunus;1 +6175;Friedrichsdorf Taunus;1 +6181;Hanau;1 +6182;Seligenstadt;1 +6183;Erlensee;1 +6184;Langenselbold;1 +6185;Hammersbach Hess;1 +6186;Grosskrotzenburg;1 +6187;Schöneck;1 +6188;Kahl a Main;1 +6190;Hattersheim a Main;1 +6192;Hofheim am Taunus;1 +6195;Kelkheim Taunus;1 +6196;Bad Soden am Taunus;1 +6198;Eppstein;1 +6201;Weinheim Bergstr;1 +6202;Schwetzingen;1 +6203;Ladenburg;1 +6204;Viernheim;1 +6205;Hockenheim;1 +6206;Lampertheim;1 +6207;Wald-Michelbach;1 +6209;Mörlenbach;1 +621;Mannheim;1 +6220;Wilhelmsfeld;1 +6221;Heidelberg;1 +6222;Wiesloch;1 +6223;Neckargemünd;1 +6224;Sandhausen Baden;1 +6226;Meckesheim;1 +6227;Walldorf Baden;1 +6228;Schönau Odenw;1 +6229;Neckarsteinach;1 +6231;Hochdorf-Assenheim;1 +6232;Speyer;1 +6233;Frankenthal Pfalz;1 +6234;Mutterstadt;1 +6235;Schifferstadt;1 +6236;Neuhofen Pfalz;1 +6237;Maxdorf;1 +6238;Dirmstein;1 +6239;Bobenheim-Roxheim;1 +6241;Worms;1 +6242;Osthofen;1 +6243;Monsheim;1 +6244;Westhofen Rheinhess;1 +6245;Biblis;1 +6246;Eich Rheinhess;1 +6247;Worms-Pfeddersheim;1 +6249;Guntersblum;1 +6251;Bensheim;1 +6252;Heppenheim Bergstraße;1 +6253;Fürth Odenw;1 +6254;Lautertal Odenwald;1 +6255;Lindenfels;1 +6256;Lampertheim-Hüttenfeld;1 +6257;Seeheim-Jugenheim;1 +6258;Gernsheim;1 +6261;Mosbach Baden;1 +6262;Aglasterhausen;1 +6263;Neckargerach;1 +6264;Neudenau;1 +6265;Billigheim Baden;1 +6266;Hassmersheim;1 +6267;Fahrenbach Baden;1 +6268;Hüffenhardt;1 +6269;Gundelsheim Württ;1 +6271;Eberbach Baden;1 +6272;Hirschhorn Neckar;1 +6274;Waldbrunn Odenw;1 +6275;Rothenberg Odenw;1 +6276;Hesseneck;1 +6281;Buchen Odenwald;1 +6282;Walldürn;1 +6283;Hardheim Odenw;1 +6284;Mudau;1 +6285;Walldürn-Altheim;1 +6286;Walldürn-Rippberg;1 +6287;Limbach Baden;1 +6291;Adelsheim;1 +6292;Seckach;1 +6293;Schefflenz;1 +6294;Krautheim Jagst;1 +6295;Rosenberg Baden;1 +6296;Ahorn Baden;1 +6297;Ravenstein Baden;1 +6298;Möckmühl;1 +6301;Otterbach Pfalz;1 +6302;Winnweiler;1 +6303;Enkenbach-Alsenborn;1 +6304;Wolfstein Pfalz;1 +6305;Hochspeyer;1 +6306;Trippstadt;1 +6307;Schopp;1 +6308;Olsbrücken;1 +631;Kaiserslautern;1 +6321;Neustadt an der Weinstraße;1 +6322;Bad Dürkheim;1 +6323;Edenkoben;1 +6324;Hassloch;1 +6325;Lambrecht Pfalz;1 +6326;Deidesheim;1 +6327;Neustadt-Lachen;1 +6328;Elmstein;1 +6329;Weidenthal Pfalz;1 +6331;Pirmasens;1 +6332;Zweibrücken;1 +6333;Waldfischbach-Burgalben;1 +6334;Thaleischweiler-Fröschen;1 +6335;Trulben;1 +6336;Dellfeld;1 +6337;Grossbundenbach;1 +6338;Hornbach Pfalz;1 +6339;Grosssteinhausen;1 +6340;Wörth-Schaidt;1 +6341;Landau in der Pfalz;1 +6342;Schweigen-Rechtenbach;1 +6343;Bad Bergzabern;1 +6344;Schwegenheim;1 +6345;Albersweiler;1 +6346;Annweiler am Trifels;1 +6347;Hochstadt Pfalz;1 +6348;Offenbach an der Queich;1 +6349;Billigheim-Ingenheim;1 +6351;Eisenberg Pfalz;1 +6352;Kirchheimbolanden;1 +6353;Freinsheim;1 +6355;Albisheim Pfrimm;1 +6356;Carlsberg Pfalz;1 +6357;Standenbühl;1 +6358;Kriegsfeld;1 +6359;Grünstadt;1 +6361;Rockenhausen;1 +6362;Alsenz;1 +6363;Niederkirchen;1 +6364;Nußbach Pfalz;1 +6371;Landstuhl;1 +6372;Bruchmühlbach-Miesau;1 +6373;Schönenberg-Kübelberg;1 +6374;Weilerbach;1 +6375;Wallhalben;1 +6381;Kusel;1 +6382;Lauterecken;1 +6383;Glan-Münchweiler;1 +6384;Konken;1 +6385;Reichenbach-Steegen;1 +6386;Altenkirchen Pfalz;1 +6387;Sankt Julian;1 +6391;Dahn;1 +6392;Hauenstein Pfalz;1 +6393;Fischbach bei Dahn;1 +6394;Bundenthal;1 +6395;Münchweiler an der Rodalb;1 +6396;Hinterweidenthal;1 +6397;Leimen Pfalz;1 +6398;Vorderweidenthal;1 +6400;Mücke;1 +6401;Grünberg Hess;1 +6402;Hungen;1 +6403;Linden Hess;1 +6404;Lich Hess;1 +6405;Laubach Hess;1 +6406;Lollar;1 +6407;Rabenau Hess;1 +6408;Buseck;1 +6409;Biebertal;1 +641;Giessen;1 +6420;Lahntal;1 +6421;Marburg;1 +6422;Kirchhain;1 +6423;Wetter Hessen;1 +6424;Ebsdorfergrund;1 +6425;Rauschenberg Hess;1 +6426;Fronhausen;1 +6427;Cölbe-Schönstadt;1 +6428;Stadtallendorf;1 +6429;Schweinsberg Hess;1 +6430;Hahnstätten;1 +6431;Limburg a d Lahn;1 +6432;Diez;1 +6433;Hadamar;1 +6434;Bad Camberg;1 +6435;Wallmerod;1 +6436;Dornburg Hess;1 +6438;Hünfelden;1 +6439;Holzappel;1 +6440;Kölschhausen;1 +6441;Wetzlar;1 +6442;Braunfels;1 +6443;Ehringshausen Dill;1 +6444;Bischoffen;1 +6445;Schöffengrund;1 +6446;Hohenahr;1 +6447;Langgöns-Niederkleen;1 +6449;Ehringshausen-Katzenfurt;1 +6451;Frankenberg Eder;1 +6452;Battenberg Eder;1 +6453;Gemünden Wohra;1 +6454;Lichtenfels-Sachsenberg;1 +6455;Frankenau Hess;1 +6456;Haina Kloster;1 +6457;Burgwald Eder;1 +6458;Rosenthal Hess;1 +6461;Biedenkopf;1 +6462;Gladenbach;1 +6464;Angelburg;1 +6465;Breidenbach b Biedenkopf;1 +6466;Dautphetal-Friedensdorf;1 +6467;Hatzfeld Eder;1 +6468;Dautphetal-Mornshausen;1 +6471;Weilburg;1 +6472;Weilmünster;1 +6473;Leun;1 +6474;Villmar-Aumenau;1 +6475;Weilmünster-Wolfenhausen;1 +6476;Mengerskirchen;1 +6477;Greifenstein-Nenderoth;1 +6478;Greifenstein-Ulm;1 +6479;Waldbrunn Westerwald;1 +6482;Runkel;1 +6483;Selters Taunus;1 +6484;Beselich;1 +6485;Nentershausen Westerw;1 +6486;Katzenelnbogen;1 +6500;Waldrach;1 +6501;Konz;1 +6502;Schweich;1 +6503;Hermeskeil;1 +6504;Thalfang;1 +6505;Kordel;1 +6506;Welschbillig;1 +6507;Neumagen-Dhron;1 +6508;Hetzerath Mosel;1 +6509;Büdlich;1 +651;Trier;1 +6522;Mettendorf;1 +6523;Holsthum;1 +6524;Rodershausen;1 +6525;Irrel;1 +6526;Bollendorf;1 +6527;Oberweis;1 +6531;Bernkastel-Kues;1 +6532;Zeltingen-Rachtig;1 +6533;Morbach Hunsrück;1 +6534;Mülheim Mosel;1 +6535;Osann-Monzel;1 +6536;Kleinich;1 +6541;Traben-Trarbach;1 +6542;Bullay;1 +6543;Büchenbeuren;1 +6544;Rhaunen;1 +6545;Blankenrath;1 +6550;Irrhausen;1 +6551;Prüm;1 +6552;Olzheim;1 +6553;Schönecken;1 +6554;Waxweiler;1 +6555;Bleialf;1 +6556;Pronsfeld;1 +6557;Hallschlag;1 +6558;Büdesheim Eifel;1 +6559;Leidenborn;1 +6561;Bitburg;1 +6562;Speicher;1 +6563;Kyllburg;1 +6564;Neuerburg Eifel;1 +6565;Dudeldorf;1 +6566;Körperich;1 +6567;Oberkail;1 +6568;Wolsfeld;1 +6569;Bickendorf;1 +6571;Wittlich;1 +6572;Manderscheid Eifel;1 +6573;Gillenfeld;1 +6574;Hasborn;1 +6575;Landscheid;1 +6578;Salmtal;1 +6580;Zemmer;1 +6581;Saarburg;1 +6582;Freudenburg;1 +6583;Palzem;1 +6584;Wellen Mosel;1 +6585;Ralingen;1 +6586;Beuren Hochwald;1 +6587;Zerf;1 +6588;Pluwig;1 +6589;Kell am See;1 +6591;Gerolstein;1 +6592;Daun;1 +6593;Hillesheim Eifel;1 +6594;Birresborn;1 +6595;Dockweiler;1 +6596;Üdersdorf;1 +6597;Jünkerath;1 +6599;Weidenbach b Gerolstein;1 +661;Fulda;1 +6620;Philippsthal Werra;1 +6621;Bad Hersfeld;1 +6622;Bebra;1 +6623;Rotenburg a d Fulda;1 +6624;Heringen Werra;1 +6625;Niederaula;1 +6626;Wildeck-Obersuhl;1 +6627;Nentershausen Hess;1 +6628;Oberaula;1 +6629;Schenklengsfeld;1 +6630;Schwalmtal-Storndorf;1 +6631;Alsfeld;1 +6633;Homberg Ohm;1 +6634;Gemünden Felda;1 +6635;Kirtorf;1 +6636;Romrod;1 +6637;Feldatal;1 +6638;Schwalmtal-Renzendorf;1 +6639;Ottrau;1 +6641;Lauterbach Hessen;1 +6642;Schlitz;1 +6643;Herbstein;1 +6644;Grebenhain;1 +6645;Ulrichstein;1 +6646;Grebenau;1 +6647;Herbstein-Stockhausen;1 +6648;Bad Salzschlirf;1 +6650;Hosenfeld;1 +6651;Rasdorf;1 +6652;Hünfeld;1 +6653;Burghaun;1 +6654;Gersfeld Rhön;1 +6655;Neuhof Kr Fulda;1 +6656;Ebersburg;1 +6657;Hofbieber;1 +6658;Poppenhausen Wasserkuppe;1 +6659;Eichenzell;1 +6660;Steinau-Marjoss;1 +6661;Schlüchtern;1 +6663;Steinau an der Straße;1 +6664;Sinntal-Sterbfritz;1 +6665;Sinntal-Altengronau;1 +6666;Freiensteinau;1 +6667;Steinau-Ulmbach;1 +6668;Birstein-Lichenroth;1 +6669;Neuhof-Hauswurz;1 +6670;Ludwigsau Hess;1 +6672;Eiterfeld;1 +6673;Haunetal;1 +6674;Friedewald Hess;1 +6675;Breitenbach a Herzberg;1 +6676;Hohenroda Hess;1 +6677;Neuenstein Hess;1 +6678;Wildeck-Hönebach;1 +6681;Hilders;1 +6682;Tann Rhön;1 +6683;Ehrenberg Rhön;1 +6684;Hofbieber-Schwarzbach;1 +6691;Schwalmstadt;1 +6692;Neustadt Hessen;1 +6693;Neuental;1 +6694;Neukirchen Knüll;1 +6695;Jesberg;1 +6696;Gilserberg;1 +6697;Willingshausen;1 +6698;Schrecksbach;1 +6701;Sprendlingen Rheinhess;1 +6703;Wöllstein Rheinhess;1 +6704;Langenlonsheim;1 +6706;Wallhausen Nahe;1 +6707;Windesheim;1 +6708;Bad Münster am Stein-Ebernburg;1 +6709;Fürfeld Kr Bad Kreuznach;1 +671;Bad Kreuznach;1 +6721;Bingen am Rhein;1 +6722;Rüdesheim am Rhein;1 +6723;Oestrich-Winkel;1 +6724;Stromberg Hunsrück;1 +6725;Gau-Algesheim;1 +6726;Lorch Rheingau;1 +6727;Gensingen;1 +6728;Ober-Hilbersheim;1 +6731;Alzey;1 +6732;Wörrstadt;1 +6733;Gau-Odernheim;1 +6734;Flonheim;1 +6735;Eppelsheim;1 +6736;Bechenheim;1 +6737;Köngernheim;1 +6741;St Goar;1 +6742;Boppard;1 +6743;Bacharach;1 +6744;Oberwesel;1 +6745;Gondershausen;1 +6746;Pfalzfeld;1 +6747;Emmelshausen;1 +6751;Bad Sobernheim;1 +6752;Kirn Nahe;1 +6753;Meisenheim;1 +6754;Martinstein;1 +6755;Odernheim am Glan;1 +6756;Winterbach Soonwald;1 +6757;Becherbach bei Kirn;1 +6758;Waldböckelheim;1 +6761;Simmern Hunsrück;1 +6762;Kastellaun;1 +6763;Kirchberg Hunsrück;1 +6764;Rheinböllen;1 +6765;Gemünden Hunsrück;1 +6766;Kisselbach;1 +6771;St Goarshausen;1 +6772;Nastätten;1 +6773;Kamp-Bornhofen;1 +6774;Kaub;1 +6775;Strüth Taunus;1 +6776;Dachsenhausen;1 +6781;Idar-Oberstein;1 +6782;Birkenfeld Nahe;1 +6783;Baumholder;1 +6784;Weierbach;1 +6785;Herrstein;1 +6786;Kempfeld;1 +6787;Niederbrombach;1 +6788;Sien;1 +6789;Heimbach Nahe;1 +6802;Völklingen-Lauterbach;1 +6803;Mandelbachtal-Ommersheim;1 +6804;Mandelbachtal;1 +6805;Kleinblittersdorf;1 +6806;Heusweiler;1 +6809;Grossrosseln;1 +681;Saarbrücken;1 +6821;Neunkirchen Saar;1 +6824;Ottweiler;1 +6825;Illingen Saar;1 +6826;Bexbach;1 +6827;Eppelborn;1 +6831;Saarlouis;1 +6832;Beckingen-Reimsbach;1 +6833;Rehlingen-Siersburg;1 +6834;Bous;1 +6835;Beckingen;1 +6836;Überherrn;1 +6837;Wallerfangen;1 +6838;Saarwellingen;1 +6841;Homburg Saar;1 +6842;Blieskastel;1 +6843;Gersheim;1 +6844;Blieskastel-Altheim;1 +6848;Homburg-Einöd;1 +6849;Kirkel;1 +6851;St Wendel;1 +6852;Nohfelden;1 +6853;Marpingen;1 +6854;Oberthal Saar;1 +6855;Freisen;1 +6856;St Wendel-Niederkirchen;1 +6857;Namborn;1 +6858;Ottweiler-Fürth;1 +6861;Merzig;1 +6864;Mettlach;1 +6865;Mettlach-Orscholz;1 +6866;Perl-Nennig;1 +6867;Perl;1 +6868;Mettlach-Tünsdorf;1 +6869;Merzig-Silwingen;1 +6871;Wadern;1 +6872;Losheim am See;1 +6873;Nonnweiler;1 +6874;Wadern-Nunkirchen;1 +6875;Nonnweiler-Primstal;1 +6876;Weiskirchen Saar;1 +6881;Lebach;1 +6887;Schmelz Saar;1 +6888;Lebach-Steinbach;1 +6893;Saarbrücken-Ensheim;1 +6894;St Ingbert;1 +6897;Sulzbach Saar;1 +6898;Völklingen;1 +69;Frankfurt am Main;1 +7021;Kirchheim unter Teck;1 +7022;Nürtingen;1 +7023;Weilheim an der Teck;1 +7024;Wendlingen am Neckar;1 +7025;Neuffen;1 +7026;Lenningen;1 +7031;Böblingen;1 +7032;Herrenberg;1 +7033;Weil Der Stadt;1 +7034;Ehningen;1 +7041;Mühlacker;1 +7042;Vaihingen an der Enz;1 +7043;Maulbronn;1 +7044;Mönsheim;1 +7045;Oberderdingen;1 +7046;Zaberfeld;1 +7051;Calw;1 +7052;Bad Liebenzell;1 +7053;Bad Teinach-Zavelstein;1 +7054;Wildberg Württ;1 +7055;Neuweiler Kr Calw;1 +7056;Gechingen;1 +7062;Beilstein Württ;1 +7063;Bad Wimpfen;1 +7066;Bad Rappenau-Bonfeld;1 +7071;Tübingen;1 +7072;Gomaringen;1 +7073;Ammerbuch;1 +7081;Bad Wildbad;1 +7082;Neuenbürg Württ;1 +7083;Bad Herrenalb;1 +7084;Schömberg b Neuenbürg;1 +7085;Enzklösterle;1 +711;Stuttgart;1 +7121;Reutlingen;1 +7122;St Johann Württ;1 +7123;Metzingen Württ;1 +7124;Trochtelfingen Hohenz;1 +7125;Bad Urach;1 +7126;Burladingen-Melchingen;1 +7127;Neckartenzlingen;1 +7128;Sonnenbühl;1 +7129;Lichtenstein Württ;1 +7130;Löwenstein Württ;1 +7131;Heilbronn Neckar;1 +7132;Neckarsulm;1 +7133;Lauffen am Neckar;1 +7134;Weinsberg;1 +7135;Brackenheim;1 +7136;Bad Friedrichshall;1 +7138;Schwaigern;1 +7139;Neuenstadt am Kocher;1 +7141;Ludwigsburg Württ;1 +7142;Bietigheim-Bissingen;1 +7143;Besigheim;1 +7144;Marbach am Neckar;1 +7145;Markgröningen;1 +7146;Remseck am Neckar;1 +7147;Sachsenheim Württ;1 +7148;Grossbottwar;1 +7150;Korntal-Münchingen;1 +7151;Waiblingen;1 +7152;Leonberg Württ;1 +7153;Plochingen;1 +7154;Kornwestheim;1 +7156;Ditzingen;1 +7157;Waldenbuch;1 +7158;Neuhausen auf den Fildern;1 +7159;Renningen;1 +7161;Göppingen;1 +7162;Süßen;1 +7163;Ebersbach an der Fils;1 +7164;Boll Kr Göppingen;1 +7165;Göppingen-Hohenstaufen;1 +7166;Adelberg;1 +7171;Schwäbisch Gmünd;1 +7172;Lorch Württ;1 +7173;Heubach;1 +7174;Mögglingen;1 +7175;Leinzell;1 +7176;Spraitbach;1 +7181;Schorndorf Württ;1 +7182;Welzheim;1 +7183;Rudersberg Württ;1 +7184;Kaisersbach;1 +7191;Backnang;1 +7192;Murrhardt;1 +7193;Sulzbach an der Murr;1 +7194;Spiegelberg;1 +7195;Winnenden;1 +7202;Karlsbad;1 +7203;Walzbachtal;1 +7204;Malsch-Völkersbach;1 +721;Karlsruhe;1 +7220;Forbach-Hundsbach;1 +7221;Baden-Baden;1 +7222;Rastatt;1 +7223;Bühl Baden;1 +7224;Gernsbach;1 +7225;Gaggenau;1 +7226;Bühl-Sand;1 +7227;Lichtenau Baden;1 +7228;Forbach;1 +7229;Iffezheim;1 +7231;Pforzheim;1 +7232;Königsbach-Stein;1 +7233;Niefern-Öschelbronn;1 +7234;Tiefenbronn;1 +7235;Unterreichenbach Kr Calw;1 +7236;Keltern;1 +7237;Neulingen Enzkreis;1 +7240;Pfinztal;1 +7242;Rheinstetten;1 +7243;Ettlingen;1 +7244;Weingarten Baden;1 +7245;Durmersheim;1 +7246;Malsch Kr Karlsruhe;1 +7247;Linkenheim-Hochstetten;1 +7248;Marxzell;1 +7249;Stutensee;1 +7250;Kraichtal;1 +7251;Bruchsal;1 +7252;Bretten;1 +7253;Bad Schönborn;1 +7254;Waghäusel;1 +7255;Graben-Neudorf;1 +7256;Philippsburg;1 +7257;Bruchsal-Untergrombach;1 +7258;Oberderdingen-Flehingen;1 +7259;Östringen-Odenheim;1 +7260;Sinsheim-Hilsbach;1 +7261;Sinsheim;1 +7262;Eppingen;1 +7263;Waibstadt;1 +7264;Bad Rappenau;1 +7265;Angelbachtal;1 +7266;Kirchardt;1 +7267;Gemmingen;1 +7268;Bad Rappenau-Obergimpern;1 +7269;Sulzfeld Baden;1 +7271;Wörth am Rhein;1 +7272;Rülzheim;1 +7273;Hagenbach Pfalz;1 +7274;Germersheim;1 +7275;Kandel;1 +7276;Herxheim bei Landau Pfalz;1 +7277;Wörth-Büchelberg;1 +7300;Roggenburg;1 +7302;Pfaffenhofen a d Roth;1 +7303;Illertissen;1 +7304;Blaustein Württ;1 +7305;Erbach Donau;1 +7306;Vöhringen Iller;1 +7307;Senden Iller;1 +7308;Nersingen;1 +7309;Weissenhorn;1 +731;Ulm Donau;1 +7321;Heidenheim a d Brenz;1 +7322;Giengen a d Brenz;1 +7323;Gerstetten;1 +7324;Herbrechtingen;1 +7325;Sontheim a d Brenz;1 +7326;Neresheim;1 +7327;Dischingen;1 +7328;Königsbronn;1 +7329;Steinheim am Albuch;1 +7331;Geislingen an der Steige;1 +7332;Lauterstein;1 +7333;Laichingen;1 +7334;Deggingen;1 +7335;Wiesensteig;1 +7336;Lonsee;1 +7337;Nellingen Alb;1 +7340;Neenstetten;1 +7343;Buch b Illertissen;1 +7344;Blaubeuren;1 +7345;Langenau Württ;1 +7346;Illerkirchberg;1 +7347;Dietenheim;1 +7348;Beimerstetten;1 +7351;Biberach an der Riß;1 +7352;Ochsenhausen;1 +7353;Schwendi;1 +7354;Erolzheim;1 +7355;Hochdorf Riß;1 +7356;Schemmerhofen;1 +7357;Attenweiler;1 +7358;Eberhardzell-Füramoos;1 +7361;Aalen;1 +7362;Bopfingen;1 +7363;Lauchheim;1 +7364;Oberkochen;1 +7365;Essingen Württ;1 +7366;Abtsgmünd;1 +7367;Aalen-Ebnat;1 +7371;Riedlingen Württ;1 +7373;Zwiefalten;1 +7374;Uttenweiler;1 +7375;Obermarchtal;1 +7376;Langenenslingen;1 +7381;Münsingen;1 +7382;Römerstein;1 +7383;Münsingen-Buttenhausen;1 +7384;Schelklingen-Hütten;1 +7385;Gomadingen;1 +7386;Hayingen;1 +7387;Hohenstein Württ;1 +7388;Pfronstetten;1 +7389;Heroldstatt;1 +7391;Ehingen Donau;1 +7392;Laupheim;1 +7393;Munderkingen;1 +7394;Schelklingen;1 +7395;Ehingen-Dächingen;1 +7402;Fluorn-Winzeln;1 +7403;Dunningen;1 +7404;Epfendorf;1 +741;Rottweil;1 +7420;Deisslingen;1 +7422;Schramberg;1 +7423;Oberndorf am Neckar;1 +7424;Spaichingen;1 +7425;Trossingen;1 +7426;Gosheim;1 +7427;Schömberg b Balingen;1 +7428;Rosenfeld;1 +7429;Egesheim;1 +7431;Albstadt-Ebingen;1 +7432;Albstadt-Tailfingen;1 +7433;Balingen;1 +7434;Winterlingen;1 +7435;Albstadt-Laufen;1 +7436;Messstetten-Oberdigisheim;1 +7440;Bad Rippoldsau;1 +7441;Freudenstadt;1 +7442;Baiersbronn;1 +7443;Dornstetten;1 +7444;Alpirsbach;1 +7445;Pfalzgrafenweiler;1 +7446;Lossburg;1 +7447;Baiersbronn-Schwarzenberg;1 +7448;Seewald;1 +7449;Baiersbronn-Obertal;1 +7451;Horb am Neckar;1 +7452;Nagold;1 +7453;Altensteig Württ;1 +7454;Sulz am Neckar;1 +7455;Dornhan;1 +7456;Haiterbach;1 +7457;Rottenburg-Ergenzingen;1 +7458;Ebhausen;1 +7459;Nagold-Hochdorf;1 +7461;Tuttlingen;1 +7462;Immendingen;1 +7463;Mühlheim an der Donau;1 +7464;Talheim Kr Tuttlingen;1 +7465;Emmingen-Liptingen;1 +7466;Beuron;1 +7467;Neuhausen ob Eck;1 +7471;Hechingen;1 +7472;Rottenburg am Neckar;1 +7473;Mössingen;1 +7474;Haigerloch;1 +7475;Burladingen;1 +7476;Bisingen;1 +7477;Jungingen b Hechingen;1 +7478;Hirrlingen;1 +7482;Horb-Dettingen;1 +7483;Horb-Mühringen;1 +7484;Simmersfeld;1 +7485;Empfingen;1 +7486;Horb-Altheim;1 +7502;Wolpertswende;1 +7503;Wilhelmsdorf Württ;1 +7504;Horgenzell;1 +7505;Fronreute;1 +7506;Wangen-Leupolz;1 +751;Ravensburg;1 +7520;Bodnegg;1 +7522;Wangen im Allgäu;1 +7524;Bad Waldsee;1 +7525;Aulendorf;1 +7527;Wolfegg;1 +7528;Neukirch b Tettnang;1 +7529;Waldburg Württ;1 +7531;Konstanz;1 +7532;Meersburg;1 +7533;Allensbach;1 +7534;Reichenau Baden;1 +7541;Friedrichshafen;1 +7542;Tettnang;1 +7543;Kressbronn am Bodensee;1 +7544;Markdorf;1 +7545;Immenstaad am Bodensee;1 +7546;Oberteuringen;1 +7551;Überlingen Bodensee;1 +7552;Pfullendorf;1 +7553;Salem Baden;1 +7554;Heiligenberg Baden;1 +7555;Deggenhausertal;1 +7556;Uhldingen-Mühlhofen;1 +7557;Herdwangen-Schönach;1 +7558;Illmensee;1 +7561;Leutkirch im Allgäu;1 +7562;Isny im Allgäu;1 +7563;Kisslegg;1 +7564;Bad Wurzach;1 +7565;Aichstetten Kr Ravensburg;1 +7566;Argenbühl;1 +7567;Leutkirch-Friesenhofen;1 +7568;Bad Wurzach-Hauerz;1 +7569;Isny-Eisenbach;1 +7570;Sigmaringen-Gutenstein;1 +7571;Sigmaringen;1 +7572;Mengen Württ;1 +7573;Stetten am kalten Markt;1 +7574;Gammertingen;1 +7575;Messkirch;1 +7576;Krauchenwies;1 +7577;Veringenstadt;1 +7578;Wald Hohenz;1 +7579;Schwenningen Baden;1 +7581;Saulgau;1 +7582;Bad Buchau;1 +7583;Bad Schussenried;1 +7584;Altshausen;1 +7585;Ostrach;1 +7586;Herbertingen;1 +7587;Hosskirch;1 +7602;Oberried Breisgau;1 +761;Freiburg im Breisgau;1 +7620;Schopfheim-Gersbach;1 +7621;Lörrach;1 +7622;Schopfheim;1 +7623;Rheinfelden Baden;1 +7624;Grenzach-Wyhlen;1 +7625;Zell im Wiesental;1 +7626;Kandern;1 +7627;Steinen Kr Lörrach;1 +7628;Efringen-Kirchen;1 +7629;Tegernau Baden;1 +7631;Müllheim Baden;1 +7632;Badenweiler;1 +7633;Staufen im Breisgau;1 +7634;Sulzburg;1 +7635;Schliengen;1 +7636;Münstertal Schwarzwald;1 +7641;Emmendingen;1 +7642;Endingen Kaiserstuhl;1 +7643;Herbolzheim Breisgau;1 +7644;Kenzingen;1 +7645;Freiamt;1 +7646;Weisweil Breisgau;1 +7651;Titisee-Neustadt;1 +7652;Hinterzarten;1 +7653;Lenzkirch;1 +7654;Löffingen;1 +7655;Feldberg-Altglashütten;1 +7656;Schluchsee;1 +7657;Eisenbach Hochschwarzwald;1 +7660;St Peter Schwarzw;1 +7661;Kirchzarten;1 +7662;Vogtsburg im Kaiserstuhl;1 +7663;Eichstetten;1 +7664;Freiburg-Tiengen;1 +7665;March Breisgau;1 +7666;Denzlingen;1 +7667;Breisach am Rhein;1 +7668;Ihringen;1 +7669;St Märgen;1 +7671;Todtnau;1 +7672;St Blasien;1 +7673;Schönau im Schwarzwald;1 +7674;Todtmoos;1 +7675;Bernau Baden;1 +7676;Feldberg Schwarzwald;1 +7681;Waldkirch Breisgau;1 +7682;Elzach;1 +7683;Simonswald;1 +7684;Glottertal;1 +7685;Gutach-Bleibach;1 +7702;Blumberg Baden;1 +7703;Bonndorf im Schwarzwald;1 +7704;Geisingen Baden;1 +7705;Wolterdingen Schwarzw;1 +7706;Oberbaldingen;1 +7707;Bräunlingen;1 +7708;Geisingen-Leipferdingen;1 +7709;Wutach;1 +771;Donaueschingen;1 +7720;Schwenningen a Neckar;1 +7721;Villingen i Schwarzw;1 +7722;Triberg im Schwarzwald;1 +7723;Furtwangen im Schwarzwald;1 +7724;St Georgen im Schwarzwald;1 +7725;Königsfeld im Schwarzwald;1 +7726;Bad Dürrheim;1 +7727;Vöhrenbach;1 +7728;Niedereschach;1 +7729;Tennenbronn;1 +7731;Singen Hohentwiel;1 +7732;Radolfzell am Bodensee;1 +7733;Engen Hegau;1 +7734;Gailingen;1 +7735;Öhningen;1 +7736;Tengen;1 +7738;Steisslingen;1 +7739;Hilzingen;1 +7741;Tiengen Hochrhein;1 +7742;Klettgau;1 +7743;Ühlingen-Birkendorf;1 +7744;Stühlingen;1 +7745;Jestetten;1 +7746;Wutöschingen;1 +7747;Berau;1 +7748;Grafenhausen Hochschwarzw;1 +7751;Waldshut;1 +7753;Albbruck;1 +7754;Görwihl;1 +7755;Weilheim Kr Waldshut;1 +7761;Bad Säckingen;1 +7762;Wehr Baden;1 +7763;Murg;1 +7764;Herrischried;1 +7765;Rickenbach Hotzenw;1 +7771;Stockach;1 +7773;Bodman-Ludwigshafen;1 +7774;Eigeltingen;1 +7775;Mühlingen;1 +7777;Sauldorf;1 +7802;Oberkirch Baden;1 +7803;Gengenbach;1 +7804;Oppenau;1 +7805;Appenweier;1 +7806;Bad Peterstal-Griesbach;1 +7807;Neuried Ortenaukreis;1 +7808;Hohberg b Offenburg;1 +781;Offenburg;1 +7821;Lahr Schwarzwald;1 +7822;Ettenheim;1 +7823;Seelbach Schutter;1 +7824;Schwanau;1 +7825;Kippenheim;1 +7826;Schuttertal;1 +7831;Hausach;1 +7832;Haslach im Kinzigtal;1 +7833;Hornberg Schwarzwaldbahn;1 +7834;Wolfach;1 +7835;Zell am Harmersbach;1 +7836;Schiltach;1 +7837;Oberharmersbach;1 +7838;Nordrach;1 +7839;Schapbach;1 +7841;Achern;1 +7842;Kappelrodeck;1 +7843;Renchen;1 +7844;Rheinau;1 +7851;Kehl;1 +7852;Willstätt;1 +7853;Kehl-Bodersweier;1 +7854;Kehl-Goldscheuer;1 +7903;Mainhardt;1 +7904;Ilshofen;1 +7905;Langenburg;1 +7906;Braunsbach;1 +7907;Schwäbisch Hall-Sulzdorf;1 +791;Schwäbisch Hall;1 +7930;Boxberg Baden;1 +7931;Bad Mergentheim;1 +7932;Niederstetten Württ;1 +7933;Creglingen;1 +7934;Weikersheim;1 +7935;Schrozberg;1 +7936;Schrozberg-Bartenstein;1 +7937;Dörzbach;1 +7938;Mulfingen Jagst;1 +7939;Schrozberg-Spielbach;1 +7940;Künzelsau;1 +7941;Öhringen;1 +7942;Neuenstein Württ;1 +7943;Schöntal Jagst;1 +7944;Kupferzell;1 +7945;Wüstenrot;1 +7946;Bretzfeld;1 +7947;Forchtenberg;1 +7948;Öhringen-Ohrnberg;1 +7949;Pfedelbach-Untersteinbach;1 +7950;Schnelldorf;1 +7951;Crailsheim;1 +7952;Gerabronn;1 +7953;Blaufelden;1 +7954;Kirchberg an der Jagst;1 +7955;Wallhausen Württ;1 +7957;Kressberg;1 +7958;Rot Am See-Brettheim;1 +7959;Frankenhardt;1 +7961;Ellwangen Jagst;1 +7962;Fichtenau;1 +7963;Adelmannsfelden;1 +7964;Stödtlen;1 +7965;Ellwangen-Röhlingen;1 +7966;Unterschneidheim;1 +7967;Jagstzell;1 +7971;Gaildorf;1 +7972;Gschwend b Gaildorf;1 +7973;Obersontheim;1 +7974;Bühlerzell;1 +7975;Untergröningen;1 +7976;Sulzbach-Laufen;1 +7977;Oberrot b Gaildorf;1 +8020;Weyarn;1 +8021;Waakirchen;1 +8022;Tegernsee;1 +8023;Bayrischzell;1 +8024;Holzkirchen;1 +8025;Miesbach;1 +8026;Hausham;1 +8027;Dietramszell;1 +8028;Fischbachau;1 +8029;Kreuth b Tegernsee;1 +8031;Rosenheim Oberbay;1 +8032;Rohrdorf Kr Rosenheim;1 +8033;Oberaudorf;1 +8034;Brannenburg;1 +8035;Raubling;1 +8036;Stephanskirchen Simssee;1 +8038;Vogtareuth;1 +8039;Rott a Inn;1 +8041;Bad Tölz;1 +8042;Lenggries;1 +8043;Jachenau;1 +8045;Lenggries-Fall;1 +8046;Bad Heilbrunn;1 +8051;Prien a Chiemsee;1 +8052;Aschau i Chiemgau;1 +8053;Bad Endorf;1 +8054;Breitbrunn a Chiemsee;1 +8055;Halfing;1 +8056;Eggstätt;1 +8057;Aschau-Sachrang;1 +8061;Bad Aibling;1 +8062;Bruckmühl Mangfall;1 +8063;Feldkirchen-Westerham;1 +8064;Au b Bad Aibling;1 +8065;Tuntenhausen-Schönau;1 +8066;Bad Feilnbach;1 +8067;Tuntenhausen;1 +8071;Wasserburg a Inn;1 +8072;Haag i OB;1 +8073;Gars a Inn;1 +8074;Schnaitsee;1 +8075;Amerang;1 +8076;Pfaffing;1 +8081;Dorfen Stadt;1 +8082;Schwindegg;1 +8083;Isen;1 +8084;Taufkirchen Vils;1 +8085;Sankt Wolfgang;1 +8086;Buchbach Oberbay;1 +8091;Kirchseeon;1 +8092;Grafing b München;1 +8093;Glonn Kr Ebersberg;1 +8094;Steinhöring;1 +8095;Aying;1 +8102;Höhenkirchen-Siegertsbrunn;1 +8104;Sauerlach;1 +8105;Gilching;1 +8106;Vaterstetten;1 +811;Hallbergmoos;1 +8121;Markt Schwaben;1 +8122;Erding;1 +8123;Moosinning;1 +8124;Forstern Oberbay;1 +8131;Dachau;1 +8133;Haimhausen Oberbay;1 +8134;Odelzhausen;1 +8135;Sulzemoos;1 +8136;Markt Indersdorf;1 +8137;Petershausen;1 +8138;Schwabhausen b Dachau;1 +8139;Röhrmoos;1 +8141;Fürstenfeldbruck;1 +8142;Olching;1 +8143;Inning a Ammersee;1 +8144;Grafrath;1 +8145;Mammendorf;1 +8146;Moorenweis;1 +8151;Starnberg;1 +8152;Herrsching a Ammersee;1 +8153;Wessling;1 +8157;Feldafing;1 +8158;Tutzing;1 +8161;Freising;1 +8165;Neufahrn b Freising;1 +8166;Allershausen Oberbay;1 +8167;Zolling;1 +8168;Attenkirchen;1 +8170;Straßlach-Dingharting;1 +8171;Wolfratshausen;1 +8176;Egling b Wolfratshausen;1 +8177;Münsing Starnberger See;1 +8178;Icking;1 +8179;Eurasburg a d Loisach;1 +8191;Landsberg a Lech;1 +8192;Schondorf a Ammersee;1 +8193;Geltendorf;1 +8194;Vilgertshofen;1 +8195;Weil Kr Landsberg a Lech;1 +8196;Pürgen;1 +8202;Althegnenberg;1 +8203;Grossaitingen;1 +8204;Mickhausen;1 +8205;Dasing;1 +8206;Egling a d Paar;1 +8207;Affing;1 +8208;Eurasburg b Augsburg;1 +821;Augsburg;1 +8221;Günzburg;1 +8222;Burgau Schwab;1 +8223;Ichenhausen;1 +8224;Offingen Donau;1 +8225;Jettingen-Scheppach;1 +8226;Bibertal;1 +8230;Gablingen;1 +8231;Königsbrunn b Augsburg;1 +8232;Schwabmünchen;1 +8233;Kissing;1 +8234;Bobingen;1 +8236;Fischach;1 +8237;Aindling;1 +8238;Gessertshausen;1 +8239;Langenneufnach;1 +8241;Buchloe;1 +8243;Fuchstal;1 +8245;Türkheim Wertach;1 +8246;Waal;1 +8247;Bad Wörishofen;1 +8248;Lamerdingen;1 +8249;Ettringen Wertach;1 +8250;Hilgertshausen-Tandern;1 +8251;Aichach;1 +8252;Schrobenhausen;1 +8253;Pöttmes;1 +8254;Altomünster;1 +8257;Inchenhofen;1 +8258;Sielenbach;1 +8259;Schiltberg;1 +8261;Mindelheim;1 +8262;Mittelneufnach;1 +8263;Breitenbrunn Schwab;1 +8265;Pfaffenhausen Schwab;1 +8266;Kirchheim i Schw;1 +8267;Dirlewang;1 +8268;Tussenhausen;1 +8269;Unteregg b Mindelheim;1 +8271;Meitingen;1 +8272;Wertingen;1 +8273;Nordendorf;1 +8274;Buttenwiesen;1 +8276;Baar Schwaben;1 +8281;Thannhausen Schwab;1 +8282;Krumbach Schwaben;1 +8283;Neuburg a d Kammel;1 +8284;Ziemetshausen;1 +8285;Burtenbach;1 +8291;Zusmarshausen;1 +8292;Dinkelscherben;1 +8293;Welden b Augsburg;1 +8294;Horgau;1 +8295;Altenmünster Schwab;1 +8296;Villenbach;1 +8302;Görisried;1 +8303;Waltenhofen;1 +8304;Wildpoldsried;1 +8306;Ronsberg;1 +831;Kempten Allgäu;1 +8320;Missen-Wilhams;1 +8321;Sonthofen;1 +8322;Oberstdorf;1 +8323;Immenstadt i Allgäu;1 +8324;Hindelang;1 +8325;Oberstaufen-Thalkirchdorf;1 +8326;Fischen i Allgäu;1 +8327;Rettenberg;1 +8328;Balderschwang;1 +8330;Legau;1 +8331;Memmingen;1 +8332;Ottobeuren;1 +8333;Babenhausen Schwab;1 +8334;Bad Grönenbach;1 +8335;Fellheim;1 +8336;Erkheim;1 +8337;Altenstadt Iller;1 +8338;Böhen;1 +8340;Baisweil;1 +8341;Kaufbeuren;1 +8342;Marktoberdorf;1 +8343;Aitrang;1 +8344;Westendorf b Kaufbeuren;1 +8345;Stöttwang;1 +8346;Pforzen;1 +8347;Friesenried;1 +8348;Bidingen;1 +8349;Stötten a Auerberg;1 +8361;Nesselwang;1 +8362;Füssen;1 +8363;Pfronten;1 +8364;Seeg;1 +8365;Wertach;1 +8366;Oy-Mittelberg;1 +8367;Roßhaupten Forggensee;1 +8368;Halblech;1 +8369;Rückholz;1 +8370;Wiggensbach;1 +8372;Obergünzburg;1 +8373;Altusried;1 +8374;Dietmannsried;1 +8375;Weitnau;1 +8376;Sulzberg Allgäu;1 +8377;Unterthingau;1 +8378;Buchenberg b Kempten;1 +8379;Waltenhofen-Oberdorf;1 +8380;Achberg;1 +8381;Lindenberg i Allgäu;1 +8382;Lindau Bodensee;1 +8383;Grünenbach Allgäu;1 +8384;Röthenbach Allgäu;1 +8385;Hergatz;1 +8386;Oberstaufen;1 +8387;Weiler-Simmerberg;1 +8388;Hergensweiler;1 +8389;Weissensberg;1 +8392;Markt Rettenbach;1 +8393;Holzgünz;1 +8394;Lautrach;1 +8395;Tannheim Württ;1 +8402;Münchsmünster;1 +8403;Pförring;1 +8404;Oberdolling;1 +8405;Stammham b Ingolstadt;1 +8406;Böhmfeld;1 +8407;Grossmehring;1 +841;Ingolstadt Donau;1 +8421;Eichstätt Bay;1 +8422;Dollnstein;1 +8423;Titting;1 +8424;Nassenfels;1 +8426;Walting Kr Eichstätt;1 +8427;Wellheim;1 +8431;Neuburg a d Donau;1 +8432;Burgheim;1 +8433;Königsmoos;1 +8434;Rennertshofen;1 +8435;Ehekirchen;1 +8441;Pfaffenhofen a d Ilm;1 +8442;Wolnzach;1 +8443;Hohenwart Paar;1 +8444;Schweitenkirchen;1 +8445;Gerolsbach;1 +8446;Pörnbach;1 +8450;Ingolstadt-Zuchering;1 +8452;Geisenfeld;1 +8453;Reichertshofen Oberbay;1 +8454;Karlshuld;1 +8456;Lenting;1 +8457;Vohburg a d Donau;1 +8458;Gaimersheim;1 +8459;Manching;1 +8460;Berching-Holnstein;1 +8461;Beilngries;1 +8462;Berching;1 +8463;Greding;1 +8464;Dietfurt a d Altmühl;1 +8465;Kipfenberg;1 +8466;Denkendorf Oberbay;1 +8467;Kinding;1 +8468;Altmannstein-Pondorf;1 +8469;Freystadt-Burggriesbach;1 +8501;Thyrnau;1 +8502;Fürstenzell;1 +8503;Neuhaus a Inn;1 +8504;Tittling;1 +8505;Hutthurm;1 +8506;Bad Höhenstadt;1 +8507;Neuburg a Inn;1 +8509;Ruderting;1 +851;Passau;1 +8531;Pocking;1 +8532;Griesbach i Rottal;1 +8533;Rotthalmünster;1 +8534;Tettenweis;1 +8535;Haarbach;1 +8536;Kößlarn;1 +8537;Bad Füssing-Aigen;1 +8538;Pocking-Hartkirchen;1 +8541;Vilshofen Niederbay;1 +8542;Ortenburg;1 +8543;Aidenbach;1 +8544;Eging a See;1 +8545;Hofkirchen Bay;1 +8546;Windorf-Otterskirchen;1 +8547;Osterhofen-Gergweis;1 +8548;Vilshofen-Sandbach;1 +8549;Vilshofen-Pleinting;1 +8550;Philippsreut;1 +8551;Freyung;1 +8552;Grafenau Niederbay;1 +8553;Spiegelau;1 +8554;Schönberg Niederbay;1 +8555;Perlesreut;1 +8556;Haidmühle;1 +8557;Mauth;1 +8558;Hohenau Niederbay;1 +8561;Pfarrkirchen Niederbay;1 +8562;Triftern;1 +8563;Bad Birnbach Rottal;1 +8564;Johanniskirchen;1 +8565;Dietersburg-Baumgarten;1 +8571;Simbach a Inn;1 +8572;Tann Niederbay;1 +8573;Ering;1 +8574;Wittibreut;1 +8581;Waldkirchen Niederbay;1 +8582;Röhrnbach;1 +8583;Neureichenau;1 +8584;Breitenberg Niederbay;1 +8585;Grainet;1 +8586;Hauzenberg;1 +8591;Obernzell;1 +8592;Wegscheid Niederbay;1 +8593;Untergriesbach;1 +861;Traunstein;1 +8621;Trostberg;1 +8622;Tacherting- Peterskirchen;1 +8623;Kirchweidach;1 +8624;Obing;1 +8628;Kienberg Oberbay;1 +8629;Palling;1 +8630;Oberneukirchen;1 +8631;Mühldorf a Inn;1 +8633;Tüßling;1 +8634;Garching a d Alz;1 +8635;Pleiskirchen;1 +8636;Ampfing;1 +8637;Lohkirchen;1 +8638;Waldkraiburg;1 +8639;Neumarkt-Sankt Veit;1 +8640;Reit Im Winkl;1 +8641;Grassau Kr Traunstein;1 +8642;Übersee;1 +8649;Schleching;1 +8650;Marktschellenberg;1 +8651;Bad Reichenhall;1 +8652;Berchtesgaden;1 +8654;Freilassing;1 +8656;Anger;1 +8657;Ramsau b Berchtesgaden;1 +8661;Grabenstätt Chiemsee;1 +8662;Siegsdorf Kr Traunstein;1 +8663;Ruhpolding;1 +8664;Chieming;1 +8665;Inzell;1 +8666;Teisendorf;1 +8667;Seeon-Seebruck;1 +8669;Traunreut;1 +8670;Reischach Kr Altötting;1 +8671;Altötting;1 +8677;Burghausen Salzach;1 +8678;Marktl;1 +8679;Burgkirchen a d Alz;1 +8681;Waging a See;1 +8682;Laufen Salzach;1 +8683;Tittmoning;1 +8684;Fridolfing;1 +8685;Kirchanschöring;1 +8686;Petting;1 +8687;Taching-Tengling;1 +8702;Wörth a d Isar;1 +8703;Essenbach;1 +8704;Altdorf-Pfettrach;1 +8705;Altfraunhofen;1 +8706;Vilsheim;1 +8707;Adlkofen;1 +8708;Weihmichl-Unterneuhausen;1 +8709;Eching Niederbay;1 +871;Landshut;1 +8721;Eggenfelden;1 +8722;Gangkofen;1 +8723;Arnstorf;1 +8724;Massing;1 +8725;Wurmannsquick;1 +8726;Schönau Niederbay;1 +8727;Falkenberg Niederbay;1 +8728;Geratskirchen;1 +8731;Dingolfing;1 +8732;Frontenhausen;1 +8733;Mengkofen;1 +8734;Reisbach Niederbay;1 +8735;Gangkofen-Kollbach;1 +8741;Vilsbiburg;1 +8742;Velden Vils;1 +8743;Geisenhausen;1 +8744;Gerzen;1 +8745;Bodenkirchen;1 +8751;Mainburg;1 +8752;Au i d Hallertau;1 +8753;Elsendorf Niederbay;1 +8754;Volkenschwand;1 +8756;Nandlstadt;1 +8761;Moosburg a d Isar;1 +8762;Wartenberg Oberbay;1 +8764;Mauern Kr Freising;1 +8765;Bruckberg Niederbay;1 +8766;Gammelsdorf;1 +8771;Ergoldsbach;1 +8772;Mallersdorf-Pfaffenberg;1 +8773;Neufahrn i NB;1 +8774;Bayerbach b Ergoldsbach;1 +8781;Rottenburg a d Laaber;1 +8782;Pfeffenhausen;1 +8783;Rohr i NB;1 +8784;Hohenthann;1 +8785;Rottenburg-Oberroning;1 +8801;Seeshaupt;1 +8802;Huglfing;1 +8803;Peissenberg;1 +8805;Hohenpeissenberg;1 +8806;Utting a Ammersee;1 +8807;Dießen a Ammersee;1 +8808;Pähl;1 +8809;Wessobrunn;1 +881;Weilheim i OB;1 +8821;Garmisch-Partenkirchen;1 +8822;Oberammergau;1 +8823;Mittenwald;1 +8824;Oberau Loisach;1 +8825;Krün;1 +8841;Murnau a Staffelsee;1 +8845;Bad Kohlgrub;1 +8846;Uffing a Staffelsee;1 +8847;Obersöchering;1 +8851;Kochel a See;1 +8856;Penzberg;1 +8857;Benediktbeuern;1 +8858;Kochel-Walchensee;1 +8860;Bernbeuren;1 +8861;Schongau;1 +8862;Steingaden Oberbay;1 +8867;Rottenbuch Oberbay;1 +8868;Schwabsoien;1 +8869;Kinsau;1 +89;München;1 +906;Donauwörth;1 +9070;Tapfheim;1 +9071;Dillingen a d Donau;1 +9072;Lauingen Donau;1 +9073;Gundelfingen a d Donau;1 +9074;Höchstädt a d Donau;1 +9075;Glött;1 +9076;Wittislingen;1 +9077;Bachhagel;1 +9078;Mertingen;1 +9080;Harburg Schwaben;1 +9081;Nördlingen;1 +9082;Oettingen i Bay;1 +9083;Möttingen;1 +9084;Bissingen Schwab;1 +9085;Alerheim;1 +9086;Fremdingen;1 +9087;Marktoffingen;1 +9088;Mönchsdeggingen;1 +9089;Bissingen-Unterringingen;1 +9090;Rain Lech;1 +9091;Monheim Schwab;1 +9092;Wemding;1 +9093;Polsingen;1 +9094;Tagmersheim;1 +9097;Marxheim;1 +9099;Kaisheim;1 +9101;Langenzenn;1 +9102;Wilhermsdorf;1 +9103;Cadolzburg;1 +9104;Emskirchen;1 +9105;Grosshabersdorf;1 +9106;Markt Erlbach;1 +9107;Trautskirchen;1 +911;Nürnberg;1 +9120;Leinburg;1 +9122;Schwabach;1 +9123;Lauf a d Pegnitz;1 +9126;Eckental;1 +9127;Rosstal Mittelfr;1 +9128;Feucht;1 +9129;Wendelstein;1 +9131;Erlangen;1 +9132;Herzogenaurach;1 +9133;Baiersdorf Mittelfr;1 +9134;Neunkirchen a Brand;1 +9135;Heßdorf Mittelfr;1 +9141;Weißenburg i Bay;1 +9142;Treuchtlingen;1 +9143;Pappenheim Mittelfr;1 +9144;Pleinfeld;1 +9145;Solnhofen;1 +9146;Markt Berolzheim;1 +9147;Nennslingen;1 +9148;Ettenstatt;1 +9149;Weissenburg-Suffersheim;1 +9151;Hersbruck;1 +9152;Hartenstein Mittelfr;1 +9153;Schnaittach;1 +9154;Pommelsbrunn;1 +9155;Simmelsdorf;1 +9156;Neuhaus a d Pegnitz;1 +9157;Alfeld Mittelfr;1 +9158;Offenhausen Mittelfr;1 +9161;Neustadt a d Aisch;1 +9162;Scheinfeld;1 +9163;Dachsbach;1 +9164;Langenfeld Mittelfr;1 +9165;Sugenheim;1 +9166;Münchsteinach;1 +9167;Oberscheinfeld;1 +9170;Schwanstetten;1 +9171;Roth Mittelfr;1 +9172;Georgensgmünd;1 +9173;Thalmässing;1 +9174;Hilpoltstein;1 +9175;Spalt;1 +9176;Allersberg;1 +9177;Heideck;1 +9178;Abenberg Mittelfr;1 +9179;Freystadt;1 +9180;Pyrbaum;1 +9181;Neumarkt i d Opf;1 +9182;Velburg;1 +9183;Burgthann;1 +9184;Deining Oberpf;1 +9185;Mühlhausen Oberpf;1 +9186;Lauterhofen Oberpf;1 +9187;Altdorf b Nürnberg;1 +9188;Postbauer-Heng;1 +9189;Berg b Neumarkt i d Opf;1 +9190;Heroldsbach;1 +9191;Forchheim Oberfr;1 +9192;Gräfenberg;1 +9193;Höchstadt a d Aisch;1 +9194;Ebermannstadt;1 +9195;Adelsdorf Mittelfr;1 +9196;Wiesenttal;1 +9197;Egloffstein;1 +9198;Heiligenstadt i Ofr;1 +9199;Kunreuth;1 +9201;Gesees;1 +9202;Waischenfeld;1 +9203;Neudrossenfeld;1 +9204;Plankenfels;1 +9205;Vorbach;1 +9206;Mistelgau-Obernsees;1 +9207;Königsfeld Oberfr;1 +9208;Bindlach;1 +9209;Emtmannsberg;1 +921;Bayreuth;1 +9220;Kasendorf-Azendorf;1 +9221;Kulmbach;1 +9222;Presseck;1 +9223;Rugendorf;1 +9225;Stadtsteinach;1 +9227;Neuenmarkt;1 +9228;Thurnau;1 +9229;Mainleus;1 +9231;Marktredwitz;1 +9232;Wunsiedel;1 +9233;Arzberg Oberfr;1 +9234;Neusorg;1 +9235;Thierstein;1 +9236;Nagel;1 +9238;Röslau;1 +9241;Pegnitz;1 +9242;Gößweinstein;1 +9243;Pottenstein;1 +9244;Betzenstein;1 +9245;Obertrubach;1 +9246;Pegnitz-Trockau;1 +9251;Münchberg;1 +9252;Helmbrechts;1 +9253;Weissenstadt;1 +9254;Gefrees;1 +9255;Marktleugast;1 +9256;Stammbach;1 +9257;Zell Oberfr;1 +9260;Wilhelmsthal Oberfr;1 +9261;Kronach;1 +9262;Wallenfels;1 +9263;Ludwigsstadt;1 +9264;Küps;1 +9265;Pressig;1 +9266;Mitwitz;1 +9267;Nordhalben;1 +9268;Teuschnitz;1 +9269;Tettau Kr Kronach;1 +9270;Creussen;1 +9271;Thurnau-Alladorf;1 +9272;Fichtelberg;1 +9273;Bad Berneck i Fichtelgebirge;1 +9274;Hollfeld;1 +9275;Speichersdorf;1 +9276;Bischofsgrün;1 +9277;Warmensteinach;1 +9278;Weidenberg;1 +9279;Mistelgau;1 +9280;Selbitz Oberfr;1 +9281;Hof Saale;1 +9282;Naila;1 +9283;Rehau;1 +9284;Schwarzenbach a d Saale;1 +9285;Kirchenlamitz;1 +9286;Oberkotzau;1 +9287;Selb;1 +9288;Bad Steben;1 +9289;Schwarzenbach a Wald;1 +9292;Konradsreuth;1 +9293;Berg Oberfr;1 +9294;Regnitzlosau;1 +9295;Töpen;1 +9302;Rottendorf Unterfr;1 +9303;Eibelstadt;1 +9305;Estenfeld;1 +9306;Kist;1 +9307;Altertheim;1 +931;Würzburg;1 +9321;Kitzingen;1 +9323;Iphofen;1 +9324;Dettelbach;1 +9325;Kleinlangheim;1 +9326;Markt Einersheim;1 +9331;Ochsenfurt;1 +9332;Marktbreit;1 +9333;Sommerhausen;1 +9334;Giebelstadt;1 +9335;Aub Kr Würzburg;1 +9336;Bütthard;1 +9337;Gaukönigshofen;1 +9338;Röttingen Unterfr;1 +9339;Ippesheim;1 +9340;Königheim-Brehmen;1 +9341;Tauberbischofsheim;1 +9342;Wertheim;1 +9343;Lauda-Königshofen;1 +9344;Gerchsheim;1 +9345;Külsheim Baden;1 +9346;Grünsfeld;1 +9347;Wittighausen;1 +9348;Werbach-Gamburg;1 +9349;Werbach-Wenkheim;1 +9350;Eussenheim-Hundsbach;1 +9351;Gemünden a Main;1 +9352;Lohr a Main;1 +9353;Karlstadt;1 +9354;Rieneck;1 +9355;Frammersbach;1 +9356;Burgsinn;1 +9357;Gräfendorf Bay;1 +9358;Gössenheim;1 +9359;Karlstadt-Wiesenfeld;1 +9360;Thüngen;1 +9363;Arnstein Unterfr;1 +9364;Zellingen;1 +9365;Rimpar;1 +9366;Geroldshausen Unterfr;1 +9367;Unterpleichfeld;1 +9369;Uettingen;1 +9371;Miltenberg;1 +9372;Klingenberg a Main;1 +9373;Amorbach;1 +9374;Eschau;1 +9375;Freudenberg Baden;1 +9376;Collenberg;1 +9377;Freudenberg-Boxtal;1 +9378;Eichenbühl-Riedern;1 +9381;Volkach;1 +9382;Gerolzhofen;1 +9383;Wiesentheid;1 +9384;Schwanfeld;1 +9385;Kolitzheim;1 +9386;Prosselsheim;1 +9391;Marktheidenfeld;1 +9392;Faulbach Unterfr;1 +9393;Rothenfels Unterfr;1 +9394;Esselbach;1 +9395;Triefenstein;1 +9396;Urspringen b Lohr;1 +9397;Wertheim-Dertingen;1 +9398;Birkenfeld b Würzburg;1 +9401;Neutraubling;1 +9402;Regenstauf;1 +9403;Donaustauf;1 +9404;Nittendorf;1 +9405;Bad Abbach;1 +9406;Mintraching;1 +9407;Wenzenbach;1 +9408;Altenthann;1 +9409;Pielenhofen;1 +941;Regensburg;1 +9420;Feldkirchen Niederbay;1 +9421;Straubing;1 +9422;Bogen Niederbay;1 +9423;Geiselhöring;1 +9424;Strasskirchen;1 +9426;Oberschneiding;1 +9427;Leiblfing;1 +9428;Kirchroth;1 +9429;Rain Niederbay;1 +9431;Schwandorf;1 +9433;Nabburg;1 +9434;Bodenwöhr;1 +9435;Schwarzenfeld;1 +9436;Nittenau;1 +9438;Fensterbach;1 +9439;Neunburg-Kemnath;1 +9441;Kelheim;1 +9442;Riedenburg;1 +9443;Abensberg;1 +9444;Siegenburg;1 +9445;Neustadt a d Donau;1 +9446;Altmannstein;1 +9447;Essing;1 +9448;Hausen Niederbay;1 +9451;Schierling;1 +9452;Langquaid;1 +9453;Thalmassing;1 +9454;Aufhausen Oberpf;1 +9461;Roding;1 +9462;Falkenstein Oberpf;1 +9463;Wald Oberpf;1 +9464;Walderbach;1 +9465;Neukirchen-Balbini;1 +9466;Stamsried;1 +9467;Michelsneukirchen;1 +9468;Zell Oberpf;1 +9469;Roding-Neubäu;1 +9471;Burglengenfeld;1 +9472;Hohenfels Oberpf;1 +9473;Kallmünz;1 +9474;Schmidmühlen;1 +9480;Sünching;1 +9481;Pfatter;1 +9482;Wörth a d Donau;1 +9484;Brennberg;1 +9491;Hemau;1 +9492;Parsberg;1 +9493;Beratzhausen;1 +9495;Breitenbrunn Oberpf;1 +9497;Seubersdorf i d Opf;1 +9498;Laaber;1 +9499;Painten;1 +9502;Frensdorf;1 +9503;Oberhaid Oberfr;1 +9504;Stadelhofen;1 +9505;Litzendorf;1 +951;Bamberg;1 +9521;Hassfurt;1 +9522;Eltmann;1 +9523;Hofheim i Ufr;1 +9524;Zeil a Main;1 +9525;Königsberg i Bay;1 +9526;Riedbach;1 +9527;Knetzgau;1 +9528;Donnersdorf;1 +9529;Oberaurach;1 +9531;Ebern;1 +9532;Maroldsweisach;1 +9533;Untermerzbach;1 +9534;Burgpreppach;1 +9535;Pfarrweisach;1 +9536;Kirchlauter;1 +9542;Schesslitz;1 +9543;Hirschaid;1 +9544;Baunach;1 +9545;Buttenheim;1 +9546;Burgebrach;1 +9547;Zapfendorf;1 +9548;Mühlhausen Mittelfr;1 +9549;Lisberg;1 +9551;Burgwindheim;1 +9552;Burghaslach;1 +9553;Ebrach Oberfr;1 +9554;Untersteinbach Unterfr;1 +9555;Schlüsselfeld-Aschbach;1 +9556;Geiselwind;1 +9560;Grub a Forst;1 +9561;Coburg;1 +9562;Sonnefeld;1 +9563;Rödental;1 +9564;Bad Rodach;1 +9565;Untersiemau;1 +9566;Meeder;1 +9567;Seßlach-Gemünda;1 +9568;Neustadt b Coburg;1 +9569;Sesslach;1 +9571;Lichtenfels Bay;1 +9572;Burgkunstadt;1 +9573;Staffelstein Oberfr;1 +9574;Marktzeuln;1 +9575;Weismain;1 +9576;Lichtenfels-Isling;1 +9602;Neustadt a d Waldnaab;1 +9603;Floss;1 +9604;Wernberg-Köblitz;1 +9605;Weiherhammer;1 +9606;Pfreimd;1 +9607;Luhe-Wildenau;1 +9608;Kohlberg Oberpf;1 +961;Weiden i d Opf;1 +9621;Amberg Oberpf;1 +9622;Hirschau Oberpf;1 +9624;Ensdorf Oberpf;1 +9625;Kastl b Amberg;1 +9626;Hohenburg;1 +9627;Freudenberg Oberpf;1 +9628;Ursensollen;1 +9631;Tirschenreuth;1 +9632;Waldsassen;1 +9633;Mitterteich;1 +9634;Wiesau;1 +9635;Bärnau;1 +9636;Plößberg;1 +9637;Falkenberg Oberpf;1 +9638;Neualbenreuth;1 +9639;Mähring;1 +9641;Grafenwöhr;1 +9642;Kemnath Stadt;1 +9643;Auerbach i d Opf;1 +9644;Pressath;1 +9645;Eschenbach i d Opf;1 +9646;Freihung;1 +9647;Kirchenthumbach;1 +9648;Neustadt a Kulm;1 +9651;Vohenstrauss;1 +9652;Waidhaus;1 +9653;Eslarn;1 +9654;Pleystein;1 +9655;Tännesberg;1 +9656;Moosbach b Vohenstrauß;1 +9657;Waldthurn;1 +9658;Georgenberg;1 +9659;Leuchtenberg;1 +9661;Sulzbach-Rosenberg;1 +9662;Vilseck;1 +9663;Neukirchen b Sulzbach-Rosenberg;1 +9664;Hahnbach;1 +9665;Königstein Oberpf;1 +9666;Illschwang;1 +9671;Oberviechtach;1 +9672;Neunburg vorm Wald;1 +9673;Tiefenbach Oberpf;1 +9674;Schönsee;1 +9675;Altendorf a Nabburg;1 +9676;Winklarn;1 +9677;Oberviechtach-Pullenried;1 +9681;Windischeschenbach;1 +9682;Erbendorf;1 +9683;Friedenfels;1 +9701;Sandberg Unterfr;1 +9704;Euerdorf;1 +9708;Bad Bocklet;1 +971;Bad Kissingen;1 +9720;Üchtelhausen;1 +9721;Schweinfurt;1 +9722;Werneck;1 +9723;Röthlein;1 +9724;Stadtlauringen;1 +9725;Poppenhausen Unterfr;1 +9726;Euerbach;1 +9727;Schonungen-Marktsteinach;1 +9728;Wülfershausen Unterfr;1 +9729;Grettstadt;1 +9732;Hammelburg;1 +9733;Münnerstadt;1 +9734;Burkardroth;1 +9735;Massbach;1 +9736;Oberthulba;1 +9737;Wartmannsroth;1 +9738;Rottershausen;1 +9741;Bad Brückenau;1 +9742;Kalbach Rhön;1 +9744;Zeitlofs-Detter;1 +9745;Wildflecken;1 +9746;Zeitlofs;1 +9747;Geroda Bay;1 +9748;Motten;1 +9749;Oberbach Unterfr;1 +9761;Bad Königshofen i Grabfeld;1 +9762;Saal a d Saale;1 +9763;Sulzdorf a d Lederhecke;1 +9764;Höchheim;1 +9765;Trappstadt;1 +9766;Grosswenkheim;1 +9771;Bad Neustadt a d Saale;1 +9772;Bischofsheim a d Rhön;1 +9773;Unsleben;1 +9774;Oberelsbach;1 +9775;Schönau a d Brend;1 +9776;Mellrichstadt;1 +9777;Ostheim v d Rhön;1 +9778;Fladungen;1 +9779;Nordheim v d Rhön;1 +9802;Ansbach-Katterbach;1 +9803;Colmberg;1 +9804;Aurach;1 +9805;Burgoberbach;1 +981;Ansbach;1 +9820;Lehrberg;1 +9822;Bechhofen a d Heide;1 +9823;Leutershausen;1 +9824;Dietenhofen;1 +9825;Herrieden;1 +9826;Weidenbach Mittelfr;1 +9827;Lichtenau Mittelfr;1 +9828;Rügland;1 +9829;Flachslanden;1 +9831;Gunzenhausen;1 +9832;Wassertrüdingen;1 +9833;Heidenheim Mittelfr;1 +9834;Theilenhofen;1 +9835;Ehingen Mittelfr;1 +9836;Gunzenhausen-Cronheim;1 +9837;Haundorf;1 +9841;Bad Windsheim;1 +9842;Uffenheim;1 +9843;Burgbernheim;1 +9844;Obernzenn;1 +9845;Oberdachstetten;1 +9846;Ipsheim;1 +9847;Ergersheim;1 +9848;Simmershofen;1 +9851;Dinkelsbühl;1 +9852;Feuchtwangen;1 +9853;Wilburgstetten;1 +9854;Wittelshofen;1 +9855;Dentlein a Forst;1 +9856;Dürrwangen;1 +9857;Schopfloch Mittelfr;1 +9861;Rothenburg ob der Tauber;1 +9865;Adelshofen Mittelfr;1 +9867;Geslau;1 +9868;Schillingsfürst;1 +9869;Wettringen Mittelfr;1 +9871;Windsbach;1 +9872;Heilsbronn;1 +9873;Abenberg-Wassermungenau;1 +9874;Neuendettelsau;1 +9875;Wolframs-Eschenbach;1 +9876;Rohr Mittelfr;1 +9901;Hengersberg Bay;1 +9903;Schöllnach;1 +9904;Lalling;1 +9905;Bernried Niederbay;1 +9906;Mariaposching;1 +9907;Zenting;1 +9908;Schöfweg;1 +991;Deggendorf;1 +9920;Bischofsmais;1 +9921;Regen;1 +9922;Zwiesel;1 +9923;Teisnach;1 +9924;Bodenmais;1 +9925;Bayerisch Eisenstein;1 +9926;Frauenau;1 +9927;Kirchberg Wald;1 +9928;Kirchdorf i Wald;1 +9929;Ruhmannsfelden;1 +9931;Plattling;1 +9932;Osterhofen;1 +9933;Wallersdorf;1 +9935;Stephansposching;1 +9936;Wallerfing;1 +9937;Oberpöring;1 +9938;Moos Niederbay;1 +9941;Kötzting;1 +9942;Viechtach;1 +9943;Lam Oberpf;1 +9944;Miltach;1 +9945;Arnbruck;1 +9946;Hohenwarth b Kötzing;1 +9947;Neukirchen b Hl Blut;1 +9948;Eschlkam;1 +9951;Landau a d Isar;1 +9952;Eichendorf;1 +9953;Pilsting;1 +9954;Simbach Niederbay;1 +9955;Mamming;1 +9956;Eichendorf-Aufhausen;1 +9961;Mitterfels;1 +9962;Schwarzach Niederbay;1 +9963;Konzell;1 +9964;Stallwang;1 +9965;Sankt Englmar;1 +9966;Wiesenfelden;1 +9971;Cham;1 +9972;Waldmünchen;1 +9973;Furth i Wald;1 +9974;Traitsching;1 +9975;Waldmünchen-Geigant;1 +9976;Rötz;1 +9977;Arnschwang;1 +9978;Schönthal Oberpf;1 + \ No newline at end of file diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py new file mode 100644 index 0000000..dabba83 --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -0,0 +1,82 @@ +import csv + + +def add(leaf, keypart, name): + if len(keypart) == 1: + leaf[keypart] = name + else: + if not keypart[0] in leaf: + leaf[keypart[0]] = {} + add(leaf[keypart[0]], keypart[1:], name) + + +def print_function(leaf, prefix): + if prefix == '': + java_visibility = 'public' + else: + java_visibility = 'private' + + print(' '+java_visibility+' static String fromNumber'+ prefix +'(String number) {') + print(' if ((number == null) || (number.length()<1)) {') + print(' return "";') + print(' }') + print('') + print(' switch (number.substring(0, 1)) {') + + if prefix == "": + # main function - need explicit reference to service and mobile function for starting numbers with 1 + print(' case "1":') + print(' return fromNumber1(number.substring(1));') + + for k in leaf: + print(' case "'+k+'":') + + if isinstance(leaf[k], dict): + print(' return fromNumber'+prefix+k+'(number.substring(1));') + else: + if (prefix+k) == "212": + print(' // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sach' + 'gebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBV' + 'erzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1') + print(' if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) {') + print(' return "2129"; // Haan Rheinland') + print(' }') + print(' return "'+prefix+k+'"; // '+ leaf[k]) + + print(' default:') + print(' return "";') + print(' }') + print(' }') + print('') + + for k in leaf: + if isinstance(leaf[k], dict): + print_function(leaf[k], prefix + k) + +# Start, creating a dictonary for placing the Numberplan as a tree +onkz = {} + +# Data from https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vorwahlverzeichnis_ONB.zip.zip?__blob=publicationFile&v=1 +# it is linked at https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/ONRufnr/Einteilung_ONB/start.html + +with open('NVONB.INTERNET.20220727.ONB.csv', newline='') as csvfile: + reader = csv.reader(csvfile, delimiter=';', quotechar='"') + for row in reader: + # remove first line: Ortsnetzkennzahl;Ortsnetzname;KennzeichenAktiv + if row == ['Ortsnetzkennzahl', 'Ortsnetzname', 'KennzeichenAktiv']: + continue + # remove line: 2129;Haan Rheinl;1 // because of overlapping, this is added explicitly, see above + if row == ['2129', 'Haan Rheinl', '1']: + continue + # remove last line:  + if row == ['\x1a']: + continue + add(onkz, row[0], row[1]) + +# print code from three +print_function(onkz, "") + + + + + diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java new file mode 100644 index 0000000..d3a0b27 --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -0,0 +1,21596 @@ +package de.telekom.phonenumbernormalizer.numberplans.constants; + +public class GermanAreaCodeExtractor { + + /* + The following Code is generated by the python script: src/generators/GermanAreaCodeExtractor/main.py + it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new + code and past it between the comments below. + + It only generates the code for geographical NDC starting with 2..9 for service and mobile numbers, starting one is + hard coded (reference is added into script automatically. + + */ + + private static String fromNumber1(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + // used mobile number blocks see: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html + switch (number.substring(0, 1)) { + case "5": + return fromNumber15(number.substring(1)); + case "6": + return fromNumber16(number.substring(1)); + case "7": + return fromNumber17(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber15(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber150(number.substring(1)); + case "1": + return fromNumber151(number.substring(1)); + case "2": + return fromNumber152(number.substring(1)); + case "3": + return fromNumber153(number.substring(1)); + case "5": + return fromNumber155(number.substring(1)); + case "6": + return fromNumber156(number.substring(1)); + case "7": + return fromNumber157(number.substring(1)); + case "8": + return fromNumber158(number.substring(1)); + case "9": + return fromNumber159(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber150(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1501(number.substring(1)); + case "2": + return fromNumber1502(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1501(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + // TODO: Replace all substring(0, 1) with chartAt(0) + if (number.charAt(0) == '9') { + return "15019"; // Tismi BV + } + return ""; + } + + private static String fromNumber1502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15020"; // Legos - Local Exchange Global Operation Services + } + return ""; + } + + private static String fromNumber151(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "1511"; // Telekom Deutschland GmbH + case "2": + return "1512"; // Telekom Deutschland GmbH + case "4": + return "1514"; // Telekom Deutschland GmbH + case "5": + return "1515"; // Telekom Deutschland GmbH + case "6": + return "1516"; // Telekom Deutschland GmbH + case "7": + return "1517"; // Telekom Deutschland GmbH + case "8": + return fromNumber1518(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1518(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15180"; // Telekom Deutschland GmbH + case "1": + return "15181"; // Telekom Deutschland GmbH + case "2": + return "15182"; // Telekom Deutschland GmbH + case "3": + return "15183"; // Telekom Deutschland GmbH + default: + return ""; + } + } + + private static String fromNumber152(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "1520"; // Vodafone GmbH + case "1": + return "1521"; // Lycamobile Europe Ltd. + case "2": + return "1522"; // Vodafone GmbH + case "3": + return "1523"; // Vodafone GmbH + case "5": + return "1525"; // Vodafone GmbH + case "6": + return "1526"; // Vodafone GmbH + case "9": + return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH) + default: + return ""; + } + } + + private static String fromNumber153(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '1') { + return fromNumber1531(number.substring(1)); + } + return ""; + } + + private static String fromNumber1531(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15310"; // MTEL Deutschland GmbH + } + return ""; + } + + private static String fromNumber155(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1551(number.substring(1)); + case "6": + return fromNumber1556(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1551(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15510"; // Lebara Limited + case "1": + return "15511"; // Lebara Limited + default: + return ""; + } + } + + private static String fromNumber1556(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15560"; // 1&1 Mobilfunk GmbH + case "1": + return "15561"; // 1&1 Mobilfunk GmbH + case "2": + return "15562"; // 1&1 Mobilfunk GmbH + case "3": + return "15563"; // 1&1 Mobilfunk GmbH + case "4": + return "15564"; // 1&1 Mobilfunk GmbH + case "5": + return "15565"; // 1&1 Mobilfunk GmbH + case "6": + return "15566"; // 1&1 Mobilfunk GmbH + case "7": + return "15567"; // 1&1 Mobilfunk GmbH + case "8": + return "15568"; // 1&1 Mobilfunk GmbH + case "9": + return "15569"; // 1&1 Mobilfunk GmbH + default: + return ""; + } + } + + private static String fromNumber156(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return fromNumber1563(number.substring(1)); + case "7": + return fromNumber1567(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber1563(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "15630"; // multiConnect GmbH + } + return ""; + } + + private static String fromNumber1567(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "8": + return "15678"; // Argon Networks UG + case "9": + return "15679"; // Argon Networks UG + default: + return ""; + } + } + + private static String fromNumber157(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber1570(number.substring(1)); + case "3": + return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "5": + return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "7": + return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "8": + return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "9": + return "1579"; // Telefónica Germany GmbH & Co. OHG (Netznutzungsvereinbarung mit Fa. Sipgate Wireless GmbH zuvor Fa. Vintage Wireless Networks Gesellschaft für Telekommunikation mbH), (ehem. E-Plus-Mobilfunk GmbH) + default: + return ""; + } + } + + private static String fromNumber1570(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "15700"; // Telefónica Germany GmbH & Co. OHG + case "1": + return "15701"; // Telefónica Germany GmbH & Co. OHG + case "2": + return "15702"; // Telefónica Germany GmbH & Co. OHG + case "3": + return "15703"; // Telefónica Germany GmbH & Co. OHG + case "4": + return "15704"; // Telefónica Germany GmbH & Co. OHG + case "6": + return "15706"; // Telefónica Germany GmbH & Co. OHG + + default: + return ""; + } + } + + private static String fromNumber158(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '8') { + return fromNumber1588(number.substring(1)); + } + return ""; + } + + private static String fromNumber1588(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '8') { + return "15888"; // TelcoVillage GmbH + } + return ""; + } + + private static String fromNumber159(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + if (number.charAt(0) == '0') { + return "1590"; // Telefónica Germany GmbH & Co. OHG + } + return ""; + } + + private static String fromNumber16(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "160"; // Telekom Deutschland GmbH + case "2": + return "162"; // Vodafone GmbH + case "3": + return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + default: + return ""; + } + } + + private static String fromNumber17(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "170"; // Telekom Deutschland GmbH + case "1": + return "171"; // Telekom Deutschland GmbH + case "2": + return "172"; // Vodafone GmbH + case "3": + return "173"; // Vodafone GmbH + case "4": + return "174"; // Vodafone GmbH + case "5": + return "175"; // Telekom Deutschland GmbH + case "6": + return "176"; // Telefónica Germany GmbH & Co. OHG + case "7": + return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "8": + return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case "9": + return "179"; // Telefónica Germany GmbH & Co. OHG + default: + return ""; + } + } + + /* + Start of generated code + */ + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return fromNumber1(number.substring(1)); + case "2": + return fromNumber2(number.substring(1)); + case "3": + return fromNumber3(number.substring(1)); + case "4": + return fromNumber4(number.substring(1)); + case "5": + return fromNumber5(number.substring(1)); + case "6": + return fromNumber6(number.substring(1)); + case "7": + return fromNumber7(number.substring(1)); + case "8": + return fromNumber8(number.substring(1)); + case "9": + return fromNumber9(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber2(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber20(number.substring(1)); + case "1": + return fromNumber21(number.substring(1)); + case "2": + return fromNumber22(number.substring(1)); + case "3": + return fromNumber23(number.substring(1)); + case "4": + return fromNumber24(number.substring(1)); + case "5": + return fromNumber25(number.substring(1)); + case "6": + return fromNumber26(number.substring(1)); + case "7": + return fromNumber27(number.substring(1)); + case "8": + return fromNumber28(number.substring(1)); + case "9": + return fromNumber29(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber20(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "201"; // Essen + case "2": + return "202"; // Wuppertal + case "3": + return "203"; // Duisburg + case "4": + return fromNumber204(number.substring(1)); + case "5": + return fromNumber205(number.substring(1)); + case "6": + return fromNumber206(number.substring(1)); + case "8": + return "208"; // Oberhausen Rheinl + case "9": + return "209"; // Gelsenkirchen + default: + return ""; + } + } + + private static String fromNumber204(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2041"; // Bottrop + case "3": + return "2043"; // Gladbeck + case "5": + return "2045"; // Bottrop-Kirchhellen + default: + return ""; + } + } + + private static String fromNumber205(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2051"; // Velbert + case "2": + return "2052"; // Velbert-Langenberg + case "3": + return "2053"; // Velbert-Neviges + case "4": + return "2054"; // Essen-Kettwig + case "6": + return "2056"; // Heiligenhaus + case "8": + return "2058"; // Wülfrath + default: + return ""; + } + } + + private static String fromNumber206(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "4": + return "2064"; // Dinslaken + case "5": + return "2065"; // Duisburg-Rheinhausen + case "6": + return "2066"; // Duisburg-Homberg + default: + return ""; + } + } + + private static String fromNumber21(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber210(number.substring(1)); + case "1": + return "211"; // Düsseldorf + case "2": + // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBVerzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1 + if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) { + return "2129"; // Haan Rheinland + } + return "212"; // Solingen + case "3": + return fromNumber213(number.substring(1)); + case "4": + return "214"; // Leverkusen + case "5": + return fromNumber215(number.substring(1)); + case "6": + return fromNumber216(number.substring(1)); + case "7": + return fromNumber217(number.substring(1)); + case "8": + return fromNumber218(number.substring(1)); + case "9": + return fromNumber219(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber210(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2102"; // Ratingen + case "3": + return "2103"; // Hilden + case "4": + return "2104"; // Mettmann + default: + return ""; + } + } + + private static String fromNumber213(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2131"; // Neuss + case "2": + return "2132"; // Meerbusch-Büderich + case "3": + return "2133"; // Dormagen + case "7": + return "2137"; // Neuss-Norf + default: + return ""; + } + } + + private static String fromNumber215(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2150"; // Meerbusch-Lank + case "1": + return "2151"; // Krefeld + case "2": + return "2152"; // Kempen + case "3": + return "2153"; // Nettetal-Lobberich + case "4": + return "2154"; // Willich + case "6": + return "2156"; // Willich-Anrath + case "7": + return "2157"; // Nettetal-Kaldenkirchen + case "8": + return "2158"; // Grefrath b Krefeld + case "9": + return "2159"; // Meerbusch-Osterath + default: + return ""; + } + } + + private static String fromNumber216(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2161"; // Mönchengladbach + case "2": + return "2162"; // Viersen + case "3": + return "2163"; // Schwalmtal Niederrhein + case "4": + return "2164"; // Jüchen-Otzenrath + case "5": + return "2165"; // Jüchen + case "6": + return "2166"; // Mönchengladbach-Rheydt + default: + return ""; + } + } + + private static String fromNumber217(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2171"; // Leverkusen-Opladen + case "3": + return "2173"; // Langenfeld Rheinland + case "4": + return "2174"; // Burscheid Rheinl + case "5": + return "2175"; // Leichlingen Rheinland + default: + return ""; + } + } + + private static String fromNumber218(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2181"; // Grevenbroich + case "2": + return "2182"; // Grevenbroich-Kapellen + case "3": + return "2183"; // Rommerskirchen + default: + return ""; + } + } + + private static String fromNumber219(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2191"; // Remscheid + case "2": + return "2192"; // Hückeswagen + case "3": + return "2193"; // Dabringhausen + case "5": + return "2195"; // Radevormwald + case "6": + return "2196"; // Wermelskirchen + default: + return ""; + } + } + + private static String fromNumber22(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber220(number.substring(1)); + case "1": + return "221"; // Köln + case "2": + return fromNumber222(number.substring(1)); + case "3": + return fromNumber223(number.substring(1)); + case "4": + return fromNumber224(number.substring(1)); + case "5": + return fromNumber225(number.substring(1)); + case "6": + return fromNumber226(number.substring(1)); + case "7": + return fromNumber227(number.substring(1)); + case "8": + return "228"; // Bonn + case "9": + return fromNumber229(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber220(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2202"; // Bergisch Gladbach + case "3": + return "2203"; // Köln-Porz + case "4": + return "2204"; // Bensberg + case "5": + return "2205"; // Rösrath + case "6": + return "2206"; // Overath + case "7": + return "2207"; // Kürten-Dürscheid + case "8": + return "2208"; // Niederkassel + default: + return ""; + } + } + + private static String fromNumber222(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2222"; // Bornheim Rheinl + case "3": + return "2223"; // Königswinter + case "4": + return "2224"; // Bad Honnef + case "5": + return "2225"; // Meckenheim Rheinl + case "6": + return "2226"; // Rheinbach + case "7": + return "2227"; // Bornheim-Merten + case "8": + return "2228"; // Remagen-Rolandseck + default: + return ""; + } + } + + private static String fromNumber223(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2232"; // Brühl Rheinl + case "3": + return "2233"; // Hürth Rheinl + case "4": + return "2234"; // Frechen + case "5": + return "2235"; // Erftstadt + case "6": + return "2236"; // Wesseling Rheinl + case "7": + return "2237"; // Kerpen Rheinl-Türnich + case "8": + return "2238"; // Pulheim + default: + return ""; + } + } + + private static String fromNumber224(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2241"; // Siegburg + case "2": + return "2242"; // Hennef Sieg + case "3": + return "2243"; // Eitorf + case "4": + return "2244"; // Königswinter-Oberpleis + case "5": + return "2245"; // Much + case "6": + return "2246"; // Lohmar Rheinland + case "7": + return "2247"; // Neunkirchen-Seelscheid + case "8": + return "2248"; // Hennef-Uckerath + default: + return ""; + } + } + + private static String fromNumber225(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2251"; // Euskirchen + case "2": + return "2252"; // Zülpich + case "3": + return "2253"; // Bad Münstereifel + case "4": + return "2254"; // Weilerswist + case "5": + return "2255"; // Euskirchen-Flamersheim + case "6": + return "2256"; // Mechernich-Satzvey + case "7": + return "2257"; // Reckerscheid + default: + return ""; + } + } + + private static String fromNumber226(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2261"; // Gummersbach + case "2": + return "2262"; // Wiehl + case "3": + return "2263"; // Engelskirchen + case "4": + return "2264"; // Marienheide + case "5": + return "2265"; // Reichshof-Eckenhagen + case "6": + return "2266"; // Lindlar + case "7": + return "2267"; // Wipperfürth + case "8": + return "2268"; // Kürten + case "9": + return "2269"; // Kierspe-Rönsahl + default: + return ""; + } + } + + private static String fromNumber227(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2271"; // Bergheim Erft + case "2": + return "2272"; // Bedburg Erft + case "3": + return "2273"; // Kerpen-Horrem + case "4": + return "2274"; // Elsdorf Rheinl + case "5": + return "2275"; // Kerpen-Buir + default: + return ""; + } + } + + private static String fromNumber229(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2291"; // Waldbröl + case "2": + return "2292"; // Windeck Sieg + case "3": + return "2293"; // Nümbrecht + case "4": + return "2294"; // Morsbach Sieg + case "5": + return "2295"; // Ruppichteroth + case "6": + return "2296"; // Reichshof-Brüchermühle + case "7": + return "2297"; // Wildbergerhütte + default: + return ""; + } + } + + private static String fromNumber23(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber230(number.substring(1)); + case "1": + return "231"; // Dortmund + case "2": + return fromNumber232(number.substring(1)); + case "3": + return fromNumber233(number.substring(1)); + case "4": + return "234"; // Bochum + case "5": + return fromNumber235(number.substring(1)); + case "6": + return fromNumber236(number.substring(1)); + case "7": + return fromNumber237(number.substring(1)); + case "8": + return fromNumber238(number.substring(1)); + case "9": + return fromNumber239(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber230(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2301"; // Holzwickede + case "2": + return "2302"; // Witten + case "3": + return "2303"; // Unna + case "4": + return "2304"; // Schwerte + case "5": + return "2305"; // Castrop-Rauxel + case "6": + return "2306"; // Lünen + case "7": + return "2307"; // Kamen + case "8": + return "2308"; // Unna-Hemmerde + case "9": + return "2309"; // Waltrop + default: + return ""; + } + } + + private static String fromNumber232(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "2323"; // Herne + case "4": + return "2324"; // Hattingen Ruhr + case "5": + return "2325"; // Wanne-Eickel + case "7": + return "2327"; // Bochum-Wattenscheid + default: + return ""; + } + } + + private static String fromNumber233(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2330"; // Herdecke + case "1": + return "2331"; // Hagen Westf + case "2": + return "2332"; // Gevelsberg + case "3": + return "2333"; // Ennepetal + case "4": + return "2334"; // Hagen-Hohenlimburg + case "5": + return "2335"; // Wetter Ruhr + case "6": + return "2336"; // Schwelm + case "7": + return "2337"; // Hagen-Dahl + case "8": + return "2338"; // Breckerfeld + case "9": + return "2339"; // Sprockhövel-Haßlinghausen + default: + return ""; + } + } + + private static String fromNumber235(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2351"; // Lüdenscheid + case "2": + return "2352"; // Altena Westf + case "3": + return "2353"; // Halver + case "4": + return "2354"; // Meinerzhagen + case "5": + return "2355"; // Schalksmühle + case "7": + return "2357"; // Herscheid Westf + case "8": + return "2358"; // Meinerzhagen-Valbert + case "9": + return "2359"; // Kierspe + default: + return ""; + } + } + + private static String fromNumber236(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2360"; // Haltern-Lippramsdorf + case "1": + return "2361"; // Recklinghausen + case "2": + return "2362"; // Dorsten + case "3": + return "2363"; // Datteln + case "4": + return "2364"; // Haltern Westf + case "5": + return "2365"; // Marl + case "6": + return "2366"; // Herten Westf + case "7": + return "2367"; // Henrichenburg + case "8": + return "2368"; // Oer-Erkenschwick + case "9": + return "2369"; // Dorsten-Wulfen + default: + return ""; + } + } + + private static String fromNumber237(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2371"; // Iserlohn + case "2": + return "2372"; // Hemer + case "3": + return "2373"; // Menden Sauerland + case "4": + return "2374"; // Iserlohn-Letmathe + case "5": + return "2375"; // Balve + case "7": + return "2377"; // Wickede Ruhr + case "8": + return "2378"; // Fröndenberg-Langschede + case "9": + return "2379"; // Menden-Asbeck + default: + return ""; + } + } + + private static String fromNumber238(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2381"; // Hamm Westf + case "2": + return "2382"; // Ahlen Westf + case "3": + return "2383"; // Bönen + case "4": + return "2384"; // Welver + case "5": + return "2385"; // Hamm-Rhynern + case "7": + return "2387"; // Drensteinfurt-Walstedde + case "8": + return "2388"; // Hamm-Uentrop + case "9": + return "2389"; // Werne + default: + return ""; + } + } + + private static String fromNumber239(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2391"; // Plettenberg + case "2": + return "2392"; // Werdohl + case "3": + return "2393"; // Sundern-Allendorf + case "4": + return "2394"; // Neuenrade-Affeln + case "5": + return "2395"; // Finnentrop-Rönkhausen + default: + return ""; + } + } + + private static String fromNumber24(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber240(number.substring(1)); + case "1": + return "241"; // Aachen + case "2": + return fromNumber242(number.substring(1)); + case "3": + return fromNumber243(number.substring(1)); + case "4": + return fromNumber244(number.substring(1)); + case "5": + return fromNumber245(number.substring(1)); + case "6": + return fromNumber246(number.substring(1)); + case "7": + return fromNumber247(number.substring(1)); + case "8": + return fromNumber248(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber240(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2401"; // Baesweiler + case "2": + return "2402"; // Stolberg Rheinl + case "3": + return "2403"; // Eschweiler Rheinl + case "4": + return "2404"; // Alsdorf Rheinl + case "5": + return "2405"; // Würselen + case "6": + return "2406"; // Herzogenrath + case "7": + return "2407"; // Herzogenrath-Kohlscheid + case "8": + return "2408"; // Aachen-Kornelimünster + case "9": + return "2409"; // Stolberg-Gressenich + default: + return ""; + } + } + + private static String fromNumber242(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2421"; // Düren + case "2": + return "2422"; // Kreuzau + case "3": + return "2423"; // Langerwehe + case "4": + return "2424"; // Vettweiss + case "5": + return "2425"; // Nideggen-Embken + case "6": + return "2426"; // Nörvenich + case "7": + return "2427"; // Nideggen + case "8": + return "2428"; // Niederzier + case "9": + return "2429"; // Hürtgenwald + default: + return ""; + } + } + + private static String fromNumber243(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2431"; // Erkelenz + case "2": + return "2432"; // Wassenberg + case "3": + return "2433"; // Hückelhoven + case "4": + return "2434"; // Wegberg + case "5": + return "2435"; // Erkelenz-Lövenich + case "6": + return "2436"; // Wegberg-Rödgen + default: + return ""; + } + } + + private static String fromNumber244(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2440"; // Nettersheim-Tondorf + case "1": + return "2441"; // Kall + case "3": + return "2443"; // Mechernich + case "4": + return "2444"; // Schleiden-Gemünd + case "5": + return "2445"; // Schleiden Eifel + case "6": + return "2446"; // Heimbach Eifel + case "7": + return "2447"; // Dahlem b Kall + case "8": + return "2448"; // Hellenthal-Rescheid + case "9": + return "2449"; // Blankenheim Ahr + default: + return ""; + } + } + + private static String fromNumber245(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2451"; // Geilenkirchen + case "2": + return "2452"; // Heinsberg Rheinl + case "3": + return "2453"; // Heinsberg-Randerath + case "4": + return "2454"; // Gangelt + case "5": + return "2455"; // Waldfeucht + case "6": + return "2456"; // Selfkant + default: + return ""; + } + } + + private static String fromNumber246(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2461"; // Jülich + case "2": + return "2462"; // Linnich + case "3": + return "2463"; // Titz + case "4": + return "2464"; // Aldenhoven b Jülich + case "5": + return "2465"; // Inden + default: + return ""; + } + } + + private static String fromNumber247(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2471"; // Roetgen Eifel + case "2": + return "2472"; // Monschau + case "3": + return "2473"; // Simmerath + case "4": + return "2474"; // Nideggen-Schmidt + default: + return ""; + } + } + + private static String fromNumber248(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2482"; // Hellenthal + case "4": + return "2484"; // Mechernich-Eiserfey + case "5": + return "2485"; // Schleiden-Dreiborn + case "6": + return "2486"; // Nettersheim + default: + return ""; + } + } + + private static String fromNumber25(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber250(number.substring(1)); + case "1": + return "251"; // Münster + case "2": + return fromNumber252(number.substring(1)); + case "3": + return fromNumber253(number.substring(1)); + case "4": + return fromNumber254(number.substring(1)); + case "5": + return fromNumber255(number.substring(1)); + case "6": + return fromNumber256(number.substring(1)); + case "7": + return fromNumber257(number.substring(1)); + case "8": + return fromNumber258(number.substring(1)); + case "9": + return fromNumber259(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber250(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2501"; // Münster-Hiltrup + case "2": + return "2502"; // Nottuln + case "4": + return "2504"; // Telgte + case "5": + return "2505"; // Altenberge Westf + case "6": + return "2506"; // Münster-Wolbeck + case "7": + return "2507"; // Havixbeck + case "8": + return "2508"; // Drensteinfurt + case "9": + return "2509"; // Nottuln-Appelhülsen + default: + return ""; + } + } + + private static String fromNumber252(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2520"; // Wadersloh-Diestedde + case "1": + return "2521"; // Beckum + case "2": + return "2522"; // Oelde + case "3": + return "2523"; // Wadersloh + case "4": + return "2524"; // Ennigerloh + case "5": + return "2525"; // Beckum-Neubeckum + case "6": + return "2526"; // Sendenhorst + case "7": + return "2527"; // Lippetal-Lippborg + case "8": + return "2528"; // Ennigerloh-Enniger + case "9": + return "2529"; // Oelde-Stromberg + default: + return ""; + } + } + + private static String fromNumber253(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2532"; // Ostbevern + case "3": + return "2533"; // Münster-Nienberge + case "4": + return "2534"; // Münster-Roxel + case "5": + return "2535"; // Sendenhorst-Albersloh + case "6": + return "2536"; // Münster-Albachten + case "8": + return "2538"; // Drensteinfurt-Rinkerode + default: + return ""; + } + } + + private static String fromNumber254(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2541"; // Coesfeld + case "2": + return "2542"; // Gescher + case "3": + return "2543"; // Billerbeck Westf + case "5": + return "2545"; // Rosendahl-Darfeld + case "6": + return "2546"; // Coesfeld-Lette + case "7": + return "2547"; // Rosendahl-Osterwick + case "8": + return "2548"; // Dülmen-Rorup + default: + return ""; + } + } + + private static String fromNumber255(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2551"; // Steinfurt-Burgsteinfurt + case "2": + return "2552"; // Steinfurt-Borghorst + case "3": + return "2553"; // Ochtrup + case "4": + return "2554"; // Laer Kr Steinfurt + case "5": + return "2555"; // Schöppingen + case "6": + return "2556"; // Metelen + case "7": + return "2557"; // Wettringen Kr Steinfurt + case "8": + return "2558"; // Horstmar + default: + return ""; + } + } + + private static String fromNumber256(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2561"; // Ahaus + case "2": + return "2562"; // Gronau Westfalen + case "3": + return "2563"; // Stadtlohn + case "4": + return "2564"; // Vreden + case "5": + return "2565"; // Gronau-Epe + case "6": + return "2566"; // Legden + case "7": + return "2567"; // Ahaus-Alstätte + case "8": + return "2568"; // Heek + default: + return ""; + } + } + + private static String fromNumber257(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2571"; // Greven Westf + case "2": + return "2572"; // Emsdetten + case "3": + return "2573"; // Nordwalde + case "4": + return "2574"; // Saerbeck + case "5": + return "2575"; // Greven-Reckenfeld + default: + return ""; + } + } + + private static String fromNumber258(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2581"; // Warendorf + case "2": + return "2582"; // Everswinkel + case "3": + return "2583"; // Sassenberg + case "4": + return "2584"; // Warendorf-Milte + case "5": + return "2585"; // Warendorf-Hoetmar + case "6": + return "2586"; // Beelen + case "7": + return "2587"; // Ennigerloh-Westkirchen + case "8": + return "2588"; // Harsewinkel-Greffen + default: + return ""; + } + } + + private static String fromNumber259(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2590"; // Dülmen-Buldern + case "1": + return "2591"; // Lüdinghausen + case "2": + return "2592"; // Selm + case "3": + return "2593"; // Ascheberg Westf + case "4": + return "2594"; // Dülmen + case "5": + return "2595"; // Olfen + case "6": + return "2596"; // Nordkirchen + case "7": + return "2597"; // Senden Westf + case "8": + return "2598"; // Senden-Ottmarsbocholt + case "9": + return "2599"; // Ascheberg-Herbern + default: + return ""; + } + } + + private static String fromNumber26(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber260(number.substring(1)); + case "1": + return "261"; // Koblenz a Rhein + case "2": + return fromNumber262(number.substring(1)); + case "3": + return fromNumber263(number.substring(1)); + case "4": + return fromNumber264(number.substring(1)); + case "5": + return fromNumber265(number.substring(1)); + case "6": + return fromNumber266(number.substring(1)); + case "7": + return fromNumber267(number.substring(1)); + case "8": + return fromNumber268(number.substring(1)); + case "9": + return fromNumber269(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber260(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2601"; // Nauort + case "2": + return "2602"; // Montabaur + case "3": + return "2603"; // Bad Ems + case "4": + return "2604"; // Nassau Lahn + case "5": + return "2605"; // Löf + case "6": + return "2606"; // Winningen Mosel + case "7": + return "2607"; // Kobern-Gondorf + case "8": + return "2608"; // Welschneudorf + default: + return ""; + } + } + + private static String fromNumber262(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2620"; // Neuhäusel Westerw + case "1": + return "2621"; // Lahnstein + case "2": + return "2622"; // Bendorf Rhein + case "3": + return "2623"; // Ransbach-Baumbach + case "4": + return "2624"; // Höhr-Grenzhausen + case "5": + return "2625"; // Ochtendung + case "6": + return "2626"; // Selters Westferwald + case "7": + return "2627"; // Braubach + case "8": + return "2628"; // Rhens + default: + return ""; + } + } + + private static String fromNumber263(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2630"; // Mülheim-Kärlich + case "1": + return "2631"; // Neuwied + case "2": + return "2632"; // Andernach + case "3": + return "2633"; // Brohl-Lützing + case "4": + return "2634"; // Rengsdorf + case "5": + return "2635"; // Rheinbrohl + case "6": + return "2636"; // Burgbrohl + case "7": + return "2637"; // Weissenthurm + case "8": + return "2638"; // Waldbreitbach + case "9": + return "2639"; // Anhausen Kr Neuwied + default: + return ""; + } + } + + private static String fromNumber264(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2641"; // Bad Neuenahr-Ahrweiler + case "2": + return "2642"; // Remagen + case "3": + return "2643"; // Altenahr + case "4": + return "2644"; // Linz am Rhein + case "5": + return "2645"; // Vettelschoss + case "6": + return "2646"; // Königsfeld Eifel + case "7": + return "2647"; // Kesseling + default: + return ""; + } + } + + private static String fromNumber265(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2651"; // Mayen + case "2": + return "2652"; // Mendig + case "3": + return "2653"; // Kaisersesch + case "4": + return "2654"; // Polch + case "5": + return "2655"; // Weibern + case "6": + return "2656"; // Virneburg + case "7": + return "2657"; // Uersfeld + default: + return ""; + } + } + + private static String fromNumber266(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2661"; // Bad Marienberg Westerwald + case "2": + return "2662"; // Hachenburg + case "3": + return "2663"; // Westerburg Westerw + case "4": + return "2664"; // Rennerod + case "6": + return "2666"; // Freilingen Westerw + case "7": + return "2667"; // Stein-Neukirch + default: + return ""; + } + } + + private static String fromNumber267(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2671"; // Cochem + case "2": + return "2672"; // Treis-Karden + case "3": + return "2673"; // Ellenz-Poltersdorf + case "4": + return "2674"; // Bad Bertrich + case "5": + return "2675"; // Ediger-Eller + case "6": + return "2676"; // Ulmen + case "7": + return "2677"; // Lutzerath + case "8": + return "2678"; // Büchel b Cochem + default: + return ""; + } + } + + private static String fromNumber268(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2680"; // Mündersbach + case "1": + return "2681"; // Altenkirchen Westerwald + case "2": + return "2682"; // Hamm Sieg + case "3": + return "2683"; // Asbach Westerw + case "4": + return "2684"; // Puderbach Westerw + case "5": + return "2685"; // Flammersfeld + case "6": + return "2686"; // Weyerbusch + case "7": + return "2687"; // Horhausen Westerwald + case "8": + return "2688"; // Kroppach + case "9": + return "2689"; // Dierdorf + default: + return ""; + } + } + + private static String fromNumber269(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2691"; // Adenau + case "2": + return "2692"; // Kelberg + case "3": + return "2693"; // Antweiler + case "4": + return "2694"; // Wershofen + case "5": + return "2695"; // Insul + case "6": + return "2696"; // Nohn Eifel + case "7": + return "2697"; // Blankenheim-Ahrhütte + default: + return ""; + } + } + + private static String fromNumber27(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "271"; // Siegen + case "2": + return fromNumber272(number.substring(1)); + case "3": + return fromNumber273(number.substring(1)); + case "4": + return fromNumber274(number.substring(1)); + case "5": + return fromNumber275(number.substring(1)); + case "6": + return fromNumber276(number.substring(1)); + case "7": + return fromNumber277(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber272(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2721"; // Lennestadt + case "2": + return "2722"; // Attendorn + case "3": + return "2723"; // Kirchhundem + case "4": + return "2724"; // Finnentrop-Serkenrode + case "5": + return "2725"; // Lennestadt-Oedingen + default: + return ""; + } + } + + private static String fromNumber273(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2732"; // Kreuztal + case "3": + return "2733"; // Hilchenbach + case "4": + return "2734"; // Freudenberg Westf + case "5": + return "2735"; // Neunkirchen Siegerl + case "6": + return "2736"; // Burbach Siegerl + case "7": + return "2737"; // Netphen-Deuz + case "8": + return "2738"; // Netphen + case "9": + return "2739"; // Wilnsdorf + default: + return ""; + } + } + + private static String fromNumber274(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2741"; // Betzdorf + case "2": + return "2742"; // Wissen + case "3": + return "2743"; // Daaden + case "4": + return "2744"; // Herdorf + case "5": + return "2745"; // Brachbach Sieg + case "7": + return "2747"; // Molzhain + default: + return ""; + } + } + + private static String fromNumber275(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2750"; // Diedenshausen + case "1": + return "2751"; // Bad Berleburg + case "2": + return "2752"; // Bad Laasphe + case "3": + return "2753"; // Erndtebrück + case "4": + return "2754"; // Bad Laasphe-Feudingen + case "5": + return "2755"; // Bad Berleburg-Schwarzenau + case "8": + return "2758"; // Bad Berleburg-Girkhausen + case "9": + return "2759"; // Bad Berleburg-Aue + default: + return ""; + } + } + + private static String fromNumber276(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2761"; // Olpe Biggesee + case "2": + return "2762"; // Wenden Südsauerland + case "3": + return "2763"; // Drolshagen-Bleche + case "4": + return "2764"; // Welschen Ennest + default: + return ""; + } + } + + private static String fromNumber277(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2770"; // Eschenburg + case "1": + return "2771"; // Dillenburg + case "2": + return "2772"; // Herborn Hess + case "3": + return "2773"; // Haiger + case "4": + return "2774"; // Dietzhölztal + case "5": + return "2775"; // Driedorf + case "6": + return "2776"; // Bad Endbach-Hartenrod + case "7": + return "2777"; // Breitscheid Hess + case "8": + return "2778"; // Siegbach + case "9": + return "2779"; // Greifenstein-Beilstein + default: + return ""; + } + } + + private static String fromNumber28(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber280(number.substring(1)); + case "1": + return "281"; // Wesel + case "2": + return fromNumber282(number.substring(1)); + case "3": + return fromNumber283(number.substring(1)); + case "4": + return fromNumber284(number.substring(1)); + case "5": + return fromNumber285(number.substring(1)); + case "6": + return fromNumber286(number.substring(1)); + case "7": + return fromNumber287(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber280(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2801"; // Xanten + case "2": + return "2802"; // Alpen + case "3": + return "2803"; // Wesel-Büderich + case "4": + return "2804"; // Xanten-Marienbaum + default: + return ""; + } + } + + private static String fromNumber282(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2821"; // Kleve Niederrhein + case "2": + return "2822"; // Emmerich + case "3": + return "2823"; // Goch + case "4": + return "2824"; // Kalkar + case "5": + return "2825"; // Uedem + case "6": + return "2826"; // Kranenburg Niederrhein + case "7": + return "2827"; // Goch-Hassum + case "8": + return "2828"; // Emmerich-Elten + default: + return ""; + } + } + + private static String fromNumber283(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2831"; // Geldern + case "2": + return "2832"; // Kevelaer + case "3": + return "2833"; // Kerken + case "4": + return "2834"; // Straelen + case "5": + return "2835"; // Issum + case "6": + return "2836"; // Wachtendonk + case "7": + return "2837"; // Weeze + case "8": + return "2838"; // Sonsbeck + case "9": + return "2839"; // Straelen-Herongen + default: + return ""; + } + } + + private static String fromNumber284(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2841"; // Moers + case "2": + return "2842"; // Kamp-Lintfort + case "3": + return "2843"; // Rheinberg + case "4": + return "2844"; // Rheinberg-Orsoy + case "5": + return "2845"; // Neukirchen-Vluyn + default: + return ""; + } + } + + private static String fromNumber285(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "2850"; // Rees-Haldern + case "1": + return "2851"; // Rees + case "2": + return "2852"; // Hamminkeln + case "3": + return "2853"; // Schermbeck + case "5": + return "2855"; // Voerde Niederrhein + case "6": + return "2856"; // Hamminkeln-Brünen + case "7": + return "2857"; // Rees-Mehr + case "8": + return "2858"; // Hünxe + case "9": + return "2859"; // Wesel-Bislich + default: + return ""; + } + } + + private static String fromNumber286(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2861"; // Borken Westf + case "2": + return "2862"; // Südlohn + case "3": + return "2863"; // Velen + case "4": + return "2864"; // Reken + case "5": + return "2865"; // Raesfeld + case "6": + return "2866"; // Dorsten-Rhade + case "7": + return "2867"; // Heiden Kr Borken + default: + return ""; + } + } + + private static String fromNumber287(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2871"; // Bocholt + case "2": + return "2872"; // Rhede Westf + case "3": + return "2873"; // Isselburg-Werth + case "4": + return "2874"; // Isselburg + default: + return ""; + } + } + + private static String fromNumber29(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber290(number.substring(1)); + case "1": + return "291"; // Meschede + case "2": + return fromNumber292(number.substring(1)); + case "3": + return fromNumber293(number.substring(1)); + case "4": + return fromNumber294(number.substring(1)); + case "5": + return fromNumber295(number.substring(1)); + case "6": + return fromNumber296(number.substring(1)); + case "7": + return fromNumber297(number.substring(1)); + case "8": + return fromNumber298(number.substring(1)); + case "9": + return fromNumber299(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber290(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "2902"; // Warstein + case "3": + return "2903"; // Meschede-Freienohl + case "4": + return "2904"; // Bestwig + case "5": + return "2905"; // Bestwig-Ramsbeck + default: + return ""; + } + } + + private static String fromNumber292(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2921"; // Soest + case "2": + return "2922"; // Werl + case "3": + return "2923"; // Lippetal-Herzfeld + case "4": + return "2924"; // Möhnesee + case "5": + return "2925"; // Warstein-Allagen + case "7": + return "2927"; // Neuengeseke + case "8": + return "2928"; // Soest-Ostönnen + default: + return ""; + } + } + + private static String fromNumber293(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2931"; // Arnsberg + case "2": + return "2932"; // Neheim-Hüsten + case "3": + return "2933"; // Sundern Sauerland + case "4": + return "2934"; // Sundern-Altenhellefeld + case "5": + return "2935"; // Sundern-Hachen + case "7": + return "2937"; // Arnsberg-Oeventrop + case "8": + return "2938"; // Ense + default: + return ""; + } + } + + private static String fromNumber294(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2941"; // Lippstadt + case "2": + return "2942"; // Geseke + case "3": + return "2943"; // Erwitte + case "4": + return "2944"; // Rietberg-Mastholte + case "5": + return "2945"; // Lippstadt-Benninghausen + case "7": + return "2947"; // Anröchte + case "8": + return "2948"; // Lippstadt-Rebbeke + default: + return ""; + } + } + + private static String fromNumber295(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2951"; // Büren + case "2": + return "2952"; // Rüthen + case "3": + return "2953"; // Wünnenberg + case "4": + return "2954"; // Rüthen-Oestereiden + case "5": + return "2955"; // Büren-Wewelsburg + case "7": + return "2957"; // Wünnenberg-Haaren + case "8": + return "2958"; // Büren-Harth + default: + return ""; + } + } + + private static String fromNumber296(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2961"; // Brilon + case "2": + return "2962"; // Olsberg + case "3": + return "2963"; // Brilon-Messinghausen + case "4": + return "2964"; // Brilon-Alme + default: + return ""; + } + } + + private static String fromNumber297(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2971"; // Schmallenberg-Dorlar + case "2": + return "2972"; // Schmallenberg + case "3": + return "2973"; // Eslohe Sauerland + case "4": + return "2974"; // Schmallenberg-Fredeburg + case "5": + return "2975"; // Schmallenberg-Oberkirchen + case "7": + return "2977"; // Schmallenberg-Bödefeld + default: + return ""; + } + } + + private static String fromNumber298(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2981"; // Winterberg Westf + case "2": + return "2982"; // Medebach + case "3": + return "2983"; // Winterberg-Siedlinghausen + case "4": + return "2984"; // Hallenberg + case "5": + return "2985"; // Winterberg-Niedersfeld + default: + return ""; + } + } + + private static String fromNumber299(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "2991"; // Marsberg-Bredelar + case "2": + return "2992"; // Marsberg + case "3": + return "2993"; // Marsberg-Canstein + case "4": + return "2994"; // Marsberg-Westheim + default: + return ""; + } + } + + private static String fromNumber3(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "30"; // Berlin + case "3": + return fromNumber33(number.substring(1)); + case "4": + return fromNumber34(number.substring(1)); + case "5": + return fromNumber35(number.substring(1)); + case "6": + return fromNumber36(number.substring(1)); + case "7": + return fromNumber37(number.substring(1)); + case "8": + return fromNumber38(number.substring(1)); + case "9": + return fromNumber39(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber33(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber330(number.substring(1)); + case "1": + return "331"; // Potsdam + case "2": + return fromNumber332(number.substring(1)); + case "3": + return fromNumber333(number.substring(1)); + case "4": + return fromNumber334(number.substring(1)); + case "5": + return "335"; // Frankfurt (Oder) + case "6": + return fromNumber336(number.substring(1)); + case "7": + return fromNumber337(number.substring(1)); + case "8": + return fromNumber338(number.substring(1)); + case "9": + return fromNumber339(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber330(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3301"; // Oranienburg + case "2": + return "3302"; // Hennigsdorf + case "3": + return "3303"; // Birkenwerder + case "4": + return "3304"; // Velten + case "5": + return fromNumber3305(number.substring(1)); + case "6": + return "3306"; // Gransee + case "7": + return "3307"; // Zehdenick + case "8": + return fromNumber3308(number.substring(1)); + case "9": + return fromNumber3309(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3305(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33051"; // Nassenheide + case "2": + return "33052"; // Leegebruch + case "3": + return "33053"; // Zehlendorf Kr Oberhavel + case "4": + return "33054"; // Liebenwalde + case "5": + return "33055"; // Kremmen + case "6": + return "33056"; // Mühlenbeck Kr Oberhavel + default: + return ""; + } + } + + private static String fromNumber3308(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33080"; // Marienthal Kr Oberhavel + case "2": + return "33082"; // Menz Kr Oberhavel + case "3": + return "33083"; // Schulzendorf Kr Oberhavel + case "4": + return "33084"; // Gutengermendorf + case "5": + return "33085"; // Seilershof + case "6": + return "33086"; // Grieben Kr Oberhavel + case "7": + return "33087"; // Bredereiche + case "8": + return "33088"; // Falkenthal + case "9": + return "33089"; // Himmelpfort + default: + return ""; + } + } + + private static String fromNumber3309(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "33093"; // Fürstenberg Havel + case "4": + return "33094"; // Löwenberg + default: + return ""; + } + } + + private static String fromNumber332(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3320(number.substring(1)); + case "1": + return "3321"; // Nauen Brandenb + case "2": + return "3322"; // Falkensee + case "3": + return fromNumber3323(number.substring(1)); + case "7": + return "3327"; // Werder Havel + case "8": + return "3328"; // Teltow + case "9": + return "3329"; // Stahnsdorf + default: + return ""; + } + } + + private static String fromNumber3320(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33200"; // Bergholz-Rehbrücke + case "1": + return "33201"; // Gross Glienicke + case "2": + return "33202"; // Töplitz + case "3": + return "33203"; // Kleinmachnow + case "4": + return "33204"; // Beelitz Mark + case "5": + return "33205"; // Michendorf + case "6": + return "33206"; // Fichtenwalde + case "7": + return "33207"; // Gross Kreutz + case "8": + return "33208"; // Fahrland + case "9": + return "33209"; // Caputh + default: + return ""; + } + } + + private static String fromNumber3323(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33230"; // Börnicke Kr Havelland + case "1": + return "33231"; // Pausin + case "2": + return "33232"; // Brieselang + case "3": + return "33233"; // Ketzin + case "4": + return "33234"; // Wustermark + case "5": + return "33235"; // Friesack + case "7": + return "33237"; // Paulinenaue + case "8": + return "33238"; // Senzke + case "9": + return "33239"; // Gross Behnitz + default: + return ""; + } + } + + private static String fromNumber333(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3331"; // Angermünde + case "2": + return "3332"; // Schwedt/Oder + case "3": + return fromNumber3333(number.substring(1)); + case "4": + return "3334"; // Eberswalde + case "5": + return "3335"; // Finowfurt + case "6": + return fromNumber3336(number.substring(1)); + case "7": + return "3337"; // Biesenthal Brandenb + case "8": + return "3338"; // Bernau Brandenb + case "9": + return fromNumber3339(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3333(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33331"; // Casekow + case "2": + return "33332"; // Gartz Oder + case "3": + return "33333"; // Tantow + case "4": + return "33334"; // Greiffenberg + case "5": + return "33335"; // Pinnow Kr Uckermark + case "6": + return "33336"; // Passow Kr Uckermark + case "7": + return "33337"; // Altkünkendorf + case "8": + return "33338"; // Stolpe/Oder + default: + return ""; + } + } + + private static String fromNumber3336(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33361"; // Joachimsthal + case "2": + return "33362"; // Liepe Kr Barnim + case "3": + return "33363"; // Altenhof Kr Barnim + case "4": + return "33364"; // Gross Ziethen Kr Barnim + case "5": + return "33365"; // Lüdersdorf Kr Barnim + case "6": + return "33366"; // Chorin + case "7": + return "33367"; // Friedrichswalde Brandenb + case "8": + return "33368"; // Hohensaaten + case "9": + return "33369"; // Oderberg + default: + return ""; + } + } + + private static String fromNumber3339(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "33393"; // Gross Schönebeck Kr Barnim + case "4": + return "33394"; // Blumberg Kr Barnim + case "5": + return "33395"; // Zerpenschleuse + case "6": + return "33396"; // Klosterfelde + case "7": + return "33397"; // Wandlitz + case "8": + return "33398"; // Werneuchen + default: + return ""; + } + } + + private static String fromNumber334(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3341"; // Strausberg + case "2": + return "3342"; // Neuenhagen b Berlin + case "3": + return fromNumber3343(number.substring(1)); + case "4": + return "3344"; // Bad Freienwalde + case "5": + return fromNumber3345(number.substring(1)); + case "6": + return "3346"; // Seelow + case "7": + return fromNumber3347(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3343(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33432"; // Müncheberg + case "3": + return "33433"; // Buckow Märk Schweiz + case "4": + return "33434"; // Herzfelde b Strausberg + case "5": + return "33435"; // Rehfelde + case "6": + return "33436"; // Prötzel + case "7": + return "33437"; // Reichenberg b Strausberg + case "8": + return "33438"; // Altlandsberg + case "9": + return "33439"; // Fredersdorf-Vogelsdorf + default: + return ""; + } + } + + private static String fromNumber3345(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33451"; // Heckelberg + case "2": + return "33452"; // Neulewin + case "4": + return "33454"; // Wölsickendorf/Wollenberg + case "6": + return "33456"; // Wriezen + case "7": + return "33457"; // Altreetz + case "8": + return "33458"; // Falkenberg Mark + default: + return ""; + } + } + + private static String fromNumber3347(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33470"; // Lietzen + case "2": + return "33472"; // Golzow b Seelow + case "3": + return "33473"; // Zechin + case "4": + return "33474"; // Neutrebbin + case "5": + return "33475"; // Letschin + case "6": + return "33476"; // Neuhardenberg + case "7": + return "33477"; // Trebnitz b Müncheberg + case "8": + return "33478"; // Gross Neuendorf + case "9": + return "33479"; // Küstrin-Kietz + default: + return ""; + } + } + + private static String fromNumber336(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3360(number.substring(1)); + case "1": + return "3361"; // Fürstenwalde Spree + case "2": + return "3362"; // Erkner + case "3": + return fromNumber3363(number.substring(1)); + case "4": + return "3364"; // Eisenhüttenstadt + case "5": + return fromNumber3365(number.substring(1)); + case "6": + return "3366"; // Beeskow + case "7": + return fromNumber3367(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3360(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33601"; // Podelzig + case "2": + return "33602"; // Alt Zeschdorf + case "3": + return "33603"; // Falkenhagen b Seelow + case "4": + return "33604"; // Lebus + case "5": + return "33605"; // Boossen + case "6": + return "33606"; // Müllrose + case "7": + return "33607"; // Briesen Mark + case "8": + return "33608"; // Jacobsdorf Mark + case "9": + return "33609"; // Brieskow-Finkenheerd + default: + return ""; + } + } + + private static String fromNumber3363(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33631"; // Bad Saarow-Pieskow + case "2": + return "33632"; // Hangelsberg + case "3": + return "33633"; // Spreenhagen + case "4": + return "33634"; // Berkenbrück Kr Oder-Spree + case "5": + return "33635"; // Arensdorf Kr Oder-Spree + case "6": + return "33636"; // Steinhöfel Kr Oder-Spree + case "7": + return "33637"; // Beerfelde + case "8": + return "33638"; // Rüdersdorf b Berlin + default: + return ""; + } + } + + private static String fromNumber3365(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33652"; // Neuzelle + case "3": + return "33653"; // Ziltendorf + case "4": + return "33654"; // Fünfeichen + case "5": + return "33655"; // Grunow Kr Oder-Spree + case "6": + return "33656"; // Bahro + case "7": + return "33657"; // Steinsdorf Brandenb + default: + return ""; + } + } + + private static String fromNumber3367(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33671"; // Lieberose + case "2": + return "33672"; // Pfaffendorfb Beeskow + case "3": + return "33673"; // Weichensdorf + case "4": + return "33674"; // Trebatsch + case "5": + return "33675"; // Tauche + case "6": + return "33676"; // Friedland b Beeskow + case "7": + return "33677"; // Glienicke b Beeskow + case "8": + return "33678"; // Storkow Mark + case "9": + return "33679"; // Wendisch Rietz + default: + return ""; + } + } + + private static String fromNumber337(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3370(number.substring(1)); + case "1": + return "3371"; // Luckenwalde + case "2": + return "3372"; // Jüterbog + case "3": + return fromNumber3373(number.substring(1)); + case "4": + return fromNumber3374(number.substring(1)); + case "5": + return "3375"; // Königs Wusterhausen + case "6": + return fromNumber3376(number.substring(1)); + case "7": + return "3377"; // Zossen Brandenb + case "8": + return "3378"; // Ludwigsfelde + case "9": + return "3379"; // Mahlow + default: + return ""; + } + } + + private static String fromNumber3370(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33701"; // Grossbeeren + case "2": + return "33702"; // Wünsdorf + case "3": + return "33703"; // Sperenberg + case "4": + return "33704"; // Baruth Mark + case "8": + return "33708"; // Rangsdorf + default: + return ""; + } + } + + private static String fromNumber3373(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33731"; // Trebbin + case "2": + return "33732"; // Hennickendorf b Luckenwalde + case "3": + return "33733"; // Stülpe + case "4": + return "33734"; // Felgentreu + default: + return ""; + } + } + + private static String fromNumber3374(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33741"; // Niedergörsdorf + case "2": + return "33742"; // Oehna Brandenb + case "3": + return "33743"; // Blönsdorf + case "4": + return "33744"; // Hohenseefeld + case "5": + return "33745"; // Petkus + case "6": + return "33746"; // Werbig b Jüterbog + case "7": + return "33747"; // Marzahna + case "8": + return "33748"; // Treuenbrietzen + default: + return ""; + } + } + + private static String fromNumber3376(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33760"; // Münchehofe Kr Dahme-Spreewald + case "2": + return "33762"; // Zeuthen + case "3": + return "33763"; // Bestensee + case "4": + return "33764"; // Mittenwalde Mark + case "5": + return "33765"; // Märkisch Buchholz + case "6": + return "33766"; // Teupitz + case "7": + return "33767"; // Friedersdorf b Berlin + case "8": + return "33768"; // Prieros + case "9": + return "33769"; // Töpchin + default: + return ""; + } + } + + private static String fromNumber338(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3381"; // Brandenburg an der Havel + case "2": + return "3382"; // Lehnin + case "3": + return fromNumber3383(number.substring(1)); + case "4": + return fromNumber3384(number.substring(1)); + case "5": + return "3385"; // Rathenow + case "6": + return "3386"; // Premnitz + case "7": + return fromNumber3387(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3383(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33830"; // Ziesar + case "1": + return "33831"; // Weseram + case "2": + return "33832"; // Rogäsen + case "3": + return "33833"; // Wollin b Brandenburg + case "4": + return "33834"; // Pritzerbe + case "5": + return "33835"; // Golzow b Brandenburg + case "6": + return "33836"; // Butzow b Brandenburg + case "7": + return "33837"; // Brielow + case "8": + return "33838"; // Päwesin + case "9": + return "33839"; // Wusterwitz + default: + return ""; + } + } + + private static String fromNumber3384(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33841"; // Belzig + case "3": + return "33843"; // Niemegk + case "4": + return "33844"; // Brück Brandenb + case "5": + return "33845"; // Borkheide + case "6": + return "33846"; // Dippmannsdorf + case "7": + return "33847"; // Görzke + case "8": + return "33848"; // Raben + case "9": + return "33849"; // Wiesenburg Mark + default: + return ""; + } + } + + private static String fromNumber3387(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33870"; // Zollchow b Rathenow + case "2": + return "33872"; // Hohennauen + case "3": + return "33873"; // Grosswudicke + case "4": + return "33874"; // Stechow Brandenb + case "5": + return "33875"; // Rhinow + case "6": + return "33876"; // Buschow + case "7": + return "33877"; // Nitzahn + case "8": + return "33878"; // Nennhausen + default: + return ""; + } + } + + private static String fromNumber339(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3391"; // Neuruppin + case "2": + return fromNumber3392(number.substring(1)); + case "3": + return fromNumber3393(number.substring(1)); + case "4": + return "3394"; // Wittstock Dosse + case "5": + return "3395"; // Pritzwalk + case "6": + return fromNumber3396(number.substring(1)); + case "7": + return fromNumber3397(number.substring(1)); + case "8": + return fromNumber3398(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3392(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33920"; // Walsleben b Neuruppin + case "1": + return "33921"; // Zechlinerhütte + case "2": + return "33922"; // Karwesee + case "3": + return "33923"; // Flecken Zechlin + case "4": + return "33924"; // Rägelin + case "5": + return "33925"; // Wustrau-Altfriesack + case "6": + return "33926"; // Herzberg Mark + case "7": + return "33927"; // Linum + case "8": + return "33928"; // Wildberg Brandenb + case "9": + return "33929"; // Gühlen-Glienicke + default: + return ""; + } + } + + private static String fromNumber3393(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33931"; // Rheinsberg Mark + case "2": + return "33932"; // Fehrbellin + case "3": + return "33933"; // Lindow Mark + default: + return ""; + } + } + + private static String fromNumber3396(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "33962"; // Heiligengrabe + case "3": + return "33963"; // Wulfersdorf b Wittstock + case "4": + return "33964"; // Fretzdorf + case "5": + return "33965"; // Herzsprung b Wittstock + case "6": + return "33966"; // Dranse + case "7": + return "33967"; // Freyenstein + case "8": + return "33968"; // Meyenburg Kr Prignitz + case "9": + return "33969"; // Stepenitz + default: + return ""; + } + } + + private static String fromNumber3397(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "33970"; // Neustadt Dosse + case "1": + return "33971"; // Kyritz Brandenb + case "2": + return "33972"; // Breddin + case "3": + return "33973"; // Zernitz b Neustadt Dosse + case "4": + return "33974"; // Dessow + case "5": + return "33975"; // Dannenwalde Kr Prignitz + case "6": + return "33976"; // Wutike + case "7": + return "33977"; // Gumtow + case "8": + return "33978"; // Segeletz + case "9": + return "33979"; // Wusterhausen Dosse + default: + return ""; + } + } + + private static String fromNumber3398(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "33981"; // Putlitz + case "2": + return "33982"; // Hoppenrade Kr Prignitz + case "3": + return "33983"; // Gross Pankow Kr Prignitz + case "4": + return "33984"; // Blumenthal b Pritzwalk + case "6": + return "33986"; // Falkenhagen Kr Prignitz + case "9": + return "33989"; // Sadenbeck + default: + return ""; + } + } + + private static String fromNumber34(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "340"; // Dessau Anh + case "1": + return "341"; // Leipzig + case "2": + return fromNumber342(number.substring(1)); + case "3": + return fromNumber343(number.substring(1)); + case "4": + return fromNumber344(number.substring(1)); + case "5": + return "345"; // Halle Saale + case "6": + return fromNumber346(number.substring(1)); + case "7": + return fromNumber347(number.substring(1)); + case "9": + return fromNumber349(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber342(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3420(number.substring(1)); + case "1": + return "3421"; // Torgau + case "2": + return fromNumber3422(number.substring(1)); + case "3": + return "3423"; // Eilenburg + case "4": + return fromNumber3424(number.substring(1)); + case "5": + return "3425"; // Wurzen + case "6": + return fromNumber3426(number.substring(1)); + case "9": + return fromNumber3429(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3420(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34202"; // Delitzsch + case "3": + return "34203"; // Zwenkau + case "4": + return "34204"; // Schkeuditz + case "5": + return "34205"; // Markranstädt + case "6": + return "34206"; // Rötha + case "7": + return "34207"; // Zwochau + case "8": + return "34208"; // Löbnitz B Delitzsch + default: + return ""; + } + } + + private static String fromNumber3422(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34221"; // Schildau Gneisenaustadt + case "2": + return "34222"; // Arzberg b Torgau + case "3": + return "34223"; // Dommitzsch + case "4": + return "34224"; // Belgern Sachs + default: + return ""; + } + } + + private static String fromNumber3424(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34241"; // Jesewitz + case "2": + return "34242"; // Hohenpriessnitz + case "3": + return "34243"; // Bad Düben + case "4": + return "34244"; // Mockrehna + default: + return ""; + } + } + + private static String fromNumber3426(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34261"; // Kühren b Wurzen + case "2": + return "34262"; // Falkenhain b Wurzen + case "3": + return "34263"; // Hohburg + default: + return ""; + } + } + + private static String fromNumber3429(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34291"; // Borsdorf + case "2": + return "34292"; // Brandis b Wurzen + case "3": + return "34293"; // Naunhof b Grimma + case "4": + return "34294"; // Rackwitz + case "5": + return "34295"; // Krensitz + case "6": + return "34296"; // Groitzsch b Pegau + case "7": + return "34297"; // Liebertwolkwitz + case "8": + return "34298"; // Taucha b Leipzig + case "9": + return "34299"; // Gaschwitz + default: + return ""; + } + } + + private static String fromNumber343(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3431"; // Döbeln + case "2": + return fromNumber3432(number.substring(1)); + case "3": + return "3433"; // Borna Stadt + case "4": + return fromNumber3434(number.substring(1)); + case "5": + return "3435"; // Oschatz + case "6": + return fromNumber3436(number.substring(1)); + case "7": + return "3437"; // Grimma + case "8": + return fromNumber3438(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3432(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34321"; // Leisnig + case "2": + return "34322"; // Rosswein + case "4": + return "34324"; // Ostrau Sachs + case "5": + return "34325"; // Mochau-Lüttewitz + case "7": + return "34327"; // Waldheim Sachs + case "8": + return "34328"; // Hartha b Döbeln + default: + return ""; + } + } + + private static String fromNumber3434(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34341"; // Geithain + case "2": + return "34342"; // Neukieritzsch + case "3": + return "34343"; // Regis-Breitingen + case "4": + return "34344"; // Kohren-Sahlis + case "5": + return "34345"; // Bad Lausick + case "6": + return "34346"; // Narsdorf + case "7": + return "34347"; // Oelzschau b Borna + case "8": + return "34348"; // Frohburg + default: + return ""; + } + } + + private static String fromNumber3436(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34361"; // Dahlen Sachs + case "2": + return "34362"; // Mügeln b Oschatz + case "3": + return "34363"; // Cavertitz + case "4": + return "34364"; // Wermsdorf + default: + return ""; + } + } + + private static String fromNumber3438(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34381"; // Colditz + case "2": + return "34382"; // Nerchau + case "3": + return "34383"; // Trebsen Mulde + case "4": + return "34384"; // Grossbothen + case "5": + return "34385"; // Mutzschen + case "6": + return "34386"; // Dürrweitzschen B Grimma + default: + return ""; + } + } + + private static String fromNumber344(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3441"; // Zeitz + case "2": + return fromNumber3442(number.substring(1)); + case "3": + return "3443"; // Weissenfels Sachs-Anh + case "4": + return fromNumber3444(number.substring(1)); + case "5": + return "3445"; // Naumburg Saale + case "6": + return fromNumber3446(number.substring(1)); + case "7": + return "3447"; // Altenburg Thür + case "8": + return "3448"; // Meuselwitz Thür + case "9": + return fromNumber3449(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3442(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34422"; // Osterfeld + case "3": + return "34423"; // Heuckewalde + case "4": + return "34424"; // Reuden b Zeitz + case "5": + return "34425"; // Droyssig + case "6": + return "34426"; // Kayna + default: + return ""; + } + } + + private static String fromNumber3444(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34441"; // Hohenmölsen + case "3": + return "34443"; // Teuchern + case "4": + return "34444"; // Lützen + case "5": + return "34445"; // Stößen + case "6": + return "34446"; // Grosskorbetha + default: + return ""; + } + } + + private static String fromNumber3446(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34461"; // Nebra Unstrut + case "2": + return "34462"; // Laucha Unstrut + case "3": + return "34463"; // Bad Kösen + case "4": + return "34464"; // Freyburg Unstrut + case "5": + return "34465"; // Bad Bibra + case "6": + return "34466"; // Janisroda + case "7": + return "34467"; // Eckartsberga + default: + return ""; + } + } + + private static String fromNumber3449(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34491"; // Schmölln Thür + case "2": + return "34492"; // Lucka + case "3": + return "34493"; // Gößnitz Thür + case "4": + return "34494"; // Ehrenhain + case "5": + return "34495"; // Dobitschen + case "6": + return "34496"; // Nöbdenitz + case "7": + return "34497"; // Langenleuba-Niederhain + case "8": + return "34498"; // Rositz + default: + return ""; + } + } + + private static String fromNumber346(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3460(number.substring(1)); + case "1": + return "3461"; // Merseburg Saale + case "2": + return "3462"; // Bad Dürrenberg + case "3": + return fromNumber3463(number.substring(1)); + case "4": + return "3464"; // Sangerhausen + case "5": + return fromNumber3465(number.substring(1)); + case "6": + return "3466"; // Artern Unstrut + case "7": + return fromNumber3467(number.substring(1)); + case "9": + return fromNumber3469(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3460(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "34600"; // Ostrau Saalkreis + case "1": + return "34601"; // Teutschenthal + case "2": + return "34602"; // Landsberg Sachs-Anh + case "3": + return "34603"; // Nauendorf Sachs-Anh + case "4": + return "34604"; // Niemberg + case "5": + return "34605"; // Gröbers + case "6": + return "34606"; // Teicha Sachs-Anh + case "7": + return "34607"; // Wettin + case "9": + return "34609"; // Salzmünde + default: + return ""; + } + } + + private static String fromNumber3463(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "34632"; // Mücheln Geiseltal + case "3": + return "34633"; // Braunsbedra + case "5": + return "34635"; // Bad Lauchstädt + case "6": + return "34636"; // Schafstädt + case "7": + return "34637"; // Frankleben + case "8": + return "34638"; // Zöschen + case "9": + return "34639"; // Wallendorf Luppe + default: + return ""; + } + } + + private static String fromNumber3465(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34651"; // Rossla + case "2": + return "34652"; // Allstedt + case "3": + return "34653"; // Rottleberode + case "4": + return "34654"; // Stolberg Harz + case "6": + return "34656"; // Wallhausen Sachs-Anh + case "8": + return "34658"; // Hayn Harz + case "9": + return "34659"; // Blankenheim b Sangerhausen + default: + return ""; + } + } + + private static String fromNumber3467(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34671"; // Bad Frankenhausen Kyffhäuser + case "2": + return "34672"; // Rossleben + case "3": + return "34673"; // Heldrungen + default: + return ""; + } + } + + private static String fromNumber3469(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34691"; // Könnern + case "2": + return "34692"; // Alsleben Saale + default: + return ""; + } + } + + private static String fromNumber347(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3471"; // Bernburg Saale + case "2": + return fromNumber3472(number.substring(1)); + case "3": + return "3473"; // Aschersleben Sachs-Anh + case "4": + return fromNumber3474(number.substring(1)); + case "5": + return "3475"; // Lutherstadt Eisleben + case "6": + return "3476"; // Hettstedt Sachs-Anh + case "7": + return fromNumber3477(number.substring(1)); + case "8": + return fromNumber3478(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3472(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34721"; // Nienburg Saale + case "2": + return "34722"; // Preusslitz + default: + return ""; + } + } + + private static String fromNumber3474(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34741"; // Frose + case "2": + return "34742"; // Sylda + case "3": + return "34743"; // Ermsleben + case "5": + return "34745"; // Winningen Sachs-Anh + case "6": + return "34746"; // Giersleben + default: + return ""; + } + } + + private static String fromNumber3477(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34771"; // Querfurt + case "2": + return "34772"; // Helbra + case "3": + return "34773"; // Schwittersdorf + case "4": + return "34774"; // Röblingen am See + case "5": + return "34775"; // Wippra + case "6": + return "34776"; // Rothenschirmbach + case "9": + return "34779"; // Abberode + default: + return ""; + } + } + + private static String fromNumber3478(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34781"; // Greifenhagen + case "2": + return "34782"; // Mansfeld Südharz + case "3": + return "34783"; // Gerbstedt + case "5": + return "34785"; // Sandersleben + default: + return ""; + } + } + + private static String fromNumber349(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3490(number.substring(1)); + case "1": + return "3491"; // Lutherstadt Wittenberg + case "2": + return fromNumber3492(number.substring(1)); + case "3": + return "3493"; // Bitterfeld + case "4": + return "3494"; // Wolfen + case "5": + return fromNumber3495(number.substring(1)); + case "6": + return "3496"; // Köthen Anhalt + case "7": + return fromNumber3497(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3490(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "34901"; // Roßlau Elbe + case "3": + return "34903"; // Coswig Anhalt + case "4": + return "34904"; // Oranienbaum + case "5": + return "34905"; // Wörlitz + case "6": + return "34906"; // Raguhn + case "7": + return "34907"; // Jeber-Bergfrieden + case "9": + return "34909"; // Aken Elbe + default: + return ""; + } + } + + private static String fromNumber3492(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "34920"; // Kropstädt + case "1": + return "34921"; // Kemberg + case "2": + return "34922"; // Mühlanger + case "3": + return "34923"; // Cobbelsdorf + case "4": + return "34924"; // Zahna + case "5": + return "34925"; // Bad Schmiedeberg + case "6": + return "34926"; // Pretzsch Elbe + case "7": + return "34927"; // Globig-Bleddin + case "8": + return "34928"; // Seegrehna + case "9": + return "34929"; // Straach + default: + return ""; + } + } + + private static String fromNumber3495(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "34953"; // Gräfenhainichen + case "4": + return "34954"; // Roitzsch b Bitterfeld + case "5": + return "34955"; // Gossa + case "6": + return "34956"; // Zörbig + default: + return ""; + } + } + + private static String fromNumber3497(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "34973"; // Osternienburg + case "5": + return "34975"; // Görzig Kr Köthen + case "6": + return "34976"; // Gröbzig + case "7": + return "34977"; // Quellendorf + case "8": + return "34978"; // Radegast Kr Köthen + case "9": + return "34979"; // Wulfen Sachs-Anh + default: + return ""; + } + } + + private static String fromNumber35(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber350(number.substring(1)); + case "1": + return "351"; // Dresden + case "2": + return fromNumber352(number.substring(1)); + case "3": + return fromNumber353(number.substring(1)); + case "4": + return fromNumber354(number.substring(1)); + case "5": + return "355"; // Cottbus + case "6": + return fromNumber356(number.substring(1)); + case "7": + return fromNumber357(number.substring(1)); + case "8": + return fromNumber358(number.substring(1)); + case "9": + return fromNumber359(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber350(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3501"; // Pirna + case "2": + return fromNumber3502(number.substring(1)); + case "3": + return fromNumber3503(number.substring(1)); + case "4": + return "3504"; // Dippoldiswalde + case "5": + return fromNumber3505(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35020"; // Struppen + case "1": + return "35021"; // Königstein Sächs Schweiz + case "2": + return "35022"; // Bad Schandau + case "3": + return "35023"; // Bad Gottleuba + case "4": + return "35024"; // Stadt Wehlen + case "5": + return "35025"; // Liebstadt + case "6": + return "35026"; // Dürrröhrsdorf-Dittersbach + case "7": + return "35027"; // Weesenstein + case "8": + return "35028"; // Krippen + default: + return ""; + } + } + + private static String fromNumber3503(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35032"; // Langenhennersdorf + case "3": + return "35033"; // Rosenthal Sächs Schweiz + default: + return ""; + } + } + + private static String fromNumber3505(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35052"; // Kipsdorf Kurort + case "3": + return "35053"; // Glashütte Sachs + case "4": + return "35054"; // Lauenstein Sachs + case "5": + return "35055"; // Höckendorf b Dippoldiswalde + case "6": + return "35056"; // Altenberg Sachs + case "7": + return "35057"; // Hermsdorf Erzgeb + case "8": + return "35058"; // Pretzschendorf + default: + return ""; + } + } + + private static String fromNumber352(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3520(number.substring(1)); + case "1": + return "3521"; // Meissen + case "2": + return "3522"; // Grossenhain Sachs + case "3": + return "3523"; // Coswig b Dresden + case "4": + return fromNumber3524(number.substring(1)); + case "5": + return "3525"; // Riesa + case "6": + return fromNumber3526(number.substring(1)); + case "8": + return "3528"; // Radeberg + case "9": + return "3529"; // Heidenau Sachs + default: + return ""; + } + } + + private static String fromNumber3520(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35200"; // Arnsdorf b Dresden + case "1": + return "35201"; // Langebrück + case "2": + return "35202"; // Klingenberg Sachs + case "3": + return "35203"; // Tharandt + case "4": + return "35204"; // Wilsdruff + case "5": + return "35205"; // Ottendorf-Okrilla + case "6": + return "35206"; // Kreischa b Dresden + case "7": + return "35207"; // Moritzburg + case "8": + return "35208"; // Radeburg + case "9": + return "35209"; // Mohorn + default: + return ""; + } + } + + private static String fromNumber3524(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35240"; // Tauscha b Großenhain + case "1": + return "35241"; // Lommatzsch + case "2": + return "35242"; // Nossen + case "3": + return "35243"; // Weinböhla + case "4": + return "35244"; // Krögis + case "5": + return "35245"; // Burkhardswalde-Munzig + case "6": + return "35246"; // Ziegenhain Sachs + case "7": + return "35247"; // Zehren Sachs + case "8": + return "35248"; // Schönfeld b Großenhain + case "9": + return "35249"; // Basslitz + default: + return ""; + } + } + + private static String fromNumber3526(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35263"; // Gröditz b Riesa + case "4": + return "35264"; // Strehla + case "5": + return "35265"; // Glaubitz + case "6": + return "35266"; // Heyda b Riesa + case "7": + return "35267"; // Diesbar-Seusslitz + case "8": + return "35268"; // Stauchitz + default: + return ""; + } + } + + private static String fromNumber353(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3531"; // Finsterwalde + case "2": + return fromNumber3532(number.substring(1)); + case "3": + return "3533"; // Elsterwerda + case "4": + return fromNumber3534(number.substring(1)); + case "5": + return "3535"; // Herzberg Elster + case "6": + return fromNumber3536(number.substring(1)); + case "7": + return "3537"; // Jessen Elster + case "8": + return fromNumber3538(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3532(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35322"; // Doberlug-Kirchhain + case "3": + return "35323"; // Sonnewalde + case "4": + return "35324"; // Crinitz + case "5": + return "35325"; // Rückersdorf b Finsterwalde + case "6": + return "35326"; // Schönborn Kr Elbe-Elster + case "7": + return "35327"; // Priessen + case "9": + return "35329"; // Dollenchen + default: + return ""; + } + } + + private static String fromNumber3534(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35341"; // Bad Liebenwerda + case "2": + return "35342"; // Mühlberg Elbe + case "3": + return "35343"; // Hirschfeld b Elsterwerda + default: + return ""; + } + } + + private static String fromNumber3536(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35361"; // Schlieben + case "2": + return "35362"; // Schönewalde b Herzberg + case "3": + return "35363"; // Fermerswalde + case "4": + return "35364"; // Lebusa + case "5": + return "35365"; // Falkenberg Elster + default: + return ""; + } + } + + private static String fromNumber3538(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35383"; // Elster Elbe + case "4": + return "35384"; // Steinsdorf b Jessen + case "5": + return "35385"; // Annaburg + case "6": + return "35386"; // Prettin + case "7": + return "35387"; // Seyda + case "8": + return "35388"; // Klöden + case "9": + return "35389"; // Holzdorf Elster + default: + return ""; + } + } + + private static String fromNumber354(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3541"; // Calau + case "2": + return "3542"; // Lübbenau Spreewald + case "3": + return fromNumber3543(number.substring(1)); + case "4": + return "3544"; // Luckau Brandenb + case "5": + return fromNumber3545(number.substring(1)); + case "6": + return "3546"; // Lübben Spreewald + case "7": + return fromNumber3547(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3543(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "35433"; // Vetschau + case "4": + return "35434"; // Altdöbern + case "5": + return "35435"; // Gollmitz b Calau + case "6": + return "35436"; // Laasow b Calau + case "9": + return "35439"; // Zinnitz + default: + return ""; + } + } + + private static String fromNumber3545(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35451"; // Dahme Brandenb + case "2": + return "35452"; // Golssen + case "3": + return "35453"; // Drahnsdorf + case "4": + return "35454"; // Uckro + case "5": + return "35455"; // Walddrehna + case "6": + return "35456"; // Terpt + default: + return ""; + } + } + + private static String fromNumber3547(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35471"; // Birkenhainchen + case "2": + return "35472"; // Schlepzig + case "3": + return "35473"; // Neu Lübbenau + case "4": + return "35474"; // Schönwalde b Lübben + case "5": + return "35475"; // Straupitz + case "6": + return "35476"; // Wittmannsdorf-Bückchen + case "7": + return "35477"; // Rietzneuendorf-Friedrichshof + case "8": + return "35478"; // Goyatz + default: + return ""; + } + } + + private static String fromNumber356(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3560(number.substring(1)); + case "1": + return "3561"; // Guben + case "2": + return "3562"; // Forst Lausitz + case "3": + return "3563"; // Spremberg + case "4": + return "3564"; // Schwarze Pumpe + case "9": + return fromNumber3569(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3560(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35600"; // Döbern NL + case "1": + return "35601"; // Peitz + case "2": + return "35602"; // Drebkau + case "3": + return "35603"; // Burg Spreewald + case "4": + return "35604"; // Krieschow + case "5": + return "35605"; // Komptendorf + case "6": + return "35606"; // Briesen b Cottbus + case "7": + return "35607"; // Jänschwalde + case "8": + return "35608"; // Gross Ossnig + case "9": + return "35609"; // Drachhausen + default: + return ""; + } + } + + private static String fromNumber3569(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35691"; // Bärenklau NL + case "2": + return "35692"; // Kerkwitz + case "3": + return "35693"; // Lauschütz + case "4": + return "35694"; // Gosda b Klinge + case "5": + return "35695"; // Simmersdorf + case "6": + return "35696"; // Briesnig + case "7": + return "35697"; // Bagenz + case "8": + return "35698"; // Hornow + default: + return ""; + } + } + + private static String fromNumber357(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3571"; // Hoyerswerda + case "2": + return fromNumber3572(number.substring(1)); + case "3": + return "3573"; // Senftenberg + case "4": + return "3574"; // Lauchhammer + case "5": + return fromNumber3575(number.substring(1)); + case "6": + return "3576"; // Weisswasser + case "7": + return fromNumber3577(number.substring(1)); + case "8": + return "3578"; // Kamenz + case "9": + return fromNumber3579(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3572(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35722"; // Lauta b Hoyerswerda + case "3": + return "35723"; // Bernsdorf OL + case "4": + return "35724"; // Lohsa + case "5": + return "35725"; // Wittichenau + case "6": + return "35726"; // Groß Särchen + case "7": + return "35727"; // Burghammer + case "8": + return "35728"; // Uhyst Spree + default: + return ""; + } + } + + private static String fromNumber3575(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35751"; // Welzow + case "2": + return "35752"; // Ruhland + case "3": + return "35753"; // Großräschen + case "4": + return "35754"; // Klettwitz + case "5": + return "35755"; // Ortrand + case "6": + return "35756"; // Hosena + default: + return ""; + } + } + + private static String fromNumber3577(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35771"; // Bad Muskau + case "2": + return "35772"; // Rietschen + case "3": + return "35773"; // Schleife + case "4": + return "35774"; // Boxberg Sachs + case "5": + return "35775"; // Pechern + default: + return ""; + } + } + + private static String fromNumber3579(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35792"; // Ossling + case "3": + return "35793"; // Elstra + case "5": + return "35795"; // Königsbrück + case "6": + return "35796"; // Panschwitz-Kuckau + case "7": + return "35797"; // Schwepnitz + default: + return ""; + } + } + + private static String fromNumber358(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3581"; // Görlitz + case "2": + return fromNumber3582(number.substring(1)); + case "3": + return "3583"; // Zittau + case "4": + return fromNumber3584(number.substring(1)); + case "5": + return "3585"; // Löbau + case "6": + return "3586"; // Neugersdorf Sachs + case "7": + return fromNumber3587(number.substring(1)); + case "8": + return "3588"; // Niesky + case "9": + return fromNumber3589(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3582(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35820"; // Zodel + case "2": + return "35822"; // Hagenwerder + case "3": + return "35823"; // Ostritz + case "5": + return "35825"; // Kodersdorf + case "6": + return "35826"; // Königshain b Görlitz + case "7": + return "35827"; // Nieder-Seifersdorf + case "8": + return "35828"; // Reichenbach OL + case "9": + return "35829"; // Gersdorf b Görlitz + default: + return ""; + } + } + + private static String fromNumber3584(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35841"; // Großschönau Sachs + case "2": + return "35842"; // Oderwitz + case "3": + return "35843"; // Hirschfelde b Zittau + case "4": + return "35844"; // Oybin Kurort + default: + return ""; + } + } + + private static String fromNumber3587(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "35872"; // Neusalza-Spremberg + case "3": + return "35873"; // Herrnhut + case "4": + return "35874"; // Bernstadt a d Eigen + case "5": + return "35875"; // Obercunnersdorf b Löbau + case "6": + return "35876"; // Weissenberg Sachs + case "7": + return "35877"; // Cunewalde + default: + return ""; + } + } + + private static String fromNumber3589(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35891"; // Rothenburg OL + case "2": + return "35892"; // Horka OL + case "3": + return "35893"; // Mücka + case "4": + return "35894"; // Hähnichen + case "5": + return "35895"; // Klitten + default: + return ""; + } + } + + private static String fromNumber359(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3591"; // Bautzen + case "2": + return "3592"; // Kirschau + case "3": + return fromNumber3593(number.substring(1)); + case "4": + return "3594"; // Bischofswerda + case "5": + return fromNumber3595(number.substring(1)); + case "6": + return "3596"; // Neustadt i Sa + case "7": + return fromNumber3597(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3593(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "35930"; // Seitschen + case "1": + return "35931"; // Königswartha + case "2": + return "35932"; // Guttau + case "3": + return "35933"; // Neschwitz + case "4": + return "35934"; // Grossdubrau + case "5": + return "35935"; // Kleinwelka + case "6": + return "35936"; // Sohland Spree + case "7": + return "35937"; // Prischwitz + case "8": + return "35938"; // Großpostwitz OL + case "9": + return "35939"; // Hochkirch + default: + return ""; + } + } + + private static String fromNumber3595(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35951"; // Neukirch Lausitz + case "2": + return "35952"; // Großröhrsdorf OL + case "3": + return "35953"; // Burkau + case "4": + return "35954"; // Grossharthau + case "5": + return "35955"; // Pulsnitz + default: + return ""; + } + } + + private static String fromNumber3597(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "35971"; // Sebnitz + case "3": + return "35973"; // Stolpen + case "4": + return "35974"; // Hinterhermsdorf + case "5": + return "35975"; // Hohnstein + default: + return ""; + } + } + + private static String fromNumber36(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber360(number.substring(1)); + case "1": + return "361"; // Erfurt + case "2": + return fromNumber362(number.substring(1)); + case "3": + return fromNumber363(number.substring(1)); + case "4": + return fromNumber364(number.substring(1)); + case "5": + return "365"; // Gera + case "6": + return fromNumber366(number.substring(1)); + case "7": + return fromNumber367(number.substring(1)); + case "8": + return fromNumber368(number.substring(1)); + case "9": + return fromNumber369(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber360(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3601"; // Mühlhausen Thür + case "2": + return fromNumber3602(number.substring(1)); + case "3": + return "3603"; // Bad Langensalza + case "4": + return fromNumber3604(number.substring(1)); + case "5": + return "3605"; // Leinefelde + case "6": + return "3606"; // Heiligenstadt Heilbad + case "7": + return fromNumber3607(number.substring(1)); + case "8": + return fromNumber3608(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3602(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36020"; // Ebeleben + case "1": + return "36021"; // Schlotheim + case "2": + return "36022"; // Grossengottern + case "3": + return "36023"; // Horsmar + case "4": + return "36024"; // Diedorf b Mühlhausen Thür + case "5": + return "36025"; // Körner + case "6": + return "36026"; // Struth b Mühlhausen Thür + case "7": + return "36027"; // Lengenfeld Unterm Stein + case "8": + return "36028"; // Kammerforst Thür + case "9": + return "36029"; // Menteroda + default: + return ""; + } + } + + private static String fromNumber3604(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36041"; // Bad Tennstedt + case "2": + return "36042"; // Tonna + case "3": + return "36043"; // Kirchheilingen + default: + return ""; + } + } + + private static String fromNumber3607(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36071"; // Teistungen + case "2": + return "36072"; // Weißenborn-Lüderode + case "4": + return "36074"; // Worbis + case "5": + return "36075"; // Dingelstädt Eichsfeld + case "6": + return "36076"; // Niederorschel + case "7": + return "36077"; // Grossbodungen + default: + return ""; + } + } + + private static String fromNumber3608(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36081"; // Arenshausen + case "2": + return "36082"; // Ershausen + case "3": + return "36083"; // Uder + case "4": + return "36084"; // Heuthen + case "5": + return "36085"; // Reinholterode + case "7": + return "36087"; // Wüstheuterode + default: + return ""; + } + } + + private static String fromNumber362(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3620(number.substring(1)); + case "1": + return "3621"; // Gotha Thür + case "2": + return "3622"; // Waltershausen Thür + case "3": + return "3623"; // Friedrichroda + case "4": + return "3624"; // Ohrdruf + case "5": + return fromNumber3625(number.substring(1)); + case "8": + return "3628"; // Arnstadt + case "9": + return "3629"; // Stadtilm + default: + return ""; + } + } + + private static String fromNumber3620(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36200"; // Elxleben b Arnstadt + case "1": + return "36201"; // Walschleben + case "2": + return "36202"; // Neudietendorf + case "3": + return "36203"; // Vieselbach + case "4": + return "36204"; // Stotternheim + case "5": + return "36205"; // Gräfenroda + case "6": + return "36206"; // Grossfahner + case "7": + return "36207"; // Plaue Thür + case "8": + return "36208"; // Ermstedt + case "9": + return "36209"; // Klettbach + default: + return ""; + } + } + + private static String fromNumber3625(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "36252"; // Tambach-Dietharz Thür Wald + case "3": + return "36253"; // Georgenthal Thür Wald + case "4": + return "36254"; // Friedrichswerth + case "5": + return "36255"; // Goldbach b Gotha + case "6": + return "36256"; // Wechmar + case "7": + return "36257"; // Luisenthal Thür + case "8": + return "36258"; // Friemar + case "9": + return "36259"; // Tabarz Thür Wald + default: + return ""; + } + } + + private static String fromNumber363(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3631"; // Nordhausen Thür + case "2": + return "3632"; // Sondershausen + case "3": + return fromNumber3633(number.substring(1)); + case "4": + return "3634"; // Sömmerda + case "5": + return "3635"; // Kölleda + case "6": + return "3636"; // Greussen + case "7": + return fromNumber3637(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3633(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36330"; // Grossberndten + case "1": + return "36331"; // Ilfeld + case "2": + return "36332"; // Ellrich + case "3": + return "36333"; // Heringen Helme + case "4": + return "36334"; // Wolkramshausen + case "5": + return "36335"; // Grosswechsungen + case "6": + return "36336"; // Klettenberg + case "7": + return "36337"; // Schiedungen + case "8": + return "36338"; // Bleicherode + default: + return ""; + } + } + + private static String fromNumber3637(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36370"; // Grossenehrich + case "1": + return "36371"; // Schlossvippach + case "2": + return "36372"; // Kleinneuhausen + case "3": + return "36373"; // Buttstädt + case "4": + return "36374"; // Weissensee + case "5": + return "36375"; // Kindelbrück + case "6": + return "36376"; // Straussfurt + case "7": + return "36377"; // Rastenberg + case "8": + return "36378"; // Ostramondra + case "9": + return "36379"; // Holzengel + default: + return ""; + } + } + + private static String fromNumber364(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3641"; // Jena + case "2": + return fromNumber3642(number.substring(1)); + case "3": + return "3643"; // Weimar Thür + case "4": + return "3644"; // Apolda + case "5": + return fromNumber3645(number.substring(1)); + case "6": + return fromNumber3646(number.substring(1)); + case "7": + return "3647"; // Pößneck + case "8": + return fromNumber3648(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3642(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36421"; // Camburg + case "2": + return "36422"; // Reinstädt Thür + case "3": + return "36423"; // Orlamünde + case "4": + return "36424"; // Kahla Thür + case "5": + return "36425"; // Isserstedt + case "6": + return "36426"; // Ottendorf b Stadtroda + case "7": + return "36427"; // Dornburg Saale + case "8": + return "36428"; // Stadtroda + default: + return ""; + } + } + + private static String fromNumber3645(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36450"; // Kranichfeld + case "1": + return "36451"; // Buttelstedt + case "2": + return "36452"; // Berlstedt + case "3": + return "36453"; // Mellingen + case "4": + return "36454"; // Magdala + case "8": + return "36458"; // Bad Berka + case "9": + return "36459"; // Blankenhain Thür + default: + return ""; + } + } + + private static String fromNumber3646(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36461"; // Bad Sulza + case "2": + return "36462"; // Ossmannstedt + case "3": + return "36463"; // Gebstedt + case "4": + return "36464"; // Wormstedt + case "5": + return "36465"; // Oberndorf b Apolda + default: + return ""; + } + } + + private static String fromNumber3648(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36481"; // Neustadt an der Orla + case "2": + return "36482"; // Triptis + case "3": + return "36483"; // Ziegenrück + case "4": + return "36484"; // Knau b Pößneck + default: + return ""; + } + } + + private static String fromNumber366(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3660(number.substring(1)); + case "1": + return "3661"; // Greiz + case "2": + return fromNumber3662(number.substring(1)); + case "3": + return "3663"; // Schleiz + case "4": + return fromNumber3664(number.substring(1)); + case "5": + return fromNumber3665(number.substring(1)); + case "9": + return fromNumber3669(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3660(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36601"; // Hermsdorf Thür + case "2": + return "36602"; // Ronneburg Thür + case "3": + return "36603"; // Weida + case "4": + return "36604"; // Münchenbernsdorf + case "5": + return "36605"; // Bad Köstritz + case "6": + return "36606"; // Kraftsdorf + case "7": + return "36607"; // Niederpöllnitz + case "8": + return "36608"; // Seelingstädt b Gera + default: + return ""; + } + } + + private static String fromNumber3662(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36621"; // Elsterberg b Plauen + case "2": + return "36622"; // Triebes + case "3": + return "36623"; // Berga Elster + case "4": + return "36624"; // Teichwolframsdorf + case "5": + return "36625"; // Langenwetzendorf + case "6": + return "36626"; // Auma + case "8": + return "36628"; // Zeulenroda + default: + return ""; + } + } + + private static String fromNumber3664(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36640"; // Remptendorf + case "2": + return "36642"; // Harra + case "3": + return "36643"; // Thimmendorf + case "4": + return "36644"; // Hirschberg Saale + case "5": + return "36645"; // Mühltroff + case "6": + return "36646"; // Tanna b Schleiz + case "7": + return "36647"; // Saalburg Thür + case "8": + return "36648"; // Dittersdorf b Schleiz + case "9": + return "36649"; // Gefell b Schleiz + default: + return ""; + } + } + + private static String fromNumber3665(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36651"; // Lobenstein + case "2": + return "36652"; // Wurzbach + case "3": + return "36653"; // Lehesten Thür Wald + default: + return ""; + } + } + + private static String fromNumber3669(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36691"; // Eisenberg Thür + case "2": + return "36692"; // Bürgel + case "3": + return "36693"; // Crossen an der Elster + case "4": + return "36694"; // Schkölen Thür + case "5": + return "36695"; // Söllmnitz + default: + return ""; + } + } + + private static String fromNumber367(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3670(number.substring(1)); + case "1": + return "3671"; // Saalfeld Saale + case "2": + return "3672"; // Rudolstadt + case "3": + return fromNumber3673(number.substring(1)); + case "4": + return fromNumber3674(number.substring(1)); + case "5": + return "3675"; // Sonneberg Thür + case "6": + return fromNumber3676(number.substring(1)); + case "7": + return "3677"; // Ilmenau Thür + case "8": + return fromNumber3678(number.substring(1)); + case "9": + return "3679"; // Neuhaus a Rennweg + default: + return ""; + } + } + + private static String fromNumber3670(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36701"; // Lichte + case "2": + return "36702"; // Lauscha + case "3": + return "36703"; // Gräfenthal + case "4": + return "36704"; // Steinheid + case "5": + return "36705"; // Oberweißbach Thür Wald + default: + return ""; + } + } + + private static String fromNumber3673(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36730"; // Sitzendorf + case "1": + return "36731"; // Unterloquitz + case "2": + return "36732"; // Könitz + case "3": + return "36733"; // Kaulsdorf + case "4": + return "36734"; // Leutenberg + case "5": + return "36735"; // Probstzella + case "6": + return "36736"; // Arnsgereuth + case "7": + return "36737"; // Drognitz + case "8": + return "36738"; // Königsee + case "9": + return "36739"; // Rottenbach + default: + return ""; + } + } + + private static String fromNumber3674(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36741"; // Bad Blankenburg + case "2": + return "36742"; // Uhlstädt + case "3": + return "36743"; // Teichel + case "4": + return "36744"; // Remda + default: + return ""; + } + } + + private static String fromNumber3676(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36761"; // Heubisch + case "2": + return "36762"; // Steinach Thür + case "4": + return "36764"; // Neuhaus-Schierschnitz + case "6": + return "36766"; // Schalkau + default: + return ""; + } + } + + private static String fromNumber3678(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36781"; // Grossbreitenbach + case "2": + return "36782"; // Schmiedefeld a Rennsteig + case "3": + return "36783"; // Gehren Thür + case "4": + return "36784"; // Stützerbach + case "5": + return "36785"; // Gräfinau-Angstedt + default: + return ""; + } + } + + private static String fromNumber368(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3681"; // Suhl + case "2": + return "3682"; // Zella-Mehlis + case "3": + return "3683"; // Schmalkalden + case "4": + return fromNumber3684(number.substring(1)); + case "5": + return "3685"; // Hildburghausen + case "6": + return "3686"; // Eisfeld + case "7": + return fromNumber3687(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3684(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36840"; // Trusetal + case "1": + return "36841"; // Schleusingen + case "2": + return "36842"; // Oberhof Thür + case "3": + return "36843"; // Benshausen + case "4": + return "36844"; // Rohr Thür + case "5": + return "36845"; // Gehlberg + case "6": + return "36846"; // Suhl-Dietzhausen + case "7": + return "36847"; // Steinbach-Hallenberg + case "8": + return "36848"; // Wernshausen + case "9": + return "36849"; // Kleinschmalkalden + default: + return ""; + } + } + + private static String fromNumber3687(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36870"; // Masserberg + case "1": + return "36871"; // Bad Colberg-Heldburg + case "3": + return "36873"; // Themar + case "4": + return "36874"; // Schönbrunn b Hildburghaus + case "5": + return "36875"; // Straufhain-Streufdorf + case "8": + return "36878"; // Oberland + default: + return ""; + } + } + + private static String fromNumber369(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3691"; // Eisenach Thür + case "2": + return fromNumber3692(number.substring(1)); + case "3": + return "3693"; // Meiningen + case "4": + return fromNumber3694(number.substring(1)); + case "5": + return "3695"; // Bad Salzungen + case "6": + return fromNumber3696(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3692(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36920"; // Grossenlupnitz + case "1": + return "36921"; // Wutha-Farnroda + case "2": + return "36922"; // Gerstungen + case "3": + return "36923"; // Treffurt + case "4": + return "36924"; // Mihla + case "5": + return "36925"; // Marksuhl + case "6": + return "36926"; // Creuzburg + case "7": + return "36927"; // Unterellen + case "8": + return "36928"; // Neuenhof Thür + case "9": + return "36929"; // Ruhla + default: + return ""; + } + } + + private static String fromNumber3694(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "36940"; // Oepfershausen + case "1": + return "36941"; // Wasungen + case "3": + return "36943"; // Bettenhausen Thür + case "4": + return "36944"; // Rentwertshausen + case "5": + return "36945"; // Henneberg + case "6": + return "36946"; // Erbenhausen Thür + case "7": + return "36947"; // Jüchsen + case "8": + return "36948"; // Römhild + case "9": + return "36949"; // Obermaßfeld-Grimmenthal + default: + return ""; + } + } + + private static String fromNumber3696(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "36961"; // Bad Liebenstein + case "2": + return "36962"; // Vacha + case "3": + return "36963"; // Dorndorf Rhön + case "4": + return "36964"; // Dermbach Rhön + case "5": + return "36965"; // Stadtlengsfeld + case "6": + return "36966"; // Kaltennordheim + case "7": + return "36967"; // Geisa + case "8": + return "36968"; // Rossdorf Rhön + case "9": + return "36969"; // Merkers + default: + return ""; + } + } + + private static String fromNumber37(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "371"; // Chemnitz Sachs + case "2": + return fromNumber372(number.substring(1)); + case "3": + return fromNumber373(number.substring(1)); + case "4": + return fromNumber374(number.substring(1)); + case "5": + return "375"; // Zwickau + case "6": + return fromNumber376(number.substring(1)); + case "7": + return fromNumber377(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber372(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3720(number.substring(1)); + case "1": + return "3721"; // Meinersdorf + case "2": + return "3722"; // Limbach-Oberfrohna + case "3": + return "3723"; // Hohenstein-Ernstthal + case "4": + return "3724"; // Burgstädt + case "5": + return "3725"; // Zschopau + case "6": + return "3726"; // Flöha + case "7": + return "3727"; // Mittweida + case "9": + return fromNumber3729(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3720(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37200"; // Wittgensdorf b Chemnitz + case "2": + return "37202"; // Claussnitz b Chemnitz + case "3": + return "37203"; // Gersdorf b Chemnitz + case "4": + return "37204"; // Lichtenstein Sachs + case "6": + return "37206"; // Frankenberg Sachs + case "7": + return "37207"; // Hainichen Sachs + case "8": + return "37208"; // Auerswalde + case "9": + return "37209"; // Einsiedel b Chemnitz + default: + return ""; + } + } + + private static String fromNumber3729(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37291"; // Augustusburg + case "2": + return "37292"; // Oederan + case "3": + return "37293"; // Eppendorf Sachs + case "4": + return "37294"; // Grünhainichen + case "5": + return "37295"; // Lugau Erzgeb + case "6": + return "37296"; // Stollberg Erzgeb + case "7": + return "37297"; // Thum Sachs + case "8": + return "37298"; // Oelsnitz Erzgeb + default: + return ""; + } + } + + private static String fromNumber373(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3731"; // Freiberg Sachs + case "2": + return fromNumber3732(number.substring(1)); + case "3": + return "3733"; // Annaberg-Buchholz + case "4": + return fromNumber3734(number.substring(1)); + case "5": + return "3735"; // Marienberg Sachs + case "6": + return fromNumber3736(number.substring(1)); + case "7": + return "3737"; // Rochlitz + case "8": + return fromNumber3738(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3732(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37320"; // Mulda Sachs + case "1": + return "37321"; // Frankenstein Sachs + case "2": + return "37322"; // Brand-Erbisdorf + case "3": + return "37323"; // Lichtenberg Erzgeb + case "4": + return "37324"; // Reinsberg Sachs + case "5": + return "37325"; // Niederbobritzsch + case "6": + return "37326"; // Frauenstein Sachs + case "7": + return "37327"; // Rechenberg-Bienenmühle + case "8": + return "37328"; // Grossschirma + case "9": + return "37329"; // Grosshartmannsdorf + default: + return ""; + } + } + + private static String fromNumber3734(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37341"; // Ehrenfriedersdorf + case "2": + return "37342"; // Cranzahl + case "3": + return "37343"; // Jöhstadt + case "4": + return "37344"; // Crottendorf Sachs + case "6": + return "37346"; // Geyer + case "7": + return "37347"; // Bärenstein Kr Annaberg + case "8": + return "37348"; // Oberwiesenthal Kurort + case "9": + return "37349"; // Scheibenberg + default: + return ""; + } + } + + private static String fromNumber3736(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37360"; // Olbernhau + case "1": + return "37361"; // Neuhausen Erzgeb + case "2": + return "37362"; // Seiffen Erzgeb + case "3": + return "37363"; // Zöblitz + case "4": + return "37364"; // Reitzenhain Erzgeb + case "5": + return "37365"; // Sayda + case "6": + return "37366"; // Rübenau + case "7": + return "37367"; // Lengefeld Erzgeb + case "8": + return "37368"; // Deutschneudorf + case "9": + return "37369"; // Wolkenstein + default: + return ""; + } + } + + private static String fromNumber3738(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37381"; // Penig + case "2": + return "37382"; // Geringswalde + case "3": + return "37383"; // Lunzenau + case "4": + return "37384"; // Wechselburg + default: + return ""; + } + } + + private static String fromNumber374(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3741"; // Plauen + case "2": + return fromNumber3742(number.substring(1)); + case "3": + return fromNumber3743(number.substring(1)); + case "4": + return "3744"; // Auerbach Vogtl + case "5": + return "3745"; // Falkenstein Vogtl + case "6": + return fromNumber3746(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3742(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "37421"; // Oelsnitz Vogtl + case "2": + return "37422"; // Markneukirchen + case "3": + return "37423"; // Adorf Vogtl + default: + return ""; + } + } + + private static String fromNumber3743(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37430"; // Eichigt + case "1": + return "37431"; // Mehltheuer Vogtl + case "2": + return "37432"; // Pausa Vogtl + case "3": + return "37433"; // Gutenfürst + case "4": + return "37434"; // Bobenneukirchen + case "5": + return "37435"; // Reuth b Plauen + case "6": + return "37436"; // Weischlitz + case "7": + return "37437"; // Bad Elster + case "8": + return "37438"; // Bad Brambach + case "9": + return "37439"; // Jocketa + default: + return ""; + } + } + + private static String fromNumber3746(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "37462"; // Rothenkirchen Vogtl + case "3": + return "37463"; // Bergen Vogtl + case "4": + return "37464"; // Schöneck Vogtl + case "5": + return "37465"; // Tannenbergsthal Vogtl + case "7": + return "37467"; // Klingenthal Sachs + case "8": + return "37468"; // Treuen Vogtl + default: + return ""; + } + } + + private static String fromNumber376(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3760(number.substring(1)); + case "1": + return "3761"; // Werdau Sachs + case "2": + return "3762"; // Crimmitschau + case "3": + return "3763"; // Glauchau + case "4": + return "3764"; // Meerane + case "5": + return "3765"; // Reichenbach Vogtl + default: + return ""; + } + } + + private static String fromNumber3760(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "37600"; // Neumark Sachs + case "1": + return "37601"; // Mülsen Skt Jacob + case "2": + return "37602"; // Kirchberg Sachs + case "3": + return "37603"; // Wildenfels + case "4": + return "37604"; // Mosel + case "5": + return "37605"; // Hartenstein Sachs + case "6": + return "37606"; // Lengenfeld Vogtl + case "7": + return "37607"; // Ebersbrunn Sachs + case "8": + return "37608"; // Waldenburg Sachs + case "9": + return "37609"; // Wolkenburg Mulde + default: + return ""; + } + } + + private static String fromNumber377(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3771"; // Aue Sachs + case "2": + return "3772"; // Schneeberg Erzgeb + case "3": + return "3773"; // Johanngeorgenstadt + case "4": + return "3774"; // Schwarzenberg + case "5": + return fromNumber3775(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3775(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "37752"; // Eibenstock + case "4": + return "37754"; // Zwönitz + case "5": + return "37755"; // Schönheide Erzgeb + case "6": + return "37756"; // Breitenbrunn Erzgeb + case "7": + return "37757"; // Rittersgrün + default: + return ""; + } + } + + private static String fromNumber38(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "381"; // Rostock + case "2": + return fromNumber382(number.substring(1)); + case "3": + return fromNumber383(number.substring(1)); + case "4": + return fromNumber384(number.substring(1)); + case "5": + return "385"; // Schwerin Meckl + case "6": + return fromNumber386(number.substring(1)); + case "7": + return fromNumber387(number.substring(1)); + case "8": + return fromNumber388(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber382(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3820(number.substring(1)); + case "1": + return "3821"; // Ribnitz-Damgarten + case "2": + return fromNumber3822(number.substring(1)); + case "3": + return fromNumber3823(number.substring(1)); + case "9": + return fromNumber3829(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3820(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38201"; // Gelbensande + case "2": + return "38202"; // Volkenshagen + case "3": + return "38203"; // Bad Doberan + case "4": + return "38204"; // Broderstorf + case "5": + return "38205"; // Tessin b Rostock + case "6": + return "38206"; // Graal-Müritz Seeheilbad + case "7": + return "38207"; // Stäbelow + case "8": + return "38208"; // Kavelstorf + case "9": + return "38209"; // Sanitz b Rostock + default: + return ""; + } + } + + private static String fromNumber3822(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38220"; // Wustrow Ostseebad + case "1": + return "38221"; // Marlow + case "2": + return "38222"; // Semlow + case "3": + return "38223"; // Saal Vorpom + case "4": + return "38224"; // Gresenhorst + case "5": + return "38225"; // Trinwillershagen + case "6": + return "38226"; // Dierhagen Ostseebad + case "7": + return "38227"; // Lüdershagen b Barth + case "8": + return "38228"; // Dettmannsdorf-Kölzow + case "9": + return "38229"; // Bad Sülze + default: + return ""; + } + } + + private static String fromNumber3823(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38231"; // Barth + case "2": + return "38232"; // Zingst Ostseebad + case "3": + return "38233"; // Prerow Ostseebad + case "4": + return "38234"; // Born a Darß + default: + return ""; + } + } + + private static String fromNumber3829(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "38292"; // Kröpelin + case "3": + return "38293"; // Kühlungsborn Ostseebad + case "4": + return "38294"; // Neubukow + case "5": + return "38295"; // Satow b Bad Doberan + case "6": + return "38296"; // Rerik Ostseebad + case "7": + return "38297"; // Moitin + default: + return ""; + } + } + + private static String fromNumber383(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3830(number.substring(1)); + case "1": + return "3831"; // Stralsund + case "2": + return fromNumber3832(number.substring(1)); + case "3": + return fromNumber3833(number.substring(1)); + case "4": + return "3834"; // Greifswald + case "5": + return fromNumber3835(number.substring(1)); + case "6": + return "3836"; // Wolgast + case "7": + return fromNumber3837(number.substring(1)); + case "8": + return "3838"; // Bergen auf Rügen + case "9": + return fromNumber3839(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3830(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38300"; // Insel Hiddensee + case "1": + return "38301"; // Putbus + case "2": + return "38302"; // Sagard + case "3": + return "38303"; // Sellin Ostseebad + case "4": + return "38304"; // Garz Rügen + case "5": + return "38305"; // Gingst + case "6": + return "38306"; // Samtens + case "7": + return "38307"; // Poseritz + case "8": + return "38308"; // Göhren Rügen + case "9": + return "38309"; // Trent + default: + return ""; + } + } + + private static String fromNumber3832(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38320"; // Tribsees + case "1": + return "38321"; // Martensdorf b Stralsund + case "2": + return "38322"; // Richtenberg + case "3": + return "38323"; // Prohn + case "4": + return "38324"; // Velgast + case "5": + return "38325"; // Rolofshagen + case "6": + return "38326"; // Grimmen + case "7": + return "38327"; // Elmenhorst Vorpom + case "8": + return "38328"; // Miltzow + default: + return ""; + } + } + + private static String fromNumber3833(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38331"; // Rakow Vorpom + case "2": + return "38332"; // Gross Bisdorf + case "3": + return "38333"; // Horst b Grimmen + case "4": + return "38334"; // Grammendorf + default: + return ""; + } + } + + private static String fromNumber3835(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38351"; // Mesekenhagen + case "2": + return "38352"; // Kemnitz b Greifswald + case "3": + return "38353"; // Gützkow b Greifswald + case "4": + return "38354"; // Wusterhusen + case "5": + return "38355"; // Züssow + case "6": + return "38356"; // Behrenhoff + default: + return ""; + } + } + + private static String fromNumber3837(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38370"; // Kröslin + case "1": + return "38371"; // Karlshagen + case "2": + return "38372"; // Usedom + case "3": + return "38373"; // Katzow + case "4": + return "38374"; // Lassan b Wolgast + case "5": + return "38375"; // Koserow + case "6": + return "38376"; // Zirchow + case "7": + return "38377"; // Zinnowitz + case "8": + return "38378"; // Heringsdorf Seebad + case "9": + return "38379"; // Benz Usedom + default: + return ""; + } + } + + private static String fromNumber3839(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38391"; // Altenkirchen Rügen + case "2": + return "38392"; // Sassnitz + case "3": + return "38393"; // Binz Ostseebad + default: + return ""; + } + } + + private static String fromNumber384(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3841"; // Wismar Meckl + case "2": + return fromNumber3842(number.substring(1)); + case "3": + return "3843"; // Güstrow + case "4": + return "3844"; // Schwaan + case "5": + return fromNumber3845(number.substring(1)); + case "6": + return fromNumber3846(number.substring(1)); + case "7": + return "3847"; // Sternberg + case "8": + return fromNumber3848(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3842(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "38422"; // Neukloster + case "3": + return "38423"; // Bad Kleinen + case "4": + return "38424"; // Bobitz + case "5": + return "38425"; // Kirchdorf Poel + case "6": + return "38426"; // Neuburg-Steinhausen + case "7": + return "38427"; // Blowatz + case "8": + return "38428"; // Hohenkirchen b Wismar + case "9": + return "38429"; // Glasin + default: + return ""; + } + } + + private static String fromNumber3845(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38450"; // Tarnow b Bützow + case "1": + return "38451"; // Hoppenrade b Güstrow + case "2": + return "38452"; // Lalendorf + case "3": + return "38453"; // Mistorf + case "4": + return "38454"; // Kritzkow + case "5": + return "38455"; // Plaaz + case "6": + return "38456"; // Langhagen b Güstrow + case "7": + return "38457"; // Krakow am See + case "8": + return "38458"; // Zehna + case "9": + return "38459"; // Laage + default: + return ""; + } + } + + private static String fromNumber3846(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38461"; // Bützow + case "2": + return "38462"; // Baumgarten Meckl + case "4": + return "38464"; // Bernitt + case "6": + return "38466"; // Jürgenshagen + default: + return ""; + } + } + + private static String fromNumber3848(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38481"; // Witzin + case "2": + return "38482"; // Warin + case "3": + return "38483"; // Brüel + case "4": + return "38484"; // Ventschow + case "5": + return "38485"; // Dabel + case "6": + return "38486"; // Gustävel + case "8": + return "38488"; // Demen + default: + return ""; + } + } + + private static String fromNumber386(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "3860"; // Raben Steinfeld + case "1": + return "3861"; // Plate + case "3": + return "3863"; // Crivitz + case "5": + return "3865"; // Holthusen + case "6": + return "3866"; // Cambs + case "7": + return "3867"; // Lübstorf + case "8": + return "3868"; // Rastow + case "9": + return "3869"; // Dümmer + default: + return ""; + } + } + + private static String fromNumber387(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3871"; // Parchim + case "2": + return fromNumber3872(number.substring(1)); + case "3": + return fromNumber3873(number.substring(1)); + case "4": + return "3874"; // Ludwigslust Meckl + case "5": + return fromNumber3875(number.substring(1)); + case "6": + return "3876"; // Perleberg + case "7": + return "3877"; // Wittenberge + case "8": + return fromNumber3878(number.substring(1)); + case "9": + return fromNumber3879(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3872(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38720"; // Grebbin + case "1": + return "38721"; // Ziegendorf + case "2": + return "38722"; // Raduhn + case "3": + return "38723"; // Kladrum + case "4": + return "38724"; // Siggelkow + case "5": + return "38725"; // Gross Godems + case "6": + return "38726"; // Spornitz + case "7": + return "38727"; // Mestlin + case "8": + return "38728"; // Domsühl + case "9": + return "38729"; // Marnitz + default: + return ""; + } + } + + private static String fromNumber3873(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38731"; // Lübz + case "2": + return "38732"; // Gallin b Lübz + case "3": + return "38733"; // Karbow-Vietlübbe + case "5": + return "38735"; // Plau am See + case "6": + return "38736"; // Goldberg Meckl + case "7": + return "38737"; // Ganzlin + case "8": + return "38738"; // Karow b Lübz + default: + return ""; + } + } + + private static String fromNumber3875(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38750"; // Malliss + case "1": + return "38751"; // Picher + case "2": + return "38752"; // Zierzow b Ludwigslust + case "3": + return "38753"; // Wöbbelin + case "4": + return "38754"; // Leussow b Ludwigslust + case "5": + return "38755"; // Eldena + case "6": + return "38756"; // Grabow Meckl + case "7": + return "38757"; // Neustadt-Glewe + case "8": + return "38758"; // Dömitz + case "9": + return "38759"; // Tewswoos + default: + return ""; + } + } + + private static String fromNumber3878(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38780"; // Lanz Brandenb + case "1": + return "38781"; // Mellen + case "2": + return "38782"; // Reetz b Perleberg + case "3": + return "38783"; // Dallmin + case "4": + return "38784"; // Kleinow Kr Prignitz + case "5": + return "38785"; // Berge b Perleberg + case "7": + return "38787"; // Glöwen + case "8": + return "38788"; // Gross Warnow + case "9": + return "38789"; // Wolfshagen b Perleberg + default: + return ""; + } + } + + private static String fromNumber3879(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38791"; // Bad Wilsnack + case "2": + return "38792"; // Lenzen (Elbe) + case "3": + return "38793"; // Dergenthin + case "4": + return "38794"; // Cumlosen + case "6": + return "38796"; // Viesecke + case "7": + return "38797"; // Karstädt Kr Prignitz + default: + return ""; + } + } + + private static String fromNumber388(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3881"; // Grevesmühlen + case "2": + return fromNumber3882(number.substring(1)); + case "3": + return "3883"; // Hagenow + case "4": + return fromNumber3884(number.substring(1)); + case "5": + return fromNumber3885(number.substring(1)); + case "6": + return "3886"; // Gadebusch + case "7": + return fromNumber3887(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3882(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38821"; // Lüdersdorf Meckl + case "2": + return "38822"; // Diedrichshagen b Grevesmühlen + case "3": + return "38823"; // Selmsdorf + case "4": + return "38824"; // Mallentin + case "5": + return "38825"; // Klütz + case "6": + return "38826"; // Dassow + case "7": + return "38827"; // Kalkhorst + case "8": + return "38828"; // Schönberg Meckl + default: + return ""; + } + } + + private static String fromNumber3884(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38841"; // Neuhaus Elbe + case "2": + return "38842"; // Lüttenmark + case "3": + return "38843"; // Bennin + case "4": + return "38844"; // Gülze + case "5": + return "38845"; // Kaarssen + case "7": + return "38847"; // Boizenburg Elbe + case "8": + return "38848"; // Vellahn + default: + return ""; + } + } + + private static String fromNumber3885(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "38850"; // Gammelin + case "1": + return "38851"; // Zarrentin Meckl + case "2": + return "38852"; // Wittenburg + case "3": + return "38853"; // Drönnewitz b Hagenow + case "4": + return "38854"; // Redefin + case "5": + return "38855"; // Lübtheen + case "6": + return "38856"; // Pritzier b Hagenow + case "8": + return "38858"; // Lassahn + case "9": + return "38859"; // Alt Zachun + default: + return ""; + } + } + + private static String fromNumber3887(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "38871"; // Mühlen Eichsen + case "2": + return "38872"; // Rehna + case "3": + return "38873"; // Carlow + case "4": + return "38874"; // Lützow + case "5": + return "38875"; // Schlagsdorf b Gadebusch + case "6": + return "38876"; // Roggendorf + default: + return ""; + } + } + + private static String fromNumber39(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber390(number.substring(1)); + case "1": + return "391"; // Magdeburg + case "2": + return fromNumber392(number.substring(1)); + case "3": + return fromNumber393(number.substring(1)); + case "4": + return fromNumber394(number.substring(1)); + case "5": + return "395"; // Neubrandenburg + case "6": + return fromNumber396(number.substring(1)); + case "7": + return fromNumber397(number.substring(1)); + case "8": + return fromNumber398(number.substring(1)); + case "9": + return fromNumber399(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber390(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3900(number.substring(1)); + case "1": + return "3901"; // Salzwedel + case "2": + return "3902"; // Diesdorf Altm + case "3": + return fromNumber3903(number.substring(1)); + case "4": + return "3904"; // Haldensleben + case "5": + return fromNumber3905(number.substring(1)); + case "6": + return fromNumber3906(number.substring(1)); + case "7": + return "3907"; // Gardelegen + case "8": + return fromNumber3908(number.substring(1)); + case "9": + return "3909"; // Klötze Altmark + default: + return ""; + } + } + + private static String fromNumber3900(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39000"; // Beetzendorf + case "1": + return "39001"; // Apenburg + case "2": + return "39002"; // Oebisfelde + case "3": + return "39003"; // Jübar + case "4": + return "39004"; // Köckte b Gardelegen + case "5": + return "39005"; // Kusey + case "6": + return "39006"; // Miesterhorst + case "7": + return "39007"; // Tangeln + case "8": + return "39008"; // Kunrau + case "9": + return "39009"; // Badel + default: + return ""; + } + } + + private static String fromNumber3903(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39030"; // Brunau + case "1": + return "39031"; // Dähre + case "2": + return "39032"; // Mahlsdorf b Salzwedel + case "3": + return "39033"; // Wallstawe + case "4": + return "39034"; // Fleetmark + case "5": + return "39035"; // Kuhfelde + case "6": + return "39036"; // Binde + case "7": + return "39037"; // Pretzier + case "8": + return "39038"; // Henningen + case "9": + return "39039"; // Bonese + default: + return ""; + } + } + + private static String fromNumber3905(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39050"; // Bartensleben + case "1": + return "39051"; // Calvörde + case "2": + return "39052"; // Erxleben b Haldensleben + case "3": + return "39053"; // Süplingen + case "4": + return "39054"; // Flechtingen + case "5": + return "39055"; // Hörsingen + case "6": + return "39056"; // Klüden + case "7": + return "39057"; // Rätzlingen Sachs-Anh + case "8": + return "39058"; // Uthmöden + case "9": + return "39059"; // Wegenstedt + default: + return ""; + } + } + + private static String fromNumber3906(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39061"; // Weferlingen + case "2": + return "39062"; // Bebertal + default: + return ""; + } + } + + private static String fromNumber3908(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39080"; // Kalbe Milde + case "1": + return "39081"; // Kakerbeck Sachs-Anh + case "2": + return "39082"; // Mieste + case "3": + return "39083"; // Messdorf + case "4": + return "39084"; // Lindstedt + case "5": + return "39085"; // Zichtau + case "6": + return "39086"; // Jävenitz + case "7": + return "39087"; // Jerchel Altmark + case "8": + return "39088"; // Letzlingen + case "9": + return "39089"; // Bismark Altmark + default: + return ""; + } + } + + private static String fromNumber392(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3920(number.substring(1)); + case "1": + return "3921"; // Burg b Magdeburg + case "2": + return fromNumber3922(number.substring(1)); + case "3": + return "3923"; // Zerbst + case "4": + return fromNumber3924(number.substring(1)); + case "5": + return "3925"; // Stassfurt + case "6": + return fromNumber3926(number.substring(1)); + case "8": + return "3928"; // Schönebeck Elbe + case "9": + return fromNumber3929(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3920(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39200"; // Gommern + case "1": + return "39201"; // Wolmirstedt + case "2": + return "39202"; // Gross Ammensleben + case "3": + return "39203"; // Barleben + case "4": + return "39204"; // Niederndodeleben + case "5": + return "39205"; // Langenweddingen + case "6": + return "39206"; // Eichenbarleben + case "7": + return "39207"; // Colbitz + case "8": + return "39208"; // Loitsche + case "9": + return "39209"; // Wanzleben + default: + return ""; + } + } + + private static String fromNumber3922(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39221"; // Möckern b Magdeburg + case "2": + return "39222"; // Möser + case "3": + return "39223"; // Theessen + case "4": + return "39224"; // Büden + case "5": + return "39225"; // Altengrabow + case "6": + return "39226"; // Hohenziatz + default: + return ""; + } + } + + private static String fromNumber3924(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39241"; // Leitzkau + case "2": + return "39242"; // Prödel + case "3": + return "39243"; // Nedlitz b Zerbst + case "4": + return "39244"; // Steutz + case "5": + return "39245"; // Loburg + case "6": + return "39246"; // Lindau Anh + case "7": + return "39247"; // Güterglück + case "8": + return "39248"; // Dobritz + default: + return ""; + } + } + + private static String fromNumber3926(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "39262"; // Güsten Anh + case "3": + return "39263"; // Unseburg + case "4": + return "39264"; // Kroppenstedt + case "5": + return "39265"; // Löderburg + case "6": + return "39266"; // Förderstedt + case "7": + return "39267"; // Schneidlingen + case "8": + return "39268"; // Egeln + default: + return ""; + } + } + + private static String fromNumber3929(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39291"; // Calbe Saale + case "2": + return "39292"; // Biederitz + case "3": + return "39293"; // Dreileben + case "4": + return "39294"; // Gross Rosenburg + case "5": + return "39295"; // Zuchau + case "6": + return "39296"; // Welsleben + case "7": + return "39297"; // Eickendorf Kr Schönebeck + case "8": + return "39298"; // Barby Elbe + default: + return ""; + } + } + + private static String fromNumber393(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3931"; // Stendal + case "2": + return fromNumber3932(number.substring(1)); + case "3": + return "3933"; // Genthin + case "4": + return fromNumber3934(number.substring(1)); + case "5": + return "3935"; // Tangerhütte + case "6": + return fromNumber3936(number.substring(1)); + case "7": + return "3937"; // Osterburg Altmark + case "8": + return fromNumber3938(number.substring(1)); + case "9": + return fromNumber3939(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3932(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39320"; // Schinne + case "1": + return "39321"; // Arneburg + case "2": + return "39322"; // Tangermünde + case "3": + return "39323"; // Schönhausen Elbe + case "4": + return "39324"; // Kläden b Stendal + case "5": + return "39325"; // Vinzelberg + case "7": + return "39327"; // Klietz + case "8": + return "39328"; // Rochau + case "9": + return "39329"; // Möringen + default: + return ""; + } + } + + private static String fromNumber3934(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39341"; // Redekin + case "2": + return "39342"; // Gladau + case "3": + return "39343"; // Jerichow + case "4": + return "39344"; // Güsen + case "5": + return "39345"; // Parchen + case "6": + return "39346"; // Tucheim + case "7": + return "39347"; // Kade + case "8": + return "39348"; // Klitsche + case "9": + return "39349"; // Parey Elbe + default: + return ""; + } + } + + private static String fromNumber3936(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39361"; // Lüderitz + case "2": + return "39362"; // Grieben b Tangerhütte + case "3": + return "39363"; // Angern + case "4": + return "39364"; // Dolle + case "5": + return "39365"; // Bellingen b Stendal + case "6": + return "39366"; // Kehnert + default: + return ""; + } + } + + private static String fromNumber3938(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "39382"; // Kamern + case "3": + return "39383"; // Sandau Elbe + case "4": + return "39384"; // Arendsee Altmark + case "6": + return "39386"; // Seehausen Altmark + case "7": + return "39387"; // Havelberg + case "8": + return "39388"; // Goldbeck Altm + case "9": + return "39389"; // Schollene + default: + return ""; + } + } + + private static String fromNumber3939(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39390"; // Iden + case "1": + return "39391"; // Lückstedt + case "2": + return "39392"; // Rönnebeck Sachs-Ahn + case "3": + return "39393"; // Werben Elbe + case "4": + return "39394"; // Hohenberg-Krusemark + case "5": + return "39395"; // Wanzer + case "6": + return "39396"; // Neukirchen Altmark + case "7": + return "39397"; // Geestgottberg + case "8": + return "39398"; // Gross Garz + case "9": + return "39399"; // Kleinau + default: + return ""; + } + } + + private static String fromNumber394(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3940(number.substring(1)); + case "1": + return "3941"; // Halberstadt + case "2": + return fromNumber3942(number.substring(1)); + case "3": + return "3943"; // Wernigerode + case "4": + return "3944"; // Blankenburg Harz + case "5": + return fromNumber3945(number.substring(1)); + case "6": + return "3946"; // Quedlinburg + case "7": + return "3947"; // Thale + case "8": + return fromNumber3948(number.substring(1)); + case "9": + return "3949"; // Oschersleben Bode + default: + return ""; + } + } + + private static String fromNumber3940(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39400"; // Wefensleben + case "1": + return "39401"; // Neuwegersleben + case "2": + return "39402"; // Völpke + case "3": + return "39403"; // Gröningen Sachs-Ahn + case "4": + return "39404"; // Ausleben + case "5": + return "39405"; // Hötensleben + case "6": + return "39406"; // Harbke + case "7": + return "39407"; // Seehausen Börde + case "8": + return "39408"; // Hadmersleben + case "9": + return "39409"; // Eilsleben + default: + return ""; + } + } + + private static String fromNumber3942(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39421"; // Osterwieck + case "2": + return "39422"; // Badersleben + case "3": + return "39423"; // Wegeleben + case "4": + return "39424"; // Schwanebeck Sachs-Anh + case "5": + return "39425"; // Dingelstedt a Huy + case "6": + return "39426"; // Hessen + case "7": + return "39427"; // Ströbeck + case "8": + return "39428"; // Pabstorf + default: + return ""; + } + } + + private static String fromNumber3945(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39451"; // Wasserleben + case "2": + return "39452"; // Ilsenburg + case "3": + return "39453"; // Derenburg + case "4": + return "39454"; // Elbingerode Harz + case "5": + return "39455"; // Schierke + case "6": + return "39456"; // Altenbrak + case "7": + return "39457"; // Benneckenstein Harz + case "8": + return "39458"; // Heudeber + case "9": + return "39459"; // Hasselfelde + default: + return ""; + } + } + + private static String fromNumber3948(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39481"; // Hedersleben b Aschersleben + case "2": + return "39482"; // Gatersleben + case "3": + return "39483"; // Ballenstedt + case "4": + return "39484"; // Harzgerode + case "5": + return "39485"; // Gernrode Harz + case "7": + return "39487"; // Friedrichsbrunn + case "8": + return "39488"; // Güntersberge + case "9": + return "39489"; // Strassberg Harz + default: + return ""; + } + } + + private static String fromNumber396(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber3960(number.substring(1)); + case "1": + return "3961"; // Altentreptow + case "2": + return "3962"; // Penzlin b Waren + case "3": + return "3963"; // Woldegk + case "4": + return "3964"; // Bredenfelde b Strasburg + case "5": + return "3965"; // Burow b Altentreptow + case "6": + return "3966"; // Cölpin + case "7": + return "3967"; // Oertzenhof b Strasburg + case "8": + return "3968"; // Schönbeck Meckl + case "9": + return "3969"; // Siedenbollentin + default: + return ""; + } + } + + private static String fromNumber3960(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39600"; // Zwiedorf + case "1": + return "39601"; // Friedland Meckl + case "2": + return "39602"; // Kleeth + case "3": + return "39603"; // Burg Stargard + case "4": + return "39604"; // Wildberg b Altentreptow + case "5": + return "39605"; // Gross Nemerow + case "6": + return "39606"; // Glienke + case "7": + return "39607"; // Kotelow + case "8": + return "39608"; // Staven + default: + return ""; + } + } + + private static String fromNumber397(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3971"; // Anklam + case "2": + return fromNumber3972(number.substring(1)); + case "3": + return "3973"; // Pasewalk + case "4": + return fromNumber3974(number.substring(1)); + case "5": + return fromNumber3975(number.substring(1)); + case "6": + return "3976"; // Torgelow b Ueckermünde + case "7": + return fromNumber3977(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3972(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39721"; // Liepen b Anklam + case "2": + return "39722"; // Sarnow b Anklam + case "3": + return "39723"; // Krien + case "4": + return "39724"; // Klein Bünzow + case "6": + return "39726"; // Ducherow + case "7": + return "39727"; // Spantekow + case "8": + return "39728"; // Medow b Anklam + default: + return ""; + } + } + + private static String fromNumber3974(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39740"; // Nechlin + case "1": + return "39741"; // Jatznick + case "2": + return "39742"; // Brüssow b Pasewalk + case "3": + return "39743"; // Zerrenthin + case "4": + return "39744"; // Rothenklempenow + case "5": + return "39745"; // Hetzdorf b Strasburg + case "6": + return "39746"; // Krackow + case "7": + return "39747"; // Züsedom + case "8": + return "39748"; // Viereck + case "9": + return "39749"; // Grambow b Pasewalk + default: + return ""; + } + } + + private static String fromNumber3975(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39751"; // Penkun + case "2": + return "39752"; // Blumenhagen b Strasburg + case "3": + return "39753"; // Strasburg + case "4": + return "39754"; // Löcknitz Vorpom + default: + return ""; + } + } + + private static String fromNumber3977(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39771"; // Ueckermünde + case "2": + return "39772"; // Rothemühl + case "3": + return "39773"; // Altwarp + case "4": + return "39774"; // Mönkebude + case "5": + return "39775"; // Ahlbeck b Torgelow + case "6": + return "39776"; // Hintersee + case "7": + return "39777"; // Borkenfriede + case "8": + return "39778"; // Ferdinandshof b Torgelow + case "9": + return "39779"; // Eggesin + default: + return ""; + } + } + + private static String fromNumber398(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3981"; // Neustrelitz + case "2": + return fromNumber3982(number.substring(1)); + case "3": + return fromNumber3983(number.substring(1)); + case "4": + return "3984"; // Prenzlau + case "5": + return fromNumber3985(number.substring(1)); + case "6": + return fromNumber3986(number.substring(1)); + case "7": + return "3987"; // Templin + case "8": + return fromNumber3988(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3982(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "39820"; // Triepkendorf + case "1": + return "39821"; // Carpin + case "2": + return "39822"; // Kratzeburg + case "3": + return "39823"; // Rechlin + case "4": + return "39824"; // Hohenzieritz + case "5": + return "39825"; // Wokuhl + case "6": + return "39826"; // Blankensee b Neustrelitz + case "7": + return "39827"; // Schwarz b Neustrelitz + case "8": + return "39828"; // Wustrow Kr Mecklenburg-Strelitz + case "9": + return "39829"; // Blankenförde + default: + return ""; + } + } + + private static String fromNumber3983(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39831"; // Feldberg Meckl + case "2": + return "39832"; // Wesenberg Meckl + case "3": + return "39833"; // Mirow Kr Neustrelitz + default: + return ""; + } + } + + private static String fromNumber3985(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39851"; // Göritz b Prenzlau + case "2": + return "39852"; // Schönermark b Prenzlau + case "3": + return "39853"; // Holzendorf b Prenzlau + case "4": + return "39854"; // Kleptow + case "5": + return "39855"; // Parmen-Weggun + case "6": + return "39856"; // Beenz b Prenzlau + case "7": + return "39857"; // Drense + case "8": + return "39858"; // Bietikow + case "9": + return "39859"; // Fürstenwerder + default: + return ""; + } + } + + private static String fromNumber3986(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39861"; // Gramzow b Prenzlau + case "2": + return "39862"; // Schmölln b Prenzlau + case "3": + return "39863"; // Seehausen b Prenzlau + default: + return ""; + } + } + + private static String fromNumber3988(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39881"; // Ringenwalde b Templin + case "2": + return "39882"; // Gollin + case "3": + return "39883"; // Groß Dölln + case "4": + return "39884"; // Hassleben b Prenzlau + case "5": + return "39885"; // Jakobshagen + case "6": + return "39886"; // Milmersdorf + case "7": + return "39887"; // Gerswalde + case "8": + return "39888"; // Lychen + case "9": + return "39889"; // Boitzenburg + default: + return ""; + } + } + + private static String fromNumber399(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "3991"; // Waren Müritz + case "2": + return fromNumber3992(number.substring(1)); + case "3": + return fromNumber3993(number.substring(1)); + case "4": + return "3994"; // Malchin + case "5": + return fromNumber3995(number.substring(1)); + case "6": + return "3996"; // Teterow + case "7": + return fromNumber3997(number.substring(1)); + case "8": + return "3998"; // Demmin + case "9": + return fromNumber3999(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber3992(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39921"; // Ankershagen + case "2": + return "39922"; // Dambeck b Röbel + case "3": + return "39923"; // Priborn + case "4": + return "39924"; // Stuer + case "5": + return "39925"; // Wredenhagen + case "6": + return "39926"; // Grabowhöfe + case "7": + return "39927"; // Nossentiner Hütte + case "8": + return "39928"; // Möllenhagen + case "9": + return "39929"; // Jabel b Waren + default: + return ""; + } + } + + private static String fromNumber3993(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39931"; // Röbel Müritz + case "2": + return "39932"; // Malchow b Waren + case "3": + return "39933"; // Vollrathsruhe + case "4": + return "39934"; // Groß Plasten + default: + return ""; + } + } + + private static String fromNumber3995(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39951"; // Faulenrost + case "2": + return "39952"; // Grammentin + case "3": + return "39953"; // Schwinkendorf + case "4": + return "39954"; // Stavenhagen Reuterstadt + case "5": + return "39955"; // Jürgenstorf Meckl + case "6": + return "39956"; // Neukalen + case "7": + return "39957"; // Gielow + case "9": + return "39959"; // Dargun + default: + return ""; + } + } + + private static String fromNumber3997(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39971"; // Gnoien + case "2": + return "39972"; // Walkendorf + case "3": + return "39973"; // Altkalen + case "5": + return "39975"; // Thürkow + case "6": + return "39976"; // Groß Bützin + case "7": + return "39977"; // Jördenstorf + case "8": + return "39978"; // Gross Roge + default: + return ""; + } + } + + private static String fromNumber3999(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "39991"; // Daberkow + case "2": + return "39992"; // Görmin + case "3": + return "39993"; // Hohenmocker + case "4": + return "39994"; // Metschow + case "5": + return "39995"; // Nossendorf + case "6": + return "39996"; // Törpin + case "7": + return "39997"; // Jarmen + case "8": + return "39998"; // Loitz b Demmin + case "9": + return "39999"; // Tutow + default: + return ""; + } + } + + private static String fromNumber4(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "40"; // Hamburg + case "1": + return fromNumber41(number.substring(1)); + case "2": + return fromNumber42(number.substring(1)); + case "3": + return fromNumber43(number.substring(1)); + case "4": + return fromNumber44(number.substring(1)); + case "5": + return fromNumber45(number.substring(1)); + case "6": + return fromNumber46(number.substring(1)); + case "7": + return fromNumber47(number.substring(1)); + case "8": + return fromNumber48(number.substring(1)); + case "9": + return fromNumber49(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber41(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber410(number.substring(1)); + case "2": + return fromNumber412(number.substring(1)); + case "3": + return fromNumber413(number.substring(1)); + case "4": + return fromNumber414(number.substring(1)); + case "5": + return fromNumber415(number.substring(1)); + case "6": + return fromNumber416(number.substring(1)); + case "7": + return fromNumber417(number.substring(1)); + case "8": + return fromNumber418(number.substring(1)); + case "9": + return fromNumber419(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber410(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4101"; // Pinneberg + case "2": + return "4102"; // Ahrensburg + case "3": + return "4103"; // Wedel + case "4": + return "4104"; // Aumühle b Hamburg + case "5": + return "4105"; // Seevetal + case "6": + return "4106"; // Quickborn Kr Pinneberg + case "7": + return "4107"; // Siek Kr Stormarn + case "8": + return "4108"; // Rosengarten Kr Harburg + case "9": + return "4109"; // Tangstedt Bz Hamburg + default: + return ""; + } + } + + private static String fromNumber412(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4120"; // Ellerhoop + case "1": + return "4121"; // Elmshorn + case "2": + return "4122"; // Uetersen + case "3": + return "4123"; // Barmstedt + case "4": + return "4124"; // Glückstadt + case "5": + return "4125"; // Seestermühe + case "6": + return "4126"; // Horst Holstein + case "7": + return "4127"; // Westerhorn + case "8": + return "4128"; // Kollmar + case "9": + return "4129"; // Haseldorf + default: + return ""; + } + } + + private static String fromNumber413(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4131"; // Lüneburg + case "2": + return "4132"; // Amelinghausen + case "3": + return "4133"; // Wittorf Kr Lünebeburg + case "4": + return "4134"; // Embsen Kr Lünebeburg + case "5": + return "4135"; // Kirchgellersen + case "6": + return "4136"; // Scharnebeck + case "7": + return "4137"; // Barendorf + case "8": + return "4138"; // Betzendorf Kr Lünebeburg + case "9": + return "4139"; // Hohnstorf Elbe + default: + return ""; + } + } + + private static String fromNumber414(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4140"; // Estorf Kr Stade + case "1": + return "4141"; // Stade + case "2": + return "4142"; // Steinkirchen Kr Stade + case "3": + return "4143"; // Drochtersen + case "4": + return "4144"; // Himmelpforten + case "6": + return "4146"; // Stade-Bützfleth + case "8": + return "4148"; // Drochtersen-Assel + case "9": + return "4149"; // Fredenbeck + default: + return ""; + } + } + + private static String fromNumber415(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4151"; // Schwarzenbek + case "2": + return "4152"; // Geesthacht + case "3": + return "4153"; // Lauenburg Elbe + case "4": + return "4154"; // Trittau + case "5": + return "4155"; // Büchen + case "6": + return "4156"; // Talkau + case "8": + return "4158"; // Roseburg + case "9": + return "4159"; // Basthorst + default: + return ""; + } + } + + private static String fromNumber416(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4161"; // Buxtehude + case "2": + return "4162"; // Jork + case "3": + return "4163"; // Horneburg Niederelbe + case "4": + return "4164"; // Harsefeld + case "5": + return "4165"; // Hollenstedt Nordheide + case "6": + return "4166"; // Ahlerstedt + case "7": + return "4167"; // Apensen + case "8": + return "4168"; // Neu Wulmstorf-Elstorf + case "9": + return "4169"; // Sauensiek + default: + return ""; + } + } + + private static String fromNumber417(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4171"; // Winsen Luhe + case "2": + return "4172"; // Salzhausen + case "3": + return "4173"; // Wulfsen + case "4": + return "4174"; // Stelle Kr Harburg + case "5": + return "4175"; // Egestorf Nordheide + case "6": + return "4176"; // Marschacht + case "7": + return "4177"; // Drage Elbe + case "8": + return "4178"; // Radbruch + case "9": + return "4179"; // Winsen-Tönnhausen + default: + return ""; + } + } + + private static String fromNumber418(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4180"; // Königsmoor + case "1": + return "4181"; // Buchholz in der Nordheide + case "2": + return "4182"; // Tostedt + case "3": + return "4183"; // Jesteburg + case "4": + return "4184"; // Hanstedt Nordheide + case "5": + return "4185"; // Marxen Auetal + case "6": + return "4186"; // Buchholz-Trelde + case "7": + return "4187"; // Holm-Seppensen + case "8": + return "4188"; // Welle Nordheide + case "9": + return "4189"; // Undeloh + default: + return ""; + } + } + + private static String fromNumber419(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4191"; // Kaltenkirchen Holst + case "2": + return "4192"; // Bad Bramstedt + case "3": + return "4193"; // Henstedt-Ulzburg + case "4": + return "4194"; // Sievershütten + case "5": + return "4195"; // Hartenholm + default: + return ""; + } + } + + private static String fromNumber42(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber420(number.substring(1)); + case "1": + return "421"; // Bremen + case "2": + return fromNumber422(number.substring(1)); + case "3": + return fromNumber423(number.substring(1)); + case "4": + return fromNumber424(number.substring(1)); + case "5": + return fromNumber425(number.substring(1)); + case "6": + return fromNumber426(number.substring(1)); + case "7": + return fromNumber427(number.substring(1)); + case "8": + return fromNumber428(number.substring(1)); + case "9": + return fromNumber429(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber420(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4202"; // Achim b Bremen + case "3": + return "4203"; // Weyhe b Bremen + case "4": + return "4204"; // Thedinghausen + case "5": + return "4205"; // Ottersberg + case "6": + return "4206"; // Stuhr-Heiligenrode + case "7": + return "4207"; // Oyten + case "8": + return "4208"; // Grasberg + case "9": + return "4209"; // Schwanewede + default: + return ""; + } + } + + private static String fromNumber422(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4221"; // Delmenhorst + case "2": + return "4222"; // Ganderkesee + case "3": + return "4223"; // Ganderkesee-Bookholzberg + case "4": + return "4224"; // Gross Ippener + default: + return ""; + } + } + + private static String fromNumber423(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4230"; // Verden-Walle + case "1": + return "4231"; // Verden Aller + case "2": + return "4232"; // Langwedel Kr Verden + case "3": + return "4233"; // Blender + case "4": + return "4234"; // Dörverden + case "5": + return "4235"; // Langwedel-Etelsen + case "6": + return "4236"; // Kirchlinteln + case "7": + return "4237"; // Bendingbostel + case "8": + return "4238"; // Neddenaverbergen + case "9": + return "4239"; // Dörverden-Westen + default: + return ""; + } + } + + private static String fromNumber424(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4240"; // Syke-Heiligenfelde + case "1": + return "4241"; // Bassum + case "2": + return "4242"; // Syke + case "3": + return "4243"; // Twistringen + case "4": + return "4244"; // Harpstedt + case "5": + return "4245"; // Neuenkirchen b Bassum + case "6": + return "4246"; // Twistringen-Heiligenloh + case "7": + return "4247"; // Affinghausen + case "8": + return "4248"; // Bassum-Neubruchhausen + case "9": + return "4249"; // Bassum-Nordwohlde + default: + return ""; + } + } + + private static String fromNumber425(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4251"; // Hoya + case "2": + return "4252"; // Bruchhausen-Vilsen + case "3": + return "4253"; // Asendorf Kr Diepholz + case "4": + return "4254"; // Eystrup + case "5": + return "4255"; // Martfeld + case "6": + return "4256"; // Hilgermissen + case "7": + return "4257"; // Schweringen + case "8": + return "4258"; // Schwarme + default: + return ""; + } + } + + private static String fromNumber426(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4260"; // Visselhövede-Wittorf + case "1": + return "4261"; // Rotenburg Wümme + case "2": + return "4262"; // Visselhövede + case "3": + return "4263"; // Scheessel + case "4": + return "4264"; // Sottrum Kr Rotenburg + case "5": + return "4265"; // Fintel + case "6": + return "4266"; // Brockel + case "7": + return "4267"; // Lauenbrück + case "8": + return "4268"; // Bötersen + case "9": + return "4269"; // Ahausen-Kirchwalsede + default: + return ""; + } + } + + private static String fromNumber427(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4271"; // Sulingen + case "2": + return "4272"; // Siedenburg + case "3": + return "4273"; // Kirchdorf b Sulingen + case "4": + return "4274"; // Varrel b Sulingen + case "5": + return "4275"; // Ehrenburg + case "6": + return "4276"; // Borstel b Sulingen + case "7": + return "4277"; // Schwaförden + default: + return ""; + } + } + + private static String fromNumber428(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4281"; // Zeven + case "2": + return "4282"; // Sittensen + case "3": + return "4283"; // Tarmstedt + case "4": + return "4284"; // Selsingen + case "5": + return "4285"; // Rhade b Zeven + case "6": + return "4286"; // Gyhum + case "7": + return "4287"; // Heeslingen-Boitzen + case "8": + return "4288"; // Horstedt Kr Rotenburg + case "9": + return "4289"; // Kirchtimke + default: + return ""; + } + } + + private static String fromNumber429(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4292"; // Ritterhude + case "3": + return "4293"; // Ottersberg-Fischerhude + case "4": + return "4294"; // Riede Kr Verden + case "5": + return "4295"; // Emtinghausen + case "6": + return "4296"; // Schwanewede-Aschwarden + case "7": + return "4297"; // Ottersberg-Posthausen + case "8": + return "4298"; // Lilienthal + default: + return ""; + } + } + + private static String fromNumber43(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber430(number.substring(1)); + case "1": + return "431"; // Kiel + case "2": + return fromNumber432(number.substring(1)); + case "3": + return fromNumber433(number.substring(1)); + case "4": + return fromNumber434(number.substring(1)); + case "5": + return fromNumber435(number.substring(1)); + case "6": + return fromNumber436(number.substring(1)); + case "7": + return fromNumber437(number.substring(1)); + case "8": + return fromNumber438(number.substring(1)); + case "9": + return fromNumber439(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber430(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4302"; // Kirchbarkau + case "3": + return "4303"; // Schlesen + case "5": + return "4305"; // Westensee + case "7": + return "4307"; // Raisdorf + case "8": + return "4308"; // Schwedeneck + default: + return ""; + } + } + + private static String fromNumber432(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4320"; // Heidmühlen + case "1": + return "4321"; // Neumünster + case "2": + return "4322"; // Bordesholm + case "3": + return "4323"; // Bornhöved + case "4": + return "4324"; // Brokstedt + case "6": + return "4326"; // Wankendorf + case "7": + return "4327"; // Grossenaspe + case "8": + return "4328"; // Rickling + case "9": + return "4329"; // Langwedel Holst + default: + return ""; + } + } + + private static String fromNumber433(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4330"; // Emkendorf + case "1": + return "4331"; // Rendsburg + case "2": + return "4332"; // Hamdorf b Rendsburg + case "3": + return "4333"; // Erfde + case "4": + return "4334"; // Bredenbek b Rendsburg + case "5": + return "4335"; // Hohn b Rendsburg + case "6": + return "4336"; // Owschlag + case "7": + return "4337"; // Jevenstedt + case "8": + return "4338"; // Alt Duvenstedt + case "9": + return "4339"; // Christiansholm + default: + return ""; + } + } + + private static String fromNumber434(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4340"; // Achterwehr + case "2": + return "4342"; // Preetz Kr Plön + case "3": + return "4343"; // Laboe + case "4": + return "4344"; // Schönberg Holstein + case "6": + return "4346"; // Gettorf + case "7": + return "4347"; // Flintbek + case "8": + return "4348"; // Schönkirchen + case "9": + return "4349"; // Dänischenhagen + default: + return ""; + } + } + + private static String fromNumber435(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4351"; // Eckernförde + case "2": + return "4352"; // Damp + case "3": + return "4353"; // Ascheffel + case "4": + return "4354"; // Fleckeby + case "5": + return "4355"; // Rieseby + case "6": + return "4356"; // Gross Wittensee + case "7": + return "4357"; // Sehestedt Eider + case "8": + return "4358"; // Loose b Eckernförde + default: + return ""; + } + } + + private static String fromNumber436(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4361"; // Oldenburg in Holstein + case "2": + return "4362"; // Heiligenhafen + case "3": + return "4363"; // Lensahn + case "4": + return "4364"; // Dahme Kr Ostholstein + case "5": + return "4365"; // Heringsdorf Holst + case "6": + return "4366"; // Grömitz-Cismar + case "7": + return "4367"; // Grossenbrode + default: + return ""; + } + } + + private static String fromNumber437(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4371"; // Burg auf Fehmarn + case "2": + return "4372"; // Westfehmarn + default: + return ""; + } + } + + private static String fromNumber438(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4381"; // Lütjenburg + case "2": + return "4382"; // Wangels + case "3": + return "4383"; // Grebin + case "4": + return "4384"; // Selent + case "5": + return "4385"; // Hohenfelde b Kiel + default: + return ""; + } + } + + private static String fromNumber439(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4392"; // Nortorf b Neumünster + case "3": + return "4393"; // Boostedt + case "4": + return "4394"; // Bokhorst + default: + return ""; + } + } + + private static String fromNumber44(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber440(number.substring(1)); + case "1": + return "441"; // Oldenburg (Oldb) + case "2": + return fromNumber442(number.substring(1)); + case "3": + return fromNumber443(number.substring(1)); + case "4": + return fromNumber444(number.substring(1)); + case "5": + return fromNumber445(number.substring(1)); + case "6": + return fromNumber446(number.substring(1)); + case "7": + return fromNumber447(number.substring(1)); + case "8": + return fromNumber448(number.substring(1)); + case "9": + return fromNumber449(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber440(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4401"; // Brake Unterweser + case "2": + return "4402"; // Rastede + case "3": + return "4403"; // Bad Zwischenahn + case "4": + return "4404"; // Elsfleth + case "5": + return "4405"; // Edewecht + case "6": + return "4406"; // Berne + case "7": + return "4407"; // Wardenburg + case "8": + return "4408"; // Hude Oldenburg + case "9": + return "4409"; // Westerstede-Ocholt + default: + return ""; + } + } + + private static String fromNumber442(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4421"; // Wilhelmshaven + case "2": + return "4422"; // Sande Kr Friesl + case "3": + return "4423"; // Fedderwarden + case "5": + return "4425"; // Wangerland-Hooksiel + case "6": + return "4426"; // Wangerland-Horumersiel + default: + return ""; + } + } + + private static String fromNumber443(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4431"; // Wildeshausen + case "2": + return "4432"; // Dötlingen-Brettorf + case "3": + return "4433"; // Dötlingen + case "4": + return "4434"; // Colnrade + case "5": + return "4435"; // Grossenkneten + default: + return ""; + } + } + + private static String fromNumber444(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4441"; // Vechta + case "2": + return "4442"; // Lohne Oldenburg + case "3": + return "4443"; // Dinklage + case "4": + return "4444"; // Goldenstedt + case "5": + return "4445"; // Visbek Kr Vechta + case "6": + return "4446"; // Bakum Kr Vechta + case "7": + return "4447"; // Vechta-Langförden + default: + return ""; + } + } + + private static String fromNumber445(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4451"; // Varel Jadebusen + case "2": + return "4452"; // Zetel-Neuenburg + case "3": + return "4453"; // Zetel + case "4": + return "4454"; // Jade + case "5": + return "4455"; // Jade-Schweiburg + case "6": + return "4456"; // Varel-Altjührden + case "8": + return "4458"; // Wiefelstede-Spohle + default: + return ""; + } + } + + private static String fromNumber446(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4461"; // Jever + case "2": + return "4462"; // Wittmund + case "3": + return "4463"; // Wangerland + case "4": + return "4464"; // Wittmund-Carolinensiel + case "5": + return "4465"; // Friedeburg Ostfriesl + case "6": + return "4466"; // Wittmund-Ardorf + case "7": + return "4467"; // Wittmund-Funnix + case "8": + return "4468"; // Friedeburg-Reepsholt + case "9": + return "4469"; // Wangerooge + default: + return ""; + } + } + + private static String fromNumber447(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4471"; // Cloppenburg + case "2": + return "4472"; // Lastrup + case "3": + return "4473"; // Emstek + case "4": + return "4474"; // Garrel + case "5": + return "4475"; // Molbergen + case "7": + return "4477"; // Lastrup-Hemmelte + case "8": + return "4478"; // Cappeln Oldenburg + case "9": + return "4479"; // Molbergen-Peheim + default: + return ""; + } + } + + private static String fromNumber448(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4480"; // Ovelgönne-Strückhausen + case "1": + return "4481"; // Hatten-Sandkrug + case "2": + return "4482"; // Hatten + case "3": + return "4483"; // Ovelgönne-Großenmeer + case "4": + return "4484"; // Hude-Wüsting + case "5": + return "4485"; // Elsfleth-Huntorf + case "6": + return "4486"; // Edewecht-Friedrichsfehn + case "7": + return "4487"; // Grossenkneten-Huntlosen + case "8": + return "4488"; // Westerstede + case "9": + return "4489"; // Apen + default: + return ""; + } + } + + private static String fromNumber449(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4491"; // Friesoythe + case "2": + return "4492"; // Saterland + case "3": + return "4493"; // Friesoythe-Gehlenberg + case "4": + return "4494"; // Bösel Oldenburg + case "5": + return "4495"; // Friesoythe-Thüle + case "6": + return "4496"; // Friesoythe-Markhausen + case "7": + return "4497"; // Barßel-Harkebrügge + case "8": + return "4498"; // Saterland-Ramsloh + case "9": + return "4499"; // Barssel + default: + return ""; + } + } + + private static String fromNumber45(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber450(number.substring(1)); + case "1": + return "451"; // Lübeck + case "2": + return fromNumber452(number.substring(1)); + case "3": + return fromNumber453(number.substring(1)); + case "4": + return fromNumber454(number.substring(1)); + case "5": + return fromNumber455(number.substring(1)); + case "6": + return fromNumber456(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber450(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4501"; // Kastorf Holst + case "2": + return "4502"; // Lübeck-Travemünde + case "3": + return "4503"; // Timmendorfer Strand + case "4": + return "4504"; // Ratekau + case "5": + return "4505"; // Stockelsdorf-Curau + case "6": + return "4506"; // Stockelsdorf-Krumbeck + case "8": + return "4508"; // Krummesse + case "9": + return "4509"; // Groß Grönau + default: + return ""; + } + } + + private static String fromNumber452(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4521"; // Eutin + case "2": + return "4522"; // Plön + case "3": + return "4523"; // Malente + case "4": + return "4524"; // Scharbeutz-Pönitz + case "5": + return "4525"; // Ahrensbök + case "6": + return "4526"; // Ascheberg Holstein + case "7": + return "4527"; // Bosau + case "8": + return "4528"; // Schönwalde am Bungsberg + case "9": + return "4529"; // Süsel-Bujendorf + default: + return ""; + } + } + + private static String fromNumber453(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4531"; // Bad Oldesloe + case "2": + return "4532"; // Bargteheide + case "3": + return "4533"; // Reinfeld Holstein + case "4": + return "4534"; // Steinburg Kr Storman + case "5": + return "4535"; // Nahe + case "6": + return "4536"; // Steinhorst Lauenb + case "7": + return "4537"; // Sülfeld Holst + case "9": + return "4539"; // Westerau + default: + return ""; + } + } + + private static String fromNumber454(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4541"; // Ratzeburg + case "2": + return "4542"; // Mölln Lauenb + case "3": + return "4543"; // Nusse + case "4": + return "4544"; // Berkenthin + case "5": + return "4545"; // Seedorf Lauenb + case "6": + return "4546"; // Mustin Lauenburg + case "7": + return "4547"; // Gudow Lauenb + default: + return ""; + } + } + + private static String fromNumber455(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4550"; // Bühnsdorf + case "1": + return "4551"; // Bad Segeberg + case "2": + return "4552"; // Leezen + case "3": + return "4553"; // Geschendorf + case "4": + return "4554"; // Wahlstedt + case "5": + return "4555"; // Seedorf b Bad Segeberg + case "6": + return "4556"; // Ahrensbök-Gnissau + case "7": + return "4557"; // Blunk + case "8": + return "4558"; // Todesfelde + case "9": + return "4559"; // Wensin + default: + return ""; + } + } + + private static String fromNumber456(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4561"; // Neustadt in Holstein + case "2": + return "4562"; // Grömitz + case "3": + return "4563"; // Scharbeutz-Haffkrug + case "4": + return "4564"; // Schashagen + default: + return ""; + } + } + + private static String fromNumber46(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber460(number.substring(1)); + case "1": + return "461"; // Flensburg + case "2": + return fromNumber462(number.substring(1)); + case "3": + return fromNumber463(number.substring(1)); + case "4": + return fromNumber464(number.substring(1)); + case "5": + return fromNumber465(number.substring(1)); + case "6": + return fromNumber466(number.substring(1)); + case "7": + return fromNumber467(number.substring(1)); + case "8": + return fromNumber468(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber460(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4602"; // Freienwill + case "3": + return "4603"; // Havetoft + case "4": + return "4604"; // Grossenwiehe + case "5": + return "4605"; // Medelby + case "6": + return "4606"; // Wanderup + case "7": + return "4607"; // Janneby + case "8": + return "4608"; // Handewitt + case "9": + return "4609"; // Eggebek + default: + return ""; + } + } + + private static String fromNumber462(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4621"; // Schleswig + case "2": + return "4622"; // Taarstedt + case "3": + return "4623"; // Böklund + case "4": + return "4624"; // Kropp + case "5": + return "4625"; // Jübek + case "6": + return "4626"; // Treia + case "7": + return "4627"; // Dörpstedt + default: + return ""; + } + } + + private static String fromNumber463(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4630"; // Barderup + case "1": + return "4631"; // Glücksburg Ostsee + case "2": + return "4632"; // Steinbergkirche + case "3": + return "4633"; // Satrup + case "4": + return "4634"; // Husby + case "5": + return "4635"; // Sörup + case "6": + return "4636"; // Langballig + case "7": + return "4637"; // Sterup + case "8": + return "4638"; // Tarp + case "9": + return "4639"; // Schafflund + default: + return ""; + } + } + + private static String fromNumber464(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4641"; // Süderbrarup + case "2": + return "4642"; // Kappeln Schlei + case "3": + return "4643"; // Gelting Angeln + case "4": + return "4644"; // Karby + case "6": + return "4646"; // Mohrkirch + default: + return ""; + } + } + + private static String fromNumber465(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4651"; // Sylt + default: + return ""; + } + } + + private static String fromNumber466(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4661"; // Niebüll + case "2": + return "4662"; // Leck + case "3": + return "4663"; // Süderlügum + case "4": + return "4664"; // Neukirchen b Niebüll + case "5": + return "4665"; // Emmelsbüll-Horsbüll + case "6": + return "4666"; // Ladelund + case "7": + return "4667"; // Dagebüll + case "8": + return "4668"; // Klanxbüll + default: + return ""; + } + } + + private static String fromNumber467(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4671"; // Bredstedt + case "2": + return "4672"; // Langenhorn + case "3": + return "4673"; // Joldelund + case "4": + return "4674"; // Ockholm + default: + return ""; + } + } + + private static String fromNumber468(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4681"; // Wyk auf Föhr + case "2": + return "4682"; // Amrum + case "3": + return "4683"; // Oldsum + case "4": + return "4684"; // Langeneß Hallig + default: + return ""; + } + } + + private static String fromNumber47(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber470(number.substring(1)); + case "1": + return "471"; // Bremerhaven + case "2": + return fromNumber472(number.substring(1)); + case "3": + return fromNumber473(number.substring(1)); + case "4": + return fromNumber474(number.substring(1)); + case "5": + return fromNumber475(number.substring(1)); + case "6": + return fromNumber476(number.substring(1)); + case "7": + return fromNumber477(number.substring(1)); + case "9": + return fromNumber479(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber470(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4702"; // Sandstedt + case "3": + return "4703"; // Loxstedt-Donnern + case "4": + return "4704"; // Drangstedt + case "5": + return "4705"; // Wremen + case "6": + return "4706"; // Schiffdorf + case "7": + return "4707"; // Langen-Neuenwalde + case "8": + return "4708"; // Ringstedt + default: + return ""; + } + } + + private static String fromNumber472(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4721"; // Cuxhaven + case "2": + return "4722"; // Cuxhaven-Altenbruch + case "3": + return "4723"; // Cuxhaven-Altenwalde + case "4": + return "4724"; // Cuxhaven-Lüdingworth + case "5": + return "4725"; // Helgoland + default: + return ""; + } + } + + private static String fromNumber473(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4731"; // Nordenham + case "2": + return "4732"; // Stadland-Rodenkirchen + case "3": + return "4733"; // Butjadingen-Burhave + case "4": + return "4734"; // Stadland-Seefeld + case "5": + return "4735"; // Butjadingen-Stollhamm + case "6": + return "4736"; // Butjadingen-Tossens + case "7": + return "4737"; // Stadland-Schwei + default: + return ""; + } + } + + private static String fromNumber474(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4740"; // Loxstedt-Dedesdorf + case "1": + return "4741"; // Nordholz b Bremerhaven + case "2": + return "4742"; // Dorum + case "3": + return "4743"; // Langen b Bremerhaven + case "4": + return "4744"; // Loxstedt + case "5": + return "4745"; // Bad Bederkesa + case "6": + return "4746"; // Hagen b Bremerhaven + case "7": + return "4747"; // Beverstedt + case "8": + return "4748"; // Stubben b Bremerhaven + case "9": + return "4749"; // Schiffdorf-Geestenseth + default: + return ""; + } + } + + private static String fromNumber475(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4751"; // Otterndorf + case "2": + return "4752"; // Neuhaus Oste + case "3": + return "4753"; // Balje + case "4": + return "4754"; // Bülkau + case "5": + return "4755"; // Ihlienworth + case "6": + return "4756"; // Odisheim + case "7": + return "4757"; // Wanna + case "8": + return "4758"; // Nordleda + default: + return ""; + } + } + + private static String fromNumber476(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4761"; // Bremervörde + case "2": + return "4762"; // Kutenholz + case "3": + return "4763"; // Gnarrenburg + case "4": + return "4764"; // Gnarrenburg-Klenkendorf + case "5": + return "4765"; // Ebersdorf b Bremervörde + case "6": + return "4766"; // Basdahl + case "7": + return "4767"; // Bremervörde-Bevern + case "8": + return "4768"; // Hipstedt + case "9": + return "4769"; // Bremervörde-Iselersheim + default: + return ""; + } + } + + private static String fromNumber477(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4770"; // Wischhafen + case "1": + return "4771"; // Hemmoor + case "2": + return "4772"; // Oberndorf Oste + case "3": + return "4773"; // Lamstedt + case "4": + return "4774"; // Hechthausen + case "5": + return "4775"; // Grossenwörden + case "6": + return "4776"; // Osten-Altendorf + case "7": + return "4777"; // Cadenberge + case "8": + return "4778"; // Wingst + case "9": + return "4779"; // Freiburg Elbe + default: + return ""; + } + } + + private static String fromNumber479(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4791"; // Osterholz-Scharmbeck + case "2": + return "4792"; // Worpswede + case "3": + return "4793"; // Hambergen + case "4": + return "4794"; // Worpswede-Ostersode + case "5": + return "4795"; // Garlstedt + case "6": + return "4796"; // Teufelsmoor + default: + return ""; + } + } + + private static String fromNumber48(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber480(number.substring(1)); + case "1": + return "481"; // Heide Holst + case "2": + return fromNumber482(number.substring(1)); + case "3": + return fromNumber483(number.substring(1)); + case "4": + return fromNumber484(number.substring(1)); + case "5": + return fromNumber485(number.substring(1)); + case "6": + return fromNumber486(number.substring(1)); + case "7": + return fromNumber487(number.substring(1)); + case "8": + return fromNumber488(number.substring(1)); + case "9": + return fromNumber489(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber480(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4802"; // Wrohm + case "3": + return "4803"; // Pahlen + case "4": + return "4804"; // Nordhastedt + case "5": + return "4805"; // Schafstedt + case "6": + return "4806"; // Sarzbüttel + default: + return ""; + } + } + + private static String fromNumber482(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4821"; // Itzehoe + case "2": + return "4822"; // Kellinghusen + case "3": + return "4823"; // Wilster + case "4": + return "4824"; // Krempe + case "5": + return "4825"; // Burg Dithmarschen + case "6": + return "4826"; // Hohenlockstedt + case "7": + return "4827"; // Wacken + case "8": + return "4828"; // Lägerdorf + case "9": + return "4829"; // Wewelsfleth + default: + return ""; + } + } + + private static String fromNumber483(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4830"; // Süderhastedt + case "2": + return "4832"; // Meldorf + case "3": + return "4833"; // Wesselburen + case "4": + return "4834"; // Büsum + case "5": + return "4835"; // Albersdorf Holst + case "6": + return "4836"; // Hennstedt Dithm + case "7": + return "4837"; // Neuenkirchen Dithm + case "8": + return "4838"; // Tellingstedt + case "9": + return "4839"; // Wöhrden Dithm + default: + return ""; + } + } + + private static String fromNumber484(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4841"; // Husum Nordsee + case "2": + return "4842"; // Nordstrand + case "3": + return "4843"; // Viöl + case "4": + return "4844"; // Pellworm + case "5": + return "4845"; // Ostenfeld Husum + case "6": + return "4846"; // Hattstedt + case "7": + return "4847"; // Oster-Ohrstedt + case "8": + return "4848"; // Rantrum + case "9": + return "4849"; // Hooge + default: + return ""; + } + } + + private static String fromNumber485(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4851"; // Marne + case "2": + return "4852"; // Brunsbüttel + case "3": + return "4853"; // Sankt Michaelisdonn + case "4": + return "4854"; // Friedrichskoog + case "5": + return "4855"; // Eddelak + case "6": + return "4856"; // Kronprinzenkoog + case "7": + return "4857"; // Barlt + case "8": + return "4858"; // Sankt Margarethen Holst + case "9": + return "4859"; // Windbergen + default: + return ""; + } + } + + private static String fromNumber486(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4861"; // Tönning + case "2": + return "4862"; // Garding + case "3": + return "4863"; // Sankt Peter-Ording + case "4": + return "4864"; // Oldenswort + case "5": + return "4865"; // Osterhever + default: + return ""; + } + } + + private static String fromNumber487(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4871"; // Hohenwestedt + case "2": + return "4872"; // Hanerau-Hademarschen + case "3": + return "4873"; // Aukrug + case "4": + return "4874"; // Todenbüttel + case "5": + return "4875"; // Stafstedt + case "6": + return "4876"; // Reher Holst + case "7": + return "4877"; // Hennstedt b Itzehoe + default: + return ""; + } + } + + private static String fromNumber488(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4881"; // Friedrichstadt + case "2": + return "4882"; // Lunden + case "3": + return "4883"; // Süderstapel + case "4": + return "4884"; // Schwabstedt + case "5": + return "4885"; // Bergenhusen + default: + return ""; + } + } + + private static String fromNumber489(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4892"; // Schenefeld Mittelholst + case "3": + return "4893"; // Hohenaspe + default: + return ""; + } + } + + private static String fromNumber49(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber490(number.substring(1)); + case "1": + return "491"; // Leer Ostfriesland + case "2": + return fromNumber492(number.substring(1)); + case "3": + return fromNumber493(number.substring(1)); + case "4": + return fromNumber494(number.substring(1)); + case "5": + return fromNumber495(number.substring(1)); + case "6": + return fromNumber496(number.substring(1)); + case "7": + return fromNumber497(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber490(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "4902"; // Jemgum-Ditzum + case "3": + return "4903"; // Wymeer + default: + return ""; + } + } + + private static String fromNumber492(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4920"; // Wirdum + case "1": + return "4921"; // Emden Stadt + case "2": + return "4922"; // Borkum + case "3": + return "4923"; // Krummhörn-Pewsum + case "4": + return "4924"; // Moormerland-Oldersum + case "5": + return "4925"; // Hinte + case "6": + return "4926"; // Krummhörn-Greetsiel + case "7": + return "4927"; // Krummhörn-Loquard + case "8": + return "4928"; // Ihlow-Riepe + case "9": + return "4929"; // Ihlow Kr Aurich + default: + return ""; + } + } + + private static String fromNumber493(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4931"; // Norden + case "2": + return "4932"; // Norderney + case "3": + return "4933"; // Dornum Ostfriesl + case "4": + return "4934"; // Marienhafe + case "5": + return "4935"; // Juist + case "6": + return "4936"; // Grossheide + case "8": + return "4938"; // Hagermarsch + case "9": + return "4939"; // Baltrum + default: + return ""; + } + } + + private static String fromNumber494(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4941"; // Aurich + case "2": + return "4942"; // Südbrookmerland + case "3": + return "4943"; // Grossefehn + case "4": + return "4944"; // Wiesmoor + case "5": + return "4945"; // Grossefehn-Timmel + case "6": + return "4946"; // Grossefehn-Bagband + case "7": + return "4947"; // Aurich-Ogenbargen + case "8": + return "4948"; // Wiesmoor-Marcardsmoor + default: + return ""; + } + } + + private static String fromNumber495(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "4950"; // Holtland + case "1": + return "4951"; // Weener + case "2": + return "4952"; // Rhauderfehn + case "3": + return "4953"; // Bunde + case "4": + return "4954"; // Moormerland + case "5": + return "4955"; // Westoverledingen + case "6": + return "4956"; // Uplengen + case "7": + return "4957"; // Detern + case "8": + return "4958"; // Jemgum + case "9": + return "4959"; // Dollart + default: + return ""; + } + } + + private static String fromNumber496(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4961"; // Papenburg + case "2": + return "4962"; // Papenburg-Aschendorf + case "3": + return "4963"; // Dörpen + case "4": + return "4964"; // Rhede Ems + case "5": + return "4965"; // Surwold + case "6": + return "4966"; // Neubörger + case "7": + return "4967"; // Rhauderfehn-Burlage + case "8": + return "4968"; // Neulehe + default: + return ""; + } + } + + private static String fromNumber497(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "4971"; // Esens + case "2": + return "4972"; // Langeoog + case "3": + return "4973"; // Wittmund-Burhafe + case "4": + return "4974"; // Neuharlingersiel + case "5": + return "4975"; // Westerholt Ostfriesl + case "6": + return "4976"; // Spiekeroog + case "7": + return "4977"; // Blomberg Ostfriesl + default: + return ""; + } + } + + private static String fromNumber5(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber50(number.substring(1)); + case "1": + return fromNumber51(number.substring(1)); + case "2": + return fromNumber52(number.substring(1)); + case "3": + return fromNumber53(number.substring(1)); + case "4": + return fromNumber54(number.substring(1)); + case "5": + return fromNumber55(number.substring(1)); + case "6": + return fromNumber56(number.substring(1)); + case "7": + return fromNumber57(number.substring(1)); + case "8": + return fromNumber58(number.substring(1)); + case "9": + return fromNumber59(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber50(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber502(number.substring(1)); + case "3": + return fromNumber503(number.substring(1)); + case "4": + return fromNumber504(number.substring(1)); + case "5": + return fromNumber505(number.substring(1)); + case "6": + return fromNumber506(number.substring(1)); + case "7": + return fromNumber507(number.substring(1)); + case "8": + return fromNumber508(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber502(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5021"; // Nienburg Weser + case "2": + return "5022"; // Wietzen + case "3": + return "5023"; // Liebenau Kr Nieburg Weser + case "4": + return "5024"; // Rohrsen Kr Nienburg Weser + case "5": + return "5025"; // Estorf Weser + case "6": + return "5026"; // Steimbke + case "7": + return "5027"; // Linsburg + case "8": + return "5028"; // Pennigsehl + default: + return ""; + } + } + + private static String fromNumber503(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5031"; // Wunstorf + case "2": + return "5032"; // Neustadt am Rübenberge + case "3": + return "5033"; // Wunstorf-Grossenheidorn + case "4": + return "5034"; // Neustadt-Hagen + case "5": + return "5035"; // Gross Munzel + case "6": + return "5036"; // Neustadt-Schneeren + case "7": + return "5037"; // Bad Rehburg + default: + return ""; + } + } + + private static String fromNumber504(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5041"; // Springe Deister + case "2": + return "5042"; // Bad Münder am Deister + case "3": + return "5043"; // Lauenau + case "4": + return "5044"; // Springe-Eldagsen + case "5": + return "5045"; // Springe-Bennigsen + default: + return ""; + } + } + + private static String fromNumber505(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5051"; // Bergen Kr Celle + case "2": + return "5052"; // Hermannsburg + case "3": + return "5053"; // Faßberg-Müden + case "4": + return "5054"; // Bergen-Sülze + case "5": + return "5055"; // Fassberg + case "6": + return "5056"; // Winsen-Meissendorf + default: + return ""; + } + } + + private static String fromNumber506(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5060"; // Bodenburg + case "2": + return "5062"; // Holle b Hildesheim + case "3": + return "5063"; // Bad Salzdetfurth + case "4": + return "5064"; // Groß Düngen + case "5": + return "5065"; // Sibbesse + case "6": + return "5066"; // Sarstedt + case "7": + return "5067"; // Bockenem + case "8": + return "5068"; // Elze Leine + case "9": + return "5069"; // Nordstemmen + default: + return ""; + } + } + + private static String fromNumber507(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5071"; // Schwarmstedt + case "2": + return "5072"; // Neustadt-Mandelsloh + case "3": + return "5073"; // Neustadt-Esperke + case "4": + return "5074"; // Rodewald + default: + return ""; + } + } + + private static String fromNumber508(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5082"; // Langlingen + case "3": + return "5083"; // Hohne b Celle + case "4": + return "5084"; // Hambühren + case "5": + return "5085"; // Burgdorf-Ehlershausen + case "6": + return "5086"; // Celle-Scheuen + default: + return ""; + } + } + + private static String fromNumber51(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber510(number.substring(1)); + case "1": + return "511"; // Hannover + case "2": + return fromNumber512(number.substring(1)); + case "3": + return fromNumber513(number.substring(1)); + case "4": + return fromNumber514(number.substring(1)); + case "5": + return fromNumber515(number.substring(1)); + case "6": + return fromNumber516(number.substring(1)); + case "7": + return fromNumber517(number.substring(1)); + case "8": + return fromNumber518(number.substring(1)); + case "9": + return fromNumber519(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber510(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5101"; // Pattensen + case "2": + return "5102"; // Laatzen + case "3": + return "5103"; // Wennigsen Deister + case "5": + return "5105"; // Barsinghausen + case "8": + return "5108"; // Gehrden Han + case "9": + return "5109"; // Ronnenberg + default: + return ""; + } + } + + private static String fromNumber512(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5121"; // Hildesheim + case "3": + return "5123"; // Schellerten + case "6": + return "5126"; // Algermissen + case "7": + return "5127"; // Harsum + case "8": + return "5128"; // Hohenhameln + case "9": + return "5129"; // Söhlde + default: + return ""; + } + } + + private static String fromNumber513(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5130"; // Wedemark + case "1": + return "5131"; // Garbsen + case "2": + return "5132"; // Lehrte + case "5": + return "5135"; // Burgwedel-Fuhrberg + case "6": + return "5136"; // Burgdorf Kr Hannover + case "7": + return "5137"; // Seelze + case "8": + return "5138"; // Sehnde + case "9": + return "5139"; // Burgwedel + default: + return ""; + } + } + + private static String fromNumber514(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5141"; // Celle + case "2": + return "5142"; // Eschede + case "3": + return "5143"; // Winsen Aller + case "4": + return "5144"; // Wathlingen + case "5": + return "5145"; // Beedenbostel + case "6": + return "5146"; // Wietze + case "7": + return "5147"; // Uetze-Hänigsen + case "8": + return "5148"; // Steinhorst Niedersachs + case "9": + return "5149"; // Wienhausen + default: + return ""; + } + } + + private static String fromNumber515(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5151"; // Hameln + case "2": + return "5152"; // Hessisch Oldendorf + case "3": + return "5153"; // Salzhemmendorf + case "4": + return "5154"; // Aerzen + case "5": + return "5155"; // Emmerthal + case "6": + return "5156"; // Coppenbrügge + case "7": + return "5157"; // Emmerthal-Börry + case "8": + return "5158"; // Hemeringen + case "9": + return "5159"; // Coppenbrügge-Bisperode + default: + return ""; + } + } + + private static String fromNumber516(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5161"; // Walsrode + case "2": + return "5162"; // Fallingbostel + case "3": + return "5163"; // Fallingbostel-Dorfmark + case "4": + return "5164"; // Hodenhagen + case "5": + return "5165"; // Rethem Aller + case "6": + return "5166"; // Walsrode-Kirchboitzen + case "7": + return "5167"; // Walsrode-Westenholz + case "8": + return "5168"; // Walsrode-Stellichte + default: + return ""; + } + } + + private static String fromNumber517(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5171"; // Peine + case "2": + return "5172"; // Ilsede + case "3": + return "5173"; // Uetze + case "4": + return "5174"; // Lahstedt + case "5": + return "5175"; // Lehrte-Arpke + case "6": + return "5176"; // Edemissen + case "7": + return "5177"; // Edemissen-Abbensen + default: + return ""; + } + } + + private static String fromNumber518(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5181"; // Alfeld Leine + case "2": + return "5182"; // Gronau Leine + case "3": + return "5183"; // Lamspringe + case "4": + return "5184"; // Freden Leine + case "5": + return "5185"; // Duingen + case "6": + return "5186"; // Salzhemmendorf-Wallensen + case "7": + return "5187"; // Delligsen + default: + return ""; + } + } + + private static String fromNumber519(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5190"; // Soltau-Emmingen + case "1": + return "5191"; // Soltau + case "2": + return "5192"; // Munster + case "3": + return "5193"; // Schneverdingen + case "4": + return "5194"; // Bispingen + case "5": + return "5195"; // Neuenkirchen b Soltau + case "6": + return "5196"; // Wietzendorf + case "7": + return "5197"; // Soltau-Frielingen + case "8": + return "5198"; // Schneverdingen-Wintermoor + case "9": + return "5199"; // Schneverdingen-Heber + default: + return ""; + } + } + + private static String fromNumber52(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber520(number.substring(1)); + case "1": + return "521"; // Bielefeld + case "2": + return fromNumber522(number.substring(1)); + case "3": + return fromNumber523(number.substring(1)); + case "4": + return fromNumber524(number.substring(1)); + case "5": + return fromNumber525(number.substring(1)); + case "6": + return fromNumber526(number.substring(1)); + case "7": + return fromNumber527(number.substring(1)); + case "8": + return fromNumber528(number.substring(1)); + case "9": + return fromNumber529(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber520(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5201"; // Halle Westf + case "2": + return "5202"; // Oerlinghausen + case "3": + return "5203"; // Werther Westf + case "4": + return "5204"; // Steinhagen Westf + case "5": + return "5205"; // Bielefeld-Sennestadt + case "6": + return "5206"; // Bielefeld-Jöllenbeck + case "7": + return "5207"; // Schloss Holte-Stukenbrock + case "8": + return "5208"; // Leopoldshöhe + case "9": + return "5209"; // Gütersloh-Friedrichsdorf + default: + return ""; + } + } + + private static String fromNumber522(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5221"; // Herford + case "2": + return "5222"; // Bad Salzuflen + case "3": + return "5223"; // Bünde + case "4": + return "5224"; // Enger Westf + case "5": + return "5225"; // Spenge + case "6": + return "5226"; // Bruchmühlen Westf + case "8": + return "5228"; // Vlotho-Exter + default: + return ""; + } + } + + private static String fromNumber523(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5231"; // Detmold + case "2": + return "5232"; // Lage Lippe + case "3": + return "5233"; // Steinheim Westf + case "4": + return "5234"; // Horn-Bad Meinberg + case "5": + return "5235"; // Blomberg Lippe + case "6": + return "5236"; // Blomberg-Grossenmarpe + case "7": + return "5237"; // Augustdorf + case "8": + return "5238"; // Nieheim-Himmighausen + default: + return ""; + } + } + + private static String fromNumber524(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5241"; // Gütersloh + case "2": + return "5242"; // Rheda-Wiedenbrück + case "4": + return "5244"; // Rietberg + case "5": + return "5245"; // Herzebrock-Clarholz + case "6": + return "5246"; // Verl + case "7": + return "5247"; // Harsewinkel + case "8": + return "5248"; // Langenberg Kr Gütersloh + default: + return ""; + } + } + + private static String fromNumber525(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5250"; // Delbrück Westf + case "1": + return "5251"; // Paderborn + case "2": + return "5252"; // Bad Lippspringe + case "3": + return "5253"; // Bad Driburg + case "4": + return "5254"; // Paderborn-Schloss Neuhaus + case "5": + return "5255"; // Altenbeken + case "7": + return "5257"; // Hövelhof + case "8": + return "5258"; // Salzkotten + case "9": + return "5259"; // Bad Driburg-Neuenheerse + default: + return ""; + } + } + + private static String fromNumber526(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5261"; // Lemgo + case "2": + return "5262"; // Extertal + case "3": + return "5263"; // Barntrup + case "4": + return "5264"; // Kalletal + case "5": + return "5265"; // Dörentrup + case "6": + return "5266"; // Lemgo-Kirchheide + default: + return ""; + } + } + + private static String fromNumber527(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5271"; // Höxter + case "2": + return "5272"; // Brakel Westf + case "3": + return "5273"; // Beverungen + case "4": + return "5274"; // Nieheim + case "5": + return "5275"; // Höxter-Ottbergen + case "6": + return "5276"; // Marienmünster + case "7": + return "5277"; // Höxter-Fürstenau + case "8": + return "5278"; // Höxter-Ovenhausen + default: + return ""; + } + } + + private static String fromNumber528(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5281"; // Bad Pyrmont + case "2": + return "5282"; // Schieder-Schwalenberg + case "3": + return "5283"; // Lügde-Rischenau + case "4": + return "5284"; // Schwalenberg + case "5": + return "5285"; // Bad Pyrmont-Kleinenberg + case "6": + return "5286"; // Ottenstein Niedersachs + default: + return ""; + } + } + + private static String fromNumber529(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5292"; // Lichtenau-Atteln + case "3": + return "5293"; // Paderborn-Dahl + case "4": + return "5294"; // Hövelhof-Espeln + case "5": + return "5295"; // Lichtenau Westf + default: + return ""; + } + } + + private static String fromNumber53(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber530(number.substring(1)); + case "1": + return "531"; // Braunschweig + case "2": + return fromNumber532(number.substring(1)); + case "3": + return fromNumber533(number.substring(1)); + case "4": + return fromNumber534(number.substring(1)); + case "5": + return fromNumber535(number.substring(1)); + case "6": + return fromNumber536(number.substring(1)); + case "7": + return fromNumber537(number.substring(1)); + case "8": + return fromNumber538(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber530(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5300"; // Salzgitter-Üfingen + case "1": + return "5301"; // Lehre-Essenrode + case "2": + return "5302"; // Vechelde + case "3": + return "5303"; // Wendeburg + case "4": + return "5304"; // Meine + case "5": + return "5305"; // Sickte + case "6": + return "5306"; // Cremlingen + case "7": + return "5307"; // Braunschweig-Wenden + case "8": + return "5308"; // Lehre + case "9": + return "5309"; // Lehre-Wendhausen + default: + return ""; + } + } + + private static String fromNumber532(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5320"; // Torfhaus + case "1": + return "5321"; // Goslar + case "2": + return "5322"; // Bad Harzburg + case "3": + return "5323"; // Clausthal-Zellerfeld + case "4": + return "5324"; // Vienenburg + case "5": + return "5325"; // Goslar-Hahnenklee + case "6": + return "5326"; // Langelsheim + case "7": + return "5327"; // Bad Grund Harz + case "8": + return "5328"; // Altenau Harz + case "9": + return "5329"; // Schulenberg im Oberharz + default: + return ""; + } + } + + private static String fromNumber533(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5331"; // Wolfenbüttel + case "2": + return "5332"; // Schöppenstedt + case "3": + return "5333"; // Dettum + case "4": + return "5334"; // Hornburg Kr Wolfenbüttel + case "5": + return "5335"; // Schladen + case "6": + return "5336"; // Semmenstedt + case "7": + return "5337"; // Kissenbrück + case "9": + return "5339"; // Gielde + default: + return ""; + } + } + + private static String fromNumber534(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5341"; // Salzgitter + case "4": + return "5344"; // Lengede + case "5": + return "5345"; // Baddeckenstedt + case "6": + return "5346"; // Liebenburg + case "7": + return "5347"; // Burgdorf b Salzgitter + default: + return ""; + } + } + + private static String fromNumber535(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5351"; // Helmstedt + case "2": + return "5352"; // Schöningen + case "3": + return "5353"; // Königslutter am Elm + case "4": + return "5354"; // Jerxheim + case "5": + return "5355"; // Frellstedt + case "6": + return "5356"; // Helmstedt-Barmke + case "7": + return "5357"; // Grasleben + case "8": + return "5358"; // Bahrdorf-Mackendorf + default: + return ""; + } + } + + private static String fromNumber536(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5361"; // Wolfsburg + case "2": + return "5362"; // Wolfsburg-Fallersleben + case "3": + return "5363"; // Wolfsburg-Vorsfelde + case "4": + return "5364"; // Velpke + case "5": + return "5365"; // Wolfsburg-Neindorf + case "6": + return "5366"; // Jembke + case "7": + return "5367"; // Rühen + case "8": + return "5368"; // Parsau + default: + return ""; + } + } + + private static String fromNumber537(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5371"; // Gifhorn + case "2": + return "5372"; // Meinersen + case "3": + return "5373"; // Hillerse Kr Gifhorn + case "4": + return "5374"; // Isenbüttel + case "5": + return "5375"; // Müden Aller + case "6": + return "5376"; // Wesendorf Kr Gifhorn + case "7": + return "5377"; // Ehra-Lessien + case "8": + return "5378"; // Sassenburg-Platendorf + case "9": + return "5379"; // Sassenburg-Grussendorf + default: + return ""; + } + } + + private static String fromNumber538(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5381"; // Seesen + case "2": + return "5382"; // Bad Gandersheim + case "3": + return "5383"; // Lutter am Barenberge + case "4": + return "5384"; // Seesen-Groß Rhüden + default: + return ""; + } + } + + private static String fromNumber54(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber540(number.substring(1)); + case "1": + return "541"; // Osnabrück + case "2": + return fromNumber542(number.substring(1)); + case "3": + return fromNumber543(number.substring(1)); + case "4": + return fromNumber544(number.substring(1)); + case "5": + return fromNumber545(number.substring(1)); + case "6": + return fromNumber546(number.substring(1)); + case "7": + return fromNumber547(number.substring(1)); + case "8": + return fromNumber548(number.substring(1)); + case "9": + return fromNumber549(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber540(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5401"; // Georgsmarienhütte + case "2": + return "5402"; // Bissendorf Kr Osnabrück + case "3": + return "5403"; // Bad Iburg + case "4": + return "5404"; // Westerkappeln + case "5": + return "5405"; // Hasbergen Kr Osnabrück + case "6": + return "5406"; // Belm + case "7": + return "5407"; // Wallenhorst + case "9": + return "5409"; // Hilter am Teutoburger Wald + default: + return ""; + } + } + + private static String fromNumber542(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5421"; // Dissen am Teutoburger Wald + case "2": + return "5422"; // Melle + case "3": + return "5423"; // Versmold + case "4": + return "5424"; // Bad Rothenfelde + case "5": + return "5425"; // Borgholzhausen + case "6": + return "5426"; // Glandorf + case "7": + return "5427"; // Melle-Buer + case "8": + return "5428"; // Melle-Neuenkirchen + case "9": + return "5429"; // Melle-Wellingholzhausen + default: + return ""; + } + } + + private static String fromNumber543(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5431"; // Quakenbrück + case "2": + return "5432"; // Löningen + case "3": + return "5433"; // Badbergen + case "4": + return "5434"; // Essen Oldenburg + case "5": + return "5435"; // Berge b Quakenbrück + case "6": + return "5436"; // Nortrup + case "7": + return "5437"; // Menslage + case "8": + return "5438"; // Bakum-Lüsche + case "9": + return "5439"; // Bersenbrück + default: + return ""; + } + } + + private static String fromNumber544(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5441"; // Diepholz + case "2": + return "5442"; // Barnstorf Kr Diepholz + case "3": + return "5443"; // Lemförde + case "4": + return "5444"; // Wagenfeld + case "5": + return "5445"; // Drebber + case "6": + return "5446"; // Rehden + case "7": + return "5447"; // Lembruch + case "8": + return "5448"; // Barver + default: + return ""; + } + } + + private static String fromNumber545(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5451"; // Ibbenbüren + case "2": + return "5452"; // Mettingen Westf + case "3": + return "5453"; // Recke + case "4": + return "5454"; // Hörstel-Riesenbeck + case "5": + return "5455"; // Tecklenburg-Brochterbeck + case "6": + return "5456"; // Westerkappeln-Velpe + case "7": + return "5457"; // Hopsten-Schale + case "8": + return "5458"; // Hopsten + case "9": + return "5459"; // Hörstel + default: + return ""; + } + } + + private static String fromNumber546(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5461"; // Bramsche Hase + case "2": + return "5462"; // Ankum + case "4": + return "5464"; // Alfhausen + case "5": + return "5465"; // Neuenkirchen b Bramsche + case "6": + return "5466"; // Merzen + case "7": + return "5467"; // Voltlage + case "8": + return "5468"; // Bramsche-Engter + default: + return ""; + } + } + + private static String fromNumber547(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5471"; // Bohmte + case "2": + return "5472"; // Bad Essen + case "3": + return "5473"; // Ostercappeln + case "4": + return "5474"; // Stemwede-Dielingen + case "5": + return "5475"; // Bohmte-Hunteburg + case "6": + return "5476"; // Ostercappeln-Venne + default: + return ""; + } + } + + private static String fromNumber548(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5481"; // Lengerich Westf + case "2": + return "5482"; // Tecklenburg + case "3": + return "5483"; // Lienen + case "4": + return "5484"; // Lienen-Kattenvenne + case "5": + return "5485"; // Ladbergen + default: + return ""; + } + } + + private static String fromNumber549(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5491"; // Damme Dümmer + case "2": + return "5492"; // Steinfeld Oldenburg + case "3": + return "5493"; // Neuenkirchen Kr Vechta + case "4": + return "5494"; // Holdorf Niedersachs + case "5": + return "5495"; // Vörden Kr Vechta + default: + return ""; + } + } + + private static String fromNumber55(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber550(number.substring(1)); + case "1": + return "551"; // Göttingen + case "2": + return fromNumber552(number.substring(1)); + case "3": + return fromNumber553(number.substring(1)); + case "4": + return fromNumber554(number.substring(1)); + case "5": + return fromNumber555(number.substring(1)); + case "6": + return fromNumber556(number.substring(1)); + case "7": + return fromNumber557(number.substring(1)); + case "8": + return fromNumber558(number.substring(1)); + case "9": + return fromNumber559(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber550(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5502"; // Dransfeld + case "3": + return "5503"; // Nörten-Hardenberg + case "4": + return "5504"; // Friedland Kr Göttingen + case "5": + return "5505"; // Hardegsen + case "6": + return "5506"; // Adelebsen + case "7": + return "5507"; // Ebergötzen + case "8": + return "5508"; // Gleichen-Rittmarshausen + case "9": + return "5509"; // Rosdorf Kr Göttingen + default: + return ""; + } + } + + private static String fromNumber552(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5520"; // Braunlage + case "1": + return "5521"; // Herzberg am Harz + case "2": + return "5522"; // Osterode am Harz + case "3": + return "5523"; // Bad Sachsa + case "4": + return "5524"; // Bad Lauterberg im Harz + case "5": + return "5525"; // Walkenried + case "7": + return "5527"; // Duderstadt + case "8": + return "5528"; // Gieboldehausen + case "9": + return "5529"; // Rhumspringe + default: + return ""; + } + } + + private static String fromNumber553(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5531"; // Holzminden + case "2": + return "5532"; // Stadtoldendorf + case "3": + return "5533"; // Bodenwerder + case "4": + return "5534"; // Eschershausen a d Lenne + case "5": + return "5535"; // Polle + case "6": + return "5536"; // Holzminden-Neuhaus + default: + return ""; + } + } + + private static String fromNumber554(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5541"; // Hann. Münden + case "2": + return "5542"; // Witzenhausen + case "3": + return "5543"; // Staufenberg Niedersachs + case "4": + return "5544"; // Reinhardshagen + case "5": + return "5545"; // Hedemünden + case "6": + return "5546"; // Scheden + default: + return ""; + } + } + + private static String fromNumber555(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5551"; // Northeim + case "2": + return "5552"; // Katlenburg + case "3": + return "5553"; // Kalefeld + case "4": + return "5554"; // Moringen + case "5": + return "5555"; // Moringen-Fredelsloh + case "6": + return "5556"; // Lindau Harz + default: + return ""; + } + } + + private static String fromNumber556(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5561"; // Einbeck + case "2": + return "5562"; // Dassel-Markoldendorf + case "3": + return "5563"; // Kreiensen + case "4": + return "5564"; // Dassel + case "5": + return "5565"; // Einbeck-Wenzen + default: + return ""; + } + } + + private static String fromNumber557(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5571"; // Uslar + case "2": + return "5572"; // Bodenfelde + case "3": + return "5573"; // Uslar-Volpriehausen + case "4": + return "5574"; // Oberweser + default: + return ""; + } + } + + private static String fromNumber558(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5582"; // Sankt Andreasberg + case "3": + return "5583"; // Braunlage-Hohegeiss + case "4": + return "5584"; // Hattorf am Harz + case "5": + return "5585"; // Herzberg-Sieber + case "6": + return "5586"; // Wieda + default: + return ""; + } + } + + private static String fromNumber559(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5592"; // Gleichen-Bremke + case "3": + return "5593"; // Bovenden-Lenglern + case "4": + return "5594"; // Bovenden-Reyershausen + default: + return ""; + } + } + + private static String fromNumber56(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber560(number.substring(1)); + case "1": + return "561"; // Kassel + case "2": + return fromNumber562(number.substring(1)); + case "3": + return fromNumber563(number.substring(1)); + case "4": + return fromNumber564(number.substring(1)); + case "5": + return fromNumber565(number.substring(1)); + case "6": + return fromNumber566(number.substring(1)); + case "7": + return fromNumber567(number.substring(1)); + case "8": + return fromNumber568(number.substring(1)); + case "9": + return fromNumber569(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber560(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5601"; // Schauenburg + case "2": + return "5602"; // Hessisch Lichtenau + case "3": + return "5603"; // Gudensberg + case "4": + return "5604"; // Grossalmerode + case "5": + return "5605"; // Kaufungen Hess + case "6": + return "5606"; // Zierenberg + case "7": + return "5607"; // Fuldatal + case "8": + return "5608"; // Söhrewald + case "9": + return "5609"; // Ahnatal + default: + return ""; + } + } + + private static String fromNumber562(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5621"; // Bad Wildungen + case "2": + return "5622"; // Fritzlar + case "3": + return "5623"; // Edertal + case "4": + return "5624"; // Bad Emstal + case "5": + return "5625"; // Naumburg Hess + case "6": + return "5626"; // Bad Zwesten + default: + return ""; + } + } + + private static String fromNumber563(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5631"; // Korbach + case "2": + return "5632"; // Willingen Upland + case "3": + return "5633"; // Diemelsee + case "4": + return "5634"; // Waldeck-Sachsenhausen + case "5": + return "5635"; // Vöhl + case "6": + return "5636"; // Lichtenfels-Goddelsheim + default: + return ""; + } + } + + private static String fromNumber564(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5641"; // Warburg + case "2": + return "5642"; // Warburg-Scherfede + case "3": + return "5643"; // Borgentreich + case "4": + return "5644"; // Willebadessen-Peckelsheim + case "5": + return "5645"; // Borgentreich-Borgholz + case "6": + return "5646"; // Willebadessen + case "7": + return "5647"; // Lichtenau-Kleinenberg + case "8": + return "5648"; // Brakel-Gehrden + default: + return ""; + } + } + + private static String fromNumber565(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5650"; // Cornberg + case "1": + return "5651"; // Eschwege + case "2": + return "5652"; // Bad Sooden-Allendorf + case "3": + return "5653"; // Sontra + case "4": + return "5654"; // Herleshausen + case "5": + return "5655"; // Wanfried + case "6": + return "5656"; // Waldkappel + case "7": + return "5657"; // Meissner + case "8": + return "5658"; // Wehretal + case "9": + return "5659"; // Ringgau + default: + return ""; + } + } + + private static String fromNumber566(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5661"; // Melsungen + case "2": + return "5662"; // Felsberg Hess + case "3": + return "5663"; // Spangenberg + case "4": + return "5664"; // Morschen + case "5": + return "5665"; // Guxhagen + default: + return ""; + } + } + + private static String fromNumber567(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5671"; // Hofgeismar + case "2": + return "5672"; // Bad Karlshafen + case "3": + return "5673"; // Immenhausen Hess + case "4": + return "5674"; // Grebenstein + case "5": + return "5675"; // Trendelburg + case "6": + return "5676"; // Liebenau Hess + case "7": + return "5677"; // Calden-Westuffeln + default: + return ""; + } + } + + private static String fromNumber568(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5681"; // Homberg Efze + case "2": + return "5682"; // Borken Hessen + case "3": + return "5683"; // Wabern Hess + case "4": + return "5684"; // Frielendorf + case "5": + return "5685"; // Knüllwald + case "6": + return "5686"; // Schwarzenborn Knüll + default: + return ""; + } + } + + private static String fromNumber569(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5691"; // Bad Arolsen + case "2": + return "5692"; // Wolfhagen + case "3": + return "5693"; // Volkmarsen + case "4": + return "5694"; // Diemelstadt + case "5": + return "5695"; // Twistetal + case "6": + return "5696"; // Bad Arolsen-Landau + default: + return ""; + } + } + + private static String fromNumber57(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber570(number.substring(1)); + case "1": + return "571"; // Minden Westf + case "2": + return fromNumber572(number.substring(1)); + case "3": + return fromNumber573(number.substring(1)); + case "4": + return fromNumber574(number.substring(1)); + case "5": + return fromNumber575(number.substring(1)); + case "6": + return fromNumber576(number.substring(1)); + case "7": + return fromNumber577(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber570(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5702"; // Petershagen-Lahde + case "3": + return "5703"; // Hille + case "4": + return "5704"; // Petershagen-Friedewalde + case "5": + return "5705"; // Petershagen-Windheim + case "6": + return "5706"; // Porta Westfalica + case "7": + return "5707"; // Petershagen Weser + default: + return ""; + } + } + + private static String fromNumber572(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5721"; // Stadthagen + case "2": + return "5722"; // Bückeburg + case "3": + return "5723"; // Bad Nenndorf + case "4": + return "5724"; // Obernkirchen + case "5": + return "5725"; // Lindhorst b Stadthagen + case "6": + return "5726"; // Wiedensahl + default: + return ""; + } + } + + private static String fromNumber573(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5731"; // Bad Oeynhausen + case "2": + return "5732"; // Löhne + case "3": + return "5733"; // Vlotho + case "4": + return "5734"; // Bergkirchen Westf + default: + return ""; + } + } + + private static String fromNumber574(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5741"; // Lübbecke + case "2": + return "5742"; // Preussisch Oldendorf + case "3": + return "5743"; // Espelkamp-Gestringen + case "4": + return "5744"; // Hüllhorst + case "5": + return "5745"; // Stemwede-Levern + case "6": + return "5746"; // Rödinghausen + default: + return ""; + } + } + + private static String fromNumber575(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5751"; // Rinteln + case "2": + return "5752"; // Auetal-Hattendorf + case "3": + return "5753"; // Auetal-Bernsen + case "4": + return "5754"; // Extertal-Bremke + case "5": + return "5755"; // Kalletal-Varenholz + default: + return ""; + } + } + + private static String fromNumber576(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5761"; // Stolzenau + case "3": + return "5763"; // Uchte + case "4": + return "5764"; // Steyerberg + case "5": + return "5765"; // Raddestorf + case "6": + return "5766"; // Rehburg-Loccum + case "7": + return "5767"; // Warmsen + case "8": + return "5768"; // Petershagen-Heimsen + case "9": + return "5769"; // Steyerberg-Voigtei + default: + return ""; + } + } + + private static String fromNumber577(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5771"; // Rahden Westf + case "2": + return "5772"; // Espelkamp + case "3": + return "5773"; // Stemwede-Wehdem + case "4": + return "5774"; // Wagenfeld-Ströhen + case "5": + return "5775"; // Diepenau + case "6": + return "5776"; // Preussisch Ströhen + case "7": + return "5777"; // Diepenau-Essern + default: + return ""; + } + } + + private static String fromNumber58(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber580(number.substring(1)); + case "1": + return "581"; // Uelzen + case "2": + return fromNumber582(number.substring(1)); + case "3": + return fromNumber583(number.substring(1)); + case "4": + return fromNumber584(number.substring(1)); + case "5": + return fromNumber585(number.substring(1)); + case "6": + return fromNumber586(number.substring(1)); + case "7": + return fromNumber587(number.substring(1)); + case "8": + return fromNumber588(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber580(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5802"; // Wrestedt + case "3": + return "5803"; // Rosche + case "4": + return "5804"; // Rätzlingen Kr Uelzen + case "5": + return "5805"; // Oetzen + case "6": + return "5806"; // Barum b Bad Bevensen + case "7": + return "5807"; // Altenmedingen + case "8": + return "5808"; // Gerdau + default: + return ""; + } + } + + private static String fromNumber582(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5820"; // Suhlendorf + case "1": + return "5821"; // Bad Bevensen + case "2": + return "5822"; // Ebstorf + case "3": + return "5823"; // Bienenbüttel + case "4": + return "5824"; // Bad Bodenteich + case "5": + return "5825"; // Wieren + case "6": + return "5826"; // Suderburg + case "7": + return "5827"; // Unterlüß + case "8": + return "5828"; // Himbergen + case "9": + return "5829"; // Wriedel + default: + return ""; + } + } + + private static String fromNumber583(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5831"; // Wittingen + case "2": + return "5832"; // Hankensbüttel + case "3": + return "5833"; // Brome + case "4": + return "5834"; // Wittingen-Knesebeck + case "5": + return "5835"; // Wahrenholz + case "6": + return "5836"; // Wittingen-Radenbeck + case "7": + return "5837"; // Sprakensehl + case "8": + return "5838"; // Gross Oesingen + case "9": + return "5839"; // Wittingen-Ohrdorf + default: + return ""; + } + } + + private static String fromNumber584(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5840"; // Schnackenburg + case "1": + return "5841"; // Lüchow Wendland + case "2": + return "5842"; // Schnega + case "3": + return "5843"; // Wustrow Wendland + case "4": + return "5844"; // Clenze + case "5": + return "5845"; // Bergen Dumme + case "6": + return "5846"; // Gartow Niedersachs + case "8": + return "5848"; // Trebel + case "9": + return "5849"; // Waddeweitz + default: + return ""; + } + } + + private static String fromNumber585(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "5850"; // Neetze + case "1": + return "5851"; // Dahlenburg + case "2": + return "5852"; // Bleckede + case "3": + return "5853"; // Neu Darchau + case "4": + return "5854"; // Bleckede-Barskamp + case "5": + return "5855"; // Nahrendorf + case "7": + return "5857"; // Bleckede-Brackede + case "8": + return "5858"; // Hitzacker-Wietzetze + case "9": + return "5859"; // Thomasburg + default: + return ""; + } + } + + private static String fromNumber586(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5861"; // Dannenberg Elbe + case "2": + return "5862"; // Hitzacker Elbe + case "3": + return "5863"; // Zernien + case "4": + return "5864"; // Jameln + case "5": + return "5865"; // Gusborn + default: + return ""; + } + } + + private static String fromNumber587(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5872"; // Stoetze + case "3": + return "5873"; // Eimke + case "4": + return "5874"; // Soltendieck + case "5": + return "5875"; // Emmendorf + default: + return ""; + } + } + + private static String fromNumber588(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "5882"; // Gorleben + case "3": + return "5883"; // Lemgow + default: + return ""; + } + } + + private static String fromNumber59(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber590(number.substring(1)); + case "1": + return "591"; // Lingen (Ems) + case "2": + return fromNumber592(number.substring(1)); + case "3": + return fromNumber593(number.substring(1)); + case "4": + return fromNumber594(number.substring(1)); + case "5": + return fromNumber595(number.substring(1)); + case "6": + return fromNumber596(number.substring(1)); + case "7": + return fromNumber597(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber590(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5901"; // Fürstenau b Bramsche + case "2": + return "5902"; // Freren + case "3": + return "5903"; // Emsbüren + case "4": + return "5904"; // Lengerich Emsl + case "5": + return "5905"; // Beesten + case "6": + return "5906"; // Lünne + case "7": + return "5907"; // Geeste + case "8": + return "5908"; // Wietmarschen-Lohne + case "9": + return "5909"; // Wettrup + default: + return ""; + } + } + + private static String fromNumber592(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5921"; // Nordhorn + case "2": + return "5922"; // Bad Bentheim + case "3": + return "5923"; // Schüttorf + case "4": + return "5924"; // Bad Bentheim-Gildehaus + case "5": + return "5925"; // Wietmarschen + case "6": + return "5926"; // Engden + default: + return ""; + } + } + + private static String fromNumber593(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5931"; // Meppen + case "2": + return "5932"; // Haren Ems + case "3": + return "5933"; // Lathen + case "4": + return "5934"; // Haren-Rütenbrock + case "5": + return "5935"; // Twist-Schöninghsdorf + case "6": + return "5936"; // Twist + case "7": + return "5937"; // Geeste-Gross Hesepe + case "9": + return "5939"; // Sustrum + default: + return ""; + } + } + + private static String fromNumber594(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5941"; // Neuenhaus Dinkel + case "2": + return "5942"; // Uelsen + case "3": + return "5943"; // Emlichheim + case "4": + return "5944"; // Hoogstede + case "5": + return "5945"; // Wilsum + case "6": + return "5946"; // Georgsdorf + case "7": + return "5947"; // Laar Vechte + case "8": + return "5948"; // Itterbeck + default: + return ""; + } + } + + private static String fromNumber595(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5951"; // Werlte + case "2": + return "5952"; // Sögel + case "3": + return "5953"; // Börger + case "4": + return "5954"; // Lorup + case "5": + return "5955"; // Esterwegen + case "6": + return "5956"; // Rastdorf + case "7": + return "5957"; // Lindern Oldenburg + default: + return ""; + } + } + + private static String fromNumber596(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5961"; // Haselünne + case "2": + return "5962"; // Herzlake + case "3": + return "5963"; // Bawinkel + case "4": + return "5964"; // Lähden + case "5": + return "5965"; // Klein Berssen + case "6": + return "5966"; // Meppen-Apeldorn + default: + return ""; + } + } + + private static String fromNumber597(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "5971"; // Rheine + case "3": + return "5973"; // Neuenkirchen Kr Steinfurt + case "5": + return "5975"; // Rheine-Mesum + case "6": + return "5976"; // Salzbergen + case "7": + return "5977"; // Spelle + case "8": + return "5978"; // Hörstel-Dreierwalde + default: + return ""; + } + } + + private static String fromNumber6(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber60(number.substring(1)); + case "1": + return fromNumber61(number.substring(1)); + case "2": + return fromNumber62(number.substring(1)); + case "3": + return fromNumber63(number.substring(1)); + case "4": + return fromNumber64(number.substring(1)); + case "5": + return fromNumber65(number.substring(1)); + case "6": + return fromNumber66(number.substring(1)); + case "7": + return fromNumber67(number.substring(1)); + case "8": + return fromNumber68(number.substring(1)); + case "9": + return "69"; // Frankfurt am Main + default: + return ""; + } + } + + private static String fromNumber60(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber600(number.substring(1)); + case "2": + return fromNumber602(number.substring(1)); + case "3": + return fromNumber603(number.substring(1)); + case "4": + return fromNumber604(number.substring(1)); + case "5": + return fromNumber605(number.substring(1)); + case "6": + return fromNumber606(number.substring(1)); + case "7": + return fromNumber607(number.substring(1)); + case "8": + return fromNumber608(number.substring(1)); + case "9": + return fromNumber609(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber600(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6002"; // Ober-Mörlen + case "3": + return "6003"; // Rosbach v d Höhe + case "4": + return "6004"; // Lich-Eberstadt + case "7": + return "6007"; // Rosbach-Rodheim + case "8": + return "6008"; // Echzell + default: + return ""; + } + } + + private static String fromNumber602(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6020"; // Heigenbrücken + case "1": + return "6021"; // Aschaffenburg + case "2": + return "6022"; // Obernburg a Main + case "3": + return "6023"; // Alzenau i Ufr + case "4": + return "6024"; // Schöllkrippen + case "6": + return "6026"; // Grossostheim + case "7": + return "6027"; // Stockstadt a Main + case "8": + return "6028"; // Sulzbach a Main + case "9": + return "6029"; // Mömbris + default: + return ""; + } + } + + private static String fromNumber603(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6031"; // Friedberg Hess + case "2": + return "6032"; // Bad Nauheim + case "3": + return "6033"; // Butzbach + case "4": + return "6034"; // Wöllstadt + case "5": + return "6035"; // Reichelsheim Wetterau + case "6": + return "6036"; // Wölfersheim + case "9": + return "6039"; // Karben + default: + return ""; + } + } + + private static String fromNumber604(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6041"; // Glauburg + case "2": + return "6042"; // Büdingen Hess + case "3": + return "6043"; // Nidda + case "4": + return "6044"; // Schotten Hess + case "5": + return "6045"; // Gedern + case "6": + return "6046"; // Ortenberg Hess + case "7": + return "6047"; // Altenstadt Hess + case "8": + return "6048"; // Büdingen-Eckartshausen + case "9": + return "6049"; // Kefenrod + default: + return ""; + } + } + + private static String fromNumber605(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6050"; // Biebergemünd + case "1": + return "6051"; // Gelnhausen + case "2": + return "6052"; // Bad Orb + case "3": + return "6053"; // Wächtersbach + case "4": + return "6054"; // Birstein + case "5": + return "6055"; // Freigericht + case "6": + return "6056"; // Bad Soden-Salmünster + case "7": + return "6057"; // Flörsbachtal + case "8": + return "6058"; // Gründau + case "9": + return "6059"; // Jossgrund + default: + return ""; + } + } + + private static String fromNumber606(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6061"; // Michelstadt + case "2": + return "6062"; // Erbach Odenw + case "3": + return "6063"; // Bad König + case "6": + return "6066"; // Michelstadt-Vielbrunn + case "8": + return "6068"; // Beerfelden + default: + return ""; + } + } + + private static String fromNumber607(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6071"; // Dieburg + case "3": + return "6073"; // Babenhausen Hess + case "4": + return "6074"; // Rödermark + case "8": + return "6078"; // Gross-Umstadt + default: + return ""; + } + } + + private static String fromNumber608(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6081"; // Usingen + case "2": + return "6082"; // Niederreifenberg + case "3": + return "6083"; // Weilrod + case "4": + return "6084"; // Schmitten Taunus + case "5": + return "6085"; // Waldsolms + case "6": + return "6086"; // Grävenwiesbach + case "7": + return "6087"; // Waldems + default: + return ""; + } + } + + private static String fromNumber609(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6092"; // Heimbuchenthal + case "3": + return "6093"; // Laufach + case "4": + return "6094"; // Weibersbrunn + case "5": + return "6095"; // Bessenbach + case "6": + return "6096"; // Wiesen Unterfr + default: + return ""; + } + } + + private static String fromNumber61(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber610(number.substring(1)); + case "1": + return "611"; // Wiesbaden + case "2": + return fromNumber612(number.substring(1)); + case "3": + return fromNumber613(number.substring(1)); + case "4": + return fromNumber614(number.substring(1)); + case "5": + return fromNumber615(number.substring(1)); + case "6": + return fromNumber616(number.substring(1)); + case "7": + return fromNumber617(number.substring(1)); + case "8": + return fromNumber618(number.substring(1)); + case "9": + return fromNumber619(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber610(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6101"; // Bad Vilbel + case "2": + return "6102"; // Neu-Isenburg + case "3": + return "6103"; // Langen Hess + case "4": + return "6104"; // Heusenstamm + case "5": + return "6105"; // Mörfelden-Walldorf + case "6": + return "6106"; // Rodgau + case "7": + return "6107"; // Kelsterbach + case "8": + return "6108"; // Mühlheim am Main + case "9": + return "6109"; // Frankfurt-Bergen-Enkheim + default: + return ""; + } + } + + private static String fromNumber612(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6120"; // Aarbergen + case "2": + return "6122"; // Hofheim-Wallau + case "3": + return "6123"; // Eltville am Rhein + case "4": + return "6124"; // Bad Schwalbach + case "6": + return "6126"; // Idstein + case "7": + return "6127"; // Niedernhausen Taunus + case "8": + return "6128"; // Taunusstein + case "9": + return "6129"; // Schlangenbad + default: + return ""; + } + } + + private static String fromNumber613(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6130"; // Schwabenheim an der Selz + case "1": + return "6131"; // Mainz + case "2": + return "6132"; // Ingelheim am Rhein + case "3": + return "6133"; // Oppenheim + case "4": + return "6134"; // Mainz-Kastel + case "5": + return "6135"; // Bodenheim Rhein + case "6": + return "6136"; // Nieder-Olm + case "8": + return "6138"; // Mommenheim + case "9": + return "6139"; // Budenheim + default: + return ""; + } + } + + private static String fromNumber614(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6142"; // Rüsselsheim + case "4": + return "6144"; // Bischofsheim b Rüsselsheim + case "5": + return "6145"; // Flörsheim am Main + case "6": + return "6146"; // Hochheim am Main + case "7": + return "6147"; // Trebur + default: + return ""; + } + } + + private static String fromNumber615(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6150"; // Weiterstadt + case "1": + return "6151"; // Darmstadt + case "2": + return "6152"; // Gross-Gerau + case "4": + return "6154"; // Ober-Ramstadt + case "5": + return "6155"; // Griesheim Hess + case "7": + return "6157"; // Pfungstadt + case "8": + return "6158"; // Riedstadt + case "9": + return "6159"; // Messel + default: + return ""; + } + } + + private static String fromNumber616(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6161"; // Brensbach + case "2": + return "6162"; // Reinheim Odenw + case "3": + return "6163"; // Höchst i Odw + case "4": + return "6164"; // Reichelsheim Odenwald + case "5": + return "6165"; // Breuberg + case "6": + return "6166"; // Fischbachtal + case "7": + return "6167"; // Modautal + default: + return ""; + } + } + + private static String fromNumber617(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6171"; // Oberursel Taunus + case "2": + return "6172"; // Bad Homburg v d Höhe + case "3": + return "6173"; // Kronberg im Taunus + case "4": + return "6174"; // Königstein im Taunus + case "5": + return "6175"; // Friedrichsdorf Taunus + default: + return ""; + } + } + + private static String fromNumber618(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6181"; // Hanau + case "2": + return "6182"; // Seligenstadt + case "3": + return "6183"; // Erlensee + case "4": + return "6184"; // Langenselbold + case "5": + return "6185"; // Hammersbach Hess + case "6": + return "6186"; // Grosskrotzenburg + case "7": + return "6187"; // Schöneck + case "8": + return "6188"; // Kahl a Main + default: + return ""; + } + } + + private static String fromNumber619(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6190"; // Hattersheim a Main + case "2": + return "6192"; // Hofheim am Taunus + case "5": + return "6195"; // Kelkheim Taunus + case "6": + return "6196"; // Bad Soden am Taunus + case "8": + return "6198"; // Eppstein + default: + return ""; + } + } + + private static String fromNumber62(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber620(number.substring(1)); + case "1": + return "621"; // Mannheim + case "2": + return fromNumber622(number.substring(1)); + case "3": + return fromNumber623(number.substring(1)); + case "4": + return fromNumber624(number.substring(1)); + case "5": + return fromNumber625(number.substring(1)); + case "6": + return fromNumber626(number.substring(1)); + case "7": + return fromNumber627(number.substring(1)); + case "8": + return fromNumber628(number.substring(1)); + case "9": + return fromNumber629(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber620(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6201"; // Weinheim Bergstr + case "2": + return "6202"; // Schwetzingen + case "3": + return "6203"; // Ladenburg + case "4": + return "6204"; // Viernheim + case "5": + return "6205"; // Hockenheim + case "6": + return "6206"; // Lampertheim + case "7": + return "6207"; // Wald-Michelbach + case "9": + return "6209"; // Mörlenbach + default: + return ""; + } + } + + private static String fromNumber622(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6220"; // Wilhelmsfeld + case "1": + return "6221"; // Heidelberg + case "2": + return "6222"; // Wiesloch + case "3": + return "6223"; // Neckargemünd + case "4": + return "6224"; // Sandhausen Baden + case "6": + return "6226"; // Meckesheim + case "7": + return "6227"; // Walldorf Baden + case "8": + return "6228"; // Schönau Odenw + case "9": + return "6229"; // Neckarsteinach + default: + return ""; + } + } + + private static String fromNumber623(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6231"; // Hochdorf-Assenheim + case "2": + return "6232"; // Speyer + case "3": + return "6233"; // Frankenthal Pfalz + case "4": + return "6234"; // Mutterstadt + case "5": + return "6235"; // Schifferstadt + case "6": + return "6236"; // Neuhofen Pfalz + case "7": + return "6237"; // Maxdorf + case "8": + return "6238"; // Dirmstein + case "9": + return "6239"; // Bobenheim-Roxheim + default: + return ""; + } + } + + private static String fromNumber624(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6241"; // Worms + case "2": + return "6242"; // Osthofen + case "3": + return "6243"; // Monsheim + case "4": + return "6244"; // Westhofen Rheinhess + case "5": + return "6245"; // Biblis + case "6": + return "6246"; // Eich Rheinhess + case "7": + return "6247"; // Worms-Pfeddersheim + case "9": + return "6249"; // Guntersblum + default: + return ""; + } + } + + private static String fromNumber625(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6251"; // Bensheim + case "2": + return "6252"; // Heppenheim Bergstraße + case "3": + return "6253"; // Fürth Odenw + case "4": + return "6254"; // Lautertal Odenwald + case "5": + return "6255"; // Lindenfels + case "6": + return "6256"; // Lampertheim-Hüttenfeld + case "7": + return "6257"; // Seeheim-Jugenheim + case "8": + return "6258"; // Gernsheim + default: + return ""; + } + } + + private static String fromNumber626(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6261"; // Mosbach Baden + case "2": + return "6262"; // Aglasterhausen + case "3": + return "6263"; // Neckargerach + case "4": + return "6264"; // Neudenau + case "5": + return "6265"; // Billigheim Baden + case "6": + return "6266"; // Hassmersheim + case "7": + return "6267"; // Fahrenbach Baden + case "8": + return "6268"; // Hüffenhardt + case "9": + return "6269"; // Gundelsheim Württ + default: + return ""; + } + } + + private static String fromNumber627(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6271"; // Eberbach Baden + case "2": + return "6272"; // Hirschhorn Neckar + case "4": + return "6274"; // Waldbrunn Odenw + case "5": + return "6275"; // Rothenberg Odenw + case "6": + return "6276"; // Hesseneck + default: + return ""; + } + } + + private static String fromNumber628(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6281"; // Buchen Odenwald + case "2": + return "6282"; // Walldürn + case "3": + return "6283"; // Hardheim Odenw + case "4": + return "6284"; // Mudau + case "5": + return "6285"; // Walldürn-Altheim + case "6": + return "6286"; // Walldürn-Rippberg + case "7": + return "6287"; // Limbach Baden + default: + return ""; + } + } + + private static String fromNumber629(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6291"; // Adelsheim + case "2": + return "6292"; // Seckach + case "3": + return "6293"; // Schefflenz + case "4": + return "6294"; // Krautheim Jagst + case "5": + return "6295"; // Rosenberg Baden + case "6": + return "6296"; // Ahorn Baden + case "7": + return "6297"; // Ravenstein Baden + case "8": + return "6298"; // Möckmühl + default: + return ""; + } + } + + private static String fromNumber63(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber630(number.substring(1)); + case "1": + return "631"; // Kaiserslautern + case "2": + return fromNumber632(number.substring(1)); + case "3": + return fromNumber633(number.substring(1)); + case "4": + return fromNumber634(number.substring(1)); + case "5": + return fromNumber635(number.substring(1)); + case "6": + return fromNumber636(number.substring(1)); + case "7": + return fromNumber637(number.substring(1)); + case "8": + return fromNumber638(number.substring(1)); + case "9": + return fromNumber639(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber630(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6301"; // Otterbach Pfalz + case "2": + return "6302"; // Winnweiler + case "3": + return "6303"; // Enkenbach-Alsenborn + case "4": + return "6304"; // Wolfstein Pfalz + case "5": + return "6305"; // Hochspeyer + case "6": + return "6306"; // Trippstadt + case "7": + return "6307"; // Schopp + case "8": + return "6308"; // Olsbrücken + default: + return ""; + } + } + + private static String fromNumber632(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6321"; // Neustadt an der Weinstraße + case "2": + return "6322"; // Bad Dürkheim + case "3": + return "6323"; // Edenkoben + case "4": + return "6324"; // Hassloch + case "5": + return "6325"; // Lambrecht Pfalz + case "6": + return "6326"; // Deidesheim + case "7": + return "6327"; // Neustadt-Lachen + case "8": + return "6328"; // Elmstein + case "9": + return "6329"; // Weidenthal Pfalz + default: + return ""; + } + } + + private static String fromNumber633(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6331"; // Pirmasens + case "2": + return "6332"; // Zweibrücken + case "3": + return "6333"; // Waldfischbach-Burgalben + case "4": + return "6334"; // Thaleischweiler-Fröschen + case "5": + return "6335"; // Trulben + case "6": + return "6336"; // Dellfeld + case "7": + return "6337"; // Grossbundenbach + case "8": + return "6338"; // Hornbach Pfalz + case "9": + return "6339"; // Grosssteinhausen + default: + return ""; + } + } + + private static String fromNumber634(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6340"; // Wörth-Schaidt + case "1": + return "6341"; // Landau in der Pfalz + case "2": + return "6342"; // Schweigen-Rechtenbach + case "3": + return "6343"; // Bad Bergzabern + case "4": + return "6344"; // Schwegenheim + case "5": + return "6345"; // Albersweiler + case "6": + return "6346"; // Annweiler am Trifels + case "7": + return "6347"; // Hochstadt Pfalz + case "8": + return "6348"; // Offenbach an der Queich + case "9": + return "6349"; // Billigheim-Ingenheim + default: + return ""; + } + } + + private static String fromNumber635(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6351"; // Eisenberg Pfalz + case "2": + return "6352"; // Kirchheimbolanden + case "3": + return "6353"; // Freinsheim + case "5": + return "6355"; // Albisheim Pfrimm + case "6": + return "6356"; // Carlsberg Pfalz + case "7": + return "6357"; // Standenbühl + case "8": + return "6358"; // Kriegsfeld + case "9": + return "6359"; // Grünstadt + default: + return ""; + } + } + + private static String fromNumber636(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6361"; // Rockenhausen + case "2": + return "6362"; // Alsenz + case "3": + return "6363"; // Niederkirchen + case "4": + return "6364"; // Nußbach Pfalz + default: + return ""; + } + } + + private static String fromNumber637(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6371"; // Landstuhl + case "2": + return "6372"; // Bruchmühlbach-Miesau + case "3": + return "6373"; // Schönenberg-Kübelberg + case "4": + return "6374"; // Weilerbach + case "5": + return "6375"; // Wallhalben + default: + return ""; + } + } + + private static String fromNumber638(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6381"; // Kusel + case "2": + return "6382"; // Lauterecken + case "3": + return "6383"; // Glan-Münchweiler + case "4": + return "6384"; // Konken + case "5": + return "6385"; // Reichenbach-Steegen + case "6": + return "6386"; // Altenkirchen Pfalz + case "7": + return "6387"; // Sankt Julian + default: + return ""; + } + } + + private static String fromNumber639(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6391"; // Dahn + case "2": + return "6392"; // Hauenstein Pfalz + case "3": + return "6393"; // Fischbach bei Dahn + case "4": + return "6394"; // Bundenthal + case "5": + return "6395"; // Münchweiler an der Rodalb + case "6": + return "6396"; // Hinterweidenthal + case "7": + return "6397"; // Leimen Pfalz + case "8": + return "6398"; // Vorderweidenthal + default: + return ""; + } + } + + private static String fromNumber64(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber640(number.substring(1)); + case "1": + return "641"; // Giessen + case "2": + return fromNumber642(number.substring(1)); + case "3": + return fromNumber643(number.substring(1)); + case "4": + return fromNumber644(number.substring(1)); + case "5": + return fromNumber645(number.substring(1)); + case "6": + return fromNumber646(number.substring(1)); + case "7": + return fromNumber647(number.substring(1)); + case "8": + return fromNumber648(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber640(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6400"; // Mücke + case "1": + return "6401"; // Grünberg Hess + case "2": + return "6402"; // Hungen + case "3": + return "6403"; // Linden Hess + case "4": + return "6404"; // Lich Hess + case "5": + return "6405"; // Laubach Hess + case "6": + return "6406"; // Lollar + case "7": + return "6407"; // Rabenau Hess + case "8": + return "6408"; // Buseck + case "9": + return "6409"; // Biebertal + default: + return ""; + } + } + + private static String fromNumber642(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6420"; // Lahntal + case "1": + return "6421"; // Marburg + case "2": + return "6422"; // Kirchhain + case "3": + return "6423"; // Wetter Hessen + case "4": + return "6424"; // Ebsdorfergrund + case "5": + return "6425"; // Rauschenberg Hess + case "6": + return "6426"; // Fronhausen + case "7": + return "6427"; // Cölbe-Schönstadt + case "8": + return "6428"; // Stadtallendorf + case "9": + return "6429"; // Schweinsberg Hess + default: + return ""; + } + } + + private static String fromNumber643(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6430"; // Hahnstätten + case "1": + return "6431"; // Limburg a d Lahn + case "2": + return "6432"; // Diez + case "3": + return "6433"; // Hadamar + case "4": + return "6434"; // Bad Camberg + case "5": + return "6435"; // Wallmerod + case "6": + return "6436"; // Dornburg Hess + case "8": + return "6438"; // Hünfelden + case "9": + return "6439"; // Holzappel + default: + return ""; + } + } + + private static String fromNumber644(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6440"; // Kölschhausen + case "1": + return "6441"; // Wetzlar + case "2": + return "6442"; // Braunfels + case "3": + return "6443"; // Ehringshausen Dill + case "4": + return "6444"; // Bischoffen + case "5": + return "6445"; // Schöffengrund + case "6": + return "6446"; // Hohenahr + case "7": + return "6447"; // Langgöns-Niederkleen + case "9": + return "6449"; // Ehringshausen-Katzenfurt + default: + return ""; + } + } + + private static String fromNumber645(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6451"; // Frankenberg Eder + case "2": + return "6452"; // Battenberg Eder + case "3": + return "6453"; // Gemünden Wohra + case "4": + return "6454"; // Lichtenfels-Sachsenberg + case "5": + return "6455"; // Frankenau Hess + case "6": + return "6456"; // Haina Kloster + case "7": + return "6457"; // Burgwald Eder + case "8": + return "6458"; // Rosenthal Hess + default: + return ""; + } + } + + private static String fromNumber646(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6461"; // Biedenkopf + case "2": + return "6462"; // Gladenbach + case "4": + return "6464"; // Angelburg + case "5": + return "6465"; // Breidenbach b Biedenkopf + case "6": + return "6466"; // Dautphetal-Friedensdorf + case "7": + return "6467"; // Hatzfeld Eder + case "8": + return "6468"; // Dautphetal-Mornshausen + default: + return ""; + } + } + + private static String fromNumber647(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6471"; // Weilburg + case "2": + return "6472"; // Weilmünster + case "3": + return "6473"; // Leun + case "4": + return "6474"; // Villmar-Aumenau + case "5": + return "6475"; // Weilmünster-Wolfenhausen + case "6": + return "6476"; // Mengerskirchen + case "7": + return "6477"; // Greifenstein-Nenderoth + case "8": + return "6478"; // Greifenstein-Ulm + case "9": + return "6479"; // Waldbrunn Westerwald + default: + return ""; + } + } + + private static String fromNumber648(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6482"; // Runkel + case "3": + return "6483"; // Selters Taunus + case "4": + return "6484"; // Beselich + case "5": + return "6485"; // Nentershausen Westerw + case "6": + return "6486"; // Katzenelnbogen + default: + return ""; + } + } + + private static String fromNumber65(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber650(number.substring(1)); + case "1": + return "651"; // Trier + case "2": + return fromNumber652(number.substring(1)); + case "3": + return fromNumber653(number.substring(1)); + case "4": + return fromNumber654(number.substring(1)); + case "5": + return fromNumber655(number.substring(1)); + case "6": + return fromNumber656(number.substring(1)); + case "7": + return fromNumber657(number.substring(1)); + case "8": + return fromNumber658(number.substring(1)); + case "9": + return fromNumber659(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber650(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6500"; // Waldrach + case "1": + return "6501"; // Konz + case "2": + return "6502"; // Schweich + case "3": + return "6503"; // Hermeskeil + case "4": + return "6504"; // Thalfang + case "5": + return "6505"; // Kordel + case "6": + return "6506"; // Welschbillig + case "7": + return "6507"; // Neumagen-Dhron + case "8": + return "6508"; // Hetzerath Mosel + case "9": + return "6509"; // Büdlich + default: + return ""; + } + } + + private static String fromNumber652(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6522"; // Mettendorf + case "3": + return "6523"; // Holsthum + case "4": + return "6524"; // Rodershausen + case "5": + return "6525"; // Irrel + case "6": + return "6526"; // Bollendorf + case "7": + return "6527"; // Oberweis + default: + return ""; + } + } + + private static String fromNumber653(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6531"; // Bernkastel-Kues + case "2": + return "6532"; // Zeltingen-Rachtig + case "3": + return "6533"; // Morbach Hunsrück + case "4": + return "6534"; // Mülheim Mosel + case "5": + return "6535"; // Osann-Monzel + case "6": + return "6536"; // Kleinich + default: + return ""; + } + } + + private static String fromNumber654(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6541"; // Traben-Trarbach + case "2": + return "6542"; // Bullay + case "3": + return "6543"; // Büchenbeuren + case "4": + return "6544"; // Rhaunen + case "5": + return "6545"; // Blankenrath + default: + return ""; + } + } + + private static String fromNumber655(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6550"; // Irrhausen + case "1": + return "6551"; // Prüm + case "2": + return "6552"; // Olzheim + case "3": + return "6553"; // Schönecken + case "4": + return "6554"; // Waxweiler + case "5": + return "6555"; // Bleialf + case "6": + return "6556"; // Pronsfeld + case "7": + return "6557"; // Hallschlag + case "8": + return "6558"; // Büdesheim Eifel + case "9": + return "6559"; // Leidenborn + default: + return ""; + } + } + + private static String fromNumber656(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6561"; // Bitburg + case "2": + return "6562"; // Speicher + case "3": + return "6563"; // Kyllburg + case "4": + return "6564"; // Neuerburg Eifel + case "5": + return "6565"; // Dudeldorf + case "6": + return "6566"; // Körperich + case "7": + return "6567"; // Oberkail + case "8": + return "6568"; // Wolsfeld + case "9": + return "6569"; // Bickendorf + default: + return ""; + } + } + + private static String fromNumber657(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6571"; // Wittlich + case "2": + return "6572"; // Manderscheid Eifel + case "3": + return "6573"; // Gillenfeld + case "4": + return "6574"; // Hasborn + case "5": + return "6575"; // Landscheid + case "8": + return "6578"; // Salmtal + default: + return ""; + } + } + + private static String fromNumber658(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6580"; // Zemmer + case "1": + return "6581"; // Saarburg + case "2": + return "6582"; // Freudenburg + case "3": + return "6583"; // Palzem + case "4": + return "6584"; // Wellen Mosel + case "5": + return "6585"; // Ralingen + case "6": + return "6586"; // Beuren Hochwald + case "7": + return "6587"; // Zerf + case "8": + return "6588"; // Pluwig + case "9": + return "6589"; // Kell am See + default: + return ""; + } + } + + private static String fromNumber659(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6591"; // Gerolstein + case "2": + return "6592"; // Daun + case "3": + return "6593"; // Hillesheim Eifel + case "4": + return "6594"; // Birresborn + case "5": + return "6595"; // Dockweiler + case "6": + return "6596"; // Üdersdorf + case "7": + return "6597"; // Jünkerath + case "9": + return "6599"; // Weidenbach b Gerolstein + default: + return ""; + } + } + + private static String fromNumber66(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "661"; // Fulda + case "2": + return fromNumber662(number.substring(1)); + case "3": + return fromNumber663(number.substring(1)); + case "4": + return fromNumber664(number.substring(1)); + case "5": + return fromNumber665(number.substring(1)); + case "6": + return fromNumber666(number.substring(1)); + case "7": + return fromNumber667(number.substring(1)); + case "8": + return fromNumber668(number.substring(1)); + case "9": + return fromNumber669(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber662(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6620"; // Philippsthal Werra + case "1": + return "6621"; // Bad Hersfeld + case "2": + return "6622"; // Bebra + case "3": + return "6623"; // Rotenburg a d Fulda + case "4": + return "6624"; // Heringen Werra + case "5": + return "6625"; // Niederaula + case "6": + return "6626"; // Wildeck-Obersuhl + case "7": + return "6627"; // Nentershausen Hess + case "8": + return "6628"; // Oberaula + case "9": + return "6629"; // Schenklengsfeld + default: + return ""; + } + } + + private static String fromNumber663(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6630"; // Schwalmtal-Storndorf + case "1": + return "6631"; // Alsfeld + case "3": + return "6633"; // Homberg Ohm + case "4": + return "6634"; // Gemünden Felda + case "5": + return "6635"; // Kirtorf + case "6": + return "6636"; // Romrod + case "7": + return "6637"; // Feldatal + case "8": + return "6638"; // Schwalmtal-Renzendorf + case "9": + return "6639"; // Ottrau + default: + return ""; + } + } + + private static String fromNumber664(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6641"; // Lauterbach Hessen + case "2": + return "6642"; // Schlitz + case "3": + return "6643"; // Herbstein + case "4": + return "6644"; // Grebenhain + case "5": + return "6645"; // Ulrichstein + case "6": + return "6646"; // Grebenau + case "7": + return "6647"; // Herbstein-Stockhausen + case "8": + return "6648"; // Bad Salzschlirf + default: + return ""; + } + } + + private static String fromNumber665(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6650"; // Hosenfeld + case "1": + return "6651"; // Rasdorf + case "2": + return "6652"; // Hünfeld + case "3": + return "6653"; // Burghaun + case "4": + return "6654"; // Gersfeld Rhön + case "5": + return "6655"; // Neuhof Kr Fulda + case "6": + return "6656"; // Ebersburg + case "7": + return "6657"; // Hofbieber + case "8": + return "6658"; // Poppenhausen Wasserkuppe + case "9": + return "6659"; // Eichenzell + default: + return ""; + } + } + + private static String fromNumber666(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6660"; // Steinau-Marjoss + case "1": + return "6661"; // Schlüchtern + case "3": + return "6663"; // Steinau an der Straße + case "4": + return "6664"; // Sinntal-Sterbfritz + case "5": + return "6665"; // Sinntal-Altengronau + case "6": + return "6666"; // Freiensteinau + case "7": + return "6667"; // Steinau-Ulmbach + case "8": + return "6668"; // Birstein-Lichenroth + case "9": + return "6669"; // Neuhof-Hauswurz + default: + return ""; + } + } + + private static String fromNumber667(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "6670"; // Ludwigsau Hess + case "2": + return "6672"; // Eiterfeld + case "3": + return "6673"; // Haunetal + case "4": + return "6674"; // Friedewald Hess + case "5": + return "6675"; // Breitenbach a Herzberg + case "6": + return "6676"; // Hohenroda Hess + case "7": + return "6677"; // Neuenstein Hess + case "8": + return "6678"; // Wildeck-Hönebach + default: + return ""; + } + } + + private static String fromNumber668(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6681"; // Hilders + case "2": + return "6682"; // Tann Rhön + case "3": + return "6683"; // Ehrenberg Rhön + case "4": + return "6684"; // Hofbieber-Schwarzbach + default: + return ""; + } + } + + private static String fromNumber669(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6691"; // Schwalmstadt + case "2": + return "6692"; // Neustadt Hessen + case "3": + return "6693"; // Neuental + case "4": + return "6694"; // Neukirchen Knüll + case "5": + return "6695"; // Jesberg + case "6": + return "6696"; // Gilserberg + case "7": + return "6697"; // Willingshausen + case "8": + return "6698"; // Schrecksbach + default: + return ""; + } + } + + private static String fromNumber67(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber670(number.substring(1)); + case "1": + return "671"; // Bad Kreuznach + case "2": + return fromNumber672(number.substring(1)); + case "3": + return fromNumber673(number.substring(1)); + case "4": + return fromNumber674(number.substring(1)); + case "5": + return fromNumber675(number.substring(1)); + case "6": + return fromNumber676(number.substring(1)); + case "7": + return fromNumber677(number.substring(1)); + case "8": + return fromNumber678(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber670(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6701"; // Sprendlingen Rheinhess + case "3": + return "6703"; // Wöllstein Rheinhess + case "4": + return "6704"; // Langenlonsheim + case "6": + return "6706"; // Wallhausen Nahe + case "7": + return "6707"; // Windesheim + case "8": + return "6708"; // Bad Münster am Stein-Ebernburg + case "9": + return "6709"; // Fürfeld Kr Bad Kreuznach + default: + return ""; + } + } + + private static String fromNumber672(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6721"; // Bingen am Rhein + case "2": + return "6722"; // Rüdesheim am Rhein + case "3": + return "6723"; // Oestrich-Winkel + case "4": + return "6724"; // Stromberg Hunsrück + case "5": + return "6725"; // Gau-Algesheim + case "6": + return "6726"; // Lorch Rheingau + case "7": + return "6727"; // Gensingen + case "8": + return "6728"; // Ober-Hilbersheim + default: + return ""; + } + } + + private static String fromNumber673(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6731"; // Alzey + case "2": + return "6732"; // Wörrstadt + case "3": + return "6733"; // Gau-Odernheim + case "4": + return "6734"; // Flonheim + case "5": + return "6735"; // Eppelsheim + case "6": + return "6736"; // Bechenheim + case "7": + return "6737"; // Köngernheim + default: + return ""; + } + } + + private static String fromNumber674(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6741"; // St Goar + case "2": + return "6742"; // Boppard + case "3": + return "6743"; // Bacharach + case "4": + return "6744"; // Oberwesel + case "5": + return "6745"; // Gondershausen + case "6": + return "6746"; // Pfalzfeld + case "7": + return "6747"; // Emmelshausen + default: + return ""; + } + } + + private static String fromNumber675(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6751"; // Bad Sobernheim + case "2": + return "6752"; // Kirn Nahe + case "3": + return "6753"; // Meisenheim + case "4": + return "6754"; // Martinstein + case "5": + return "6755"; // Odernheim am Glan + case "6": + return "6756"; // Winterbach Soonwald + case "7": + return "6757"; // Becherbach bei Kirn + case "8": + return "6758"; // Waldböckelheim + default: + return ""; + } + } + + private static String fromNumber676(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6761"; // Simmern Hunsrück + case "2": + return "6762"; // Kastellaun + case "3": + return "6763"; // Kirchberg Hunsrück + case "4": + return "6764"; // Rheinböllen + case "5": + return "6765"; // Gemünden Hunsrück + case "6": + return "6766"; // Kisselbach + default: + return ""; + } + } + + private static String fromNumber677(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6771"; // St Goarshausen + case "2": + return "6772"; // Nastätten + case "3": + return "6773"; // Kamp-Bornhofen + case "4": + return "6774"; // Kaub + case "5": + return "6775"; // Strüth Taunus + case "6": + return "6776"; // Dachsenhausen + default: + return ""; + } + } + + private static String fromNumber678(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6781"; // Idar-Oberstein + case "2": + return "6782"; // Birkenfeld Nahe + case "3": + return "6783"; // Baumholder + case "4": + return "6784"; // Weierbach + case "5": + return "6785"; // Herrstein + case "6": + return "6786"; // Kempfeld + case "7": + return "6787"; // Niederbrombach + case "8": + return "6788"; // Sien + case "9": + return "6789"; // Heimbach Nahe + default: + return ""; + } + } + + private static String fromNumber68(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber680(number.substring(1)); + case "1": + return "681"; // Saarbrücken + case "2": + return fromNumber682(number.substring(1)); + case "3": + return fromNumber683(number.substring(1)); + case "4": + return fromNumber684(number.substring(1)); + case "5": + return fromNumber685(number.substring(1)); + case "6": + return fromNumber686(number.substring(1)); + case "7": + return fromNumber687(number.substring(1)); + case "8": + return fromNumber688(number.substring(1)); + case "9": + return fromNumber689(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber680(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "6802"; // Völklingen-Lauterbach + case "3": + return "6803"; // Mandelbachtal-Ommersheim + case "4": + return "6804"; // Mandelbachtal + case "5": + return "6805"; // Kleinblittersdorf + case "6": + return "6806"; // Heusweiler + case "9": + return "6809"; // Grossrosseln + default: + return ""; + } + } + + private static String fromNumber682(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6821"; // Neunkirchen Saar + case "4": + return "6824"; // Ottweiler + case "5": + return "6825"; // Illingen Saar + case "6": + return "6826"; // Bexbach + case "7": + return "6827"; // Eppelborn + default: + return ""; + } + } + + private static String fromNumber683(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6831"; // Saarlouis + case "2": + return "6832"; // Beckingen-Reimsbach + case "3": + return "6833"; // Rehlingen-Siersburg + case "4": + return "6834"; // Bous + case "5": + return "6835"; // Beckingen + case "6": + return "6836"; // Überherrn + case "7": + return "6837"; // Wallerfangen + case "8": + return "6838"; // Saarwellingen + default: + return ""; + } + } + + private static String fromNumber684(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6841"; // Homburg Saar + case "2": + return "6842"; // Blieskastel + case "3": + return "6843"; // Gersheim + case "4": + return "6844"; // Blieskastel-Altheim + case "8": + return "6848"; // Homburg-Einöd + case "9": + return "6849"; // Kirkel + default: + return ""; + } + } + + private static String fromNumber685(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6851"; // St Wendel + case "2": + return "6852"; // Nohfelden + case "3": + return "6853"; // Marpingen + case "4": + return "6854"; // Oberthal Saar + case "5": + return "6855"; // Freisen + case "6": + return "6856"; // St Wendel-Niederkirchen + case "7": + return "6857"; // Namborn + case "8": + return "6858"; // Ottweiler-Fürth + default: + return ""; + } + } + + private static String fromNumber686(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6861"; // Merzig + case "4": + return "6864"; // Mettlach + case "5": + return "6865"; // Mettlach-Orscholz + case "6": + return "6866"; // Perl-Nennig + case "7": + return "6867"; // Perl + case "8": + return "6868"; // Mettlach-Tünsdorf + case "9": + return "6869"; // Merzig-Silwingen + default: + return ""; + } + } + + private static String fromNumber687(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6871"; // Wadern + case "2": + return "6872"; // Losheim am See + case "3": + return "6873"; // Nonnweiler + case "4": + return "6874"; // Wadern-Nunkirchen + case "5": + return "6875"; // Nonnweiler-Primstal + case "6": + return "6876"; // Weiskirchen Saar + default: + return ""; + } + } + + private static String fromNumber688(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "6881"; // Lebach + case "7": + return "6887"; // Schmelz Saar + case "8": + return "6888"; // Lebach-Steinbach + default: + return ""; + } + } + + private static String fromNumber689(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "6893"; // Saarbrücken-Ensheim + case "4": + return "6894"; // St Ingbert + case "7": + return "6897"; // Sulzbach Saar + case "8": + return "6898"; // Völklingen + default: + return ""; + } + } + + private static String fromNumber7(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber70(number.substring(1)); + case "1": + return fromNumber71(number.substring(1)); + case "2": + return fromNumber72(number.substring(1)); + case "3": + return fromNumber73(number.substring(1)); + case "4": + return fromNumber74(number.substring(1)); + case "5": + return fromNumber75(number.substring(1)); + case "6": + return fromNumber76(number.substring(1)); + case "7": + return fromNumber77(number.substring(1)); + case "8": + return fromNumber78(number.substring(1)); + case "9": + return fromNumber79(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber70(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber702(number.substring(1)); + case "3": + return fromNumber703(number.substring(1)); + case "4": + return fromNumber704(number.substring(1)); + case "5": + return fromNumber705(number.substring(1)); + case "6": + return fromNumber706(number.substring(1)); + case "7": + return fromNumber707(number.substring(1)); + case "8": + return fromNumber708(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber702(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7021"; // Kirchheim unter Teck + case "2": + return "7022"; // Nürtingen + case "3": + return "7023"; // Weilheim an der Teck + case "4": + return "7024"; // Wendlingen am Neckar + case "5": + return "7025"; // Neuffen + case "6": + return "7026"; // Lenningen + default: + return ""; + } + } + + private static String fromNumber703(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7031"; // Böblingen + case "2": + return "7032"; // Herrenberg + case "3": + return "7033"; // Weil Der Stadt + case "4": + return "7034"; // Ehningen + default: + return ""; + } + } + + private static String fromNumber704(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7041"; // Mühlacker + case "2": + return "7042"; // Vaihingen an der Enz + case "3": + return "7043"; // Maulbronn + case "4": + return "7044"; // Mönsheim + case "5": + return "7045"; // Oberderdingen + case "6": + return "7046"; // Zaberfeld + default: + return ""; + } + } + + private static String fromNumber705(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7051"; // Calw + case "2": + return "7052"; // Bad Liebenzell + case "3": + return "7053"; // Bad Teinach-Zavelstein + case "4": + return "7054"; // Wildberg Württ + case "5": + return "7055"; // Neuweiler Kr Calw + case "6": + return "7056"; // Gechingen + default: + return ""; + } + } + + private static String fromNumber706(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7062"; // Beilstein Württ + case "3": + return "7063"; // Bad Wimpfen + case "6": + return "7066"; // Bad Rappenau-Bonfeld + default: + return ""; + } + } + + private static String fromNumber707(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7071"; // Tübingen + case "2": + return "7072"; // Gomaringen + case "3": + return "7073"; // Ammerbuch + default: + return ""; + } + } + + private static String fromNumber708(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7081"; // Bad Wildbad + case "2": + return "7082"; // Neuenbürg Württ + case "3": + return "7083"; // Bad Herrenalb + case "4": + return "7084"; // Schömberg b Neuenbürg + case "5": + return "7085"; // Enzklösterle + default: + return ""; + } + } + + private static String fromNumber71(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "711"; // Stuttgart + case "2": + return fromNumber712(number.substring(1)); + case "3": + return fromNumber713(number.substring(1)); + case "4": + return fromNumber714(number.substring(1)); + case "5": + return fromNumber715(number.substring(1)); + case "6": + return fromNumber716(number.substring(1)); + case "7": + return fromNumber717(number.substring(1)); + case "8": + return fromNumber718(number.substring(1)); + case "9": + return fromNumber719(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber712(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7121"; // Reutlingen + case "2": + return "7122"; // St Johann Württ + case "3": + return "7123"; // Metzingen Württ + case "4": + return "7124"; // Trochtelfingen Hohenz + case "5": + return "7125"; // Bad Urach + case "6": + return "7126"; // Burladingen-Melchingen + case "7": + return "7127"; // Neckartenzlingen + case "8": + return "7128"; // Sonnenbühl + case "9": + return "7129"; // Lichtenstein Württ + default: + return ""; + } + } + + private static String fromNumber713(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7130"; // Löwenstein Württ + case "1": + return "7131"; // Heilbronn Neckar + case "2": + return "7132"; // Neckarsulm + case "3": + return "7133"; // Lauffen am Neckar + case "4": + return "7134"; // Weinsberg + case "5": + return "7135"; // Brackenheim + case "6": + return "7136"; // Bad Friedrichshall + case "8": + return "7138"; // Schwaigern + case "9": + return "7139"; // Neuenstadt am Kocher + default: + return ""; + } + } + + private static String fromNumber714(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7141"; // Ludwigsburg Württ + case "2": + return "7142"; // Bietigheim-Bissingen + case "3": + return "7143"; // Besigheim + case "4": + return "7144"; // Marbach am Neckar + case "5": + return "7145"; // Markgröningen + case "6": + return "7146"; // Remseck am Neckar + case "7": + return "7147"; // Sachsenheim Württ + case "8": + return "7148"; // Grossbottwar + default: + return ""; + } + } + + private static String fromNumber715(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7150"; // Korntal-Münchingen + case "1": + return "7151"; // Waiblingen + case "2": + return "7152"; // Leonberg Württ + case "3": + return "7153"; // Plochingen + case "4": + return "7154"; // Kornwestheim + case "6": + return "7156"; // Ditzingen + case "7": + return "7157"; // Waldenbuch + case "8": + return "7158"; // Neuhausen auf den Fildern + case "9": + return "7159"; // Renningen + default: + return ""; + } + } + + private static String fromNumber716(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7161"; // Göppingen + case "2": + return "7162"; // Süßen + case "3": + return "7163"; // Ebersbach an der Fils + case "4": + return "7164"; // Boll Kr Göppingen + case "5": + return "7165"; // Göppingen-Hohenstaufen + case "6": + return "7166"; // Adelberg + default: + return ""; + } + } + + private static String fromNumber717(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7171"; // Schwäbisch Gmünd + case "2": + return "7172"; // Lorch Württ + case "3": + return "7173"; // Heubach + case "4": + return "7174"; // Mögglingen + case "5": + return "7175"; // Leinzell + case "6": + return "7176"; // Spraitbach + default: + return ""; + } + } + + private static String fromNumber718(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7181"; // Schorndorf Württ + case "2": + return "7182"; // Welzheim + case "3": + return "7183"; // Rudersberg Württ + case "4": + return "7184"; // Kaisersbach + default: + return ""; + } + } + + private static String fromNumber719(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7191"; // Backnang + case "2": + return "7192"; // Murrhardt + case "3": + return "7193"; // Sulzbach an der Murr + case "4": + return "7194"; // Spiegelberg + case "5": + return "7195"; // Winnenden + default: + return ""; + } + } + + private static String fromNumber72(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber720(number.substring(1)); + case "1": + return "721"; // Karlsruhe + case "2": + return fromNumber722(number.substring(1)); + case "3": + return fromNumber723(number.substring(1)); + case "4": + return fromNumber724(number.substring(1)); + case "5": + return fromNumber725(number.substring(1)); + case "6": + return fromNumber726(number.substring(1)); + case "7": + return fromNumber727(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber720(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7202"; // Karlsbad + case "3": + return "7203"; // Walzbachtal + case "4": + return "7204"; // Malsch-Völkersbach + default: + return ""; + } + } + + private static String fromNumber722(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7220"; // Forbach-Hundsbach + case "1": + return "7221"; // Baden-Baden + case "2": + return "7222"; // Rastatt + case "3": + return "7223"; // Bühl Baden + case "4": + return "7224"; // Gernsbach + case "5": + return "7225"; // Gaggenau + case "6": + return "7226"; // Bühl-Sand + case "7": + return "7227"; // Lichtenau Baden + case "8": + return "7228"; // Forbach + case "9": + return "7229"; // Iffezheim + default: + return ""; + } + } + + private static String fromNumber723(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7231"; // Pforzheim + case "2": + return "7232"; // Königsbach-Stein + case "3": + return "7233"; // Niefern-Öschelbronn + case "4": + return "7234"; // Tiefenbronn + case "5": + return "7235"; // Unterreichenbach Kr Calw + case "6": + return "7236"; // Keltern + case "7": + return "7237"; // Neulingen Enzkreis + default: + return ""; + } + } + + private static String fromNumber724(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7240"; // Pfinztal + case "2": + return "7242"; // Rheinstetten + case "3": + return "7243"; // Ettlingen + case "4": + return "7244"; // Weingarten Baden + case "5": + return "7245"; // Durmersheim + case "6": + return "7246"; // Malsch Kr Karlsruhe + case "7": + return "7247"; // Linkenheim-Hochstetten + case "8": + return "7248"; // Marxzell + case "9": + return "7249"; // Stutensee + default: + return ""; + } + } + + private static String fromNumber725(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7250"; // Kraichtal + case "1": + return "7251"; // Bruchsal + case "2": + return "7252"; // Bretten + case "3": + return "7253"; // Bad Schönborn + case "4": + return "7254"; // Waghäusel + case "5": + return "7255"; // Graben-Neudorf + case "6": + return "7256"; // Philippsburg + case "7": + return "7257"; // Bruchsal-Untergrombach + case "8": + return "7258"; // Oberderdingen-Flehingen + case "9": + return "7259"; // Östringen-Odenheim + default: + return ""; + } + } + + private static String fromNumber726(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7260"; // Sinsheim-Hilsbach + case "1": + return "7261"; // Sinsheim + case "2": + return "7262"; // Eppingen + case "3": + return "7263"; // Waibstadt + case "4": + return "7264"; // Bad Rappenau + case "5": + return "7265"; // Angelbachtal + case "6": + return "7266"; // Kirchardt + case "7": + return "7267"; // Gemmingen + case "8": + return "7268"; // Bad Rappenau-Obergimpern + case "9": + return "7269"; // Sulzfeld Baden + default: + return ""; + } + } + + private static String fromNumber727(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7271"; // Wörth am Rhein + case "2": + return "7272"; // Rülzheim + case "3": + return "7273"; // Hagenbach Pfalz + case "4": + return "7274"; // Germersheim + case "5": + return "7275"; // Kandel + case "6": + return "7276"; // Herxheim bei Landau Pfalz + case "7": + return "7277"; // Wörth-Büchelberg + default: + return ""; + } + } + + private static String fromNumber73(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber730(number.substring(1)); + case "1": + return "731"; // Ulm Donau + case "2": + return fromNumber732(number.substring(1)); + case "3": + return fromNumber733(number.substring(1)); + case "4": + return fromNumber734(number.substring(1)); + case "5": + return fromNumber735(number.substring(1)); + case "6": + return fromNumber736(number.substring(1)); + case "7": + return fromNumber737(number.substring(1)); + case "8": + return fromNumber738(number.substring(1)); + case "9": + return fromNumber739(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber730(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7300"; // Roggenburg + case "2": + return "7302"; // Pfaffenhofen a d Roth + case "3": + return "7303"; // Illertissen + case "4": + return "7304"; // Blaustein Württ + case "5": + return "7305"; // Erbach Donau + case "6": + return "7306"; // Vöhringen Iller + case "7": + return "7307"; // Senden Iller + case "8": + return "7308"; // Nersingen + case "9": + return "7309"; // Weissenhorn + default: + return ""; + } + } + + private static String fromNumber732(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7321"; // Heidenheim a d Brenz + case "2": + return "7322"; // Giengen a d Brenz + case "3": + return "7323"; // Gerstetten + case "4": + return "7324"; // Herbrechtingen + case "5": + return "7325"; // Sontheim a d Brenz + case "6": + return "7326"; // Neresheim + case "7": + return "7327"; // Dischingen + case "8": + return "7328"; // Königsbronn + case "9": + return "7329"; // Steinheim am Albuch + default: + return ""; + } + } + + private static String fromNumber733(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7331"; // Geislingen an der Steige + case "2": + return "7332"; // Lauterstein + case "3": + return "7333"; // Laichingen + case "4": + return "7334"; // Deggingen + case "5": + return "7335"; // Wiesensteig + case "6": + return "7336"; // Lonsee + case "7": + return "7337"; // Nellingen Alb + default: + return ""; + } + } + + private static String fromNumber734(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7340"; // Neenstetten + case "3": + return "7343"; // Buch b Illertissen + case "4": + return "7344"; // Blaubeuren + case "5": + return "7345"; // Langenau Württ + case "6": + return "7346"; // Illerkirchberg + case "7": + return "7347"; // Dietenheim + case "8": + return "7348"; // Beimerstetten + default: + return ""; + } + } + + private static String fromNumber735(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7351"; // Biberach an der Riß + case "2": + return "7352"; // Ochsenhausen + case "3": + return "7353"; // Schwendi + case "4": + return "7354"; // Erolzheim + case "5": + return "7355"; // Hochdorf Riß + case "6": + return "7356"; // Schemmerhofen + case "7": + return "7357"; // Attenweiler + case "8": + return "7358"; // Eberhardzell-Füramoos + default: + return ""; + } + } + + private static String fromNumber736(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7361"; // Aalen + case "2": + return "7362"; // Bopfingen + case "3": + return "7363"; // Lauchheim + case "4": + return "7364"; // Oberkochen + case "5": + return "7365"; // Essingen Württ + case "6": + return "7366"; // Abtsgmünd + case "7": + return "7367"; // Aalen-Ebnat + default: + return ""; + } + } + + private static String fromNumber737(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7371"; // Riedlingen Württ + case "3": + return "7373"; // Zwiefalten + case "4": + return "7374"; // Uttenweiler + case "5": + return "7375"; // Obermarchtal + case "6": + return "7376"; // Langenenslingen + default: + return ""; + } + } + + private static String fromNumber738(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7381"; // Münsingen + case "2": + return "7382"; // Römerstein + case "3": + return "7383"; // Münsingen-Buttenhausen + case "4": + return "7384"; // Schelklingen-Hütten + case "5": + return "7385"; // Gomadingen + case "6": + return "7386"; // Hayingen + case "7": + return "7387"; // Hohenstein Württ + case "8": + return "7388"; // Pfronstetten + case "9": + return "7389"; // Heroldstatt + default: + return ""; + } + } + + private static String fromNumber739(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7391"; // Ehingen Donau + case "2": + return "7392"; // Laupheim + case "3": + return "7393"; // Munderkingen + case "4": + return "7394"; // Schelklingen + case "5": + return "7395"; // Ehingen-Dächingen + default: + return ""; + } + } + + private static String fromNumber74(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber740(number.substring(1)); + case "1": + return "741"; // Rottweil + case "2": + return fromNumber742(number.substring(1)); + case "3": + return fromNumber743(number.substring(1)); + case "4": + return fromNumber744(number.substring(1)); + case "5": + return fromNumber745(number.substring(1)); + case "6": + return fromNumber746(number.substring(1)); + case "7": + return fromNumber747(number.substring(1)); + case "8": + return fromNumber748(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber740(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7402"; // Fluorn-Winzeln + case "3": + return "7403"; // Dunningen + case "4": + return "7404"; // Epfendorf + default: + return ""; + } + } + + private static String fromNumber742(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7420"; // Deisslingen + case "2": + return "7422"; // Schramberg + case "3": + return "7423"; // Oberndorf am Neckar + case "4": + return "7424"; // Spaichingen + case "5": + return "7425"; // Trossingen + case "6": + return "7426"; // Gosheim + case "7": + return "7427"; // Schömberg b Balingen + case "8": + return "7428"; // Rosenfeld + case "9": + return "7429"; // Egesheim + default: + return ""; + } + } + + private static String fromNumber743(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7431"; // Albstadt-Ebingen + case "2": + return "7432"; // Albstadt-Tailfingen + case "3": + return "7433"; // Balingen + case "4": + return "7434"; // Winterlingen + case "5": + return "7435"; // Albstadt-Laufen + case "6": + return "7436"; // Messstetten-Oberdigisheim + default: + return ""; + } + } + + private static String fromNumber744(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7440"; // Bad Rippoldsau + case "1": + return "7441"; // Freudenstadt + case "2": + return "7442"; // Baiersbronn + case "3": + return "7443"; // Dornstetten + case "4": + return "7444"; // Alpirsbach + case "5": + return "7445"; // Pfalzgrafenweiler + case "6": + return "7446"; // Lossburg + case "7": + return "7447"; // Baiersbronn-Schwarzenberg + case "8": + return "7448"; // Seewald + case "9": + return "7449"; // Baiersbronn-Obertal + default: + return ""; + } + } + + private static String fromNumber745(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7451"; // Horb am Neckar + case "2": + return "7452"; // Nagold + case "3": + return "7453"; // Altensteig Württ + case "4": + return "7454"; // Sulz am Neckar + case "5": + return "7455"; // Dornhan + case "6": + return "7456"; // Haiterbach + case "7": + return "7457"; // Rottenburg-Ergenzingen + case "8": + return "7458"; // Ebhausen + case "9": + return "7459"; // Nagold-Hochdorf + default: + return ""; + } + } + + private static String fromNumber746(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7461"; // Tuttlingen + case "2": + return "7462"; // Immendingen + case "3": + return "7463"; // Mühlheim an der Donau + case "4": + return "7464"; // Talheim Kr Tuttlingen + case "5": + return "7465"; // Emmingen-Liptingen + case "6": + return "7466"; // Beuron + case "7": + return "7467"; // Neuhausen ob Eck + default: + return ""; + } + } + + private static String fromNumber747(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7471"; // Hechingen + case "2": + return "7472"; // Rottenburg am Neckar + case "3": + return "7473"; // Mössingen + case "4": + return "7474"; // Haigerloch + case "5": + return "7475"; // Burladingen + case "6": + return "7476"; // Bisingen + case "7": + return "7477"; // Jungingen b Hechingen + case "8": + return "7478"; // Hirrlingen + default: + return ""; + } + } + + private static String fromNumber748(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7482"; // Horb-Dettingen + case "3": + return "7483"; // Horb-Mühringen + case "4": + return "7484"; // Simmersfeld + case "5": + return "7485"; // Empfingen + case "6": + return "7486"; // Horb-Altheim + default: + return ""; + } + } + + private static String fromNumber75(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber750(number.substring(1)); + case "1": + return "751"; // Ravensburg + case "2": + return fromNumber752(number.substring(1)); + case "3": + return fromNumber753(number.substring(1)); + case "4": + return fromNumber754(number.substring(1)); + case "5": + return fromNumber755(number.substring(1)); + case "6": + return fromNumber756(number.substring(1)); + case "7": + return fromNumber757(number.substring(1)); + case "8": + return fromNumber758(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber750(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7502"; // Wolpertswende + case "3": + return "7503"; // Wilhelmsdorf Württ + case "4": + return "7504"; // Horgenzell + case "5": + return "7505"; // Fronreute + case "6": + return "7506"; // Wangen-Leupolz + default: + return ""; + } + } + + private static String fromNumber752(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7520"; // Bodnegg + case "2": + return "7522"; // Wangen im Allgäu + case "4": + return "7524"; // Bad Waldsee + case "5": + return "7525"; // Aulendorf + case "7": + return "7527"; // Wolfegg + case "8": + return "7528"; // Neukirch b Tettnang + case "9": + return "7529"; // Waldburg Württ + default: + return ""; + } + } + + private static String fromNumber753(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7531"; // Konstanz + case "2": + return "7532"; // Meersburg + case "3": + return "7533"; // Allensbach + case "4": + return "7534"; // Reichenau Baden + default: + return ""; + } + } + + private static String fromNumber754(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7541"; // Friedrichshafen + case "2": + return "7542"; // Tettnang + case "3": + return "7543"; // Kressbronn am Bodensee + case "4": + return "7544"; // Markdorf + case "5": + return "7545"; // Immenstaad am Bodensee + case "6": + return "7546"; // Oberteuringen + default: + return ""; + } + } + + private static String fromNumber755(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7551"; // Überlingen Bodensee + case "2": + return "7552"; // Pfullendorf + case "3": + return "7553"; // Salem Baden + case "4": + return "7554"; // Heiligenberg Baden + case "5": + return "7555"; // Deggenhausertal + case "6": + return "7556"; // Uhldingen-Mühlhofen + case "7": + return "7557"; // Herdwangen-Schönach + case "8": + return "7558"; // Illmensee + default: + return ""; + } + } + + private static String fromNumber756(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7561"; // Leutkirch im Allgäu + case "2": + return "7562"; // Isny im Allgäu + case "3": + return "7563"; // Kisslegg + case "4": + return "7564"; // Bad Wurzach + case "5": + return "7565"; // Aichstetten Kr Ravensburg + case "6": + return "7566"; // Argenbühl + case "7": + return "7567"; // Leutkirch-Friesenhofen + case "8": + return "7568"; // Bad Wurzach-Hauerz + case "9": + return "7569"; // Isny-Eisenbach + default: + return ""; + } + } + + private static String fromNumber757(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7570"; // Sigmaringen-Gutenstein + case "1": + return "7571"; // Sigmaringen + case "2": + return "7572"; // Mengen Württ + case "3": + return "7573"; // Stetten am kalten Markt + case "4": + return "7574"; // Gammertingen + case "5": + return "7575"; // Messkirch + case "6": + return "7576"; // Krauchenwies + case "7": + return "7577"; // Veringenstadt + case "8": + return "7578"; // Wald Hohenz + case "9": + return "7579"; // Schwenningen Baden + default: + return ""; + } + } + + private static String fromNumber758(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7581"; // Saulgau + case "2": + return "7582"; // Bad Buchau + case "3": + return "7583"; // Bad Schussenried + case "4": + return "7584"; // Altshausen + case "5": + return "7585"; // Ostrach + case "6": + return "7586"; // Herbertingen + case "7": + return "7587"; // Hosskirch + default: + return ""; + } + } + + private static String fromNumber76(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber760(number.substring(1)); + case "1": + return "761"; // Freiburg im Breisgau + case "2": + return fromNumber762(number.substring(1)); + case "3": + return fromNumber763(number.substring(1)); + case "4": + return fromNumber764(number.substring(1)); + case "5": + return fromNumber765(number.substring(1)); + case "6": + return fromNumber766(number.substring(1)); + case "7": + return fromNumber767(number.substring(1)); + case "8": + return fromNumber768(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber760(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7602"; // Oberried Breisgau + default: + return ""; + } + } + + private static String fromNumber762(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7620"; // Schopfheim-Gersbach + case "1": + return "7621"; // Lörrach + case "2": + return "7622"; // Schopfheim + case "3": + return "7623"; // Rheinfelden Baden + case "4": + return "7624"; // Grenzach-Wyhlen + case "5": + return "7625"; // Zell im Wiesental + case "6": + return "7626"; // Kandern + case "7": + return "7627"; // Steinen Kr Lörrach + case "8": + return "7628"; // Efringen-Kirchen + case "9": + return "7629"; // Tegernau Baden + default: + return ""; + } + } + + private static String fromNumber763(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7631"; // Müllheim Baden + case "2": + return "7632"; // Badenweiler + case "3": + return "7633"; // Staufen im Breisgau + case "4": + return "7634"; // Sulzburg + case "5": + return "7635"; // Schliengen + case "6": + return "7636"; // Münstertal Schwarzwald + default: + return ""; + } + } + + private static String fromNumber764(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7641"; // Emmendingen + case "2": + return "7642"; // Endingen Kaiserstuhl + case "3": + return "7643"; // Herbolzheim Breisgau + case "4": + return "7644"; // Kenzingen + case "5": + return "7645"; // Freiamt + case "6": + return "7646"; // Weisweil Breisgau + default: + return ""; + } + } + + private static String fromNumber765(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7651"; // Titisee-Neustadt + case "2": + return "7652"; // Hinterzarten + case "3": + return "7653"; // Lenzkirch + case "4": + return "7654"; // Löffingen + case "5": + return "7655"; // Feldberg-Altglashütten + case "6": + return "7656"; // Schluchsee + case "7": + return "7657"; // Eisenbach Hochschwarzwald + default: + return ""; + } + } + + private static String fromNumber766(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7660"; // St Peter Schwarzw + case "1": + return "7661"; // Kirchzarten + case "2": + return "7662"; // Vogtsburg im Kaiserstuhl + case "3": + return "7663"; // Eichstetten + case "4": + return "7664"; // Freiburg-Tiengen + case "5": + return "7665"; // March Breisgau + case "6": + return "7666"; // Denzlingen + case "7": + return "7667"; // Breisach am Rhein + case "8": + return "7668"; // Ihringen + case "9": + return "7669"; // St Märgen + default: + return ""; + } + } + + private static String fromNumber767(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7671"; // Todtnau + case "2": + return "7672"; // St Blasien + case "3": + return "7673"; // Schönau im Schwarzwald + case "4": + return "7674"; // Todtmoos + case "5": + return "7675"; // Bernau Baden + case "6": + return "7676"; // Feldberg Schwarzwald + default: + return ""; + } + } + + private static String fromNumber768(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7681"; // Waldkirch Breisgau + case "2": + return "7682"; // Elzach + case "3": + return "7683"; // Simonswald + case "4": + return "7684"; // Glottertal + case "5": + return "7685"; // Gutach-Bleibach + default: + return ""; + } + } + + private static String fromNumber77(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber770(number.substring(1)); + case "1": + return "771"; // Donaueschingen + case "2": + return fromNumber772(number.substring(1)); + case "3": + return fromNumber773(number.substring(1)); + case "4": + return fromNumber774(number.substring(1)); + case "5": + return fromNumber775(number.substring(1)); + case "6": + return fromNumber776(number.substring(1)); + case "7": + return fromNumber777(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber770(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7702"; // Blumberg Baden + case "3": + return "7703"; // Bonndorf im Schwarzwald + case "4": + return "7704"; // Geisingen Baden + case "5": + return "7705"; // Wolterdingen Schwarzw + case "6": + return "7706"; // Oberbaldingen + case "7": + return "7707"; // Bräunlingen + case "8": + return "7708"; // Geisingen-Leipferdingen + case "9": + return "7709"; // Wutach + default: + return ""; + } + } + + private static String fromNumber772(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7720"; // Schwenningen a Neckar + case "1": + return "7721"; // Villingen i Schwarzw + case "2": + return "7722"; // Triberg im Schwarzwald + case "3": + return "7723"; // Furtwangen im Schwarzwald + case "4": + return "7724"; // St Georgen im Schwarzwald + case "5": + return "7725"; // Königsfeld im Schwarzwald + case "6": + return "7726"; // Bad Dürrheim + case "7": + return "7727"; // Vöhrenbach + case "8": + return "7728"; // Niedereschach + case "9": + return "7729"; // Tennenbronn + default: + return ""; + } + } + + private static String fromNumber773(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7731"; // Singen Hohentwiel + case "2": + return "7732"; // Radolfzell am Bodensee + case "3": + return "7733"; // Engen Hegau + case "4": + return "7734"; // Gailingen + case "5": + return "7735"; // Öhningen + case "6": + return "7736"; // Tengen + case "8": + return "7738"; // Steisslingen + case "9": + return "7739"; // Hilzingen + default: + return ""; + } + } + + private static String fromNumber774(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7741"; // Tiengen Hochrhein + case "2": + return "7742"; // Klettgau + case "3": + return "7743"; // Ühlingen-Birkendorf + case "4": + return "7744"; // Stühlingen + case "5": + return "7745"; // Jestetten + case "6": + return "7746"; // Wutöschingen + case "7": + return "7747"; // Berau + case "8": + return "7748"; // Grafenhausen Hochschwarzw + default: + return ""; + } + } + + private static String fromNumber775(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7751"; // Waldshut + case "3": + return "7753"; // Albbruck + case "4": + return "7754"; // Görwihl + case "5": + return "7755"; // Weilheim Kr Waldshut + default: + return ""; + } + } + + private static String fromNumber776(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7761"; // Bad Säckingen + case "2": + return "7762"; // Wehr Baden + case "3": + return "7763"; // Murg + case "4": + return "7764"; // Herrischried + case "5": + return "7765"; // Rickenbach Hotzenw + default: + return ""; + } + } + + private static String fromNumber777(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7771"; // Stockach + case "3": + return "7773"; // Bodman-Ludwigshafen + case "4": + return "7774"; // Eigeltingen + case "5": + return "7775"; // Mühlingen + case "7": + return "7777"; // Sauldorf + default: + return ""; + } + } + + private static String fromNumber78(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber780(number.substring(1)); + case "1": + return "781"; // Offenburg + case "2": + return fromNumber782(number.substring(1)); + case "3": + return fromNumber783(number.substring(1)); + case "4": + return fromNumber784(number.substring(1)); + case "5": + return fromNumber785(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber780(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "7802"; // Oberkirch Baden + case "3": + return "7803"; // Gengenbach + case "4": + return "7804"; // Oppenau + case "5": + return "7805"; // Appenweier + case "6": + return "7806"; // Bad Peterstal-Griesbach + case "7": + return "7807"; // Neuried Ortenaukreis + case "8": + return "7808"; // Hohberg b Offenburg + default: + return ""; + } + } + + private static String fromNumber782(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7821"; // Lahr Schwarzwald + case "2": + return "7822"; // Ettenheim + case "3": + return "7823"; // Seelbach Schutter + case "4": + return "7824"; // Schwanau + case "5": + return "7825"; // Kippenheim + case "6": + return "7826"; // Schuttertal + default: + return ""; + } + } + + private static String fromNumber783(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7831"; // Hausach + case "2": + return "7832"; // Haslach im Kinzigtal + case "3": + return "7833"; // Hornberg Schwarzwaldbahn + case "4": + return "7834"; // Wolfach + case "5": + return "7835"; // Zell am Harmersbach + case "6": + return "7836"; // Schiltach + case "7": + return "7837"; // Oberharmersbach + case "8": + return "7838"; // Nordrach + case "9": + return "7839"; // Schapbach + default: + return ""; + } + } + + private static String fromNumber784(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7841"; // Achern + case "2": + return "7842"; // Kappelrodeck + case "3": + return "7843"; // Renchen + case "4": + return "7844"; // Rheinau + default: + return ""; + } + } + + private static String fromNumber785(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7851"; // Kehl + case "2": + return "7852"; // Willstätt + case "3": + return "7853"; // Kehl-Bodersweier + case "4": + return "7854"; // Kehl-Goldscheuer + default: + return ""; + } + } + + private static String fromNumber79(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber790(number.substring(1)); + case "1": + return "791"; // Schwäbisch Hall + case "3": + return fromNumber793(number.substring(1)); + case "4": + return fromNumber794(number.substring(1)); + case "5": + return fromNumber795(number.substring(1)); + case "6": + return fromNumber796(number.substring(1)); + case "7": + return fromNumber797(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber790(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "3": + return "7903"; // Mainhardt + case "4": + return "7904"; // Ilshofen + case "5": + return "7905"; // Langenburg + case "6": + return "7906"; // Braunsbach + case "7": + return "7907"; // Schwäbisch Hall-Sulzdorf + default: + return ""; + } + } + + private static String fromNumber793(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7930"; // Boxberg Baden + case "1": + return "7931"; // Bad Mergentheim + case "2": + return "7932"; // Niederstetten Württ + case "3": + return "7933"; // Creglingen + case "4": + return "7934"; // Weikersheim + case "5": + return "7935"; // Schrozberg + case "6": + return "7936"; // Schrozberg-Bartenstein + case "7": + return "7937"; // Dörzbach + case "8": + return "7938"; // Mulfingen Jagst + case "9": + return "7939"; // Schrozberg-Spielbach + default: + return ""; + } + } + + private static String fromNumber794(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7940"; // Künzelsau + case "1": + return "7941"; // Öhringen + case "2": + return "7942"; // Neuenstein Württ + case "3": + return "7943"; // Schöntal Jagst + case "4": + return "7944"; // Kupferzell + case "5": + return "7945"; // Wüstenrot + case "6": + return "7946"; // Bretzfeld + case "7": + return "7947"; // Forchtenberg + case "8": + return "7948"; // Öhringen-Ohrnberg + case "9": + return "7949"; // Pfedelbach-Untersteinbach + default: + return ""; + } + } + + private static String fromNumber795(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "7950"; // Schnelldorf + case "1": + return "7951"; // Crailsheim + case "2": + return "7952"; // Gerabronn + case "3": + return "7953"; // Blaufelden + case "4": + return "7954"; // Kirchberg an der Jagst + case "5": + return "7955"; // Wallhausen Württ + case "7": + return "7957"; // Kressberg + case "8": + return "7958"; // Rot Am See-Brettheim + case "9": + return "7959"; // Frankenhardt + default: + return ""; + } + } + + private static String fromNumber796(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7961"; // Ellwangen Jagst + case "2": + return "7962"; // Fichtenau + case "3": + return "7963"; // Adelmannsfelden + case "4": + return "7964"; // Stödtlen + case "5": + return "7965"; // Ellwangen-Röhlingen + case "6": + return "7966"; // Unterschneidheim + case "7": + return "7967"; // Jagstzell + default: + return ""; + } + } + + private static String fromNumber797(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "7971"; // Gaildorf + case "2": + return "7972"; // Gschwend b Gaildorf + case "3": + return "7973"; // Obersontheim + case "4": + return "7974"; // Bühlerzell + case "5": + return "7975"; // Untergröningen + case "6": + return "7976"; // Sulzbach-Laufen + case "7": + return "7977"; // Oberrot b Gaildorf + default: + return ""; + } + } + + private static String fromNumber8(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber80(number.substring(1)); + case "1": + return fromNumber81(number.substring(1)); + case "2": + return fromNumber82(number.substring(1)); + case "3": + return fromNumber83(number.substring(1)); + case "4": + return fromNumber84(number.substring(1)); + case "5": + return fromNumber85(number.substring(1)); + case "6": + return fromNumber86(number.substring(1)); + case "7": + return fromNumber87(number.substring(1)); + case "8": + return fromNumber88(number.substring(1)); + case "9": + return "89"; // München + default: + return ""; + } + } + + private static String fromNumber80(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return fromNumber802(number.substring(1)); + case "3": + return fromNumber803(number.substring(1)); + case "4": + return fromNumber804(number.substring(1)); + case "5": + return fromNumber805(number.substring(1)); + case "6": + return fromNumber806(number.substring(1)); + case "7": + return fromNumber807(number.substring(1)); + case "8": + return fromNumber808(number.substring(1)); + case "9": + return fromNumber809(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber802(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8020"; // Weyarn + case "1": + return "8021"; // Waakirchen + case "2": + return "8022"; // Tegernsee + case "3": + return "8023"; // Bayrischzell + case "4": + return "8024"; // Holzkirchen + case "5": + return "8025"; // Miesbach + case "6": + return "8026"; // Hausham + case "7": + return "8027"; // Dietramszell + case "8": + return "8028"; // Fischbachau + case "9": + return "8029"; // Kreuth b Tegernsee + default: + return ""; + } + } + + private static String fromNumber803(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8031"; // Rosenheim Oberbay + case "2": + return "8032"; // Rohrdorf Kr Rosenheim + case "3": + return "8033"; // Oberaudorf + case "4": + return "8034"; // Brannenburg + case "5": + return "8035"; // Raubling + case "6": + return "8036"; // Stephanskirchen Simssee + case "8": + return "8038"; // Vogtareuth + case "9": + return "8039"; // Rott a Inn + default: + return ""; + } + } + + private static String fromNumber804(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8041"; // Bad Tölz + case "2": + return "8042"; // Lenggries + case "3": + return "8043"; // Jachenau + case "5": + return "8045"; // Lenggries-Fall + case "6": + return "8046"; // Bad Heilbrunn + default: + return ""; + } + } + + private static String fromNumber805(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8051"; // Prien a Chiemsee + case "2": + return "8052"; // Aschau i Chiemgau + case "3": + return "8053"; // Bad Endorf + case "4": + return "8054"; // Breitbrunn a Chiemsee + case "5": + return "8055"; // Halfing + case "6": + return "8056"; // Eggstätt + case "7": + return "8057"; // Aschau-Sachrang + default: + return ""; + } + } + + private static String fromNumber806(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8061"; // Bad Aibling + case "2": + return "8062"; // Bruckmühl Mangfall + case "3": + return "8063"; // Feldkirchen-Westerham + case "4": + return "8064"; // Au b Bad Aibling + case "5": + return "8065"; // Tuntenhausen-Schönau + case "6": + return "8066"; // Bad Feilnbach + case "7": + return "8067"; // Tuntenhausen + default: + return ""; + } + } + + private static String fromNumber807(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8071"; // Wasserburg a Inn + case "2": + return "8072"; // Haag i OB + case "3": + return "8073"; // Gars a Inn + case "4": + return "8074"; // Schnaitsee + case "5": + return "8075"; // Amerang + case "6": + return "8076"; // Pfaffing + default: + return ""; + } + } + + private static String fromNumber808(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8081"; // Dorfen Stadt + case "2": + return "8082"; // Schwindegg + case "3": + return "8083"; // Isen + case "4": + return "8084"; // Taufkirchen Vils + case "5": + return "8085"; // Sankt Wolfgang + case "6": + return "8086"; // Buchbach Oberbay + default: + return ""; + } + } + + private static String fromNumber809(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8091"; // Kirchseeon + case "2": + return "8092"; // Grafing b München + case "3": + return "8093"; // Glonn Kr Ebersberg + case "4": + return "8094"; // Steinhöring + case "5": + return "8095"; // Aying + default: + return ""; + } + } + + private static String fromNumber81(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber810(number.substring(1)); + case "1": + return "811"; // Hallbergmoos + case "2": + return fromNumber812(number.substring(1)); + case "3": + return fromNumber813(number.substring(1)); + case "4": + return fromNumber814(number.substring(1)); + case "5": + return fromNumber815(number.substring(1)); + case "6": + return fromNumber816(number.substring(1)); + case "7": + return fromNumber817(number.substring(1)); + case "9": + return fromNumber819(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber810(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8102"; // Höhenkirchen-Siegertsbrunn + case "4": + return "8104"; // Sauerlach + case "5": + return "8105"; // Gilching + case "6": + return "8106"; // Vaterstetten + default: + return ""; + } + } + + private static String fromNumber812(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8121"; // Markt Schwaben + case "2": + return "8122"; // Erding + case "3": + return "8123"; // Moosinning + case "4": + return "8124"; // Forstern Oberbay + default: + return ""; + } + } + + private static String fromNumber813(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8131"; // Dachau + case "3": + return "8133"; // Haimhausen Oberbay + case "4": + return "8134"; // Odelzhausen + case "5": + return "8135"; // Sulzemoos + case "6": + return "8136"; // Markt Indersdorf + case "7": + return "8137"; // Petershausen + case "8": + return "8138"; // Schwabhausen b Dachau + case "9": + return "8139"; // Röhrmoos + default: + return ""; + } + } + + private static String fromNumber814(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8141"; // Fürstenfeldbruck + case "2": + return "8142"; // Olching + case "3": + return "8143"; // Inning a Ammersee + case "4": + return "8144"; // Grafrath + case "5": + return "8145"; // Mammendorf + case "6": + return "8146"; // Moorenweis + default: + return ""; + } + } + + private static String fromNumber815(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8151"; // Starnberg + case "2": + return "8152"; // Herrsching a Ammersee + case "3": + return "8153"; // Wessling + case "7": + return "8157"; // Feldafing + case "8": + return "8158"; // Tutzing + default: + return ""; + } + } + + private static String fromNumber816(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8161"; // Freising + case "5": + return "8165"; // Neufahrn b Freising + case "6": + return "8166"; // Allershausen Oberbay + case "7": + return "8167"; // Zolling + case "8": + return "8168"; // Attenkirchen + default: + return ""; + } + } + + private static String fromNumber817(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8170"; // Straßlach-Dingharting + case "1": + return "8171"; // Wolfratshausen + case "6": + return "8176"; // Egling b Wolfratshausen + case "7": + return "8177"; // Münsing Starnberger See + case "8": + return "8178"; // Icking + case "9": + return "8179"; // Eurasburg a d Loisach + default: + return ""; + } + } + + private static String fromNumber819(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8191"; // Landsberg a Lech + case "2": + return "8192"; // Schondorf a Ammersee + case "3": + return "8193"; // Geltendorf + case "4": + return "8194"; // Vilgertshofen + case "5": + return "8195"; // Weil Kr Landsberg a Lech + case "6": + return "8196"; // Pürgen + default: + return ""; + } + } + + private static String fromNumber82(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber820(number.substring(1)); + case "1": + return "821"; // Augsburg + case "2": + return fromNumber822(number.substring(1)); + case "3": + return fromNumber823(number.substring(1)); + case "4": + return fromNumber824(number.substring(1)); + case "5": + return fromNumber825(number.substring(1)); + case "6": + return fromNumber826(number.substring(1)); + case "7": + return fromNumber827(number.substring(1)); + case "8": + return fromNumber828(number.substring(1)); + case "9": + return fromNumber829(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber820(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8202"; // Althegnenberg + case "3": + return "8203"; // Grossaitingen + case "4": + return "8204"; // Mickhausen + case "5": + return "8205"; // Dasing + case "6": + return "8206"; // Egling a d Paar + case "7": + return "8207"; // Affing + case "8": + return "8208"; // Eurasburg b Augsburg + default: + return ""; + } + } + + private static String fromNumber822(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8221"; // Günzburg + case "2": + return "8222"; // Burgau Schwab + case "3": + return "8223"; // Ichenhausen + case "4": + return "8224"; // Offingen Donau + case "5": + return "8225"; // Jettingen-Scheppach + case "6": + return "8226"; // Bibertal + default: + return ""; + } + } + + private static String fromNumber823(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8230"; // Gablingen + case "1": + return "8231"; // Königsbrunn b Augsburg + case "2": + return "8232"; // Schwabmünchen + case "3": + return "8233"; // Kissing + case "4": + return "8234"; // Bobingen + case "6": + return "8236"; // Fischach + case "7": + return "8237"; // Aindling + case "8": + return "8238"; // Gessertshausen + case "9": + return "8239"; // Langenneufnach + default: + return ""; + } + } + + private static String fromNumber824(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8241"; // Buchloe + case "3": + return "8243"; // Fuchstal + case "5": + return "8245"; // Türkheim Wertach + case "6": + return "8246"; // Waal + case "7": + return "8247"; // Bad Wörishofen + case "8": + return "8248"; // Lamerdingen + case "9": + return "8249"; // Ettringen Wertach + default: + return ""; + } + } + + private static String fromNumber825(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8250"; // Hilgertshausen-Tandern + case "1": + return "8251"; // Aichach + case "2": + return "8252"; // Schrobenhausen + case "3": + return "8253"; // Pöttmes + case "4": + return "8254"; // Altomünster + case "7": + return "8257"; // Inchenhofen + case "8": + return "8258"; // Sielenbach + case "9": + return "8259"; // Schiltberg + default: + return ""; + } + } + + private static String fromNumber826(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8261"; // Mindelheim + case "2": + return "8262"; // Mittelneufnach + case "3": + return "8263"; // Breitenbrunn Schwab + case "5": + return "8265"; // Pfaffenhausen Schwab + case "6": + return "8266"; // Kirchheim i Schw + case "7": + return "8267"; // Dirlewang + case "8": + return "8268"; // Tussenhausen + case "9": + return "8269"; // Unteregg b Mindelheim + default: + return ""; + } + } + + private static String fromNumber827(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8271"; // Meitingen + case "2": + return "8272"; // Wertingen + case "3": + return "8273"; // Nordendorf + case "4": + return "8274"; // Buttenwiesen + case "6": + return "8276"; // Baar Schwaben + default: + return ""; + } + } + + private static String fromNumber828(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8281"; // Thannhausen Schwab + case "2": + return "8282"; // Krumbach Schwaben + case "3": + return "8283"; // Neuburg a d Kammel + case "4": + return "8284"; // Ziemetshausen + case "5": + return "8285"; // Burtenbach + default: + return ""; + } + } + + private static String fromNumber829(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8291"; // Zusmarshausen + case "2": + return "8292"; // Dinkelscherben + case "3": + return "8293"; // Welden b Augsburg + case "4": + return "8294"; // Horgau + case "5": + return "8295"; // Altenmünster Schwab + case "6": + return "8296"; // Villenbach + default: + return ""; + } + } + + private static String fromNumber83(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber830(number.substring(1)); + case "1": + return "831"; // Kempten Allgäu + case "2": + return fromNumber832(number.substring(1)); + case "3": + return fromNumber833(number.substring(1)); + case "4": + return fromNumber834(number.substring(1)); + case "6": + return fromNumber836(number.substring(1)); + case "7": + return fromNumber837(number.substring(1)); + case "8": + return fromNumber838(number.substring(1)); + case "9": + return fromNumber839(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber830(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8302"; // Görisried + case "3": + return "8303"; // Waltenhofen + case "4": + return "8304"; // Wildpoldsried + case "6": + return "8306"; // Ronsberg + default: + return ""; + } + } + + private static String fromNumber832(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8320"; // Missen-Wilhams + case "1": + return "8321"; // Sonthofen + case "2": + return "8322"; // Oberstdorf + case "3": + return "8323"; // Immenstadt i Allgäu + case "4": + return "8324"; // Hindelang + case "5": + return "8325"; // Oberstaufen-Thalkirchdorf + case "6": + return "8326"; // Fischen i Allgäu + case "7": + return "8327"; // Rettenberg + case "8": + return "8328"; // Balderschwang + default: + return ""; + } + } + + private static String fromNumber833(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8330"; // Legau + case "1": + return "8331"; // Memmingen + case "2": + return "8332"; // Ottobeuren + case "3": + return "8333"; // Babenhausen Schwab + case "4": + return "8334"; // Bad Grönenbach + case "5": + return "8335"; // Fellheim + case "6": + return "8336"; // Erkheim + case "7": + return "8337"; // Altenstadt Iller + case "8": + return "8338"; // Böhen + default: + return ""; + } + } + + private static String fromNumber834(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8340"; // Baisweil + case "1": + return "8341"; // Kaufbeuren + case "2": + return "8342"; // Marktoberdorf + case "3": + return "8343"; // Aitrang + case "4": + return "8344"; // Westendorf b Kaufbeuren + case "5": + return "8345"; // Stöttwang + case "6": + return "8346"; // Pforzen + case "7": + return "8347"; // Friesenried + case "8": + return "8348"; // Bidingen + case "9": + return "8349"; // Stötten a Auerberg + default: + return ""; + } + } + + private static String fromNumber836(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8361"; // Nesselwang + case "2": + return "8362"; // Füssen + case "3": + return "8363"; // Pfronten + case "4": + return "8364"; // Seeg + case "5": + return "8365"; // Wertach + case "6": + return "8366"; // Oy-Mittelberg + case "7": + return "8367"; // Roßhaupten Forggensee + case "8": + return "8368"; // Halblech + case "9": + return "8369"; // Rückholz + default: + return ""; + } + } + + private static String fromNumber837(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8370"; // Wiggensbach + case "2": + return "8372"; // Obergünzburg + case "3": + return "8373"; // Altusried + case "4": + return "8374"; // Dietmannsried + case "5": + return "8375"; // Weitnau + case "6": + return "8376"; // Sulzberg Allgäu + case "7": + return "8377"; // Unterthingau + case "8": + return "8378"; // Buchenberg b Kempten + case "9": + return "8379"; // Waltenhofen-Oberdorf + default: + return ""; + } + } + + private static String fromNumber838(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8380"; // Achberg + case "1": + return "8381"; // Lindenberg i Allgäu + case "2": + return "8382"; // Lindau Bodensee + case "3": + return "8383"; // Grünenbach Allgäu + case "4": + return "8384"; // Röthenbach Allgäu + case "5": + return "8385"; // Hergatz + case "6": + return "8386"; // Oberstaufen + case "7": + return "8387"; // Weiler-Simmerberg + case "8": + return "8388"; // Hergensweiler + case "9": + return "8389"; // Weissensberg + default: + return ""; + } + } + + private static String fromNumber839(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8392"; // Markt Rettenbach + case "3": + return "8393"; // Holzgünz + case "4": + return "8394"; // Lautrach + case "5": + return "8395"; // Tannheim Württ + default: + return ""; + } + } + + private static String fromNumber84(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber840(number.substring(1)); + case "1": + return "841"; // Ingolstadt Donau + case "2": + return fromNumber842(number.substring(1)); + case "3": + return fromNumber843(number.substring(1)); + case "4": + return fromNumber844(number.substring(1)); + case "5": + return fromNumber845(number.substring(1)); + case "6": + return fromNumber846(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber840(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8402"; // Münchsmünster + case "3": + return "8403"; // Pförring + case "4": + return "8404"; // Oberdolling + case "5": + return "8405"; // Stammham b Ingolstadt + case "6": + return "8406"; // Böhmfeld + case "7": + return "8407"; // Grossmehring + default: + return ""; + } + } + + private static String fromNumber842(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8421"; // Eichstätt Bay + case "2": + return "8422"; // Dollnstein + case "3": + return "8423"; // Titting + case "4": + return "8424"; // Nassenfels + case "6": + return "8426"; // Walting Kr Eichstätt + case "7": + return "8427"; // Wellheim + default: + return ""; + } + } + + private static String fromNumber843(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8431"; // Neuburg a d Donau + case "2": + return "8432"; // Burgheim + case "3": + return "8433"; // Königsmoos + case "4": + return "8434"; // Rennertshofen + case "5": + return "8435"; // Ehekirchen + default: + return ""; + } + } + + private static String fromNumber844(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8441"; // Pfaffenhofen a d Ilm + case "2": + return "8442"; // Wolnzach + case "3": + return "8443"; // Hohenwart Paar + case "4": + return "8444"; // Schweitenkirchen + case "5": + return "8445"; // Gerolsbach + case "6": + return "8446"; // Pörnbach + default: + return ""; + } + } + + private static String fromNumber845(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8450"; // Ingolstadt-Zuchering + case "2": + return "8452"; // Geisenfeld + case "3": + return "8453"; // Reichertshofen Oberbay + case "4": + return "8454"; // Karlshuld + case "6": + return "8456"; // Lenting + case "7": + return "8457"; // Vohburg a d Donau + case "8": + return "8458"; // Gaimersheim + case "9": + return "8459"; // Manching + default: + return ""; + } + } + + private static String fromNumber846(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8460"; // Berching-Holnstein + case "1": + return "8461"; // Beilngries + case "2": + return "8462"; // Berching + case "3": + return "8463"; // Greding + case "4": + return "8464"; // Dietfurt a d Altmühl + case "5": + return "8465"; // Kipfenberg + case "6": + return "8466"; // Denkendorf Oberbay + case "7": + return "8467"; // Kinding + case "8": + return "8468"; // Altmannstein-Pondorf + case "9": + return "8469"; // Freystadt-Burggriesbach + default: + return ""; + } + } + + private static String fromNumber85(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber850(number.substring(1)); + case "1": + return "851"; // Passau + case "3": + return fromNumber853(number.substring(1)); + case "4": + return fromNumber854(number.substring(1)); + case "5": + return fromNumber855(number.substring(1)); + case "6": + return fromNumber856(number.substring(1)); + case "7": + return fromNumber857(number.substring(1)); + case "8": + return fromNumber858(number.substring(1)); + case "9": + return fromNumber859(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber850(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8501"; // Thyrnau + case "2": + return "8502"; // Fürstenzell + case "3": + return "8503"; // Neuhaus a Inn + case "4": + return "8504"; // Tittling + case "5": + return "8505"; // Hutthurm + case "6": + return "8506"; // Bad Höhenstadt + case "7": + return "8507"; // Neuburg a Inn + case "9": + return "8509"; // Ruderting + default: + return ""; + } + } + + private static String fromNumber853(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8531"; // Pocking + case "2": + return "8532"; // Griesbach i Rottal + case "3": + return "8533"; // Rotthalmünster + case "4": + return "8534"; // Tettenweis + case "5": + return "8535"; // Haarbach + case "6": + return "8536"; // Kößlarn + case "7": + return "8537"; // Bad Füssing-Aigen + case "8": + return "8538"; // Pocking-Hartkirchen + default: + return ""; + } + } + + private static String fromNumber854(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8541"; // Vilshofen Niederbay + case "2": + return "8542"; // Ortenburg + case "3": + return "8543"; // Aidenbach + case "4": + return "8544"; // Eging a See + case "5": + return "8545"; // Hofkirchen Bay + case "6": + return "8546"; // Windorf-Otterskirchen + case "7": + return "8547"; // Osterhofen-Gergweis + case "8": + return "8548"; // Vilshofen-Sandbach + case "9": + return "8549"; // Vilshofen-Pleinting + default: + return ""; + } + } + + private static String fromNumber855(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8550"; // Philippsreut + case "1": + return "8551"; // Freyung + case "2": + return "8552"; // Grafenau Niederbay + case "3": + return "8553"; // Spiegelau + case "4": + return "8554"; // Schönberg Niederbay + case "5": + return "8555"; // Perlesreut + case "6": + return "8556"; // Haidmühle + case "7": + return "8557"; // Mauth + case "8": + return "8558"; // Hohenau Niederbay + default: + return ""; + } + } + + private static String fromNumber856(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8561"; // Pfarrkirchen Niederbay + case "2": + return "8562"; // Triftern + case "3": + return "8563"; // Bad Birnbach Rottal + case "4": + return "8564"; // Johanniskirchen + case "5": + return "8565"; // Dietersburg-Baumgarten + default: + return ""; + } + } + + private static String fromNumber857(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8571"; // Simbach a Inn + case "2": + return "8572"; // Tann Niederbay + case "3": + return "8573"; // Ering + case "4": + return "8574"; // Wittibreut + default: + return ""; + } + } + + private static String fromNumber858(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8581"; // Waldkirchen Niederbay + case "2": + return "8582"; // Röhrnbach + case "3": + return "8583"; // Neureichenau + case "4": + return "8584"; // Breitenberg Niederbay + case "5": + return "8585"; // Grainet + case "6": + return "8586"; // Hauzenberg + default: + return ""; + } + } + + private static String fromNumber859(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8591"; // Obernzell + case "2": + return "8592"; // Wegscheid Niederbay + case "3": + return "8593"; // Untergriesbach + default: + return ""; + } + } + + private static String fromNumber86(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "861"; // Traunstein + case "2": + return fromNumber862(number.substring(1)); + case "3": + return fromNumber863(number.substring(1)); + case "4": + return fromNumber864(number.substring(1)); + case "5": + return fromNumber865(number.substring(1)); + case "6": + return fromNumber866(number.substring(1)); + case "7": + return fromNumber867(number.substring(1)); + case "8": + return fromNumber868(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber862(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8621"; // Trostberg + case "2": + return "8622"; // Tacherting- Peterskirchen + case "3": + return "8623"; // Kirchweidach + case "4": + return "8624"; // Obing + case "8": + return "8628"; // Kienberg Oberbay + case "9": + return "8629"; // Palling + default: + return ""; + } + } + + private static String fromNumber863(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8630"; // Oberneukirchen + case "1": + return "8631"; // Mühldorf a Inn + case "3": + return "8633"; // Tüßling + case "4": + return "8634"; // Garching a d Alz + case "5": + return "8635"; // Pleiskirchen + case "6": + return "8636"; // Ampfing + case "7": + return "8637"; // Lohkirchen + case "8": + return "8638"; // Waldkraiburg + case "9": + return "8639"; // Neumarkt-Sankt Veit + default: + return ""; + } + } + + private static String fromNumber864(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8640"; // Reit Im Winkl + case "1": + return "8641"; // Grassau Kr Traunstein + case "2": + return "8642"; // Übersee + case "9": + return "8649"; // Schleching + default: + return ""; + } + } + + private static String fromNumber865(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8650"; // Marktschellenberg + case "1": + return "8651"; // Bad Reichenhall + case "2": + return "8652"; // Berchtesgaden + case "4": + return "8654"; // Freilassing + case "6": + return "8656"; // Anger + case "7": + return "8657"; // Ramsau b Berchtesgaden + default: + return ""; + } + } + + private static String fromNumber866(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8661"; // Grabenstätt Chiemsee + case "2": + return "8662"; // Siegsdorf Kr Traunstein + case "3": + return "8663"; // Ruhpolding + case "4": + return "8664"; // Chieming + case "5": + return "8665"; // Inzell + case "6": + return "8666"; // Teisendorf + case "7": + return "8667"; // Seeon-Seebruck + case "9": + return "8669"; // Traunreut + default: + return ""; + } + } + + private static String fromNumber867(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8670"; // Reischach Kr Altötting + case "1": + return "8671"; // Altötting + case "7": + return "8677"; // Burghausen Salzach + case "8": + return "8678"; // Marktl + case "9": + return "8679"; // Burgkirchen a d Alz + default: + return ""; + } + } + + private static String fromNumber868(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8681"; // Waging a See + case "2": + return "8682"; // Laufen Salzach + case "3": + return "8683"; // Tittmoning + case "4": + return "8684"; // Fridolfing + case "5": + return "8685"; // Kirchanschöring + case "6": + return "8686"; // Petting + case "7": + return "8687"; // Taching-Tengling + default: + return ""; + } + } + + private static String fromNumber87(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber870(number.substring(1)); + case "1": + return "871"; // Landshut + case "2": + return fromNumber872(number.substring(1)); + case "3": + return fromNumber873(number.substring(1)); + case "4": + return fromNumber874(number.substring(1)); + case "5": + return fromNumber875(number.substring(1)); + case "6": + return fromNumber876(number.substring(1)); + case "7": + return fromNumber877(number.substring(1)); + case "8": + return fromNumber878(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber870(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "8702"; // Wörth a d Isar + case "3": + return "8703"; // Essenbach + case "4": + return "8704"; // Altdorf-Pfettrach + case "5": + return "8705"; // Altfraunhofen + case "6": + return "8706"; // Vilsheim + case "7": + return "8707"; // Adlkofen + case "8": + return "8708"; // Weihmichl-Unterneuhausen + case "9": + return "8709"; // Eching Niederbay + default: + return ""; + } + } + + private static String fromNumber872(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8721"; // Eggenfelden + case "2": + return "8722"; // Gangkofen + case "3": + return "8723"; // Arnstorf + case "4": + return "8724"; // Massing + case "5": + return "8725"; // Wurmannsquick + case "6": + return "8726"; // Schönau Niederbay + case "7": + return "8727"; // Falkenberg Niederbay + case "8": + return "8728"; // Geratskirchen + default: + return ""; + } + } + + private static String fromNumber873(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8731"; // Dingolfing + case "2": + return "8732"; // Frontenhausen + case "3": + return "8733"; // Mengkofen + case "4": + return "8734"; // Reisbach Niederbay + case "5": + return "8735"; // Gangkofen-Kollbach + default: + return ""; + } + } + + private static String fromNumber874(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8741"; // Vilsbiburg + case "2": + return "8742"; // Velden Vils + case "3": + return "8743"; // Geisenhausen + case "4": + return "8744"; // Gerzen + case "5": + return "8745"; // Bodenkirchen + default: + return ""; + } + } + + private static String fromNumber875(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8751"; // Mainburg + case "2": + return "8752"; // Au i d Hallertau + case "3": + return "8753"; // Elsendorf Niederbay + case "4": + return "8754"; // Volkenschwand + case "6": + return "8756"; // Nandlstadt + default: + return ""; + } + } + + private static String fromNumber876(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8761"; // Moosburg a d Isar + case "2": + return "8762"; // Wartenberg Oberbay + case "4": + return "8764"; // Mauern Kr Freising + case "5": + return "8765"; // Bruckberg Niederbay + case "6": + return "8766"; // Gammelsdorf + default: + return ""; + } + } + + private static String fromNumber877(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8771"; // Ergoldsbach + case "2": + return "8772"; // Mallersdorf-Pfaffenberg + case "3": + return "8773"; // Neufahrn i NB + case "4": + return "8774"; // Bayerbach b Ergoldsbach + default: + return ""; + } + } + + private static String fromNumber878(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8781"; // Rottenburg a d Laaber + case "2": + return "8782"; // Pfeffenhausen + case "3": + return "8783"; // Rohr i NB + case "4": + return "8784"; // Hohenthann + case "5": + return "8785"; // Rottenburg-Oberroning + default: + return ""; + } + } + + private static String fromNumber88(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber880(number.substring(1)); + case "1": + return "881"; // Weilheim i OB + case "2": + return fromNumber882(number.substring(1)); + case "4": + return fromNumber884(number.substring(1)); + case "5": + return fromNumber885(number.substring(1)); + case "6": + return fromNumber886(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber880(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8801"; // Seeshaupt + case "2": + return "8802"; // Huglfing + case "3": + return "8803"; // Peissenberg + case "5": + return "8805"; // Hohenpeissenberg + case "6": + return "8806"; // Utting a Ammersee + case "7": + return "8807"; // Dießen a Ammersee + case "8": + return "8808"; // Pähl + case "9": + return "8809"; // Wessobrunn + default: + return ""; + } + } + + private static String fromNumber882(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8821"; // Garmisch-Partenkirchen + case "2": + return "8822"; // Oberammergau + case "3": + return "8823"; // Mittenwald + case "4": + return "8824"; // Oberau Loisach + case "5": + return "8825"; // Krün + default: + return ""; + } + } + + private static String fromNumber884(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8841"; // Murnau a Staffelsee + case "5": + return "8845"; // Bad Kohlgrub + case "6": + return "8846"; // Uffing a Staffelsee + case "7": + return "8847"; // Obersöchering + default: + return ""; + } + } + + private static String fromNumber885(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "8851"; // Kochel a See + case "6": + return "8856"; // Penzberg + case "7": + return "8857"; // Benediktbeuern + case "8": + return "8858"; // Kochel-Walchensee + default: + return ""; + } + } + + private static String fromNumber886(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "8860"; // Bernbeuren + case "1": + return "8861"; // Schongau + case "2": + return "8862"; // Steingaden Oberbay + case "7": + return "8867"; // Rottenbuch Oberbay + case "8": + return "8868"; // Schwabsoien + case "9": + return "8869"; // Kinsau + default: + return ""; + } + } + + private static String fromNumber9(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber90(number.substring(1)); + case "1": + return fromNumber91(number.substring(1)); + case "2": + return fromNumber92(number.substring(1)); + case "3": + return fromNumber93(number.substring(1)); + case "4": + return fromNumber94(number.substring(1)); + case "5": + return fromNumber95(number.substring(1)); + case "6": + return fromNumber96(number.substring(1)); + case "7": + return fromNumber97(number.substring(1)); + case "8": + return fromNumber98(number.substring(1)); + case "9": + return fromNumber99(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber90(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "6": + return "906"; // Donauwörth + case "7": + return fromNumber907(number.substring(1)); + case "8": + return fromNumber908(number.substring(1)); + case "9": + return fromNumber909(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber907(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9070"; // Tapfheim + case "1": + return "9071"; // Dillingen a d Donau + case "2": + return "9072"; // Lauingen Donau + case "3": + return "9073"; // Gundelfingen a d Donau + case "4": + return "9074"; // Höchstädt a d Donau + case "5": + return "9075"; // Glött + case "6": + return "9076"; // Wittislingen + case "7": + return "9077"; // Bachhagel + case "8": + return "9078"; // Mertingen + default: + return ""; + } + } + + private static String fromNumber908(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9080"; // Harburg Schwaben + case "1": + return "9081"; // Nördlingen + case "2": + return "9082"; // Oettingen i Bay + case "3": + return "9083"; // Möttingen + case "4": + return "9084"; // Bissingen Schwab + case "5": + return "9085"; // Alerheim + case "6": + return "9086"; // Fremdingen + case "7": + return "9087"; // Marktoffingen + case "8": + return "9088"; // Mönchsdeggingen + case "9": + return "9089"; // Bissingen-Unterringingen + default: + return ""; + } + } + + private static String fromNumber909(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9090"; // Rain Lech + case "1": + return "9091"; // Monheim Schwab + case "2": + return "9092"; // Wemding + case "3": + return "9093"; // Polsingen + case "4": + return "9094"; // Tagmersheim + case "7": + return "9097"; // Marxheim + case "9": + return "9099"; // Kaisheim + default: + return ""; + } + } + + private static String fromNumber91(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber910(number.substring(1)); + case "1": + return "911"; // Nürnberg + case "2": + return fromNumber912(number.substring(1)); + case "3": + return fromNumber913(number.substring(1)); + case "4": + return fromNumber914(number.substring(1)); + case "5": + return fromNumber915(number.substring(1)); + case "6": + return fromNumber916(number.substring(1)); + case "7": + return fromNumber917(number.substring(1)); + case "8": + return fromNumber918(number.substring(1)); + case "9": + return fromNumber919(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber910(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9101"; // Langenzenn + case "2": + return "9102"; // Wilhermsdorf + case "3": + return "9103"; // Cadolzburg + case "4": + return "9104"; // Emskirchen + case "5": + return "9105"; // Grosshabersdorf + case "6": + return "9106"; // Markt Erlbach + case "7": + return "9107"; // Trautskirchen + default: + return ""; + } + } + + private static String fromNumber912(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9120"; // Leinburg + case "2": + return "9122"; // Schwabach + case "3": + return "9123"; // Lauf a d Pegnitz + case "6": + return "9126"; // Eckental + case "7": + return "9127"; // Rosstal Mittelfr + case "8": + return "9128"; // Feucht + case "9": + return "9129"; // Wendelstein + default: + return ""; + } + } + + private static String fromNumber913(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9131"; // Erlangen + case "2": + return "9132"; // Herzogenaurach + case "3": + return "9133"; // Baiersdorf Mittelfr + case "4": + return "9134"; // Neunkirchen a Brand + case "5": + return "9135"; // Heßdorf Mittelfr + default: + return ""; + } + } + + private static String fromNumber914(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9141"; // Weißenburg i Bay + case "2": + return "9142"; // Treuchtlingen + case "3": + return "9143"; // Pappenheim Mittelfr + case "4": + return "9144"; // Pleinfeld + case "5": + return "9145"; // Solnhofen + case "6": + return "9146"; // Markt Berolzheim + case "7": + return "9147"; // Nennslingen + case "8": + return "9148"; // Ettenstatt + case "9": + return "9149"; // Weissenburg-Suffersheim + default: + return ""; + } + } + + private static String fromNumber915(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9151"; // Hersbruck + case "2": + return "9152"; // Hartenstein Mittelfr + case "3": + return "9153"; // Schnaittach + case "4": + return "9154"; // Pommelsbrunn + case "5": + return "9155"; // Simmelsdorf + case "6": + return "9156"; // Neuhaus a d Pegnitz + case "7": + return "9157"; // Alfeld Mittelfr + case "8": + return "9158"; // Offenhausen Mittelfr + default: + return ""; + } + } + + private static String fromNumber916(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9161"; // Neustadt a d Aisch + case "2": + return "9162"; // Scheinfeld + case "3": + return "9163"; // Dachsbach + case "4": + return "9164"; // Langenfeld Mittelfr + case "5": + return "9165"; // Sugenheim + case "6": + return "9166"; // Münchsteinach + case "7": + return "9167"; // Oberscheinfeld + default: + return ""; + } + } + + private static String fromNumber917(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9170"; // Schwanstetten + case "1": + return "9171"; // Roth Mittelfr + case "2": + return "9172"; // Georgensgmünd + case "3": + return "9173"; // Thalmässing + case "4": + return "9174"; // Hilpoltstein + case "5": + return "9175"; // Spalt + case "6": + return "9176"; // Allersberg + case "7": + return "9177"; // Heideck + case "8": + return "9178"; // Abenberg Mittelfr + case "9": + return "9179"; // Freystadt + default: + return ""; + } + } + + private static String fromNumber918(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9180"; // Pyrbaum + case "1": + return "9181"; // Neumarkt i d Opf + case "2": + return "9182"; // Velburg + case "3": + return "9183"; // Burgthann + case "4": + return "9184"; // Deining Oberpf + case "5": + return "9185"; // Mühlhausen Oberpf + case "6": + return "9186"; // Lauterhofen Oberpf + case "7": + return "9187"; // Altdorf b Nürnberg + case "8": + return "9188"; // Postbauer-Heng + case "9": + return "9189"; // Berg b Neumarkt i d Opf + default: + return ""; + } + } + + private static String fromNumber919(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9190"; // Heroldsbach + case "1": + return "9191"; // Forchheim Oberfr + case "2": + return "9192"; // Gräfenberg + case "3": + return "9193"; // Höchstadt a d Aisch + case "4": + return "9194"; // Ebermannstadt + case "5": + return "9195"; // Adelsdorf Mittelfr + case "6": + return "9196"; // Wiesenttal + case "7": + return "9197"; // Egloffstein + case "8": + return "9198"; // Heiligenstadt i Ofr + case "9": + return "9199"; // Kunreuth + default: + return ""; + } + } + + private static String fromNumber92(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber920(number.substring(1)); + case "1": + return "921"; // Bayreuth + case "2": + return fromNumber922(number.substring(1)); + case "3": + return fromNumber923(number.substring(1)); + case "4": + return fromNumber924(number.substring(1)); + case "5": + return fromNumber925(number.substring(1)); + case "6": + return fromNumber926(number.substring(1)); + case "7": + return fromNumber927(number.substring(1)); + case "8": + return fromNumber928(number.substring(1)); + case "9": + return fromNumber929(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber920(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9201"; // Gesees + case "2": + return "9202"; // Waischenfeld + case "3": + return "9203"; // Neudrossenfeld + case "4": + return "9204"; // Plankenfels + case "5": + return "9205"; // Vorbach + case "6": + return "9206"; // Mistelgau-Obernsees + case "7": + return "9207"; // Königsfeld Oberfr + case "8": + return "9208"; // Bindlach + case "9": + return "9209"; // Emtmannsberg + default: + return ""; + } + } + + private static String fromNumber922(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9220"; // Kasendorf-Azendorf + case "1": + return "9221"; // Kulmbach + case "2": + return "9222"; // Presseck + case "3": + return "9223"; // Rugendorf + case "5": + return "9225"; // Stadtsteinach + case "7": + return "9227"; // Neuenmarkt + case "8": + return "9228"; // Thurnau + case "9": + return "9229"; // Mainleus + default: + return ""; + } + } + + private static String fromNumber923(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9231"; // Marktredwitz + case "2": + return "9232"; // Wunsiedel + case "3": + return "9233"; // Arzberg Oberfr + case "4": + return "9234"; // Neusorg + case "5": + return "9235"; // Thierstein + case "6": + return "9236"; // Nagel + case "8": + return "9238"; // Röslau + default: + return ""; + } + } + + private static String fromNumber924(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9241"; // Pegnitz + case "2": + return "9242"; // Gößweinstein + case "3": + return "9243"; // Pottenstein + case "4": + return "9244"; // Betzenstein + case "5": + return "9245"; // Obertrubach + case "6": + return "9246"; // Pegnitz-Trockau + default: + return ""; + } + } + + private static String fromNumber925(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9251"; // Münchberg + case "2": + return "9252"; // Helmbrechts + case "3": + return "9253"; // Weissenstadt + case "4": + return "9254"; // Gefrees + case "5": + return "9255"; // Marktleugast + case "6": + return "9256"; // Stammbach + case "7": + return "9257"; // Zell Oberfr + default: + return ""; + } + } + + private static String fromNumber926(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9260"; // Wilhelmsthal Oberfr + case "1": + return "9261"; // Kronach + case "2": + return "9262"; // Wallenfels + case "3": + return "9263"; // Ludwigsstadt + case "4": + return "9264"; // Küps + case "5": + return "9265"; // Pressig + case "6": + return "9266"; // Mitwitz + case "7": + return "9267"; // Nordhalben + case "8": + return "9268"; // Teuschnitz + case "9": + return "9269"; // Tettau Kr Kronach + default: + return ""; + } + } + + private static String fromNumber927(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9270"; // Creussen + case "1": + return "9271"; // Thurnau-Alladorf + case "2": + return "9272"; // Fichtelberg + case "3": + return "9273"; // Bad Berneck i Fichtelgebirge + case "4": + return "9274"; // Hollfeld + case "5": + return "9275"; // Speichersdorf + case "6": + return "9276"; // Bischofsgrün + case "7": + return "9277"; // Warmensteinach + case "8": + return "9278"; // Weidenberg + case "9": + return "9279"; // Mistelgau + default: + return ""; + } + } + + private static String fromNumber928(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9280"; // Selbitz Oberfr + case "1": + return "9281"; // Hof Saale + case "2": + return "9282"; // Naila + case "3": + return "9283"; // Rehau + case "4": + return "9284"; // Schwarzenbach a d Saale + case "5": + return "9285"; // Kirchenlamitz + case "6": + return "9286"; // Oberkotzau + case "7": + return "9287"; // Selb + case "8": + return "9288"; // Bad Steben + case "9": + return "9289"; // Schwarzenbach a Wald + default: + return ""; + } + } + + private static String fromNumber929(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9292"; // Konradsreuth + case "3": + return "9293"; // Berg Oberfr + case "4": + return "9294"; // Regnitzlosau + case "5": + return "9295"; // Töpen + default: + return ""; + } + } + + private static String fromNumber93(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber930(number.substring(1)); + case "1": + return "931"; // Würzburg + case "2": + return fromNumber932(number.substring(1)); + case "3": + return fromNumber933(number.substring(1)); + case "4": + return fromNumber934(number.substring(1)); + case "5": + return fromNumber935(number.substring(1)); + case "6": + return fromNumber936(number.substring(1)); + case "7": + return fromNumber937(number.substring(1)); + case "8": + return fromNumber938(number.substring(1)); + case "9": + return fromNumber939(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber930(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9302"; // Rottendorf Unterfr + case "3": + return "9303"; // Eibelstadt + case "5": + return "9305"; // Estenfeld + case "6": + return "9306"; // Kist + case "7": + return "9307"; // Altertheim + default: + return ""; + } + } + + private static String fromNumber932(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9321"; // Kitzingen + case "3": + return "9323"; // Iphofen + case "4": + return "9324"; // Dettelbach + case "5": + return "9325"; // Kleinlangheim + case "6": + return "9326"; // Markt Einersheim + default: + return ""; + } + } + + private static String fromNumber933(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9331"; // Ochsenfurt + case "2": + return "9332"; // Marktbreit + case "3": + return "9333"; // Sommerhausen + case "4": + return "9334"; // Giebelstadt + case "5": + return "9335"; // Aub Kr Würzburg + case "6": + return "9336"; // Bütthard + case "7": + return "9337"; // Gaukönigshofen + case "8": + return "9338"; // Röttingen Unterfr + case "9": + return "9339"; // Ippesheim + default: + return ""; + } + } + + private static String fromNumber934(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9340"; // Königheim-Brehmen + case "1": + return "9341"; // Tauberbischofsheim + case "2": + return "9342"; // Wertheim + case "3": + return "9343"; // Lauda-Königshofen + case "4": + return "9344"; // Gerchsheim + case "5": + return "9345"; // Külsheim Baden + case "6": + return "9346"; // Grünsfeld + case "7": + return "9347"; // Wittighausen + case "8": + return "9348"; // Werbach-Gamburg + case "9": + return "9349"; // Werbach-Wenkheim + default: + return ""; + } + } + + private static String fromNumber935(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9350"; // Eussenheim-Hundsbach + case "1": + return "9351"; // Gemünden a Main + case "2": + return "9352"; // Lohr a Main + case "3": + return "9353"; // Karlstadt + case "4": + return "9354"; // Rieneck + case "5": + return "9355"; // Frammersbach + case "6": + return "9356"; // Burgsinn + case "7": + return "9357"; // Gräfendorf Bay + case "8": + return "9358"; // Gössenheim + case "9": + return "9359"; // Karlstadt-Wiesenfeld + default: + return ""; + } + } + + private static String fromNumber936(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9360"; // Thüngen + case "3": + return "9363"; // Arnstein Unterfr + case "4": + return "9364"; // Zellingen + case "5": + return "9365"; // Rimpar + case "6": + return "9366"; // Geroldshausen Unterfr + case "7": + return "9367"; // Unterpleichfeld + case "9": + return "9369"; // Uettingen + default: + return ""; + } + } + + private static String fromNumber937(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9371"; // Miltenberg + case "2": + return "9372"; // Klingenberg a Main + case "3": + return "9373"; // Amorbach + case "4": + return "9374"; // Eschau + case "5": + return "9375"; // Freudenberg Baden + case "6": + return "9376"; // Collenberg + case "7": + return "9377"; // Freudenberg-Boxtal + case "8": + return "9378"; // Eichenbühl-Riedern + default: + return ""; + } + } + + private static String fromNumber938(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9381"; // Volkach + case "2": + return "9382"; // Gerolzhofen + case "3": + return "9383"; // Wiesentheid + case "4": + return "9384"; // Schwanfeld + case "5": + return "9385"; // Kolitzheim + case "6": + return "9386"; // Prosselsheim + default: + return ""; + } + } + + private static String fromNumber939(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9391"; // Marktheidenfeld + case "2": + return "9392"; // Faulbach Unterfr + case "3": + return "9393"; // Rothenfels Unterfr + case "4": + return "9394"; // Esselbach + case "5": + return "9395"; // Triefenstein + case "6": + return "9396"; // Urspringen b Lohr + case "7": + return "9397"; // Wertheim-Dertingen + case "8": + return "9398"; // Birkenfeld b Würzburg + default: + return ""; + } + } + + private static String fromNumber94(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber940(number.substring(1)); + case "1": + return "941"; // Regensburg + case "2": + return fromNumber942(number.substring(1)); + case "3": + return fromNumber943(number.substring(1)); + case "4": + return fromNumber944(number.substring(1)); + case "5": + return fromNumber945(number.substring(1)); + case "6": + return fromNumber946(number.substring(1)); + case "7": + return fromNumber947(number.substring(1)); + case "8": + return fromNumber948(number.substring(1)); + case "9": + return fromNumber949(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber940(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9401"; // Neutraubling + case "2": + return "9402"; // Regenstauf + case "3": + return "9403"; // Donaustauf + case "4": + return "9404"; // Nittendorf + case "5": + return "9405"; // Bad Abbach + case "6": + return "9406"; // Mintraching + case "7": + return "9407"; // Wenzenbach + case "8": + return "9408"; // Altenthann + case "9": + return "9409"; // Pielenhofen + default: + return ""; + } + } + + private static String fromNumber942(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9420"; // Feldkirchen Niederbay + case "1": + return "9421"; // Straubing + case "2": + return "9422"; // Bogen Niederbay + case "3": + return "9423"; // Geiselhöring + case "4": + return "9424"; // Strasskirchen + case "6": + return "9426"; // Oberschneiding + case "7": + return "9427"; // Leiblfing + case "8": + return "9428"; // Kirchroth + case "9": + return "9429"; // Rain Niederbay + default: + return ""; + } + } + + private static String fromNumber943(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9431"; // Schwandorf + case "3": + return "9433"; // Nabburg + case "4": + return "9434"; // Bodenwöhr + case "5": + return "9435"; // Schwarzenfeld + case "6": + return "9436"; // Nittenau + case "8": + return "9438"; // Fensterbach + case "9": + return "9439"; // Neunburg-Kemnath + default: + return ""; + } + } + + private static String fromNumber944(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9441"; // Kelheim + case "2": + return "9442"; // Riedenburg + case "3": + return "9443"; // Abensberg + case "4": + return "9444"; // Siegenburg + case "5": + return "9445"; // Neustadt a d Donau + case "6": + return "9446"; // Altmannstein + case "7": + return "9447"; // Essing + case "8": + return "9448"; // Hausen Niederbay + default: + return ""; + } + } + + private static String fromNumber945(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9451"; // Schierling + case "2": + return "9452"; // Langquaid + case "3": + return "9453"; // Thalmassing + case "4": + return "9454"; // Aufhausen Oberpf + default: + return ""; + } + } + + private static String fromNumber946(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9461"; // Roding + case "2": + return "9462"; // Falkenstein Oberpf + case "3": + return "9463"; // Wald Oberpf + case "4": + return "9464"; // Walderbach + case "5": + return "9465"; // Neukirchen-Balbini + case "6": + return "9466"; // Stamsried + case "7": + return "9467"; // Michelsneukirchen + case "8": + return "9468"; // Zell Oberpf + case "9": + return "9469"; // Roding-Neubäu + default: + return ""; + } + } + + private static String fromNumber947(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9471"; // Burglengenfeld + case "2": + return "9472"; // Hohenfels Oberpf + case "3": + return "9473"; // Kallmünz + case "4": + return "9474"; // Schmidmühlen + default: + return ""; + } + } + + private static String fromNumber948(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9480"; // Sünching + case "1": + return "9481"; // Pfatter + case "2": + return "9482"; // Wörth a d Donau + case "4": + return "9484"; // Brennberg + default: + return ""; + } + } + + private static String fromNumber949(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9491"; // Hemau + case "2": + return "9492"; // Parsberg + case "3": + return "9493"; // Beratzhausen + case "5": + return "9495"; // Breitenbrunn Oberpf + case "7": + return "9497"; // Seubersdorf i d Opf + case "8": + return "9498"; // Laaber + case "9": + return "9499"; // Painten + default: + return ""; + } + } + + private static String fromNumber95(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber950(number.substring(1)); + case "1": + return "951"; // Bamberg + case "2": + return fromNumber952(number.substring(1)); + case "3": + return fromNumber953(number.substring(1)); + case "4": + return fromNumber954(number.substring(1)); + case "5": + return fromNumber955(number.substring(1)); + case "6": + return fromNumber956(number.substring(1)); + case "7": + return fromNumber957(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber950(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9502"; // Frensdorf + case "3": + return "9503"; // Oberhaid Oberfr + case "4": + return "9504"; // Stadelhofen + case "5": + return "9505"; // Litzendorf + default: + return ""; + } + } + + private static String fromNumber952(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9521"; // Hassfurt + case "2": + return "9522"; // Eltmann + case "3": + return "9523"; // Hofheim i Ufr + case "4": + return "9524"; // Zeil a Main + case "5": + return "9525"; // Königsberg i Bay + case "6": + return "9526"; // Riedbach + case "7": + return "9527"; // Knetzgau + case "8": + return "9528"; // Donnersdorf + case "9": + return "9529"; // Oberaurach + default: + return ""; + } + } + + private static String fromNumber953(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9531"; // Ebern + case "2": + return "9532"; // Maroldsweisach + case "3": + return "9533"; // Untermerzbach + case "4": + return "9534"; // Burgpreppach + case "5": + return "9535"; // Pfarrweisach + case "6": + return "9536"; // Kirchlauter + default: + return ""; + } + } + + private static String fromNumber954(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9542"; // Schesslitz + case "3": + return "9543"; // Hirschaid + case "4": + return "9544"; // Baunach + case "5": + return "9545"; // Buttenheim + case "6": + return "9546"; // Burgebrach + case "7": + return "9547"; // Zapfendorf + case "8": + return "9548"; // Mühlhausen Mittelfr + case "9": + return "9549"; // Lisberg + default: + return ""; + } + } + + private static String fromNumber955(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9551"; // Burgwindheim + case "2": + return "9552"; // Burghaslach + case "3": + return "9553"; // Ebrach Oberfr + case "4": + return "9554"; // Untersteinbach Unterfr + case "5": + return "9555"; // Schlüsselfeld-Aschbach + case "6": + return "9556"; // Geiselwind + default: + return ""; + } + } + + private static String fromNumber956(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9560"; // Grub a Forst + case "1": + return "9561"; // Coburg + case "2": + return "9562"; // Sonnefeld + case "3": + return "9563"; // Rödental + case "4": + return "9564"; // Bad Rodach + case "5": + return "9565"; // Untersiemau + case "6": + return "9566"; // Meeder + case "7": + return "9567"; // Seßlach-Gemünda + case "8": + return "9568"; // Neustadt b Coburg + case "9": + return "9569"; // Sesslach + default: + return ""; + } + } + + private static String fromNumber957(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9571"; // Lichtenfels Bay + case "2": + return "9572"; // Burgkunstadt + case "3": + return "9573"; // Staffelstein Oberfr + case "4": + return "9574"; // Marktzeuln + case "5": + return "9575"; // Weismain + case "6": + return "9576"; // Lichtenfels-Isling + default: + return ""; + } + } + + private static String fromNumber96(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber960(number.substring(1)); + case "1": + return "961"; // Weiden i d Opf + case "2": + return fromNumber962(number.substring(1)); + case "3": + return fromNumber963(number.substring(1)); + case "4": + return fromNumber964(number.substring(1)); + case "5": + return fromNumber965(number.substring(1)); + case "6": + return fromNumber966(number.substring(1)); + case "7": + return fromNumber967(number.substring(1)); + case "8": + return fromNumber968(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber960(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9602"; // Neustadt a d Waldnaab + case "3": + return "9603"; // Floss + case "4": + return "9604"; // Wernberg-Köblitz + case "5": + return "9605"; // Weiherhammer + case "6": + return "9606"; // Pfreimd + case "7": + return "9607"; // Luhe-Wildenau + case "8": + return "9608"; // Kohlberg Oberpf + default: + return ""; + } + } + + private static String fromNumber962(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9621"; // Amberg Oberpf + case "2": + return "9622"; // Hirschau Oberpf + case "4": + return "9624"; // Ensdorf Oberpf + case "5": + return "9625"; // Kastl b Amberg + case "6": + return "9626"; // Hohenburg + case "7": + return "9627"; // Freudenberg Oberpf + case "8": + return "9628"; // Ursensollen + default: + return ""; + } + } + + private static String fromNumber963(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9631"; // Tirschenreuth + case "2": + return "9632"; // Waldsassen + case "3": + return "9633"; // Mitterteich + case "4": + return "9634"; // Wiesau + case "5": + return "9635"; // Bärnau + case "6": + return "9636"; // Plößberg + case "7": + return "9637"; // Falkenberg Oberpf + case "8": + return "9638"; // Neualbenreuth + case "9": + return "9639"; // Mähring + default: + return ""; + } + } + + private static String fromNumber964(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9641"; // Grafenwöhr + case "2": + return "9642"; // Kemnath Stadt + case "3": + return "9643"; // Auerbach i d Opf + case "4": + return "9644"; // Pressath + case "5": + return "9645"; // Eschenbach i d Opf + case "6": + return "9646"; // Freihung + case "7": + return "9647"; // Kirchenthumbach + case "8": + return "9648"; // Neustadt a Kulm + default: + return ""; + } + } + + private static String fromNumber965(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9651"; // Vohenstrauss + case "2": + return "9652"; // Waidhaus + case "3": + return "9653"; // Eslarn + case "4": + return "9654"; // Pleystein + case "5": + return "9655"; // Tännesberg + case "6": + return "9656"; // Moosbach b Vohenstrauß + case "7": + return "9657"; // Waldthurn + case "8": + return "9658"; // Georgenberg + case "9": + return "9659"; // Leuchtenberg + default: + return ""; + } + } + + private static String fromNumber966(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9661"; // Sulzbach-Rosenberg + case "2": + return "9662"; // Vilseck + case "3": + return "9663"; // Neukirchen b Sulzbach-Rosenberg + case "4": + return "9664"; // Hahnbach + case "5": + return "9665"; // Königstein Oberpf + case "6": + return "9666"; // Illschwang + default: + return ""; + } + } + + private static String fromNumber967(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9671"; // Oberviechtach + case "2": + return "9672"; // Neunburg vorm Wald + case "3": + return "9673"; // Tiefenbach Oberpf + case "4": + return "9674"; // Schönsee + case "5": + return "9675"; // Altendorf a Nabburg + case "6": + return "9676"; // Winklarn + case "7": + return "9677"; // Oberviechtach-Pullenried + default: + return ""; + } + } + + private static String fromNumber968(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9681"; // Windischeschenbach + case "2": + return "9682"; // Erbendorf + case "3": + return "9683"; // Friedenfels + default: + return ""; + } + } + + private static String fromNumber97(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber970(number.substring(1)); + case "1": + return "971"; // Bad Kissingen + case "2": + return fromNumber972(number.substring(1)); + case "3": + return fromNumber973(number.substring(1)); + case "4": + return fromNumber974(number.substring(1)); + case "6": + return fromNumber976(number.substring(1)); + case "7": + return fromNumber977(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber970(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9701"; // Sandberg Unterfr + case "4": + return "9704"; // Euerdorf + case "8": + return "9708"; // Bad Bocklet + default: + return ""; + } + } + + private static String fromNumber972(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9720"; // Üchtelhausen + case "1": + return "9721"; // Schweinfurt + case "2": + return "9722"; // Werneck + case "3": + return "9723"; // Röthlein + case "4": + return "9724"; // Stadtlauringen + case "5": + return "9725"; // Poppenhausen Unterfr + case "6": + return "9726"; // Euerbach + case "7": + return "9727"; // Schonungen-Marktsteinach + case "8": + return "9728"; // Wülfershausen Unterfr + case "9": + return "9729"; // Grettstadt + default: + return ""; + } + } + + private static String fromNumber973(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9732"; // Hammelburg + case "3": + return "9733"; // Münnerstadt + case "4": + return "9734"; // Burkardroth + case "5": + return "9735"; // Massbach + case "6": + return "9736"; // Oberthulba + case "7": + return "9737"; // Wartmannsroth + case "8": + return "9738"; // Rottershausen + default: + return ""; + } + } + + private static String fromNumber974(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9741"; // Bad Brückenau + case "2": + return "9742"; // Kalbach Rhön + case "4": + return "9744"; // Zeitlofs-Detter + case "5": + return "9745"; // Wildflecken + case "6": + return "9746"; // Zeitlofs + case "7": + return "9747"; // Geroda Bay + case "8": + return "9748"; // Motten + case "9": + return "9749"; // Oberbach Unterfr + default: + return ""; + } + } + + private static String fromNumber976(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9761"; // Bad Königshofen i Grabfeld + case "2": + return "9762"; // Saal a d Saale + case "3": + return "9763"; // Sulzdorf a d Lederhecke + case "4": + return "9764"; // Höchheim + case "5": + return "9765"; // Trappstadt + case "6": + return "9766"; // Grosswenkheim + default: + return ""; + } + } + + private static String fromNumber977(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9771"; // Bad Neustadt a d Saale + case "2": + return "9772"; // Bischofsheim a d Rhön + case "3": + return "9773"; // Unsleben + case "4": + return "9774"; // Oberelsbach + case "5": + return "9775"; // Schönau a d Brend + case "6": + return "9776"; // Mellrichstadt + case "7": + return "9777"; // Ostheim v d Rhön + case "8": + return "9778"; // Fladungen + case "9": + return "9779"; // Nordheim v d Rhön + default: + return ""; + } + } + + private static String fromNumber98(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber980(number.substring(1)); + case "1": + return "981"; // Ansbach + case "2": + return fromNumber982(number.substring(1)); + case "3": + return fromNumber983(number.substring(1)); + case "4": + return fromNumber984(number.substring(1)); + case "5": + return fromNumber985(number.substring(1)); + case "6": + return fromNumber986(number.substring(1)); + case "7": + return fromNumber987(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber980(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "2": + return "9802"; // Ansbach-Katterbach + case "3": + return "9803"; // Colmberg + case "4": + return "9804"; // Aurach + case "5": + return "9805"; // Burgoberbach + default: + return ""; + } + } + + private static String fromNumber982(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9820"; // Lehrberg + case "2": + return "9822"; // Bechhofen a d Heide + case "3": + return "9823"; // Leutershausen + case "4": + return "9824"; // Dietenhofen + case "5": + return "9825"; // Herrieden + case "6": + return "9826"; // Weidenbach Mittelfr + case "7": + return "9827"; // Lichtenau Mittelfr + case "8": + return "9828"; // Rügland + case "9": + return "9829"; // Flachslanden + default: + return ""; + } + } + + private static String fromNumber983(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9831"; // Gunzenhausen + case "2": + return "9832"; // Wassertrüdingen + case "3": + return "9833"; // Heidenheim Mittelfr + case "4": + return "9834"; // Theilenhofen + case "5": + return "9835"; // Ehingen Mittelfr + case "6": + return "9836"; // Gunzenhausen-Cronheim + case "7": + return "9837"; // Haundorf + default: + return ""; + } + } + + private static String fromNumber984(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9841"; // Bad Windsheim + case "2": + return "9842"; // Uffenheim + case "3": + return "9843"; // Burgbernheim + case "4": + return "9844"; // Obernzenn + case "5": + return "9845"; // Oberdachstetten + case "6": + return "9846"; // Ipsheim + case "7": + return "9847"; // Ergersheim + case "8": + return "9848"; // Simmershofen + default: + return ""; + } + } + + private static String fromNumber985(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9851"; // Dinkelsbühl + case "2": + return "9852"; // Feuchtwangen + case "3": + return "9853"; // Wilburgstetten + case "4": + return "9854"; // Wittelshofen + case "5": + return "9855"; // Dentlein a Forst + case "6": + return "9856"; // Dürrwangen + case "7": + return "9857"; // Schopfloch Mittelfr + default: + return ""; + } + } + + private static String fromNumber986(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9861"; // Rothenburg ob der Tauber + case "5": + return "9865"; // Adelshofen Mittelfr + case "7": + return "9867"; // Geslau + case "8": + return "9868"; // Schillingsfürst + case "9": + return "9869"; // Wettringen Mittelfr + default: + return ""; + } + } + + private static String fromNumber987(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9871"; // Windsbach + case "2": + return "9872"; // Heilsbronn + case "3": + return "9873"; // Abenberg-Wassermungenau + case "4": + return "9874"; // Neuendettelsau + case "5": + return "9875"; // Wolframs-Eschenbach + case "6": + return "9876"; // Rohr Mittelfr + default: + return ""; + } + } + + private static String fromNumber99(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber990(number.substring(1)); + case "1": + return "991"; // Deggendorf + case "2": + return fromNumber992(number.substring(1)); + case "3": + return fromNumber993(number.substring(1)); + case "4": + return fromNumber994(number.substring(1)); + case "5": + return fromNumber995(number.substring(1)); + case "6": + return fromNumber996(number.substring(1)); + case "7": + return fromNumber997(number.substring(1)); + default: + return ""; + } + } + + private static String fromNumber990(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9901"; // Hengersberg Bay + case "3": + return "9903"; // Schöllnach + case "4": + return "9904"; // Lalling + case "5": + return "9905"; // Bernried Niederbay + case "6": + return "9906"; // Mariaposching + case "7": + return "9907"; // Zenting + case "8": + return "9908"; // Schöfweg + default: + return ""; + } + } + + private static String fromNumber992(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "9920"; // Bischofsmais + case "1": + return "9921"; // Regen + case "2": + return "9922"; // Zwiesel + case "3": + return "9923"; // Teisnach + case "4": + return "9924"; // Bodenmais + case "5": + return "9925"; // Bayerisch Eisenstein + case "6": + return "9926"; // Frauenau + case "7": + return "9927"; // Kirchberg Wald + case "8": + return "9928"; // Kirchdorf i Wald + case "9": + return "9929"; // Ruhmannsfelden + default: + return ""; + } + } + + private static String fromNumber993(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9931"; // Plattling + case "2": + return "9932"; // Osterhofen + case "3": + return "9933"; // Wallersdorf + case "5": + return "9935"; // Stephansposching + case "6": + return "9936"; // Wallerfing + case "7": + return "9937"; // Oberpöring + case "8": + return "9938"; // Moos Niederbay + default: + return ""; + } + } + + private static String fromNumber994(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9941"; // Kötzting + case "2": + return "9942"; // Viechtach + case "3": + return "9943"; // Lam Oberpf + case "4": + return "9944"; // Miltach + case "5": + return "9945"; // Arnbruck + case "6": + return "9946"; // Hohenwarth b Kötzing + case "7": + return "9947"; // Neukirchen b Hl Blut + case "8": + return "9948"; // Eschlkam + default: + return ""; + } + } + + private static String fromNumber995(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9951"; // Landau a d Isar + case "2": + return "9952"; // Eichendorf + case "3": + return "9953"; // Pilsting + case "4": + return "9954"; // Simbach Niederbay + case "5": + return "9955"; // Mamming + case "6": + return "9956"; // Eichendorf-Aufhausen + default: + return ""; + } + } + + private static String fromNumber996(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9961"; // Mitterfels + case "2": + return "9962"; // Schwarzach Niederbay + case "3": + return "9963"; // Konzell + case "4": + return "9964"; // Stallwang + case "5": + return "9965"; // Sankt Englmar + case "6": + return "9966"; // Wiesenfelden + default: + return ""; + } + } + + private static String fromNumber997(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "9971"; // Cham + case "2": + return "9972"; // Waldmünchen + case "3": + return "9973"; // Furth i Wald + case "4": + return "9974"; // Traitsching + case "5": + return "9975"; // Waldmünchen-Geigant + case "6": + return "9976"; // Rötz + case "7": + return "9977"; // Arnschwang + case "8": + return "9978"; // Schönthal Oberpf + default: + return ""; + } + } + /* + End of generated code. + */ +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy new file mode 100644 index 0000000..5609c69 --- /dev/null +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/GermanAreaCodeExtractorTest.groovy @@ -0,0 +1,44 @@ +/* + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer.numberplans + + +import de.telekom.phonenumbernormalizer.numberplans.constants.GermanAreaCodeExtractor +import spock.lang.Specification + +class GermanAreaCodeExtractorTest extends Specification { + + def "Extract Area Codes"(String number, expectedResult) { + given: + + when: + + String result = GermanAreaCodeExtractor.fromNumber(number) + + then: + result == expectedResult + + where: + number | expectedResult + "200556666" | "" + "203555666" | "203" + "204555666" | "2045" + "204655666" | "" + "212555666" | "212" + "212955666" | "2129" + } + +} From 2b4953629d969534a24b434c5723b558ff560436 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 54/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/NumberPlan.java | 98 +- .../numberplans/PhoneLibWrapper.java | 929 +++++++++++++++++- .../constants/DeFixedLineNumberPlan.java | 112 ++- 3 files changed, 1110 insertions(+), 29 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 1b45737..b491780 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -67,6 +67,82 @@ public static String getCountryCode() { return null; } + /** + * A subclass can provide National Destination Code of the rules - not used inside this class, but + * re-usable when adding the subclass to the factory. + * + * @param nsn - National Significant Number (without IDP + CC or NAC as prefix) + * @return National Destination Code without leading National Access Code + * + * @see NumberPlanFactory + */ + public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { + return ""; + } + + public boolean isUsableWithIDPandCCfromOutside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCandNDCfromOutside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCfromInside(String number) { + return false; + } + + public boolean isUsableWithIDPandCCandNDCfromInside(String number) { + return false; + } + + public boolean isUsableWithNAC(String number) { + return false; + } + public boolean isUsableWithNACandNDC(String number) { + return false; + } + + public boolean isUsableDirectly(String number) { + return isMatchingShortNumber(number); + } + + + /** + * Finds the longest prefix of a short number rule of the current number plan, at the beginning of a number. + * + * @param number - number that should be checked against the number plan + * @return String - if number matches starts with a short number rule prefix, this is the longest one - otherwise it is an empty string. + */ + public String startingWithShortNumberKey(String number) { + // first check if we have rules at all + if (this.getShortNumberCodes() == null) { + LOGGER.debug("no short number code rules available"); + return ""; + } + + // check if the number is starting with a prefix defined in the rule + int minShortNumberKeyLength = this.getMinShortNumberKeyLength(); + int maxShortNumberKeyLength = this.getMaxShortNumberKeyLength(); + + // starting prefix check with the longest prefix, so overlapping prefixes could be realized + // e.g. 1180 is in Germany a starting prefix for a 6 digit short number while 1181 - 1189 is in Germany a starting + // prefix for a 5 digits number and could be summed up by 118 and only 1180 is overriding this prefix part. + for (int i = maxShortNumberKeyLength; i >= minShortNumberKeyLength; i--) { + if (number.length() >= i) { + String shortNumber = number.substring(0, i); + if (this.getShortNumberCodes().containsKey(shortNumber)) { + return shortNumber; + } + } + } + return ""; + } + + public int getShortCodeLength(String shortNumberKey) { + return getShortNumberCodes().get(shortNumberKey); + } + /** * Checks if a number is matching any a short number rule of the current number plan. * @@ -95,24 +171,10 @@ public boolean isMatchingShortNumber(String number) { return false; } - - // check if the number is starting with a prefix defined in the rule - int minShortNumberKeyLength = this.getMinShortNumberKeyLength(); - int maxShortNumberKeyLength = this.getMaxShortNumberKeyLength(); - - Integer validShortNumberLength; - - // starting prefix check with the longest prefix, so overlapping prefixes could be realized - // e.g. 1180 is in Germany a starting prefix for a 6 digit short number while 1181 - 1189 is in Germany a starting - // prefix for a 5 digits number and could be summed up by 118 and only 1180 is overriding this prefix part. - for (int i = maxShortNumberKeyLength; i >= minShortNumberKeyLength; i--) { - if (number.length() >= i) { - String shortNumber = number.substring(0, i); - if (this.getShortNumberCodes().containsKey(shortNumber)) { - validShortNumberLength = this.getShortNumberCodes().get(shortNumber); - return number.length() == validShortNumberLength; - } - } + // check if the number length exactly matches the defined length of the prefix + String shortNumberKey = startingWithShortNumberKey(number); + if (shortNumberKey.length()>0) { + return number.length() == getShortCodeLength(shortNumberKey); } LOGGER.debug("no short number, to code found for number: {}", number); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index fce333d..18a2298 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -25,6 +25,857 @@ import java.lang.reflect.Method; import java.util.Objects; + +class CountryCodeExtractor { + // https://www.itu.int/dms_pub/itu-t/opb/sp/T-SP-E.164D-11-2011-PDF-E.pdf + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "1"; // NANP + case "2": + return fromNumber2(number.substring(1)); + case "3": + return fromNumber3(number.substring(1)); + case "4": + return fromNumber4(number.substring(1)); + case "5": + return fromNumber5(number.substring(1)); + case "6": + return fromNumber6(number.substring(1)); + case "7": + return "7"; // Russian Federation AND Kazakhstan (Republic of) + case "8": + return fromNumber8(number.substring(1)); + case "9": + return fromNumber9(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber2(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "20"; // Egypt (Arab Republic of) + case "1": + return fromNumber21(number.substring(1)); + case "2": + return fromNumber22(number.substring(1)); + case "3": + return fromNumber23(number.substring(1)); + case "4": + return fromNumber24(number.substring(1)); + case "5": + return fromNumber25(number.substring(1)); + case "6": + return fromNumber26(number.substring(1)); + case "7": + return "27"; // South Africa (Republic of) + case "9": + return fromNumber29(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber21(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "211"; // South Sudan (Republic of) + case "2": + return "212"; // Morocco (Kingdom of) + case "3": + return "213"; // Algeria (People's Democratic Republic of) + case "6": + return "216"; // Tunisia + case "8": + return "218"; // Libya (Socialist People's Libyan Arab Jamahiriya) + default: + return ""; + } + } + + public static String fromNumber22(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "220"; // Gambia (Republic of the) + case "1": + return "221"; // Senegal (Republic of) + case "2": + return "222"; // Mauritania (Islamic Republic of) + case "3": + return "223"; // Mali (Republic of) + case "4": + return "224"; // Guinea (Republic of) + case "5": + return "225"; // Côte d'Ivoire (Republic of) + case "6": + return "226"; // Burkina Faso + case "7": + return "227"; // Niger (Republic of the) + case "8": + return "228"; // Togolese Republic + case "9": + return "229"; // Benin (Republic of) + default: + return ""; + } + } + + public static String fromNumber23(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "230"; // Mauritius (Republic of) + case "1": + return "231"; // Liberia (Republic of) + case "2": + return "232"; // Sierra Leone + case "3": + return "233"; // Ghana + case "4": + return "234"; // Nigeria (Federal Republic of) + case "5": + return "235"; // Chad (Republic of) + case "6": + return "236"; // Central African Republic + case "7": + return "237"; // Cameroon (Republic of) + case "8": + return "238"; // Cape Verde (Republic of) + case "9": + return "239"; // Sao Tome and Principe (Democratic Republic of) + default: + return ""; + } + } + + public static String fromNumber24(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "240"; // Equatorial Guinea (Republic of) + case "1": + return "241"; // Gabonese Republic + case "2": + return "242"; // Congo (Republic of the) + case "3": + return "243"; // Democratic Republic of the Congo + case "4": + return "244"; // Angola (Republic of) + case "5": + return "245"; // Guinea-Bissau (Republic of) + case "6": + return "246"; // Diego Garcia + case "7": + return "247"; // {Saint Helena,} Ascension {and Tristan da Cunha} + case "8": + return "248"; // Seychelles (Republic of) + case "9": + return "249"; // Sudan (Republic of the) + default: + return ""; + } + } + + public static String fromNumber25(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "250"; // Rwanda (Republic of) + case "1": + return "251"; // Ethiopia (Federal Democratic Republic of) + case "2": + return "252"; // Somali Democratic Republic + case "3": + return "253"; // Djibouti (Republic of) + case "4": + return "254"; // Kenya (Republic of) + case "5": + return "255"; // Tanzania (United Republic of) + case "6": + return "256"; // Uganda (Republic of) + case "7": + return "257"; // Burundi (Republic of) + case "8": + return "258"; // Mozambique (Republic of) + default: + return ""; + } + } + public static String fromNumber26(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "260"; // Zambia (Republic of) + case "1": + return "261"; // Madagascar (Republic of) + case "2": + return "262"; // French Departments and Territories in the Indian Ocean + case "3": + return "263"; // Zimbabwe (Republic of) + case "4": + return "264"; // Namibia (Republic of) + case "5": + return "265"; // Malawi + case "6": + return "266"; // Lesotho (Kingdom of) + case "7": + return "267"; // Botswana (Republic of) + case "8": + return "268"; // Swaziland (Kingdom of) + case "9": + return "269"; // Comoros (Union of the) + default: + return ""; + } + } + + public static String fromNumber29(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "290"; // Saint Helena{, Ascension} and Tristan da Cunha + case "1": + return "291"; // Eritrea + case "7": + return "297"; // Aruba + case "8": + return "298"; // Faroe Islands + case "9": + return "299"; // Greenland (Denmark) + default: + return ""; + } + } + + public static String fromNumber3(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "30"; // Greece + case "1": + return "31"; // Netherlands (Kingdom of the) + case "2": + return "32"; // Belgium + case "3": + return "33"; // France + case "4": + return "34"; // Spain + case "5": + return fromNumber35(number.substring(1)); + case "6": + return "36"; // Hungary (Republic of) + case "7": + return fromNumber37(number.substring(1)); + case "8": + return fromNumber38(number.substring(1)); + case "9": + return "39"; // Italy AND Vatican City State + default: + return ""; + } + } + + public static String fromNumber35(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "350"; // Gibraltar + case "1": + return "351"; // Portugal + case "2": + return "352"; // Luxembourg + case "3": + return "353"; // Ireland + case "4": + return "354"; // Iceland + case "5": + return "355"; // Albania (Republic of) + case "6": + return "356"; // Malta + case "7": + return "357"; // Cyprus (Republic of) + case "8": + return "358"; // Finland + case "9": + return "359"; // Bulgaria (Republic of) + default: + return ""; + } + } + + public static String fromNumber37(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "370"; // Lithuania (Republic of) + case "1": + return "371"; // Latvia (Republic of) + case "2": + return "372"; // Estonia (Republic of) + case "3": + return "373"; // Moldova (Republic of) + case "4": + return "374"; // Armenia (Republic of) + case "5": + return "375"; // Belarus (Republic of) + case "6": + return "376"; // Andorra (Principality of) + case "7": + return "377"; // Monaco (Principality of) + case "8": + return "378"; // San Marino (Republic of) + case "9": + return "379"; // Vatican City State + default: + return ""; + } + } + + public static String fromNumber38(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "380"; // Ukraine + case "1": + return "381"; // Serbia (Republic of) + case "2": + return "382"; // Montenegro (Republic of) + case "5": + return "385"; // Croatia (Republic of) + case "6": + return "386"; // Slovenia (Republic of) + case "7": + return "387"; // Bosnia and Herzegovina + case "8": + return "388"; // Group of countries, shared code TODO: is it still valid? not on ITU number plan overview page + case "9": + return "389"; // The Former Yugoslav Republic of Macedonia - North Macedonia (ITU number plan overview page) + default: + return ""; + } + } + + public static String fromNumber4(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "40"; // Romania + case "1": + return "41"; // Switzerland (Confederation of) + case "2": + return fromNumber42(number.substring(1)); + case "3": + return "43"; // Austria + case "4": + return "44"; // United Kingdom of Great Britain and Northern Ireland + case "5": + return "45"; // Denmark + case "6": + return "46"; // Sweden + case "7": + return "47"; // Norway + case "8": + return "48"; // Poland (Republic of) + case "9": + return "49"; // Germany (Federal Republic of) + default: + return ""; + } + } + + public static String fromNumber42(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "420"; // Czech Republic + case "1": + return "421"; // Slovak Republic + case "3": + return "423"; // Liechtenstein (Principality of) + default: + return ""; + } + } + + public static String fromNumber5(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber50(number.substring(1)); + case "1": + return "51"; // Peru + case "2": + return "52"; // Mexico + case "3": + return "53"; // Cuba + case "4": + return "54"; // Argentine Republic + case "5": + return "55"; // Brazil (Federative Republic of) + case "6": + return "56"; // Chile + case "7": + return "57"; // Colombia (Republic of) + case "8": + return "58"; // Venezuela (Bolivarian Republic of) + case "9": + return fromNumber59(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber50(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "500"; // Falkland Islands (Malvinas) + case "1": + return "501"; // Belize + case "2": + return "502"; // Guatemala (Republic of) + case "3": + return "503"; // El Salvador (Republic of) + case "4": + return "504"; // Honduras (Republic of) + case "5": + return "505"; // Nicaragua + case "6": + return "506"; // Costa Rica + case "7": + return "507"; // Panama (Republic of) + case "8": + return "508"; // Saint Pierre and Miquelon (Collectivité territoriale de la République française) + case "9": + return "509"; // Haiti (Republic of) + default: + return ""; + } + } + + public static String fromNumber59(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "590"; // Guadeloupe (French Department of) + case "1": + return "591"; // Bolivia (Plurinational State of) + case "2": + return "592"; // Guyana + case "3": + return "593"; // Ecuador + case "4": + return "594"; // French Guiana (French Department of) + case "5": + return "595"; // Paraguay (Republic of) + case "6": + return "596"; // Martinique (French Department of) + case "7": + return "597"; // Suriname (Republic of) + case "8": + return "598"; // Uruguay (Eastern Republic of) + case "9": + return "599"; // Bonaire, Saint Eustatius and Saba AND Curaçao + default: + return ""; + } + } + + public static String fromNumber6(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "60"; // Malaysia + case "1": + return "61"; // Australia + case "2": + return "62"; // Indonesia (Republic of) + case "3": + return "63"; // Philippines (Republic of the) + case "4": + return "64"; // New Zealand + case "5": + return "65"; // Singapore (Republic of) + case "6": + return "66"; // Thailand + case "7": + return fromNumber67(number.substring(1)); + case "8": + return fromNumber68(number.substring(1)); + case "9": + return fromNumber69(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber67(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "670"; // Democratic Republic of Timor-Leste + case "2": + return "672"; // Australian External Territories + case "3": + return "673"; //Brunei Darussalam + case "4": + return "674"; // Nauru (Republic of) + case "5": + return "675"; // Papua New Guinea + case "6": + return "676"; // Tonga (Kingdom of) + case "7": + return "677"; // Solomon Islands + case "8": + return "678"; // Vanuatu (Republic of) + case "9": + return "679"; // Fiji (Republic of) + default: + return ""; + } + } + + public static String fromNumber68(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "680"; // Palau (Republic of) + case "1": + return "681"; // Wallis and Futuna (Territoire français d'outre-mer) + case "2": + return "682"; // Cook Islands + case "3": + return "683"; // Niue + case "5": + return "685"; // Samoa (Independent State of) + case "6": + return "686"; // Kiribati (Republic of) + case "7": + return "687"; // New Caledonia (Territoire français d'outre-mer) + case "8": + return "688"; // Tuvalu + case "9": + return "689"; // French Polynesia (Territoire français d'outre-mer) + default: + return ""; + } + } + + public static String fromNumber69(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "690"; // Tokelau + case "1": + return "691"; // Micronesia (Federated States of) + case "2": + return "692"; // Marshall Islands (Republic of the) + default: + return ""; + } + } + + public static String fromNumber8(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return fromNumber80(number.substring(1)); + case "1": + return "81"; // Japan + case "2": + return "82"; // Korea (Republic of) + case "4": + return "84"; // Viet Nam (Socialist Republic of) + case "5": + return fromNumber85(number.substring(1)); + case "6": + return "86"; // China (People's Republic of) + case "7": + return fromNumber87(number.substring(1)); + case "8": + return fromNumber88(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber80(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "800"; // International Freephone Service + case "8": + return "808"; // International Shared Cost Service (ISCS) + default: + return ""; + } + } + + public static String fromNumber85(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "850"; // Democratic People's Republic of Korea + case "2": + return "852"; // Hong Kong, China + case "3": + return "853"; // Macao, China + case "5": + return "855"; // Cambodia (Kingdom of) + case "6": + return "856"; // Lao People's Democratic Republic + default: + return ""; + } + } + + public static String fromNumber87(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "870"; // Inmarsat SNAC + case "5": + return "875"; // Reserved - Maritime Mobile Service Applications + case "6": + return "876"; // Reserved - Maritime Mobile Service Applications + case "7": + return "877"; // Reserved - Maritime Mobile Service Applications + case "8": + return "878"; // Universal Personal Telecommunication Service (UPT) + case "9": + return "879"; // Reserved for national non-commercial purposes + default: + return ""; + } + } + + public static String fromNumber88(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "880"; // Bangladesh (People's Republic of) + case "1": + return "881"; // Global Mobile Satellite System (GMSS), shared code + case "2": + return "882"; // International Networks, shared code + case "3": + return "883"; // International Networks, shared code + case "6": + return "886"; // Taiwan, China + case "8": + return "888"; // Telecommunications for Disaster Relief (TDR) + default: + return ""; + } + } + + public static String fromNumber9(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "90"; // Turkey + case "1": + return "91"; // India (Republic of) + case "2": + return "92"; // Pakistan (Islamic Republic of) + case "3": + return "93"; //Afghanistan + case "4": + return "94"; //Sri Lanka (Democratic Socialist Republic of) + case "5": + return "95"; // Myanmar (the Republic of the Union of) + case "6": + return fromNumber96(number.substring(1)); + case "7": + return fromNumber97(number.substring(1)); + case "8": + return "98"; // Iran (Islamic Republic of) + case "9": + return fromNumber99(number.substring(1)); + default: + return ""; + } + } + + public static String fromNumber96(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "960"; // Maldives (Republic of) + case "1": + return "961"; // Lebanon + case "2": + return "962"; // Jordan (Hashemite Kingdom of) + case "3": + return "963"; // Syrian Arab Republic + case "4": + return "964"; // Iraq (Republic of) + case "5": + return "965"; // Kuwait (State of) + case "6": + return "966"; // Saudi Arabia (Kingdom of) + case "7": + return "967"; // Yemen (Republic of) + case "8": + return "968"; // Oman (Sultanate of) + case "9": + return "969"; // Reserved - reservation currently under investigation + default: + return ""; + } + } + + public static String fromNumber97(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "0": + return "970"; // Reserved + case "1": + return "971"; // United Arab Emirates + case "2": + return "972"; // Israel (State of) + case "3": + return "973"; // Bahrain (Kingdom of) + case "4": + return "974"; // Qatar (State of) + case "5": + return "975"; // Bhutan (Kingdom of) + case "6": + return "976"; // Mongolia + case "7": + return "977"; // Nepal (Federal Democratic Republic of) + case "9": + return "979"; // International Premium Rate Service (IPRS) + default: + return ""; + } + } + + public static String fromNumber99(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.substring(0, 1)) { + case "1": + return "991"; // Trial of a proposed new international telecommunication public correspondence service, shared code + case "2": + return "992"; // Tajikistan (Republic of) + case "3": + return "993"; // Turkmenistan + case "4": + return "994"; // Azerbaijani Republic + case "5": + return "995"; // Georgia + case "6": + return "996"; // Kyrgyz Republic + case "8": + return "998"; // Uzbekistan (Republic of) + case "9": + return "999"; // Reserved for future global service + default: + return ""; + } + } +} + + /** * Wrapper around the PhoneLib library from Google *

@@ -229,7 +1080,8 @@ static boolean isSpecialFormat(String value) { if (value == null || value.length()==0) { return false; } - return ("+".equals(value.substring(0, 1))) || ("*".equals(value.substring(0, 1))); + String firstChar = value.substring(0, 1); + return ("+".equals(firstChar)) || ("*".equals(firstChar)); } /** @@ -271,11 +1123,84 @@ public boolean startsWithIDP() { return false; } + // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" String idp = this.getInternationalDialingPrefix(); return isIDPUsed(this.dialableNumber, idp); } + private int parseCountryCode(boolean alsoFromRegionCode) { + Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); + + // Using PhoneLib to extract Country Code from Number + if (tempNumber!=null) { + int result = tempNumber.getCountryCode(); + if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (alsoFromRegionCode) { + return result; + } else { + return 0; + } + } + if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { + return result; + } + } + return 0; + } + + public String getCountryCode(boolean alsoFromRegionCode) { + int parsedCountryCode = parseCountryCode(alsoFromRegionCode); + if (parsedCountryCode>0) { + return String.valueOf(parsedCountryCode); + } + + // FallBack Extraction: + String numberWithoutIDP = removeIDP(); + String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); + + if (countryCode.length()>0) { + return countryCode; + } + + if (alsoFromRegionCode) { + int regionCountryCode = getCountryCodeForRegion(this.regionCode); + if (regionCountryCode>0) { + return String.valueOf(regionCountryCode); + } + } + + return ""; + } + + public String removeNAC() { + if (dialableNumber == null) { + return ""; + } + if (startsWithNAC()) { + return dialableNumber.substring(getNationalAccessCode().length()); + } else { + return ""; + } + } + + public String removeIDP() { + if (dialableNumber == null) { + return ""; + } + if (dialableNumber.startsWith("+")) { + return dialableNumber.substring(1); + } + + if (dialableNumber.startsWith(getInternationalDialingPrefix())) { + return dialableNumber.substring(getInternationalDialingPrefix().length()); + } + + return ""; + } + /** * Checks if the number starts with the NAC of the initializing region * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. @@ -290,11 +1215,9 @@ public boolean startsWithNAC() { if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { return false; - } return dialableNumber.startsWith(nac); - } /** diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index c549471..f2af7ac 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -16,9 +16,47 @@ package de.telekom.phonenumbernormalizer.numberplans.constants; +import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; +import lombok.RequiredArgsConstructor; + + +class ShortNumberDetails { + int length; + + boolean usableWithIDPandCCfromOutside; + + boolean usableWithIDPandCCandNDCfromOutside ; + + boolean usableWithIDPandCCfromInside; + + boolean usableWithIDPandCCandNDCfromInside; + + boolean usableWithNAC; + boolean usableWithNACandNDC; + + boolean usableDirectly; + + public ShortNumberDetails(int length, boolean usableWithIDPandCCfromOutside, + boolean usableWithIDPandCCandNDCfromOutside, + boolean usableWithIDPandCCfromInside, + boolean usableWithIDPandCCandNDCfromInside, + boolean usableWithNAC, + boolean usableWithNACandNDC, + boolean usableDirectly) { + this.length = length; + this.usableWithIDPandCCfromOutside = usableWithIDPandCCfromOutside; + this.usableWithIDPandCCandNDCfromOutside = usableWithIDPandCCandNDCfromOutside; + this.usableWithIDPandCCfromInside = usableWithIDPandCCfromInside; + this.usableWithIDPandCCandNDCfromInside = usableWithIDPandCCandNDCfromInside; + this.usableWithNAC = usableWithNAC; + this.usableWithNACandNDC = usableWithNACandNDC; + this.usableDirectly = usableDirectly; + } +} /** * Definition see Chapter 8.1 in BNetzA German Number Plan @@ -32,17 +70,56 @@ public class DeFixedLineNumberPlan extends NumberPlan { private static final String COUNTRY_CODE = "49"; /** - * Constant for German short numbers in fixed-line + * Constants for German short numbers in fixed-line */ - private static final Map SHORT_NUMBER_CODES = Map.of( - "110", 3, - "112", 3, - "115", 3, - "116", 6, - "1180", 6, - "118", 5 // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. + private static final Map SHORT_NUMBER_CODES_DETAILS = Map.of( + "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "115", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); + /** + * Constant for German short numbers in fixed-line as extracted from the details above + */ + private static final Map SHORT_NUMBER_CODES = SHORT_NUMBER_CODES_DETAILS.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().length)); + + @Override + public boolean isUsableWithIDPandCCfromOutside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; + } + + @Override + public boolean isUsableWithIDPandCCandNDCfromOutside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCandNDCfromOutside; + } + + @Override + public boolean isUsableWithIDPandCCfromInside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromInside; + } + + @Override + public boolean isUsableWithIDPandCCandNDCfromInside(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCandNDCfromInside; + } + + @Override + public boolean isUsableWithNAC(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithNAC; + } + @Override + public boolean isUsableWithNACandNDC(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithNACandNDC; + } + + @Override + public boolean isUsableDirectly(String number) { + return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableDirectly; + } @Override protected Map getShortNumberCodes() { @@ -53,4 +130,23 @@ public static String getCountryCode() { return COUNTRY_CODE; } + @Override + public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { + if ((nsn == null) || (nsn.length()<1)) { + return ""; + } + + if ("1".equals(nsn.substring(0,1))) { + // Non-Geographic Area Codes + if (nsn.length()<2) { + return ""; + } + + + + } + // Geographic Area Codes + return GermanAreaCodeExtractor.fromNumber(nsn); + } + } From c96b74fde9c5f9ef0ff39ea1d5ca1d3a292ba36b Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:43 +0200 Subject: [PATCH 55/98] Starting Validator. --- .../PhoneNumberValidatorImpl.java | 161 +++++++++++++++++- .../PhoneNumberValidationResult.java | 6 +- .../PhoneNumberValidatorImplTest.groovy | 42 ++++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 4 + 4 files changed, 202 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 60409fa..a2f8756 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -15,6 +15,9 @@ */ package de.telekom.phonenumbernormalizer; +import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType; +import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; +import de.telekom.phonenumbernormalizer.numberplans.NumberPlanFactory; import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; import lombok.RequiredArgsConstructor; @@ -22,6 +25,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import java.util.Objects; + /** * Concrete implementation of {@link PhoneNumberValidator} using {@link PhoneLibWrapper} to validate a number by mitigating some inaccuracies when it comes to number plans of optional NDC and NAC as zero. @@ -42,20 +47,166 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + // TODO: change parameter regionCode to deviceContext + NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); + if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used - return wrapper.validate(); - //return PhoneNumberValidationResult.IS_POSSIBLE; + + String numberCountryCode = wrapper.getCountryCode(false); + + String regionCountryCode = String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode)); + if (regionCountryCode.equals("0")) { + regionCountryCode = ""; + } + + String numberWithoutCountryCode = wrapper.removeIDP().substring(numberCountryCode.length()); + + if (regionCountryCode.equals(numberCountryCode)) { + // Calling within the country + + + if (numberplan!=null) { + + // Check for ShortNumber directly after CC + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + // Check for NDC after CC: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + } + + } else { + + numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, numberCountryCode); + // calling from outside the country + if (numberplan!=null) { + + // Check for ShortNumber directly after CC + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + // Check for NDC after CC: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + + } + + } + + // return wrapper.validate(); } else { // No Country Exit Code has been used, so no CC is following. - if (wrapper.getNationalAccessCode()=="") { + if (Objects.equals(wrapper.getNationalAccessCode(), "")) { // no NAC is used in region return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; } else { // NAC can be used in region if (wrapper.startsWithNAC()) { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + String numberWithOutNac = wrapper.removeNAC(); + + if (numberplan!=null) { + // check if a shortnumber is used directly after NAC and if that is allowed + String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNAC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } + } + + // Check for NDC after Nac: + String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); + + if (Objects.equals(nac, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithOutNac.substring(nac.length()); + // Check for Shortnumber after NDC + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } + } + // Todo: Own Length test + + // As fallback check by libPhone + PhoneNumberValidationResult fallBackResult = wrapper.validate(); + + if ( (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE) || + (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || + // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: + ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) + ) { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } else { + // NAC can be used in region, but is not. + if (numberplan==null) { + // ToDo: Is there a test with PhoneLib? + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + String shortNumberKey = numberplan.startingWithShortNumberKey(wrapper.getDialableNumber()); + if (shortNumberKey.length()>0) { + if (!numberplan.isUsableDirectly(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } else { + if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } else { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + } + } + return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } } @@ -65,7 +216,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; - // return wrapper.validate(); + return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index d2e204f..7e81d7e 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -93,13 +93,13 @@ public enum PhoneNumberValidationResult { /** The number has an invalid international dialing prefix (aka IDP) for this region. */ INVALID_INTERNATIONAL_DIALING_PREFIX(ValidationResult.INVALID_LENGTH), - /** The number has an invalid country calling code (aka CC). */ + /** The number has an invalid country calling code (aka CC) or the specific number must not be used with used CC.*/ INVALID_COUNTRY_CODE(ValidationResult.INVALID_COUNTRY_CODE), - /** The number has an invalid national access code (aka NAC). */ + /** The number has an invalid national access code (aka NAC) or the specific number must not be used with used NAC.*/ INVALID_NATIONAL_ACCESS_CODE(ValidationResult.INVALID_LENGTH), - /** The number has an invalid national destination code (aka NDC) for this region. */ + /** The number has an invalid national destination code (aka NDC) for this region or the specific number must not be used with used NDC. */ INVALID_NATIONAL_DESTINATION_CODE(ValidationResult.INVALID_LENGTH), /** The number is shorter than all valid numbers for this region or used NDC. */ diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 7144941..0539399 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -15,9 +15,6 @@ */ package de.telekom.phonenumbernormalizer -import de.telekom.phonenumbernormalizer.dto.DeviceContext -import de.telekom.phonenumbernormalizer.dto.DeviceContextDto -import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult import spock.lang.Specification @@ -66,4 +63,43 @@ class PhoneNumberValidatorImplTest extends Specification { "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY } + def "validate police short code 110 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // short code for Police (110) is not dial-able internationally nor does it has additional numbers + "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + // end of 110 + } + + + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 24d2c96..28e7038 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -476,6 +476,10 @@ class IsValidNumberTest extends Specification { // 015xxyyyyyyy xx = block code, yyyyyyy fixed length number in 2 digit block, so together 9 digit is the overall length // 015zzzaaaaaa zzz = newer block zzz, aaaaaa fixes length number in 3 digit block, so together 9 digit is the overall length + // >>> https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html is a list of used blocks + // >>> https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/freie%20RNB/start.html + // >>> markes testcases from isPosible, which are not valid right now. + // // 0150 // From 363c35156c12bf6931df9dfd7f1ec5c72c6b81d0 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 21 May 2024 12:48:54 +0200 Subject: [PATCH 56/98] Include Mobile NDCs into generator script for GermanAreaCodeExtractor code --- .../GermanAreaCodeExtractor/main.py | 51 +- .../constants/GermanAreaCodeExtractor.java | 14045 ++++++++-------- 2 files changed, 7071 insertions(+), 7025 deletions(-) diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py index dabba83..04618cf 100644 --- a/src/generators/GermanAreaCodeExtractor/main.py +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -15,21 +15,15 @@ def print_function(leaf, prefix): java_visibility = 'public' else: java_visibility = 'private' - print(' '+java_visibility+' static String fromNumber'+ prefix +'(String number) {') print(' if ((number == null) || (number.length()<1)) {') print(' return "";') print(' }') print('') - print(' switch (number.substring(0, 1)) {') - - if prefix == "": - # main function - need explicit reference to service and mobile function for starting numbers with 1 - print(' case "1":') - print(' return fromNumber1(number.substring(1));') + print(' switch (number.charAt(0)) {') for k in leaf: - print(' case "'+k+'":') + print(" case '"+k+"':") if isinstance(leaf[k], dict): print(' return fromNumber'+prefix+k+'(number.substring(1));') @@ -73,6 +67,47 @@ def print_function(leaf, prefix): continue add(onkz, row[0], row[1]) +# Website for used mobile NDCs: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html +with open('mobile_ndcs.html', newline='') as f: + data = f.read().replace('\n', '') + data = data.split("Liste der zugeteilten Rufnummernblöcke / Mobile Dienste")[1] + data = data.split("")[1] + data = data.split("")[0] + data = data.split("")[2] + + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('', ",") + data = data.replace('', ",") + data = data.replace('', "{+}") + data = data.replace('&', "&") + data = data.replace(' ', " ") + data = data.replace(' ', " ") + data = data.replace(', ', ",") + data = data.replace(',', "{:}") + + data = data.replace('15-', "15") + mf_ndcs = data.split('{+}') + + for mf_ndc in mf_ndcs: + ndc = mf_ndc.split('{:}') + if len(ndc) == 2: + add(onkz, ndc[0], ndc[1]) + +onkz = dict(sorted(onkz.items())) + # print code from three print_function(onkz, "") diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index d3a0b27..9e123ce 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -7,23 +7,53 @@ public class GermanAreaCodeExtractor { it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new code and past it between the comments below. - It only generates the code for geographical NDC starting with 2..9 for service and mobile numbers, starting one is - hard coded (reference is added into script automatically. + TODO: special NDC need to be added to the script (mobile is done) + */ + + /* + Start of generated code */ + public static String fromNumber(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.charAt(0)) { + case '1': + return fromNumber1(number.substring(1)); + case '2': + return fromNumber2(number.substring(1)); + case '3': + return fromNumber3(number.substring(1)); + case '4': + return fromNumber4(number.substring(1)); + case '5': + return fromNumber5(number.substring(1)); + case '6': + return fromNumber6(number.substring(1)); + case '7': + return fromNumber7(number.substring(1)); + case '8': + return fromNumber8(number.substring(1)); + case '9': + return fromNumber9(number.substring(1)); + default: + return ""; + } + } private static String fromNumber1(String number) { if ((number == null) || (number.length()<1)) { return ""; } - // used mobile number blocks see: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html - switch (number.substring(0, 1)) { - case "5": + switch (number.charAt(0)) { + case '5': return fromNumber15(number.substring(1)); - case "6": + case '6': return fromNumber16(number.substring(1)); - case "7": + case '7': return fromNumber17(number.substring(1)); default: return ""; @@ -35,24 +65,24 @@ private static String fromNumber15(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber150(number.substring(1)); - case "1": + case '1': return fromNumber151(number.substring(1)); - case "2": - return fromNumber152(number.substring(1)); - case "3": + case '3': return fromNumber153(number.substring(1)); - case "5": + case '2': + return fromNumber152(number.substring(1)); + case '5': return fromNumber155(number.substring(1)); - case "6": + case '6': return fromNumber156(number.substring(1)); - case "7": + case '7': return fromNumber157(number.substring(1)); - case "8": + case '8': return fromNumber158(number.substring(1)); - case "9": + case '9': return fromNumber159(number.substring(1)); default: return ""; @@ -64,10 +94,10 @@ private static String fromNumber150(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return fromNumber1501(number.substring(1)); - case "2": + case '2': return fromNumber1502(number.substring(1)); default: return ""; @@ -79,11 +109,12 @@ private static String fromNumber1501(String number) { return ""; } - // TODO: Replace all substring(0, 1) with chartAt(0) - if (number.charAt(0) == '9') { - return "15019"; // Tismi BV + switch (number.charAt(0)) { + case '9': + return "15019"; // Tismi BV + default: + return ""; } - return ""; } private static String fromNumber1502(String number) { @@ -91,10 +122,12 @@ private static String fromNumber1502(String number) { return ""; } - if (number.charAt(0) == '0') { - return "15020"; // Legos - Local Exchange Global Operation Services + switch (number.charAt(0)) { + case '0': + return "15020"; // Legos - Local Exchange Global Operation Services + default: + return ""; } - return ""; } private static String fromNumber151(String number) { @@ -102,20 +135,20 @@ private static String fromNumber151(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "1511"; // Telekom Deutschland GmbH - case "2": + case '2': return "1512"; // Telekom Deutschland GmbH - case "4": + case '4': return "1514"; // Telekom Deutschland GmbH - case "5": + case '5': return "1515"; // Telekom Deutschland GmbH - case "6": + case '6': return "1516"; // Telekom Deutschland GmbH - case "7": + case '7': return "1517"; // Telekom Deutschland GmbH - case "8": + case '8': return fromNumber1518(number.substring(1)); default: return ""; @@ -127,65 +160,69 @@ private static String fromNumber1518(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15180"; // Telekom Deutschland GmbH - case "1": + case '1': return "15181"; // Telekom Deutschland GmbH - case "2": + case '2': return "15182"; // Telekom Deutschland GmbH - case "3": + case '3': return "15183"; // Telekom Deutschland GmbH default: return ""; } } - private static String fromNumber152(String number) { + private static String fromNumber153(String number) { if ((number == null) || (number.length()<1)) { return ""; } - switch (number.substring(0, 1)) { - case "0": - return "1520"; // Vodafone GmbH - case "1": - return "1521"; // Lycamobile Europe Ltd. - case "2": - return "1522"; // Vodafone GmbH - case "3": - return "1523"; // Vodafone GmbH - case "5": - return "1525"; // Vodafone GmbH - case "6": - return "1526"; // Vodafone GmbH - case "9": - return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH) + switch (number.charAt(0)) { + case '1': + return fromNumber1531(number.substring(1)); default: return ""; } } - private static String fromNumber153(String number) { + private static String fromNumber1531(String number) { if ((number == null) || (number.length()<1)) { return ""; } - if (number.charAt(0) == '1') { - return fromNumber1531(number.substring(1)); + switch (number.charAt(0)) { + case '0': + return "15310"; // MTEL Deutschland GmbH + default: + return ""; } - return ""; } - private static String fromNumber1531(String number) { + private static String fromNumber152(String number) { if ((number == null) || (number.length()<1)) { return ""; } - if (number.charAt(0) == '0') { - return "15310"; // MTEL Deutschland GmbH + switch (number.charAt(0)) { + case '0': + return "1520"; // Vodafone GmbH + case '1': + return "1521"; // Lycamobile Europe Ltd. + case '2': + return "1522"; // Vodafone GmbH + case '3': + return "1523"; // Vodafone GmbH + case '5': + return "1525"; // Vodafone GmbH + case '6': + return "1526"; // Vodafone GmbH + case '9': + return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH ) + default: + return ""; } - return ""; } private static String fromNumber155(String number) { @@ -193,10 +230,10 @@ private static String fromNumber155(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return fromNumber1551(number.substring(1)); - case "6": + case '6': return fromNumber1556(number.substring(1)); default: return ""; @@ -208,10 +245,10 @@ private static String fromNumber1551(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15510"; // Lebara Limited - case "1": + case '1': return "15511"; // Lebara Limited default: return ""; @@ -223,26 +260,26 @@ private static String fromNumber1556(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15560"; // 1&1 Mobilfunk GmbH - case "1": + case '1': return "15561"; // 1&1 Mobilfunk GmbH - case "2": + case '2': return "15562"; // 1&1 Mobilfunk GmbH - case "3": + case '3': return "15563"; // 1&1 Mobilfunk GmbH - case "4": + case '4': return "15564"; // 1&1 Mobilfunk GmbH - case "5": + case '5': return "15565"; // 1&1 Mobilfunk GmbH - case "6": + case '6': return "15566"; // 1&1 Mobilfunk GmbH - case "7": + case '7': return "15567"; // 1&1 Mobilfunk GmbH - case "8": + case '8': return "15568"; // 1&1 Mobilfunk GmbH - case "9": + case '9': return "15569"; // 1&1 Mobilfunk GmbH default: return ""; @@ -254,10 +291,10 @@ private static String fromNumber156(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return fromNumber1563(number.substring(1)); - case "7": + case '7': return fromNumber1567(number.substring(1)); default: return ""; @@ -269,10 +306,12 @@ private static String fromNumber1563(String number) { return ""; } - if (number.charAt(0) == '0') { - return "15630"; // multiConnect GmbH + switch (number.charAt(0)) { + case '0': + return "15630"; // multiConnect GmbH + default: + return ""; } - return ""; } private static String fromNumber1567(String number) { @@ -280,10 +319,10 @@ private static String fromNumber1567(String number) { return ""; } - switch (number.substring(0, 1)) { - case "8": + switch (number.charAt(0)) { + case '8': return "15678"; // Argon Networks UG - case "9": + case '9': return "15679"; // Argon Networks UG default: return ""; @@ -295,19 +334,17 @@ private static String fromNumber157(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber1570(number.substring(1)); - case "3": - return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "5": - return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "7": - return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "8": - return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "9": - return "1579"; // Telefónica Germany GmbH & Co. OHG (Netznutzungsvereinbarung mit Fa. Sipgate Wireless GmbH zuvor Fa. Vintage Wireless Networks Gesellschaft für Telekommunikation mbH), (ehem. E-Plus-Mobilfunk GmbH) + case '3': + return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '5': + return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '7': + return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '8': + return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) default: return ""; } @@ -318,20 +355,19 @@ private static String fromNumber1570(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "15700"; // Telefónica Germany GmbH & Co. OHG - case "1": + case '1': return "15701"; // Telefónica Germany GmbH & Co. OHG - case "2": + case '2': return "15702"; // Telefónica Germany GmbH & Co. OHG - case "3": + case '3': return "15703"; // Telefónica Germany GmbH & Co. OHG - case "4": + case '4': return "15704"; // Telefónica Germany GmbH & Co. OHG - case "6": + case '6': return "15706"; // Telefónica Germany GmbH & Co. OHG - default: return ""; } @@ -342,10 +378,12 @@ private static String fromNumber158(String number) { return ""; } - if (number.charAt(0) == '8') { - return fromNumber1588(number.substring(1)); + switch (number.charAt(0)) { + case '8': + return fromNumber1588(number.substring(1)); + default: + return ""; } - return ""; } private static String fromNumber1588(String number) { @@ -353,10 +391,12 @@ private static String fromNumber1588(String number) { return ""; } - if (number.charAt(0) == '8') { - return "15888"; // TelcoVillage GmbH + switch (number.charAt(0)) { + case '8': + return "15888"; // TelcoVillage GmbH + default: + return ""; } - return ""; } private static String fromNumber159(String number) { @@ -364,10 +404,12 @@ private static String fromNumber159(String number) { return ""; } - if (number.charAt(0) == '0') { - return "1590"; // Telefónica Germany GmbH & Co. OHG + switch (number.charAt(0)) { + case '0': + return "1590"; // Telefónica Germany GmbH & Co. OHG + default: + return ""; } - return ""; } private static String fromNumber16(String number) { @@ -375,13 +417,13 @@ private static String fromNumber16(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "160"; // Telekom Deutschland GmbH - case "2": + case '2': return "162"; // Vodafone GmbH - case "3": - return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) + case '3': + return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) default: return ""; } @@ -392,89 +434,57 @@ private static String fromNumber17(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "170"; // Telekom Deutschland GmbH - case "1": + case '1': return "171"; // Telekom Deutschland GmbH - case "2": + case '2': return "172"; // Vodafone GmbH - case "3": + case '3': return "173"; // Vodafone GmbH - case "4": + case '4': return "174"; // Vodafone GmbH - case "5": + case '5': return "175"; // Telekom Deutschland GmbH - case "6": + case '6': return "176"; // Telefónica Germany GmbH & Co. OHG - case "7": - return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "8": - return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) - case "9": + case '7': + return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '8': + return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + case '9': return "179"; // Telefónica Germany GmbH & Co. OHG default: return ""; } } - /* - Start of generated code - */ - public static String fromNumber(String number) { - if ((number == null) || (number.length()<1)) { - return ""; - } - - switch (number.substring(0, 1)) { - case "1": - return fromNumber1(number.substring(1)); - case "2": - return fromNumber2(number.substring(1)); - case "3": - return fromNumber3(number.substring(1)); - case "4": - return fromNumber4(number.substring(1)); - case "5": - return fromNumber5(number.substring(1)); - case "6": - return fromNumber6(number.substring(1)); - case "7": - return fromNumber7(number.substring(1)); - case "8": - return fromNumber8(number.substring(1)); - case "9": - return fromNumber9(number.substring(1)); - default: - return ""; - } - } - private static String fromNumber2(String number) { if ((number == null) || (number.length()<1)) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber20(number.substring(1)); - case "1": + case '1': return fromNumber21(number.substring(1)); - case "2": + case '2': return fromNumber22(number.substring(1)); - case "3": + case '3': return fromNumber23(number.substring(1)); - case "4": + case '4': return fromNumber24(number.substring(1)); - case "5": + case '5': return fromNumber25(number.substring(1)); - case "6": + case '6': return fromNumber26(number.substring(1)); - case "7": + case '7': return fromNumber27(number.substring(1)); - case "8": + case '8': return fromNumber28(number.substring(1)); - case "9": + case '9': return fromNumber29(number.substring(1)); default: return ""; @@ -486,22 +496,22 @@ private static String fromNumber20(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "201"; // Essen - case "2": + case '2': return "202"; // Wuppertal - case "3": + case '3': return "203"; // Duisburg - case "4": + case '4': return fromNumber204(number.substring(1)); - case "5": + case '5': return fromNumber205(number.substring(1)); - case "6": + case '6': return fromNumber206(number.substring(1)); - case "8": + case '8': return "208"; // Oberhausen Rheinl - case "9": + case '9': return "209"; // Gelsenkirchen default: return ""; @@ -513,12 +523,12 @@ private static String fromNumber204(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2041"; // Bottrop - case "3": + case '3': return "2043"; // Gladbeck - case "5": + case '5': return "2045"; // Bottrop-Kirchhellen default: return ""; @@ -530,18 +540,18 @@ private static String fromNumber205(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2051"; // Velbert - case "2": + case '2': return "2052"; // Velbert-Langenberg - case "3": + case '3': return "2053"; // Velbert-Neviges - case "4": + case '4': return "2054"; // Essen-Kettwig - case "6": + case '6': return "2056"; // Heiligenhaus - case "8": + case '8': return "2058"; // Wülfrath default: return ""; @@ -553,12 +563,12 @@ private static String fromNumber206(String number) { return ""; } - switch (number.substring(0, 1)) { - case "4": + switch (number.charAt(0)) { + case '4': return "2064"; // Dinslaken - case "5": + case '5': return "2065"; // Duisburg-Rheinhausen - case "6": + case '6': return "2066"; // Duisburg-Homberg default: return ""; @@ -570,30 +580,30 @@ private static String fromNumber21(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber210(number.substring(1)); - case "1": + case '1': return "211"; // Düsseldorf - case "2": + case '2': // special edge case, see: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBVerzeichnis/Sonderregelungen0212_0621.pdf?__blob=publicationFile&v=1 if ((number.length() > 1) && (number.substring(1, 2).equals("9"))) { return "2129"; // Haan Rheinland } return "212"; // Solingen - case "3": + case '3': return fromNumber213(number.substring(1)); - case "4": + case '4': return "214"; // Leverkusen - case "5": + case '5': return fromNumber215(number.substring(1)); - case "6": + case '6': return fromNumber216(number.substring(1)); - case "7": + case '7': return fromNumber217(number.substring(1)); - case "8": + case '8': return fromNumber218(number.substring(1)); - case "9": + case '9': return fromNumber219(number.substring(1)); default: return ""; @@ -605,12 +615,12 @@ private static String fromNumber210(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2102"; // Ratingen - case "3": + case '3': return "2103"; // Hilden - case "4": + case '4': return "2104"; // Mettmann default: return ""; @@ -622,14 +632,14 @@ private static String fromNumber213(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2131"; // Neuss - case "2": + case '2': return "2132"; // Meerbusch-Büderich - case "3": + case '3': return "2133"; // Dormagen - case "7": + case '7': return "2137"; // Neuss-Norf default: return ""; @@ -641,24 +651,24 @@ private static String fromNumber215(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2150"; // Meerbusch-Lank - case "1": + case '1': return "2151"; // Krefeld - case "2": + case '2': return "2152"; // Kempen - case "3": + case '3': return "2153"; // Nettetal-Lobberich - case "4": + case '4': return "2154"; // Willich - case "6": + case '6': return "2156"; // Willich-Anrath - case "7": + case '7': return "2157"; // Nettetal-Kaldenkirchen - case "8": + case '8': return "2158"; // Grefrath b Krefeld - case "9": + case '9': return "2159"; // Meerbusch-Osterath default: return ""; @@ -670,18 +680,18 @@ private static String fromNumber216(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2161"; // Mönchengladbach - case "2": + case '2': return "2162"; // Viersen - case "3": + case '3': return "2163"; // Schwalmtal Niederrhein - case "4": + case '4': return "2164"; // Jüchen-Otzenrath - case "5": + case '5': return "2165"; // Jüchen - case "6": + case '6': return "2166"; // Mönchengladbach-Rheydt default: return ""; @@ -693,14 +703,14 @@ private static String fromNumber217(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2171"; // Leverkusen-Opladen - case "3": + case '3': return "2173"; // Langenfeld Rheinland - case "4": + case '4': return "2174"; // Burscheid Rheinl - case "5": + case '5': return "2175"; // Leichlingen Rheinland default: return ""; @@ -712,12 +722,12 @@ private static String fromNumber218(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2181"; // Grevenbroich - case "2": + case '2': return "2182"; // Grevenbroich-Kapellen - case "3": + case '3': return "2183"; // Rommerskirchen default: return ""; @@ -729,16 +739,16 @@ private static String fromNumber219(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2191"; // Remscheid - case "2": + case '2': return "2192"; // Hückeswagen - case "3": + case '3': return "2193"; // Dabringhausen - case "5": + case '5': return "2195"; // Radevormwald - case "6": + case '6': return "2196"; // Wermelskirchen default: return ""; @@ -750,26 +760,26 @@ private static String fromNumber22(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber220(number.substring(1)); - case "1": + case '1': return "221"; // Köln - case "2": + case '2': return fromNumber222(number.substring(1)); - case "3": + case '3': return fromNumber223(number.substring(1)); - case "4": + case '4': return fromNumber224(number.substring(1)); - case "5": + case '5': return fromNumber225(number.substring(1)); - case "6": + case '6': return fromNumber226(number.substring(1)); - case "7": + case '7': return fromNumber227(number.substring(1)); - case "8": + case '8': return "228"; // Bonn - case "9": + case '9': return fromNumber229(number.substring(1)); default: return ""; @@ -781,20 +791,20 @@ private static String fromNumber220(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2202"; // Bergisch Gladbach - case "3": + case '3': return "2203"; // Köln-Porz - case "4": + case '4': return "2204"; // Bensberg - case "5": + case '5': return "2205"; // Rösrath - case "6": + case '6': return "2206"; // Overath - case "7": + case '7': return "2207"; // Kürten-Dürscheid - case "8": + case '8': return "2208"; // Niederkassel default: return ""; @@ -806,20 +816,20 @@ private static String fromNumber222(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2222"; // Bornheim Rheinl - case "3": + case '3': return "2223"; // Königswinter - case "4": + case '4': return "2224"; // Bad Honnef - case "5": + case '5': return "2225"; // Meckenheim Rheinl - case "6": + case '6': return "2226"; // Rheinbach - case "7": + case '7': return "2227"; // Bornheim-Merten - case "8": + case '8': return "2228"; // Remagen-Rolandseck default: return ""; @@ -831,20 +841,20 @@ private static String fromNumber223(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2232"; // Brühl Rheinl - case "3": + case '3': return "2233"; // Hürth Rheinl - case "4": + case '4': return "2234"; // Frechen - case "5": + case '5': return "2235"; // Erftstadt - case "6": + case '6': return "2236"; // Wesseling Rheinl - case "7": + case '7': return "2237"; // Kerpen Rheinl-Türnich - case "8": + case '8': return "2238"; // Pulheim default: return ""; @@ -856,22 +866,22 @@ private static String fromNumber224(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2241"; // Siegburg - case "2": + case '2': return "2242"; // Hennef Sieg - case "3": + case '3': return "2243"; // Eitorf - case "4": + case '4': return "2244"; // Königswinter-Oberpleis - case "5": + case '5': return "2245"; // Much - case "6": + case '6': return "2246"; // Lohmar Rheinland - case "7": + case '7': return "2247"; // Neunkirchen-Seelscheid - case "8": + case '8': return "2248"; // Hennef-Uckerath default: return ""; @@ -883,20 +893,20 @@ private static String fromNumber225(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2251"; // Euskirchen - case "2": + case '2': return "2252"; // Zülpich - case "3": + case '3': return "2253"; // Bad Münstereifel - case "4": + case '4': return "2254"; // Weilerswist - case "5": + case '5': return "2255"; // Euskirchen-Flamersheim - case "6": + case '6': return "2256"; // Mechernich-Satzvey - case "7": + case '7': return "2257"; // Reckerscheid default: return ""; @@ -908,24 +918,24 @@ private static String fromNumber226(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2261"; // Gummersbach - case "2": + case '2': return "2262"; // Wiehl - case "3": + case '3': return "2263"; // Engelskirchen - case "4": + case '4': return "2264"; // Marienheide - case "5": + case '5': return "2265"; // Reichshof-Eckenhagen - case "6": + case '6': return "2266"; // Lindlar - case "7": + case '7': return "2267"; // Wipperfürth - case "8": + case '8': return "2268"; // Kürten - case "9": + case '9': return "2269"; // Kierspe-Rönsahl default: return ""; @@ -937,16 +947,16 @@ private static String fromNumber227(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2271"; // Bergheim Erft - case "2": + case '2': return "2272"; // Bedburg Erft - case "3": + case '3': return "2273"; // Kerpen-Horrem - case "4": + case '4': return "2274"; // Elsdorf Rheinl - case "5": + case '5': return "2275"; // Kerpen-Buir default: return ""; @@ -958,20 +968,20 @@ private static String fromNumber229(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2291"; // Waldbröl - case "2": + case '2': return "2292"; // Windeck Sieg - case "3": + case '3': return "2293"; // Nümbrecht - case "4": + case '4': return "2294"; // Morsbach Sieg - case "5": + case '5': return "2295"; // Ruppichteroth - case "6": + case '6': return "2296"; // Reichshof-Brüchermühle - case "7": + case '7': return "2297"; // Wildbergerhütte default: return ""; @@ -983,26 +993,26 @@ private static String fromNumber23(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber230(number.substring(1)); - case "1": + case '1': return "231"; // Dortmund - case "2": + case '2': return fromNumber232(number.substring(1)); - case "3": + case '3': return fromNumber233(number.substring(1)); - case "4": + case '4': return "234"; // Bochum - case "5": + case '5': return fromNumber235(number.substring(1)); - case "6": + case '6': return fromNumber236(number.substring(1)); - case "7": + case '7': return fromNumber237(number.substring(1)); - case "8": + case '8': return fromNumber238(number.substring(1)); - case "9": + case '9': return fromNumber239(number.substring(1)); default: return ""; @@ -1014,24 +1024,24 @@ private static String fromNumber230(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2301"; // Holzwickede - case "2": + case '2': return "2302"; // Witten - case "3": + case '3': return "2303"; // Unna - case "4": + case '4': return "2304"; // Schwerte - case "5": + case '5': return "2305"; // Castrop-Rauxel - case "6": + case '6': return "2306"; // Lünen - case "7": + case '7': return "2307"; // Kamen - case "8": + case '8': return "2308"; // Unna-Hemmerde - case "9": + case '9': return "2309"; // Waltrop default: return ""; @@ -1043,14 +1053,14 @@ private static String fromNumber232(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "2323"; // Herne - case "4": + case '4': return "2324"; // Hattingen Ruhr - case "5": + case '5': return "2325"; // Wanne-Eickel - case "7": + case '7': return "2327"; // Bochum-Wattenscheid default: return ""; @@ -1062,26 +1072,26 @@ private static String fromNumber233(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2330"; // Herdecke - case "1": + case '1': return "2331"; // Hagen Westf - case "2": + case '2': return "2332"; // Gevelsberg - case "3": + case '3': return "2333"; // Ennepetal - case "4": + case '4': return "2334"; // Hagen-Hohenlimburg - case "5": + case '5': return "2335"; // Wetter Ruhr - case "6": + case '6': return "2336"; // Schwelm - case "7": + case '7': return "2337"; // Hagen-Dahl - case "8": + case '8': return "2338"; // Breckerfeld - case "9": + case '9': return "2339"; // Sprockhövel-Haßlinghausen default: return ""; @@ -1093,22 +1103,22 @@ private static String fromNumber235(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2351"; // Lüdenscheid - case "2": + case '2': return "2352"; // Altena Westf - case "3": + case '3': return "2353"; // Halver - case "4": + case '4': return "2354"; // Meinerzhagen - case "5": + case '5': return "2355"; // Schalksmühle - case "7": + case '7': return "2357"; // Herscheid Westf - case "8": + case '8': return "2358"; // Meinerzhagen-Valbert - case "9": + case '9': return "2359"; // Kierspe default: return ""; @@ -1120,26 +1130,26 @@ private static String fromNumber236(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2360"; // Haltern-Lippramsdorf - case "1": + case '1': return "2361"; // Recklinghausen - case "2": + case '2': return "2362"; // Dorsten - case "3": + case '3': return "2363"; // Datteln - case "4": + case '4': return "2364"; // Haltern Westf - case "5": + case '5': return "2365"; // Marl - case "6": + case '6': return "2366"; // Herten Westf - case "7": + case '7': return "2367"; // Henrichenburg - case "8": + case '8': return "2368"; // Oer-Erkenschwick - case "9": + case '9': return "2369"; // Dorsten-Wulfen default: return ""; @@ -1151,22 +1161,22 @@ private static String fromNumber237(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2371"; // Iserlohn - case "2": + case '2': return "2372"; // Hemer - case "3": + case '3': return "2373"; // Menden Sauerland - case "4": + case '4': return "2374"; // Iserlohn-Letmathe - case "5": + case '5': return "2375"; // Balve - case "7": + case '7': return "2377"; // Wickede Ruhr - case "8": + case '8': return "2378"; // Fröndenberg-Langschede - case "9": + case '9': return "2379"; // Menden-Asbeck default: return ""; @@ -1178,22 +1188,22 @@ private static String fromNumber238(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2381"; // Hamm Westf - case "2": + case '2': return "2382"; // Ahlen Westf - case "3": + case '3': return "2383"; // Bönen - case "4": + case '4': return "2384"; // Welver - case "5": + case '5': return "2385"; // Hamm-Rhynern - case "7": + case '7': return "2387"; // Drensteinfurt-Walstedde - case "8": + case '8': return "2388"; // Hamm-Uentrop - case "9": + case '9': return "2389"; // Werne default: return ""; @@ -1205,16 +1215,16 @@ private static String fromNumber239(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2391"; // Plettenberg - case "2": + case '2': return "2392"; // Werdohl - case "3": + case '3': return "2393"; // Sundern-Allendorf - case "4": + case '4': return "2394"; // Neuenrade-Affeln - case "5": + case '5': return "2395"; // Finnentrop-Rönkhausen default: return ""; @@ -1226,24 +1236,24 @@ private static String fromNumber24(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber240(number.substring(1)); - case "1": + case '1': return "241"; // Aachen - case "2": + case '2': return fromNumber242(number.substring(1)); - case "3": + case '3': return fromNumber243(number.substring(1)); - case "4": + case '4': return fromNumber244(number.substring(1)); - case "5": + case '5': return fromNumber245(number.substring(1)); - case "6": + case '6': return fromNumber246(number.substring(1)); - case "7": + case '7': return fromNumber247(number.substring(1)); - case "8": + case '8': return fromNumber248(number.substring(1)); default: return ""; @@ -1255,24 +1265,24 @@ private static String fromNumber240(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2401"; // Baesweiler - case "2": + case '2': return "2402"; // Stolberg Rheinl - case "3": + case '3': return "2403"; // Eschweiler Rheinl - case "4": + case '4': return "2404"; // Alsdorf Rheinl - case "5": + case '5': return "2405"; // Würselen - case "6": + case '6': return "2406"; // Herzogenrath - case "7": + case '7': return "2407"; // Herzogenrath-Kohlscheid - case "8": + case '8': return "2408"; // Aachen-Kornelimünster - case "9": + case '9': return "2409"; // Stolberg-Gressenich default: return ""; @@ -1284,24 +1294,24 @@ private static String fromNumber242(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2421"; // Düren - case "2": + case '2': return "2422"; // Kreuzau - case "3": + case '3': return "2423"; // Langerwehe - case "4": + case '4': return "2424"; // Vettweiss - case "5": + case '5': return "2425"; // Nideggen-Embken - case "6": + case '6': return "2426"; // Nörvenich - case "7": + case '7': return "2427"; // Nideggen - case "8": + case '8': return "2428"; // Niederzier - case "9": + case '9': return "2429"; // Hürtgenwald default: return ""; @@ -1313,18 +1323,18 @@ private static String fromNumber243(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2431"; // Erkelenz - case "2": + case '2': return "2432"; // Wassenberg - case "3": + case '3': return "2433"; // Hückelhoven - case "4": + case '4': return "2434"; // Wegberg - case "5": + case '5': return "2435"; // Erkelenz-Lövenich - case "6": + case '6': return "2436"; // Wegberg-Rödgen default: return ""; @@ -1336,24 +1346,24 @@ private static String fromNumber244(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2440"; // Nettersheim-Tondorf - case "1": + case '1': return "2441"; // Kall - case "3": + case '3': return "2443"; // Mechernich - case "4": + case '4': return "2444"; // Schleiden-Gemünd - case "5": + case '5': return "2445"; // Schleiden Eifel - case "6": + case '6': return "2446"; // Heimbach Eifel - case "7": + case '7': return "2447"; // Dahlem b Kall - case "8": + case '8': return "2448"; // Hellenthal-Rescheid - case "9": + case '9': return "2449"; // Blankenheim Ahr default: return ""; @@ -1365,18 +1375,18 @@ private static String fromNumber245(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2451"; // Geilenkirchen - case "2": + case '2': return "2452"; // Heinsberg Rheinl - case "3": + case '3': return "2453"; // Heinsberg-Randerath - case "4": + case '4': return "2454"; // Gangelt - case "5": + case '5': return "2455"; // Waldfeucht - case "6": + case '6': return "2456"; // Selfkant default: return ""; @@ -1388,16 +1398,16 @@ private static String fromNumber246(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2461"; // Jülich - case "2": + case '2': return "2462"; // Linnich - case "3": + case '3': return "2463"; // Titz - case "4": + case '4': return "2464"; // Aldenhoven b Jülich - case "5": + case '5': return "2465"; // Inden default: return ""; @@ -1409,14 +1419,14 @@ private static String fromNumber247(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2471"; // Roetgen Eifel - case "2": + case '2': return "2472"; // Monschau - case "3": + case '3': return "2473"; // Simmerath - case "4": + case '4': return "2474"; // Nideggen-Schmidt default: return ""; @@ -1428,14 +1438,14 @@ private static String fromNumber248(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2482"; // Hellenthal - case "4": + case '4': return "2484"; // Mechernich-Eiserfey - case "5": + case '5': return "2485"; // Schleiden-Dreiborn - case "6": + case '6': return "2486"; // Nettersheim default: return ""; @@ -1447,26 +1457,26 @@ private static String fromNumber25(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber250(number.substring(1)); - case "1": + case '1': return "251"; // Münster - case "2": + case '2': return fromNumber252(number.substring(1)); - case "3": + case '3': return fromNumber253(number.substring(1)); - case "4": + case '4': return fromNumber254(number.substring(1)); - case "5": + case '5': return fromNumber255(number.substring(1)); - case "6": + case '6': return fromNumber256(number.substring(1)); - case "7": + case '7': return fromNumber257(number.substring(1)); - case "8": + case '8': return fromNumber258(number.substring(1)); - case "9": + case '9': return fromNumber259(number.substring(1)); default: return ""; @@ -1478,22 +1488,22 @@ private static String fromNumber250(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2501"; // Münster-Hiltrup - case "2": + case '2': return "2502"; // Nottuln - case "4": + case '4': return "2504"; // Telgte - case "5": + case '5': return "2505"; // Altenberge Westf - case "6": + case '6': return "2506"; // Münster-Wolbeck - case "7": + case '7': return "2507"; // Havixbeck - case "8": + case '8': return "2508"; // Drensteinfurt - case "9": + case '9': return "2509"; // Nottuln-Appelhülsen default: return ""; @@ -1505,26 +1515,26 @@ private static String fromNumber252(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2520"; // Wadersloh-Diestedde - case "1": + case '1': return "2521"; // Beckum - case "2": + case '2': return "2522"; // Oelde - case "3": + case '3': return "2523"; // Wadersloh - case "4": + case '4': return "2524"; // Ennigerloh - case "5": + case '5': return "2525"; // Beckum-Neubeckum - case "6": + case '6': return "2526"; // Sendenhorst - case "7": + case '7': return "2527"; // Lippetal-Lippborg - case "8": + case '8': return "2528"; // Ennigerloh-Enniger - case "9": + case '9': return "2529"; // Oelde-Stromberg default: return ""; @@ -1536,18 +1546,18 @@ private static String fromNumber253(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2532"; // Ostbevern - case "3": + case '3': return "2533"; // Münster-Nienberge - case "4": + case '4': return "2534"; // Münster-Roxel - case "5": + case '5': return "2535"; // Sendenhorst-Albersloh - case "6": + case '6': return "2536"; // Münster-Albachten - case "8": + case '8': return "2538"; // Drensteinfurt-Rinkerode default: return ""; @@ -1559,20 +1569,20 @@ private static String fromNumber254(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2541"; // Coesfeld - case "2": + case '2': return "2542"; // Gescher - case "3": + case '3': return "2543"; // Billerbeck Westf - case "5": + case '5': return "2545"; // Rosendahl-Darfeld - case "6": + case '6': return "2546"; // Coesfeld-Lette - case "7": + case '7': return "2547"; // Rosendahl-Osterwick - case "8": + case '8': return "2548"; // Dülmen-Rorup default: return ""; @@ -1584,22 +1594,22 @@ private static String fromNumber255(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2551"; // Steinfurt-Burgsteinfurt - case "2": + case '2': return "2552"; // Steinfurt-Borghorst - case "3": + case '3': return "2553"; // Ochtrup - case "4": + case '4': return "2554"; // Laer Kr Steinfurt - case "5": + case '5': return "2555"; // Schöppingen - case "6": + case '6': return "2556"; // Metelen - case "7": + case '7': return "2557"; // Wettringen Kr Steinfurt - case "8": + case '8': return "2558"; // Horstmar default: return ""; @@ -1611,22 +1621,22 @@ private static String fromNumber256(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2561"; // Ahaus - case "2": + case '2': return "2562"; // Gronau Westfalen - case "3": + case '3': return "2563"; // Stadtlohn - case "4": + case '4': return "2564"; // Vreden - case "5": + case '5': return "2565"; // Gronau-Epe - case "6": + case '6': return "2566"; // Legden - case "7": + case '7': return "2567"; // Ahaus-Alstätte - case "8": + case '8': return "2568"; // Heek default: return ""; @@ -1638,16 +1648,16 @@ private static String fromNumber257(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2571"; // Greven Westf - case "2": + case '2': return "2572"; // Emsdetten - case "3": + case '3': return "2573"; // Nordwalde - case "4": + case '4': return "2574"; // Saerbeck - case "5": + case '5': return "2575"; // Greven-Reckenfeld default: return ""; @@ -1659,22 +1669,22 @@ private static String fromNumber258(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2581"; // Warendorf - case "2": + case '2': return "2582"; // Everswinkel - case "3": + case '3': return "2583"; // Sassenberg - case "4": + case '4': return "2584"; // Warendorf-Milte - case "5": + case '5': return "2585"; // Warendorf-Hoetmar - case "6": + case '6': return "2586"; // Beelen - case "7": + case '7': return "2587"; // Ennigerloh-Westkirchen - case "8": + case '8': return "2588"; // Harsewinkel-Greffen default: return ""; @@ -1686,26 +1696,26 @@ private static String fromNumber259(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2590"; // Dülmen-Buldern - case "1": + case '1': return "2591"; // Lüdinghausen - case "2": + case '2': return "2592"; // Selm - case "3": + case '3': return "2593"; // Ascheberg Westf - case "4": + case '4': return "2594"; // Dülmen - case "5": + case '5': return "2595"; // Olfen - case "6": + case '6': return "2596"; // Nordkirchen - case "7": + case '7': return "2597"; // Senden Westf - case "8": + case '8': return "2598"; // Senden-Ottmarsbocholt - case "9": + case '9': return "2599"; // Ascheberg-Herbern default: return ""; @@ -1717,26 +1727,26 @@ private static String fromNumber26(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber260(number.substring(1)); - case "1": + case '1': return "261"; // Koblenz a Rhein - case "2": + case '2': return fromNumber262(number.substring(1)); - case "3": + case '3': return fromNumber263(number.substring(1)); - case "4": + case '4': return fromNumber264(number.substring(1)); - case "5": + case '5': return fromNumber265(number.substring(1)); - case "6": + case '6': return fromNumber266(number.substring(1)); - case "7": + case '7': return fromNumber267(number.substring(1)); - case "8": + case '8': return fromNumber268(number.substring(1)); - case "9": + case '9': return fromNumber269(number.substring(1)); default: return ""; @@ -1748,22 +1758,22 @@ private static String fromNumber260(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2601"; // Nauort - case "2": + case '2': return "2602"; // Montabaur - case "3": + case '3': return "2603"; // Bad Ems - case "4": + case '4': return "2604"; // Nassau Lahn - case "5": + case '5': return "2605"; // Löf - case "6": + case '6': return "2606"; // Winningen Mosel - case "7": + case '7': return "2607"; // Kobern-Gondorf - case "8": + case '8': return "2608"; // Welschneudorf default: return ""; @@ -1775,24 +1785,24 @@ private static String fromNumber262(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2620"; // Neuhäusel Westerw - case "1": + case '1': return "2621"; // Lahnstein - case "2": + case '2': return "2622"; // Bendorf Rhein - case "3": + case '3': return "2623"; // Ransbach-Baumbach - case "4": + case '4': return "2624"; // Höhr-Grenzhausen - case "5": + case '5': return "2625"; // Ochtendung - case "6": + case '6': return "2626"; // Selters Westferwald - case "7": + case '7': return "2627"; // Braubach - case "8": + case '8': return "2628"; // Rhens default: return ""; @@ -1804,26 +1814,26 @@ private static String fromNumber263(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2630"; // Mülheim-Kärlich - case "1": + case '1': return "2631"; // Neuwied - case "2": + case '2': return "2632"; // Andernach - case "3": + case '3': return "2633"; // Brohl-Lützing - case "4": + case '4': return "2634"; // Rengsdorf - case "5": + case '5': return "2635"; // Rheinbrohl - case "6": + case '6': return "2636"; // Burgbrohl - case "7": + case '7': return "2637"; // Weissenthurm - case "8": + case '8': return "2638"; // Waldbreitbach - case "9": + case '9': return "2639"; // Anhausen Kr Neuwied default: return ""; @@ -1835,20 +1845,20 @@ private static String fromNumber264(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2641"; // Bad Neuenahr-Ahrweiler - case "2": + case '2': return "2642"; // Remagen - case "3": + case '3': return "2643"; // Altenahr - case "4": + case '4': return "2644"; // Linz am Rhein - case "5": + case '5': return "2645"; // Vettelschoss - case "6": + case '6': return "2646"; // Königsfeld Eifel - case "7": + case '7': return "2647"; // Kesseling default: return ""; @@ -1860,20 +1870,20 @@ private static String fromNumber265(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2651"; // Mayen - case "2": + case '2': return "2652"; // Mendig - case "3": + case '3': return "2653"; // Kaisersesch - case "4": + case '4': return "2654"; // Polch - case "5": + case '5': return "2655"; // Weibern - case "6": + case '6': return "2656"; // Virneburg - case "7": + case '7': return "2657"; // Uersfeld default: return ""; @@ -1885,18 +1895,18 @@ private static String fromNumber266(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2661"; // Bad Marienberg Westerwald - case "2": + case '2': return "2662"; // Hachenburg - case "3": + case '3': return "2663"; // Westerburg Westerw - case "4": + case '4': return "2664"; // Rennerod - case "6": + case '6': return "2666"; // Freilingen Westerw - case "7": + case '7': return "2667"; // Stein-Neukirch default: return ""; @@ -1908,22 +1918,22 @@ private static String fromNumber267(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2671"; // Cochem - case "2": + case '2': return "2672"; // Treis-Karden - case "3": + case '3': return "2673"; // Ellenz-Poltersdorf - case "4": + case '4': return "2674"; // Bad Bertrich - case "5": + case '5': return "2675"; // Ediger-Eller - case "6": + case '6': return "2676"; // Ulmen - case "7": + case '7': return "2677"; // Lutzerath - case "8": + case '8': return "2678"; // Büchel b Cochem default: return ""; @@ -1935,26 +1945,26 @@ private static String fromNumber268(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2680"; // Mündersbach - case "1": + case '1': return "2681"; // Altenkirchen Westerwald - case "2": + case '2': return "2682"; // Hamm Sieg - case "3": + case '3': return "2683"; // Asbach Westerw - case "4": + case '4': return "2684"; // Puderbach Westerw - case "5": + case '5': return "2685"; // Flammersfeld - case "6": + case '6': return "2686"; // Weyerbusch - case "7": + case '7': return "2687"; // Horhausen Westerwald - case "8": + case '8': return "2688"; // Kroppach - case "9": + case '9': return "2689"; // Dierdorf default: return ""; @@ -1966,20 +1976,20 @@ private static String fromNumber269(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2691"; // Adenau - case "2": + case '2': return "2692"; // Kelberg - case "3": + case '3': return "2693"; // Antweiler - case "4": + case '4': return "2694"; // Wershofen - case "5": + case '5': return "2695"; // Insul - case "6": + case '6': return "2696"; // Nohn Eifel - case "7": + case '7': return "2697"; // Blankenheim-Ahrhütte default: return ""; @@ -1991,20 +2001,20 @@ private static String fromNumber27(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "271"; // Siegen - case "2": + case '2': return fromNumber272(number.substring(1)); - case "3": + case '3': return fromNumber273(number.substring(1)); - case "4": + case '4': return fromNumber274(number.substring(1)); - case "5": + case '5': return fromNumber275(number.substring(1)); - case "6": + case '6': return fromNumber276(number.substring(1)); - case "7": + case '7': return fromNumber277(number.substring(1)); default: return ""; @@ -2016,16 +2026,16 @@ private static String fromNumber272(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2721"; // Lennestadt - case "2": + case '2': return "2722"; // Attendorn - case "3": + case '3': return "2723"; // Kirchhundem - case "4": + case '4': return "2724"; // Finnentrop-Serkenrode - case "5": + case '5': return "2725"; // Lennestadt-Oedingen default: return ""; @@ -2037,22 +2047,22 @@ private static String fromNumber273(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2732"; // Kreuztal - case "3": + case '3': return "2733"; // Hilchenbach - case "4": + case '4': return "2734"; // Freudenberg Westf - case "5": + case '5': return "2735"; // Neunkirchen Siegerl - case "6": + case '6': return "2736"; // Burbach Siegerl - case "7": + case '7': return "2737"; // Netphen-Deuz - case "8": + case '8': return "2738"; // Netphen - case "9": + case '9': return "2739"; // Wilnsdorf default: return ""; @@ -2064,18 +2074,18 @@ private static String fromNumber274(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2741"; // Betzdorf - case "2": + case '2': return "2742"; // Wissen - case "3": + case '3': return "2743"; // Daaden - case "4": + case '4': return "2744"; // Herdorf - case "5": + case '5': return "2745"; // Brachbach Sieg - case "7": + case '7': return "2747"; // Molzhain default: return ""; @@ -2087,22 +2097,22 @@ private static String fromNumber275(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2750"; // Diedenshausen - case "1": + case '1': return "2751"; // Bad Berleburg - case "2": + case '2': return "2752"; // Bad Laasphe - case "3": + case '3': return "2753"; // Erndtebrück - case "4": + case '4': return "2754"; // Bad Laasphe-Feudingen - case "5": + case '5': return "2755"; // Bad Berleburg-Schwarzenau - case "8": + case '8': return "2758"; // Bad Berleburg-Girkhausen - case "9": + case '9': return "2759"; // Bad Berleburg-Aue default: return ""; @@ -2114,14 +2124,14 @@ private static String fromNumber276(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2761"; // Olpe Biggesee - case "2": + case '2': return "2762"; // Wenden Südsauerland - case "3": + case '3': return "2763"; // Drolshagen-Bleche - case "4": + case '4': return "2764"; // Welschen Ennest default: return ""; @@ -2133,26 +2143,26 @@ private static String fromNumber277(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2770"; // Eschenburg - case "1": + case '1': return "2771"; // Dillenburg - case "2": + case '2': return "2772"; // Herborn Hess - case "3": + case '3': return "2773"; // Haiger - case "4": + case '4': return "2774"; // Dietzhölztal - case "5": + case '5': return "2775"; // Driedorf - case "6": + case '6': return "2776"; // Bad Endbach-Hartenrod - case "7": + case '7': return "2777"; // Breitscheid Hess - case "8": + case '8': return "2778"; // Siegbach - case "9": + case '9': return "2779"; // Greifenstein-Beilstein default: return ""; @@ -2164,22 +2174,22 @@ private static String fromNumber28(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber280(number.substring(1)); - case "1": + case '1': return "281"; // Wesel - case "2": + case '2': return fromNumber282(number.substring(1)); - case "3": + case '3': return fromNumber283(number.substring(1)); - case "4": + case '4': return fromNumber284(number.substring(1)); - case "5": + case '5': return fromNumber285(number.substring(1)); - case "6": + case '6': return fromNumber286(number.substring(1)); - case "7": + case '7': return fromNumber287(number.substring(1)); default: return ""; @@ -2191,14 +2201,14 @@ private static String fromNumber280(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2801"; // Xanten - case "2": + case '2': return "2802"; // Alpen - case "3": + case '3': return "2803"; // Wesel-Büderich - case "4": + case '4': return "2804"; // Xanten-Marienbaum default: return ""; @@ -2210,22 +2220,22 @@ private static String fromNumber282(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2821"; // Kleve Niederrhein - case "2": + case '2': return "2822"; // Emmerich - case "3": + case '3': return "2823"; // Goch - case "4": + case '4': return "2824"; // Kalkar - case "5": + case '5': return "2825"; // Uedem - case "6": + case '6': return "2826"; // Kranenburg Niederrhein - case "7": + case '7': return "2827"; // Goch-Hassum - case "8": + case '8': return "2828"; // Emmerich-Elten default: return ""; @@ -2237,24 +2247,24 @@ private static String fromNumber283(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2831"; // Geldern - case "2": + case '2': return "2832"; // Kevelaer - case "3": + case '3': return "2833"; // Kerken - case "4": + case '4': return "2834"; // Straelen - case "5": + case '5': return "2835"; // Issum - case "6": + case '6': return "2836"; // Wachtendonk - case "7": + case '7': return "2837"; // Weeze - case "8": + case '8': return "2838"; // Sonsbeck - case "9": + case '9': return "2839"; // Straelen-Herongen default: return ""; @@ -2266,16 +2276,16 @@ private static String fromNumber284(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2841"; // Moers - case "2": + case '2': return "2842"; // Kamp-Lintfort - case "3": + case '3': return "2843"; // Rheinberg - case "4": + case '4': return "2844"; // Rheinberg-Orsoy - case "5": + case '5': return "2845"; // Neukirchen-Vluyn default: return ""; @@ -2287,24 +2297,24 @@ private static String fromNumber285(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "2850"; // Rees-Haldern - case "1": + case '1': return "2851"; // Rees - case "2": + case '2': return "2852"; // Hamminkeln - case "3": + case '3': return "2853"; // Schermbeck - case "5": + case '5': return "2855"; // Voerde Niederrhein - case "6": + case '6': return "2856"; // Hamminkeln-Brünen - case "7": + case '7': return "2857"; // Rees-Mehr - case "8": + case '8': return "2858"; // Hünxe - case "9": + case '9': return "2859"; // Wesel-Bislich default: return ""; @@ -2316,20 +2326,20 @@ private static String fromNumber286(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2861"; // Borken Westf - case "2": + case '2': return "2862"; // Südlohn - case "3": + case '3': return "2863"; // Velen - case "4": + case '4': return "2864"; // Reken - case "5": + case '5': return "2865"; // Raesfeld - case "6": + case '6': return "2866"; // Dorsten-Rhade - case "7": + case '7': return "2867"; // Heiden Kr Borken default: return ""; @@ -2341,14 +2351,14 @@ private static String fromNumber287(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2871"; // Bocholt - case "2": + case '2': return "2872"; // Rhede Westf - case "3": + case '3': return "2873"; // Isselburg-Werth - case "4": + case '4': return "2874"; // Isselburg default: return ""; @@ -2360,26 +2370,26 @@ private static String fromNumber29(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber290(number.substring(1)); - case "1": + case '1': return "291"; // Meschede - case "2": + case '2': return fromNumber292(number.substring(1)); - case "3": + case '3': return fromNumber293(number.substring(1)); - case "4": + case '4': return fromNumber294(number.substring(1)); - case "5": + case '5': return fromNumber295(number.substring(1)); - case "6": + case '6': return fromNumber296(number.substring(1)); - case "7": + case '7': return fromNumber297(number.substring(1)); - case "8": + case '8': return fromNumber298(number.substring(1)); - case "9": + case '9': return fromNumber299(number.substring(1)); default: return ""; @@ -2391,14 +2401,14 @@ private static String fromNumber290(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "2902"; // Warstein - case "3": + case '3': return "2903"; // Meschede-Freienohl - case "4": + case '4': return "2904"; // Bestwig - case "5": + case '5': return "2905"; // Bestwig-Ramsbeck default: return ""; @@ -2410,20 +2420,20 @@ private static String fromNumber292(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2921"; // Soest - case "2": + case '2': return "2922"; // Werl - case "3": + case '3': return "2923"; // Lippetal-Herzfeld - case "4": + case '4': return "2924"; // Möhnesee - case "5": + case '5': return "2925"; // Warstein-Allagen - case "7": + case '7': return "2927"; // Neuengeseke - case "8": + case '8': return "2928"; // Soest-Ostönnen default: return ""; @@ -2435,20 +2445,20 @@ private static String fromNumber293(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2931"; // Arnsberg - case "2": + case '2': return "2932"; // Neheim-Hüsten - case "3": + case '3': return "2933"; // Sundern Sauerland - case "4": + case '4': return "2934"; // Sundern-Altenhellefeld - case "5": + case '5': return "2935"; // Sundern-Hachen - case "7": + case '7': return "2937"; // Arnsberg-Oeventrop - case "8": + case '8': return "2938"; // Ense default: return ""; @@ -2460,20 +2470,20 @@ private static String fromNumber294(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2941"; // Lippstadt - case "2": + case '2': return "2942"; // Geseke - case "3": + case '3': return "2943"; // Erwitte - case "4": + case '4': return "2944"; // Rietberg-Mastholte - case "5": + case '5': return "2945"; // Lippstadt-Benninghausen - case "7": + case '7': return "2947"; // Anröchte - case "8": + case '8': return "2948"; // Lippstadt-Rebbeke default: return ""; @@ -2485,20 +2495,20 @@ private static String fromNumber295(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2951"; // Büren - case "2": + case '2': return "2952"; // Rüthen - case "3": + case '3': return "2953"; // Wünnenberg - case "4": + case '4': return "2954"; // Rüthen-Oestereiden - case "5": + case '5': return "2955"; // Büren-Wewelsburg - case "7": + case '7': return "2957"; // Wünnenberg-Haaren - case "8": + case '8': return "2958"; // Büren-Harth default: return ""; @@ -2510,14 +2520,14 @@ private static String fromNumber296(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2961"; // Brilon - case "2": + case '2': return "2962"; // Olsberg - case "3": + case '3': return "2963"; // Brilon-Messinghausen - case "4": + case '4': return "2964"; // Brilon-Alme default: return ""; @@ -2529,18 +2539,18 @@ private static String fromNumber297(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2971"; // Schmallenberg-Dorlar - case "2": + case '2': return "2972"; // Schmallenberg - case "3": + case '3': return "2973"; // Eslohe Sauerland - case "4": + case '4': return "2974"; // Schmallenberg-Fredeburg - case "5": + case '5': return "2975"; // Schmallenberg-Oberkirchen - case "7": + case '7': return "2977"; // Schmallenberg-Bödefeld default: return ""; @@ -2552,16 +2562,16 @@ private static String fromNumber298(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2981"; // Winterberg Westf - case "2": + case '2': return "2982"; // Medebach - case "3": + case '3': return "2983"; // Winterberg-Siedlinghausen - case "4": + case '4': return "2984"; // Hallenberg - case "5": + case '5': return "2985"; // Winterberg-Niedersfeld default: return ""; @@ -2573,14 +2583,14 @@ private static String fromNumber299(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "2991"; // Marsberg-Bredelar - case "2": + case '2': return "2992"; // Marsberg - case "3": + case '3': return "2993"; // Marsberg-Canstein - case "4": + case '4': return "2994"; // Marsberg-Westheim default: return ""; @@ -2592,22 +2602,22 @@ private static String fromNumber3(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "30"; // Berlin - case "3": + case '3': return fromNumber33(number.substring(1)); - case "4": + case '4': return fromNumber34(number.substring(1)); - case "5": + case '5': return fromNumber35(number.substring(1)); - case "6": + case '6': return fromNumber36(number.substring(1)); - case "7": + case '7': return fromNumber37(number.substring(1)); - case "8": + case '8': return fromNumber38(number.substring(1)); - case "9": + case '9': return fromNumber39(number.substring(1)); default: return ""; @@ -2619,26 +2629,26 @@ private static String fromNumber33(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber330(number.substring(1)); - case "1": + case '1': return "331"; // Potsdam - case "2": + case '2': return fromNumber332(number.substring(1)); - case "3": + case '3': return fromNumber333(number.substring(1)); - case "4": + case '4': return fromNumber334(number.substring(1)); - case "5": + case '5': return "335"; // Frankfurt (Oder) - case "6": + case '6': return fromNumber336(number.substring(1)); - case "7": + case '7': return fromNumber337(number.substring(1)); - case "8": + case '8': return fromNumber338(number.substring(1)); - case "9": + case '9': return fromNumber339(number.substring(1)); default: return ""; @@ -2650,24 +2660,24 @@ private static String fromNumber330(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3301"; // Oranienburg - case "2": + case '2': return "3302"; // Hennigsdorf - case "3": + case '3': return "3303"; // Birkenwerder - case "4": + case '4': return "3304"; // Velten - case "5": + case '5': return fromNumber3305(number.substring(1)); - case "6": + case '6': return "3306"; // Gransee - case "7": + case '7': return "3307"; // Zehdenick - case "8": + case '8': return fromNumber3308(number.substring(1)); - case "9": + case '9': return fromNumber3309(number.substring(1)); default: return ""; @@ -2679,18 +2689,18 @@ private static String fromNumber3305(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33051"; // Nassenheide - case "2": + case '2': return "33052"; // Leegebruch - case "3": + case '3': return "33053"; // Zehlendorf Kr Oberhavel - case "4": + case '4': return "33054"; // Liebenwalde - case "5": + case '5': return "33055"; // Kremmen - case "6": + case '6': return "33056"; // Mühlenbeck Kr Oberhavel default: return ""; @@ -2702,24 +2712,24 @@ private static String fromNumber3308(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33080"; // Marienthal Kr Oberhavel - case "2": + case '2': return "33082"; // Menz Kr Oberhavel - case "3": + case '3': return "33083"; // Schulzendorf Kr Oberhavel - case "4": + case '4': return "33084"; // Gutengermendorf - case "5": + case '5': return "33085"; // Seilershof - case "6": + case '6': return "33086"; // Grieben Kr Oberhavel - case "7": + case '7': return "33087"; // Bredereiche - case "8": + case '8': return "33088"; // Falkenthal - case "9": + case '9': return "33089"; // Himmelpfort default: return ""; @@ -2731,10 +2741,10 @@ private static String fromNumber3309(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "33093"; // Fürstenberg Havel - case "4": + case '4': return "33094"; // Löwenberg default: return ""; @@ -2746,20 +2756,20 @@ private static String fromNumber332(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3320(number.substring(1)); - case "1": + case '1': return "3321"; // Nauen Brandenb - case "2": + case '2': return "3322"; // Falkensee - case "3": + case '3': return fromNumber3323(number.substring(1)); - case "7": + case '7': return "3327"; // Werder Havel - case "8": + case '8': return "3328"; // Teltow - case "9": + case '9': return "3329"; // Stahnsdorf default: return ""; @@ -2771,26 +2781,26 @@ private static String fromNumber3320(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33200"; // Bergholz-Rehbrücke - case "1": + case '1': return "33201"; // Gross Glienicke - case "2": + case '2': return "33202"; // Töplitz - case "3": + case '3': return "33203"; // Kleinmachnow - case "4": + case '4': return "33204"; // Beelitz Mark - case "5": + case '5': return "33205"; // Michendorf - case "6": + case '6': return "33206"; // Fichtenwalde - case "7": + case '7': return "33207"; // Gross Kreutz - case "8": + case '8': return "33208"; // Fahrland - case "9": + case '9': return "33209"; // Caputh default: return ""; @@ -2802,24 +2812,24 @@ private static String fromNumber3323(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33230"; // Börnicke Kr Havelland - case "1": + case '1': return "33231"; // Pausin - case "2": + case '2': return "33232"; // Brieselang - case "3": + case '3': return "33233"; // Ketzin - case "4": + case '4': return "33234"; // Wustermark - case "5": + case '5': return "33235"; // Friesack - case "7": + case '7': return "33237"; // Paulinenaue - case "8": + case '8': return "33238"; // Senzke - case "9": + case '9': return "33239"; // Gross Behnitz default: return ""; @@ -2831,24 +2841,24 @@ private static String fromNumber333(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3331"; // Angermünde - case "2": + case '2': return "3332"; // Schwedt/Oder - case "3": + case '3': return fromNumber3333(number.substring(1)); - case "4": + case '4': return "3334"; // Eberswalde - case "5": + case '5': return "3335"; // Finowfurt - case "6": + case '6': return fromNumber3336(number.substring(1)); - case "7": + case '7': return "3337"; // Biesenthal Brandenb - case "8": + case '8': return "3338"; // Bernau Brandenb - case "9": + case '9': return fromNumber3339(number.substring(1)); default: return ""; @@ -2860,22 +2870,22 @@ private static String fromNumber3333(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33331"; // Casekow - case "2": + case '2': return "33332"; // Gartz Oder - case "3": + case '3': return "33333"; // Tantow - case "4": + case '4': return "33334"; // Greiffenberg - case "5": + case '5': return "33335"; // Pinnow Kr Uckermark - case "6": + case '6': return "33336"; // Passow Kr Uckermark - case "7": + case '7': return "33337"; // Altkünkendorf - case "8": + case '8': return "33338"; // Stolpe/Oder default: return ""; @@ -2887,24 +2897,24 @@ private static String fromNumber3336(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33361"; // Joachimsthal - case "2": + case '2': return "33362"; // Liepe Kr Barnim - case "3": + case '3': return "33363"; // Altenhof Kr Barnim - case "4": + case '4': return "33364"; // Gross Ziethen Kr Barnim - case "5": + case '5': return "33365"; // Lüdersdorf Kr Barnim - case "6": + case '6': return "33366"; // Chorin - case "7": + case '7': return "33367"; // Friedrichswalde Brandenb - case "8": + case '8': return "33368"; // Hohensaaten - case "9": + case '9': return "33369"; // Oderberg default: return ""; @@ -2916,18 +2926,18 @@ private static String fromNumber3339(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "33393"; // Gross Schönebeck Kr Barnim - case "4": + case '4': return "33394"; // Blumberg Kr Barnim - case "5": + case '5': return "33395"; // Zerpenschleuse - case "6": + case '6': return "33396"; // Klosterfelde - case "7": + case '7': return "33397"; // Wandlitz - case "8": + case '8': return "33398"; // Werneuchen default: return ""; @@ -2939,20 +2949,20 @@ private static String fromNumber334(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3341"; // Strausberg - case "2": + case '2': return "3342"; // Neuenhagen b Berlin - case "3": + case '3': return fromNumber3343(number.substring(1)); - case "4": + case '4': return "3344"; // Bad Freienwalde - case "5": + case '5': return fromNumber3345(number.substring(1)); - case "6": + case '6': return "3346"; // Seelow - case "7": + case '7': return fromNumber3347(number.substring(1)); default: return ""; @@ -2964,22 +2974,22 @@ private static String fromNumber3343(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33432"; // Müncheberg - case "3": + case '3': return "33433"; // Buckow Märk Schweiz - case "4": + case '4': return "33434"; // Herzfelde b Strausberg - case "5": + case '5': return "33435"; // Rehfelde - case "6": + case '6': return "33436"; // Prötzel - case "7": + case '7': return "33437"; // Reichenberg b Strausberg - case "8": + case '8': return "33438"; // Altlandsberg - case "9": + case '9': return "33439"; // Fredersdorf-Vogelsdorf default: return ""; @@ -2991,18 +3001,18 @@ private static String fromNumber3345(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33451"; // Heckelberg - case "2": + case '2': return "33452"; // Neulewin - case "4": + case '4': return "33454"; // Wölsickendorf/Wollenberg - case "6": + case '6': return "33456"; // Wriezen - case "7": + case '7': return "33457"; // Altreetz - case "8": + case '8': return "33458"; // Falkenberg Mark default: return ""; @@ -3014,24 +3024,24 @@ private static String fromNumber3347(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33470"; // Lietzen - case "2": + case '2': return "33472"; // Golzow b Seelow - case "3": + case '3': return "33473"; // Zechin - case "4": + case '4': return "33474"; // Neutrebbin - case "5": + case '5': return "33475"; // Letschin - case "6": + case '6': return "33476"; // Neuhardenberg - case "7": + case '7': return "33477"; // Trebnitz b Müncheberg - case "8": + case '8': return "33478"; // Gross Neuendorf - case "9": + case '9': return "33479"; // Küstrin-Kietz default: return ""; @@ -3043,22 +3053,22 @@ private static String fromNumber336(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3360(number.substring(1)); - case "1": + case '1': return "3361"; // Fürstenwalde Spree - case "2": + case '2': return "3362"; // Erkner - case "3": + case '3': return fromNumber3363(number.substring(1)); - case "4": + case '4': return "3364"; // Eisenhüttenstadt - case "5": + case '5': return fromNumber3365(number.substring(1)); - case "6": + case '6': return "3366"; // Beeskow - case "7": + case '7': return fromNumber3367(number.substring(1)); default: return ""; @@ -3070,24 +3080,24 @@ private static String fromNumber3360(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33601"; // Podelzig - case "2": + case '2': return "33602"; // Alt Zeschdorf - case "3": + case '3': return "33603"; // Falkenhagen b Seelow - case "4": + case '4': return "33604"; // Lebus - case "5": + case '5': return "33605"; // Boossen - case "6": + case '6': return "33606"; // Müllrose - case "7": + case '7': return "33607"; // Briesen Mark - case "8": + case '8': return "33608"; // Jacobsdorf Mark - case "9": + case '9': return "33609"; // Brieskow-Finkenheerd default: return ""; @@ -3099,22 +3109,22 @@ private static String fromNumber3363(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33631"; // Bad Saarow-Pieskow - case "2": + case '2': return "33632"; // Hangelsberg - case "3": + case '3': return "33633"; // Spreenhagen - case "4": + case '4': return "33634"; // Berkenbrück Kr Oder-Spree - case "5": + case '5': return "33635"; // Arensdorf Kr Oder-Spree - case "6": + case '6': return "33636"; // Steinhöfel Kr Oder-Spree - case "7": + case '7': return "33637"; // Beerfelde - case "8": + case '8': return "33638"; // Rüdersdorf b Berlin default: return ""; @@ -3126,18 +3136,18 @@ private static String fromNumber3365(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33652"; // Neuzelle - case "3": + case '3': return "33653"; // Ziltendorf - case "4": + case '4': return "33654"; // Fünfeichen - case "5": + case '5': return "33655"; // Grunow Kr Oder-Spree - case "6": + case '6': return "33656"; // Bahro - case "7": + case '7': return "33657"; // Steinsdorf Brandenb default: return ""; @@ -3149,24 +3159,24 @@ private static String fromNumber3367(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33671"; // Lieberose - case "2": + case '2': return "33672"; // Pfaffendorfb Beeskow - case "3": + case '3': return "33673"; // Weichensdorf - case "4": + case '4': return "33674"; // Trebatsch - case "5": + case '5': return "33675"; // Tauche - case "6": + case '6': return "33676"; // Friedland b Beeskow - case "7": + case '7': return "33677"; // Glienicke b Beeskow - case "8": + case '8': return "33678"; // Storkow Mark - case "9": + case '9': return "33679"; // Wendisch Rietz default: return ""; @@ -3178,26 +3188,26 @@ private static String fromNumber337(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3370(number.substring(1)); - case "1": + case '1': return "3371"; // Luckenwalde - case "2": + case '2': return "3372"; // Jüterbog - case "3": + case '3': return fromNumber3373(number.substring(1)); - case "4": + case '4': return fromNumber3374(number.substring(1)); - case "5": + case '5': return "3375"; // Königs Wusterhausen - case "6": + case '6': return fromNumber3376(number.substring(1)); - case "7": + case '7': return "3377"; // Zossen Brandenb - case "8": + case '8': return "3378"; // Ludwigsfelde - case "9": + case '9': return "3379"; // Mahlow default: return ""; @@ -3209,16 +3219,16 @@ private static String fromNumber3370(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33701"; // Grossbeeren - case "2": + case '2': return "33702"; // Wünsdorf - case "3": + case '3': return "33703"; // Sperenberg - case "4": + case '4': return "33704"; // Baruth Mark - case "8": + case '8': return "33708"; // Rangsdorf default: return ""; @@ -3230,14 +3240,14 @@ private static String fromNumber3373(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33731"; // Trebbin - case "2": + case '2': return "33732"; // Hennickendorf b Luckenwalde - case "3": + case '3': return "33733"; // Stülpe - case "4": + case '4': return "33734"; // Felgentreu default: return ""; @@ -3249,22 +3259,22 @@ private static String fromNumber3374(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33741"; // Niedergörsdorf - case "2": + case '2': return "33742"; // Oehna Brandenb - case "3": + case '3': return "33743"; // Blönsdorf - case "4": + case '4': return "33744"; // Hohenseefeld - case "5": + case '5': return "33745"; // Petkus - case "6": + case '6': return "33746"; // Werbig b Jüterbog - case "7": + case '7': return "33747"; // Marzahna - case "8": + case '8': return "33748"; // Treuenbrietzen default: return ""; @@ -3276,24 +3286,24 @@ private static String fromNumber3376(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33760"; // Münchehofe Kr Dahme-Spreewald - case "2": + case '2': return "33762"; // Zeuthen - case "3": + case '3': return "33763"; // Bestensee - case "4": + case '4': return "33764"; // Mittenwalde Mark - case "5": + case '5': return "33765"; // Märkisch Buchholz - case "6": + case '6': return "33766"; // Teupitz - case "7": + case '7': return "33767"; // Friedersdorf b Berlin - case "8": + case '8': return "33768"; // Prieros - case "9": + case '9': return "33769"; // Töpchin default: return ""; @@ -3305,20 +3315,20 @@ private static String fromNumber338(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3381"; // Brandenburg an der Havel - case "2": + case '2': return "3382"; // Lehnin - case "3": + case '3': return fromNumber3383(number.substring(1)); - case "4": + case '4': return fromNumber3384(number.substring(1)); - case "5": + case '5': return "3385"; // Rathenow - case "6": + case '6': return "3386"; // Premnitz - case "7": + case '7': return fromNumber3387(number.substring(1)); default: return ""; @@ -3330,26 +3340,26 @@ private static String fromNumber3383(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33830"; // Ziesar - case "1": + case '1': return "33831"; // Weseram - case "2": + case '2': return "33832"; // Rogäsen - case "3": + case '3': return "33833"; // Wollin b Brandenburg - case "4": + case '4': return "33834"; // Pritzerbe - case "5": + case '5': return "33835"; // Golzow b Brandenburg - case "6": + case '6': return "33836"; // Butzow b Brandenburg - case "7": + case '7': return "33837"; // Brielow - case "8": + case '8': return "33838"; // Päwesin - case "9": + case '9': return "33839"; // Wusterwitz default: return ""; @@ -3361,22 +3371,22 @@ private static String fromNumber3384(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33841"; // Belzig - case "3": + case '3': return "33843"; // Niemegk - case "4": + case '4': return "33844"; // Brück Brandenb - case "5": + case '5': return "33845"; // Borkheide - case "6": + case '6': return "33846"; // Dippmannsdorf - case "7": + case '7': return "33847"; // Görzke - case "8": + case '8': return "33848"; // Raben - case "9": + case '9': return "33849"; // Wiesenburg Mark default: return ""; @@ -3388,22 +3398,22 @@ private static String fromNumber3387(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33870"; // Zollchow b Rathenow - case "2": + case '2': return "33872"; // Hohennauen - case "3": + case '3': return "33873"; // Grosswudicke - case "4": + case '4': return "33874"; // Stechow Brandenb - case "5": + case '5': return "33875"; // Rhinow - case "6": + case '6': return "33876"; // Buschow - case "7": + case '7': return "33877"; // Nitzahn - case "8": + case '8': return "33878"; // Nennhausen default: return ""; @@ -3415,22 +3425,22 @@ private static String fromNumber339(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3391"; // Neuruppin - case "2": + case '2': return fromNumber3392(number.substring(1)); - case "3": + case '3': return fromNumber3393(number.substring(1)); - case "4": + case '4': return "3394"; // Wittstock Dosse - case "5": + case '5': return "3395"; // Pritzwalk - case "6": + case '6': return fromNumber3396(number.substring(1)); - case "7": + case '7': return fromNumber3397(number.substring(1)); - case "8": + case '8': return fromNumber3398(number.substring(1)); default: return ""; @@ -3442,26 +3452,26 @@ private static String fromNumber3392(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33920"; // Walsleben b Neuruppin - case "1": + case '1': return "33921"; // Zechlinerhütte - case "2": + case '2': return "33922"; // Karwesee - case "3": + case '3': return "33923"; // Flecken Zechlin - case "4": + case '4': return "33924"; // Rägelin - case "5": + case '5': return "33925"; // Wustrau-Altfriesack - case "6": + case '6': return "33926"; // Herzberg Mark - case "7": + case '7': return "33927"; // Linum - case "8": + case '8': return "33928"; // Wildberg Brandenb - case "9": + case '9': return "33929"; // Gühlen-Glienicke default: return ""; @@ -3473,12 +3483,12 @@ private static String fromNumber3393(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33931"; // Rheinsberg Mark - case "2": + case '2': return "33932"; // Fehrbellin - case "3": + case '3': return "33933"; // Lindow Mark default: return ""; @@ -3490,22 +3500,22 @@ private static String fromNumber3396(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "33962"; // Heiligengrabe - case "3": + case '3': return "33963"; // Wulfersdorf b Wittstock - case "4": + case '4': return "33964"; // Fretzdorf - case "5": + case '5': return "33965"; // Herzsprung b Wittstock - case "6": + case '6': return "33966"; // Dranse - case "7": + case '7': return "33967"; // Freyenstein - case "8": + case '8': return "33968"; // Meyenburg Kr Prignitz - case "9": + case '9': return "33969"; // Stepenitz default: return ""; @@ -3517,26 +3527,26 @@ private static String fromNumber3397(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "33970"; // Neustadt Dosse - case "1": + case '1': return "33971"; // Kyritz Brandenb - case "2": + case '2': return "33972"; // Breddin - case "3": + case '3': return "33973"; // Zernitz b Neustadt Dosse - case "4": + case '4': return "33974"; // Dessow - case "5": + case '5': return "33975"; // Dannenwalde Kr Prignitz - case "6": + case '6': return "33976"; // Wutike - case "7": + case '7': return "33977"; // Gumtow - case "8": + case '8': return "33978"; // Segeletz - case "9": + case '9': return "33979"; // Wusterhausen Dosse default: return ""; @@ -3548,18 +3558,18 @@ private static String fromNumber3398(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "33981"; // Putlitz - case "2": + case '2': return "33982"; // Hoppenrade Kr Prignitz - case "3": + case '3': return "33983"; // Gross Pankow Kr Prignitz - case "4": + case '4': return "33984"; // Blumenthal b Pritzwalk - case "6": + case '6': return "33986"; // Falkenhagen Kr Prignitz - case "9": + case '9': return "33989"; // Sadenbeck default: return ""; @@ -3571,24 +3581,24 @@ private static String fromNumber34(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "340"; // Dessau Anh - case "1": + case '1': return "341"; // Leipzig - case "2": + case '2': return fromNumber342(number.substring(1)); - case "3": + case '3': return fromNumber343(number.substring(1)); - case "4": + case '4': return fromNumber344(number.substring(1)); - case "5": + case '5': return "345"; // Halle Saale - case "6": + case '6': return fromNumber346(number.substring(1)); - case "7": + case '7': return fromNumber347(number.substring(1)); - case "9": + case '9': return fromNumber349(number.substring(1)); default: return ""; @@ -3600,22 +3610,22 @@ private static String fromNumber342(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3420(number.substring(1)); - case "1": + case '1': return "3421"; // Torgau - case "2": + case '2': return fromNumber3422(number.substring(1)); - case "3": + case '3': return "3423"; // Eilenburg - case "4": + case '4': return fromNumber3424(number.substring(1)); - case "5": + case '5': return "3425"; // Wurzen - case "6": + case '6': return fromNumber3426(number.substring(1)); - case "9": + case '9': return fromNumber3429(number.substring(1)); default: return ""; @@ -3627,20 +3637,20 @@ private static String fromNumber3420(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34202"; // Delitzsch - case "3": + case '3': return "34203"; // Zwenkau - case "4": + case '4': return "34204"; // Schkeuditz - case "5": + case '5': return "34205"; // Markranstädt - case "6": + case '6': return "34206"; // Rötha - case "7": + case '7': return "34207"; // Zwochau - case "8": + case '8': return "34208"; // Löbnitz B Delitzsch default: return ""; @@ -3652,14 +3662,14 @@ private static String fromNumber3422(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34221"; // Schildau Gneisenaustadt - case "2": + case '2': return "34222"; // Arzberg b Torgau - case "3": + case '3': return "34223"; // Dommitzsch - case "4": + case '4': return "34224"; // Belgern Sachs default: return ""; @@ -3671,14 +3681,14 @@ private static String fromNumber3424(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34241"; // Jesewitz - case "2": + case '2': return "34242"; // Hohenpriessnitz - case "3": + case '3': return "34243"; // Bad Düben - case "4": + case '4': return "34244"; // Mockrehna default: return ""; @@ -3690,12 +3700,12 @@ private static String fromNumber3426(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34261"; // Kühren b Wurzen - case "2": + case '2': return "34262"; // Falkenhain b Wurzen - case "3": + case '3': return "34263"; // Hohburg default: return ""; @@ -3707,24 +3717,24 @@ private static String fromNumber3429(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34291"; // Borsdorf - case "2": + case '2': return "34292"; // Brandis b Wurzen - case "3": + case '3': return "34293"; // Naunhof b Grimma - case "4": + case '4': return "34294"; // Rackwitz - case "5": + case '5': return "34295"; // Krensitz - case "6": + case '6': return "34296"; // Groitzsch b Pegau - case "7": + case '7': return "34297"; // Liebertwolkwitz - case "8": + case '8': return "34298"; // Taucha b Leipzig - case "9": + case '9': return "34299"; // Gaschwitz default: return ""; @@ -3736,22 +3746,22 @@ private static String fromNumber343(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3431"; // Döbeln - case "2": + case '2': return fromNumber3432(number.substring(1)); - case "3": + case '3': return "3433"; // Borna Stadt - case "4": + case '4': return fromNumber3434(number.substring(1)); - case "5": + case '5': return "3435"; // Oschatz - case "6": + case '6': return fromNumber3436(number.substring(1)); - case "7": + case '7': return "3437"; // Grimma - case "8": + case '8': return fromNumber3438(number.substring(1)); default: return ""; @@ -3763,18 +3773,18 @@ private static String fromNumber3432(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34321"; // Leisnig - case "2": + case '2': return "34322"; // Rosswein - case "4": + case '4': return "34324"; // Ostrau Sachs - case "5": + case '5': return "34325"; // Mochau-Lüttewitz - case "7": + case '7': return "34327"; // Waldheim Sachs - case "8": + case '8': return "34328"; // Hartha b Döbeln default: return ""; @@ -3786,22 +3796,22 @@ private static String fromNumber3434(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34341"; // Geithain - case "2": + case '2': return "34342"; // Neukieritzsch - case "3": + case '3': return "34343"; // Regis-Breitingen - case "4": + case '4': return "34344"; // Kohren-Sahlis - case "5": + case '5': return "34345"; // Bad Lausick - case "6": + case '6': return "34346"; // Narsdorf - case "7": + case '7': return "34347"; // Oelzschau b Borna - case "8": + case '8': return "34348"; // Frohburg default: return ""; @@ -3813,14 +3823,14 @@ private static String fromNumber3436(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34361"; // Dahlen Sachs - case "2": + case '2': return "34362"; // Mügeln b Oschatz - case "3": + case '3': return "34363"; // Cavertitz - case "4": + case '4': return "34364"; // Wermsdorf default: return ""; @@ -3832,18 +3842,18 @@ private static String fromNumber3438(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34381"; // Colditz - case "2": + case '2': return "34382"; // Nerchau - case "3": + case '3': return "34383"; // Trebsen Mulde - case "4": + case '4': return "34384"; // Grossbothen - case "5": + case '5': return "34385"; // Mutzschen - case "6": + case '6': return "34386"; // Dürrweitzschen B Grimma default: return ""; @@ -3855,24 +3865,24 @@ private static String fromNumber344(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3441"; // Zeitz - case "2": + case '2': return fromNumber3442(number.substring(1)); - case "3": + case '3': return "3443"; // Weissenfels Sachs-Anh - case "4": + case '4': return fromNumber3444(number.substring(1)); - case "5": + case '5': return "3445"; // Naumburg Saale - case "6": + case '6': return fromNumber3446(number.substring(1)); - case "7": + case '7': return "3447"; // Altenburg Thür - case "8": + case '8': return "3448"; // Meuselwitz Thür - case "9": + case '9': return fromNumber3449(number.substring(1)); default: return ""; @@ -3884,16 +3894,16 @@ private static String fromNumber3442(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34422"; // Osterfeld - case "3": + case '3': return "34423"; // Heuckewalde - case "4": + case '4': return "34424"; // Reuden b Zeitz - case "5": + case '5': return "34425"; // Droyssig - case "6": + case '6': return "34426"; // Kayna default: return ""; @@ -3905,16 +3915,16 @@ private static String fromNumber3444(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34441"; // Hohenmölsen - case "3": + case '3': return "34443"; // Teuchern - case "4": + case '4': return "34444"; // Lützen - case "5": + case '5': return "34445"; // Stößen - case "6": + case '6': return "34446"; // Grosskorbetha default: return ""; @@ -3926,20 +3936,20 @@ private static String fromNumber3446(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34461"; // Nebra Unstrut - case "2": + case '2': return "34462"; // Laucha Unstrut - case "3": + case '3': return "34463"; // Bad Kösen - case "4": + case '4': return "34464"; // Freyburg Unstrut - case "5": + case '5': return "34465"; // Bad Bibra - case "6": + case '6': return "34466"; // Janisroda - case "7": + case '7': return "34467"; // Eckartsberga default: return ""; @@ -3951,22 +3961,22 @@ private static String fromNumber3449(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34491"; // Schmölln Thür - case "2": + case '2': return "34492"; // Lucka - case "3": + case '3': return "34493"; // Gößnitz Thür - case "4": + case '4': return "34494"; // Ehrenhain - case "5": + case '5': return "34495"; // Dobitschen - case "6": + case '6': return "34496"; // Nöbdenitz - case "7": + case '7': return "34497"; // Langenleuba-Niederhain - case "8": + case '8': return "34498"; // Rositz default: return ""; @@ -3978,24 +3988,24 @@ private static String fromNumber346(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3460(number.substring(1)); - case "1": + case '1': return "3461"; // Merseburg Saale - case "2": + case '2': return "3462"; // Bad Dürrenberg - case "3": + case '3': return fromNumber3463(number.substring(1)); - case "4": + case '4': return "3464"; // Sangerhausen - case "5": + case '5': return fromNumber3465(number.substring(1)); - case "6": + case '6': return "3466"; // Artern Unstrut - case "7": + case '7': return fromNumber3467(number.substring(1)); - case "9": + case '9': return fromNumber3469(number.substring(1)); default: return ""; @@ -4007,24 +4017,24 @@ private static String fromNumber3460(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "34600"; // Ostrau Saalkreis - case "1": + case '1': return "34601"; // Teutschenthal - case "2": + case '2': return "34602"; // Landsberg Sachs-Anh - case "3": + case '3': return "34603"; // Nauendorf Sachs-Anh - case "4": + case '4': return "34604"; // Niemberg - case "5": + case '5': return "34605"; // Gröbers - case "6": + case '6': return "34606"; // Teicha Sachs-Anh - case "7": + case '7': return "34607"; // Wettin - case "9": + case '9': return "34609"; // Salzmünde default: return ""; @@ -4036,20 +4046,20 @@ private static String fromNumber3463(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "34632"; // Mücheln Geiseltal - case "3": + case '3': return "34633"; // Braunsbedra - case "5": + case '5': return "34635"; // Bad Lauchstädt - case "6": + case '6': return "34636"; // Schafstädt - case "7": + case '7': return "34637"; // Frankleben - case "8": + case '8': return "34638"; // Zöschen - case "9": + case '9': return "34639"; // Wallendorf Luppe default: return ""; @@ -4061,20 +4071,20 @@ private static String fromNumber3465(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34651"; // Rossla - case "2": + case '2': return "34652"; // Allstedt - case "3": + case '3': return "34653"; // Rottleberode - case "4": + case '4': return "34654"; // Stolberg Harz - case "6": + case '6': return "34656"; // Wallhausen Sachs-Anh - case "8": + case '8': return "34658"; // Hayn Harz - case "9": + case '9': return "34659"; // Blankenheim b Sangerhausen default: return ""; @@ -4086,12 +4096,12 @@ private static String fromNumber3467(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34671"; // Bad Frankenhausen Kyffhäuser - case "2": + case '2': return "34672"; // Rossleben - case "3": + case '3': return "34673"; // Heldrungen default: return ""; @@ -4103,10 +4113,10 @@ private static String fromNumber3469(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34691"; // Könnern - case "2": + case '2': return "34692"; // Alsleben Saale default: return ""; @@ -4118,22 +4128,22 @@ private static String fromNumber347(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3471"; // Bernburg Saale - case "2": + case '2': return fromNumber3472(number.substring(1)); - case "3": + case '3': return "3473"; // Aschersleben Sachs-Anh - case "4": + case '4': return fromNumber3474(number.substring(1)); - case "5": + case '5': return "3475"; // Lutherstadt Eisleben - case "6": + case '6': return "3476"; // Hettstedt Sachs-Anh - case "7": + case '7': return fromNumber3477(number.substring(1)); - case "8": + case '8': return fromNumber3478(number.substring(1)); default: return ""; @@ -4145,10 +4155,10 @@ private static String fromNumber3472(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34721"; // Nienburg Saale - case "2": + case '2': return "34722"; // Preusslitz default: return ""; @@ -4160,16 +4170,16 @@ private static String fromNumber3474(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34741"; // Frose - case "2": + case '2': return "34742"; // Sylda - case "3": + case '3': return "34743"; // Ermsleben - case "5": + case '5': return "34745"; // Winningen Sachs-Anh - case "6": + case '6': return "34746"; // Giersleben default: return ""; @@ -4181,20 +4191,20 @@ private static String fromNumber3477(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34771"; // Querfurt - case "2": + case '2': return "34772"; // Helbra - case "3": + case '3': return "34773"; // Schwittersdorf - case "4": + case '4': return "34774"; // Röblingen am See - case "5": + case '5': return "34775"; // Wippra - case "6": + case '6': return "34776"; // Rothenschirmbach - case "9": + case '9': return "34779"; // Abberode default: return ""; @@ -4206,14 +4216,14 @@ private static String fromNumber3478(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34781"; // Greifenhagen - case "2": + case '2': return "34782"; // Mansfeld Südharz - case "3": + case '3': return "34783"; // Gerbstedt - case "5": + case '5': return "34785"; // Sandersleben default: return ""; @@ -4225,22 +4235,22 @@ private static String fromNumber349(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3490(number.substring(1)); - case "1": + case '1': return "3491"; // Lutherstadt Wittenberg - case "2": + case '2': return fromNumber3492(number.substring(1)); - case "3": + case '3': return "3493"; // Bitterfeld - case "4": + case '4': return "3494"; // Wolfen - case "5": + case '5': return fromNumber3495(number.substring(1)); - case "6": + case '6': return "3496"; // Köthen Anhalt - case "7": + case '7': return fromNumber3497(number.substring(1)); default: return ""; @@ -4252,20 +4262,20 @@ private static String fromNumber3490(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "34901"; // Roßlau Elbe - case "3": + case '3': return "34903"; // Coswig Anhalt - case "4": + case '4': return "34904"; // Oranienbaum - case "5": + case '5': return "34905"; // Wörlitz - case "6": + case '6': return "34906"; // Raguhn - case "7": + case '7': return "34907"; // Jeber-Bergfrieden - case "9": + case '9': return "34909"; // Aken Elbe default: return ""; @@ -4277,26 +4287,26 @@ private static String fromNumber3492(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "34920"; // Kropstädt - case "1": + case '1': return "34921"; // Kemberg - case "2": + case '2': return "34922"; // Mühlanger - case "3": + case '3': return "34923"; // Cobbelsdorf - case "4": + case '4': return "34924"; // Zahna - case "5": + case '5': return "34925"; // Bad Schmiedeberg - case "6": + case '6': return "34926"; // Pretzsch Elbe - case "7": + case '7': return "34927"; // Globig-Bleddin - case "8": + case '8': return "34928"; // Seegrehna - case "9": + case '9': return "34929"; // Straach default: return ""; @@ -4308,14 +4318,14 @@ private static String fromNumber3495(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "34953"; // Gräfenhainichen - case "4": + case '4': return "34954"; // Roitzsch b Bitterfeld - case "5": + case '5': return "34955"; // Gossa - case "6": + case '6': return "34956"; // Zörbig default: return ""; @@ -4327,18 +4337,18 @@ private static String fromNumber3497(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "34973"; // Osternienburg - case "5": + case '5': return "34975"; // Görzig Kr Köthen - case "6": + case '6': return "34976"; // Gröbzig - case "7": + case '7': return "34977"; // Quellendorf - case "8": + case '8': return "34978"; // Radegast Kr Köthen - case "9": + case '9': return "34979"; // Wulfen Sachs-Anh default: return ""; @@ -4350,26 +4360,26 @@ private static String fromNumber35(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber350(number.substring(1)); - case "1": + case '1': return "351"; // Dresden - case "2": + case '2': return fromNumber352(number.substring(1)); - case "3": + case '3': return fromNumber353(number.substring(1)); - case "4": + case '4': return fromNumber354(number.substring(1)); - case "5": + case '5': return "355"; // Cottbus - case "6": + case '6': return fromNumber356(number.substring(1)); - case "7": + case '7': return fromNumber357(number.substring(1)); - case "8": + case '8': return fromNumber358(number.substring(1)); - case "9": + case '9': return fromNumber359(number.substring(1)); default: return ""; @@ -4381,16 +4391,16 @@ private static String fromNumber350(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3501"; // Pirna - case "2": + case '2': return fromNumber3502(number.substring(1)); - case "3": + case '3': return fromNumber3503(number.substring(1)); - case "4": + case '4': return "3504"; // Dippoldiswalde - case "5": + case '5': return fromNumber3505(number.substring(1)); default: return ""; @@ -4402,24 +4412,24 @@ private static String fromNumber3502(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35020"; // Struppen - case "1": + case '1': return "35021"; // Königstein Sächs Schweiz - case "2": + case '2': return "35022"; // Bad Schandau - case "3": + case '3': return "35023"; // Bad Gottleuba - case "4": + case '4': return "35024"; // Stadt Wehlen - case "5": + case '5': return "35025"; // Liebstadt - case "6": + case '6': return "35026"; // Dürrröhrsdorf-Dittersbach - case "7": + case '7': return "35027"; // Weesenstein - case "8": + case '8': return "35028"; // Krippen default: return ""; @@ -4431,10 +4441,10 @@ private static String fromNumber3503(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35032"; // Langenhennersdorf - case "3": + case '3': return "35033"; // Rosenthal Sächs Schweiz default: return ""; @@ -4446,20 +4456,20 @@ private static String fromNumber3505(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35052"; // Kipsdorf Kurort - case "3": + case '3': return "35053"; // Glashütte Sachs - case "4": + case '4': return "35054"; // Lauenstein Sachs - case "5": + case '5': return "35055"; // Höckendorf b Dippoldiswalde - case "6": + case '6': return "35056"; // Altenberg Sachs - case "7": + case '7': return "35057"; // Hermsdorf Erzgeb - case "8": + case '8': return "35058"; // Pretzschendorf default: return ""; @@ -4471,24 +4481,24 @@ private static String fromNumber352(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3520(number.substring(1)); - case "1": + case '1': return "3521"; // Meissen - case "2": + case '2': return "3522"; // Grossenhain Sachs - case "3": + case '3': return "3523"; // Coswig b Dresden - case "4": + case '4': return fromNumber3524(number.substring(1)); - case "5": + case '5': return "3525"; // Riesa - case "6": + case '6': return fromNumber3526(number.substring(1)); - case "8": + case '8': return "3528"; // Radeberg - case "9": + case '9': return "3529"; // Heidenau Sachs default: return ""; @@ -4500,26 +4510,26 @@ private static String fromNumber3520(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35200"; // Arnsdorf b Dresden - case "1": + case '1': return "35201"; // Langebrück - case "2": + case '2': return "35202"; // Klingenberg Sachs - case "3": + case '3': return "35203"; // Tharandt - case "4": + case '4': return "35204"; // Wilsdruff - case "5": + case '5': return "35205"; // Ottendorf-Okrilla - case "6": + case '6': return "35206"; // Kreischa b Dresden - case "7": + case '7': return "35207"; // Moritzburg - case "8": + case '8': return "35208"; // Radeburg - case "9": + case '9': return "35209"; // Mohorn default: return ""; @@ -4531,26 +4541,26 @@ private static String fromNumber3524(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35240"; // Tauscha b Großenhain - case "1": + case '1': return "35241"; // Lommatzsch - case "2": + case '2': return "35242"; // Nossen - case "3": + case '3': return "35243"; // Weinböhla - case "4": + case '4': return "35244"; // Krögis - case "5": + case '5': return "35245"; // Burkhardswalde-Munzig - case "6": + case '6': return "35246"; // Ziegenhain Sachs - case "7": + case '7': return "35247"; // Zehren Sachs - case "8": + case '8': return "35248"; // Schönfeld b Großenhain - case "9": + case '9': return "35249"; // Basslitz default: return ""; @@ -4562,18 +4572,18 @@ private static String fromNumber3526(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35263"; // Gröditz b Riesa - case "4": + case '4': return "35264"; // Strehla - case "5": + case '5': return "35265"; // Glaubitz - case "6": + case '6': return "35266"; // Heyda b Riesa - case "7": + case '7': return "35267"; // Diesbar-Seusslitz - case "8": + case '8': return "35268"; // Stauchitz default: return ""; @@ -4585,22 +4595,22 @@ private static String fromNumber353(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3531"; // Finsterwalde - case "2": + case '2': return fromNumber3532(number.substring(1)); - case "3": + case '3': return "3533"; // Elsterwerda - case "4": + case '4': return fromNumber3534(number.substring(1)); - case "5": + case '5': return "3535"; // Herzberg Elster - case "6": + case '6': return fromNumber3536(number.substring(1)); - case "7": + case '7': return "3537"; // Jessen Elster - case "8": + case '8': return fromNumber3538(number.substring(1)); default: return ""; @@ -4612,20 +4622,20 @@ private static String fromNumber3532(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35322"; // Doberlug-Kirchhain - case "3": + case '3': return "35323"; // Sonnewalde - case "4": + case '4': return "35324"; // Crinitz - case "5": + case '5': return "35325"; // Rückersdorf b Finsterwalde - case "6": + case '6': return "35326"; // Schönborn Kr Elbe-Elster - case "7": + case '7': return "35327"; // Priessen - case "9": + case '9': return "35329"; // Dollenchen default: return ""; @@ -4637,12 +4647,12 @@ private static String fromNumber3534(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35341"; // Bad Liebenwerda - case "2": + case '2': return "35342"; // Mühlberg Elbe - case "3": + case '3': return "35343"; // Hirschfeld b Elsterwerda default: return ""; @@ -4654,16 +4664,16 @@ private static String fromNumber3536(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35361"; // Schlieben - case "2": + case '2': return "35362"; // Schönewalde b Herzberg - case "3": + case '3': return "35363"; // Fermerswalde - case "4": + case '4': return "35364"; // Lebusa - case "5": + case '5': return "35365"; // Falkenberg Elster default: return ""; @@ -4675,20 +4685,20 @@ private static String fromNumber3538(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35383"; // Elster Elbe - case "4": + case '4': return "35384"; // Steinsdorf b Jessen - case "5": + case '5': return "35385"; // Annaburg - case "6": + case '6': return "35386"; // Prettin - case "7": + case '7': return "35387"; // Seyda - case "8": + case '8': return "35388"; // Klöden - case "9": + case '9': return "35389"; // Holzdorf Elster default: return ""; @@ -4700,20 +4710,20 @@ private static String fromNumber354(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3541"; // Calau - case "2": + case '2': return "3542"; // Lübbenau Spreewald - case "3": + case '3': return fromNumber3543(number.substring(1)); - case "4": + case '4': return "3544"; // Luckau Brandenb - case "5": + case '5': return fromNumber3545(number.substring(1)); - case "6": + case '6': return "3546"; // Lübben Spreewald - case "7": + case '7': return fromNumber3547(number.substring(1)); default: return ""; @@ -4725,16 +4735,16 @@ private static String fromNumber3543(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "35433"; // Vetschau - case "4": + case '4': return "35434"; // Altdöbern - case "5": + case '5': return "35435"; // Gollmitz b Calau - case "6": + case '6': return "35436"; // Laasow b Calau - case "9": + case '9': return "35439"; // Zinnitz default: return ""; @@ -4746,18 +4756,18 @@ private static String fromNumber3545(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35451"; // Dahme Brandenb - case "2": + case '2': return "35452"; // Golssen - case "3": + case '3': return "35453"; // Drahnsdorf - case "4": + case '4': return "35454"; // Uckro - case "5": + case '5': return "35455"; // Walddrehna - case "6": + case '6': return "35456"; // Terpt default: return ""; @@ -4769,22 +4779,22 @@ private static String fromNumber3547(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35471"; // Birkenhainchen - case "2": + case '2': return "35472"; // Schlepzig - case "3": + case '3': return "35473"; // Neu Lübbenau - case "4": + case '4': return "35474"; // Schönwalde b Lübben - case "5": + case '5': return "35475"; // Straupitz - case "6": + case '6': return "35476"; // Wittmannsdorf-Bückchen - case "7": + case '7': return "35477"; // Rietzneuendorf-Friedrichshof - case "8": + case '8': return "35478"; // Goyatz default: return ""; @@ -4796,18 +4806,18 @@ private static String fromNumber356(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3560(number.substring(1)); - case "1": + case '1': return "3561"; // Guben - case "2": + case '2': return "3562"; // Forst Lausitz - case "3": + case '3': return "3563"; // Spremberg - case "4": + case '4': return "3564"; // Schwarze Pumpe - case "9": + case '9': return fromNumber3569(number.substring(1)); default: return ""; @@ -4819,26 +4829,26 @@ private static String fromNumber3560(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35600"; // Döbern NL - case "1": + case '1': return "35601"; // Peitz - case "2": + case '2': return "35602"; // Drebkau - case "3": + case '3': return "35603"; // Burg Spreewald - case "4": + case '4': return "35604"; // Krieschow - case "5": + case '5': return "35605"; // Komptendorf - case "6": + case '6': return "35606"; // Briesen b Cottbus - case "7": + case '7': return "35607"; // Jänschwalde - case "8": + case '8': return "35608"; // Gross Ossnig - case "9": + case '9': return "35609"; // Drachhausen default: return ""; @@ -4850,22 +4860,22 @@ private static String fromNumber3569(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35691"; // Bärenklau NL - case "2": + case '2': return "35692"; // Kerkwitz - case "3": + case '3': return "35693"; // Lauschütz - case "4": + case '4': return "35694"; // Gosda b Klinge - case "5": + case '5': return "35695"; // Simmersdorf - case "6": + case '6': return "35696"; // Briesnig - case "7": + case '7': return "35697"; // Bagenz - case "8": + case '8': return "35698"; // Hornow default: return ""; @@ -4877,24 +4887,24 @@ private static String fromNumber357(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3571"; // Hoyerswerda - case "2": + case '2': return fromNumber3572(number.substring(1)); - case "3": + case '3': return "3573"; // Senftenberg - case "4": + case '4': return "3574"; // Lauchhammer - case "5": + case '5': return fromNumber3575(number.substring(1)); - case "6": + case '6': return "3576"; // Weisswasser - case "7": + case '7': return fromNumber3577(number.substring(1)); - case "8": + case '8': return "3578"; // Kamenz - case "9": + case '9': return fromNumber3579(number.substring(1)); default: return ""; @@ -4906,20 +4916,20 @@ private static String fromNumber3572(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35722"; // Lauta b Hoyerswerda - case "3": + case '3': return "35723"; // Bernsdorf OL - case "4": + case '4': return "35724"; // Lohsa - case "5": + case '5': return "35725"; // Wittichenau - case "6": + case '6': return "35726"; // Groß Särchen - case "7": + case '7': return "35727"; // Burghammer - case "8": + case '8': return "35728"; // Uhyst Spree default: return ""; @@ -4931,18 +4941,18 @@ private static String fromNumber3575(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35751"; // Welzow - case "2": + case '2': return "35752"; // Ruhland - case "3": + case '3': return "35753"; // Großräschen - case "4": + case '4': return "35754"; // Klettwitz - case "5": + case '5': return "35755"; // Ortrand - case "6": + case '6': return "35756"; // Hosena default: return ""; @@ -4954,16 +4964,16 @@ private static String fromNumber3577(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35771"; // Bad Muskau - case "2": + case '2': return "35772"; // Rietschen - case "3": + case '3': return "35773"; // Schleife - case "4": + case '4': return "35774"; // Boxberg Sachs - case "5": + case '5': return "35775"; // Pechern default: return ""; @@ -4975,16 +4985,16 @@ private static String fromNumber3579(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35792"; // Ossling - case "3": + case '3': return "35793"; // Elstra - case "5": + case '5': return "35795"; // Königsbrück - case "6": + case '6': return "35796"; // Panschwitz-Kuckau - case "7": + case '7': return "35797"; // Schwepnitz default: return ""; @@ -4996,24 +5006,24 @@ private static String fromNumber358(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3581"; // Görlitz - case "2": + case '2': return fromNumber3582(number.substring(1)); - case "3": + case '3': return "3583"; // Zittau - case "4": + case '4': return fromNumber3584(number.substring(1)); - case "5": + case '5': return "3585"; // Löbau - case "6": + case '6': return "3586"; // Neugersdorf Sachs - case "7": + case '7': return fromNumber3587(number.substring(1)); - case "8": + case '8': return "3588"; // Niesky - case "9": + case '9': return fromNumber3589(number.substring(1)); default: return ""; @@ -5025,22 +5035,22 @@ private static String fromNumber3582(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35820"; // Zodel - case "2": + case '2': return "35822"; // Hagenwerder - case "3": + case '3': return "35823"; // Ostritz - case "5": + case '5': return "35825"; // Kodersdorf - case "6": + case '6': return "35826"; // Königshain b Görlitz - case "7": + case '7': return "35827"; // Nieder-Seifersdorf - case "8": + case '8': return "35828"; // Reichenbach OL - case "9": + case '9': return "35829"; // Gersdorf b Görlitz default: return ""; @@ -5052,14 +5062,14 @@ private static String fromNumber3584(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35841"; // Großschönau Sachs - case "2": + case '2': return "35842"; // Oderwitz - case "3": + case '3': return "35843"; // Hirschfelde b Zittau - case "4": + case '4': return "35844"; // Oybin Kurort default: return ""; @@ -5071,18 +5081,18 @@ private static String fromNumber3587(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "35872"; // Neusalza-Spremberg - case "3": + case '3': return "35873"; // Herrnhut - case "4": + case '4': return "35874"; // Bernstadt a d Eigen - case "5": + case '5': return "35875"; // Obercunnersdorf b Löbau - case "6": + case '6': return "35876"; // Weissenberg Sachs - case "7": + case '7': return "35877"; // Cunewalde default: return ""; @@ -5094,16 +5104,16 @@ private static String fromNumber3589(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35891"; // Rothenburg OL - case "2": + case '2': return "35892"; // Horka OL - case "3": + case '3': return "35893"; // Mücka - case "4": + case '4': return "35894"; // Hähnichen - case "5": + case '5': return "35895"; // Klitten default: return ""; @@ -5115,20 +5125,20 @@ private static String fromNumber359(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3591"; // Bautzen - case "2": + case '2': return "3592"; // Kirschau - case "3": + case '3': return fromNumber3593(number.substring(1)); - case "4": + case '4': return "3594"; // Bischofswerda - case "5": + case '5': return fromNumber3595(number.substring(1)); - case "6": + case '6': return "3596"; // Neustadt i Sa - case "7": + case '7': return fromNumber3597(number.substring(1)); default: return ""; @@ -5140,26 +5150,26 @@ private static String fromNumber3593(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "35930"; // Seitschen - case "1": + case '1': return "35931"; // Königswartha - case "2": + case '2': return "35932"; // Guttau - case "3": + case '3': return "35933"; // Neschwitz - case "4": + case '4': return "35934"; // Grossdubrau - case "5": + case '5': return "35935"; // Kleinwelka - case "6": + case '6': return "35936"; // Sohland Spree - case "7": + case '7': return "35937"; // Prischwitz - case "8": + case '8': return "35938"; // Großpostwitz OL - case "9": + case '9': return "35939"; // Hochkirch default: return ""; @@ -5171,16 +5181,16 @@ private static String fromNumber3595(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35951"; // Neukirch Lausitz - case "2": + case '2': return "35952"; // Großröhrsdorf OL - case "3": + case '3': return "35953"; // Burkau - case "4": + case '4': return "35954"; // Grossharthau - case "5": + case '5': return "35955"; // Pulsnitz default: return ""; @@ -5192,14 +5202,14 @@ private static String fromNumber3597(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "35971"; // Sebnitz - case "3": + case '3': return "35973"; // Stolpen - case "4": + case '4': return "35974"; // Hinterhermsdorf - case "5": + case '5': return "35975"; // Hohnstein default: return ""; @@ -5211,26 +5221,26 @@ private static String fromNumber36(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber360(number.substring(1)); - case "1": + case '1': return "361"; // Erfurt - case "2": + case '2': return fromNumber362(number.substring(1)); - case "3": + case '3': return fromNumber363(number.substring(1)); - case "4": + case '4': return fromNumber364(number.substring(1)); - case "5": + case '5': return "365"; // Gera - case "6": + case '6': return fromNumber366(number.substring(1)); - case "7": + case '7': return fromNumber367(number.substring(1)); - case "8": + case '8': return fromNumber368(number.substring(1)); - case "9": + case '9': return fromNumber369(number.substring(1)); default: return ""; @@ -5242,22 +5252,22 @@ private static String fromNumber360(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3601"; // Mühlhausen Thür - case "2": + case '2': return fromNumber3602(number.substring(1)); - case "3": + case '3': return "3603"; // Bad Langensalza - case "4": + case '4': return fromNumber3604(number.substring(1)); - case "5": + case '5': return "3605"; // Leinefelde - case "6": + case '6': return "3606"; // Heiligenstadt Heilbad - case "7": + case '7': return fromNumber3607(number.substring(1)); - case "8": + case '8': return fromNumber3608(number.substring(1)); default: return ""; @@ -5269,26 +5279,26 @@ private static String fromNumber3602(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36020"; // Ebeleben - case "1": + case '1': return "36021"; // Schlotheim - case "2": + case '2': return "36022"; // Grossengottern - case "3": + case '3': return "36023"; // Horsmar - case "4": + case '4': return "36024"; // Diedorf b Mühlhausen Thür - case "5": + case '5': return "36025"; // Körner - case "6": + case '6': return "36026"; // Struth b Mühlhausen Thür - case "7": + case '7': return "36027"; // Lengenfeld Unterm Stein - case "8": + case '8': return "36028"; // Kammerforst Thür - case "9": + case '9': return "36029"; // Menteroda default: return ""; @@ -5300,12 +5310,12 @@ private static String fromNumber3604(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36041"; // Bad Tennstedt - case "2": + case '2': return "36042"; // Tonna - case "3": + case '3': return "36043"; // Kirchheilingen default: return ""; @@ -5317,18 +5327,18 @@ private static String fromNumber3607(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36071"; // Teistungen - case "2": + case '2': return "36072"; // Weißenborn-Lüderode - case "4": + case '4': return "36074"; // Worbis - case "5": + case '5': return "36075"; // Dingelstädt Eichsfeld - case "6": + case '6': return "36076"; // Niederorschel - case "7": + case '7': return "36077"; // Grossbodungen default: return ""; @@ -5340,18 +5350,18 @@ private static String fromNumber3608(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36081"; // Arenshausen - case "2": + case '2': return "36082"; // Ershausen - case "3": + case '3': return "36083"; // Uder - case "4": + case '4': return "36084"; // Heuthen - case "5": + case '5': return "36085"; // Reinholterode - case "7": + case '7': return "36087"; // Wüstheuterode default: return ""; @@ -5363,22 +5373,22 @@ private static String fromNumber362(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3620(number.substring(1)); - case "1": + case '1': return "3621"; // Gotha Thür - case "2": + case '2': return "3622"; // Waltershausen Thür - case "3": + case '3': return "3623"; // Friedrichroda - case "4": + case '4': return "3624"; // Ohrdruf - case "5": + case '5': return fromNumber3625(number.substring(1)); - case "8": + case '8': return "3628"; // Arnstadt - case "9": + case '9': return "3629"; // Stadtilm default: return ""; @@ -5390,26 +5400,26 @@ private static String fromNumber3620(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36200"; // Elxleben b Arnstadt - case "1": + case '1': return "36201"; // Walschleben - case "2": + case '2': return "36202"; // Neudietendorf - case "3": + case '3': return "36203"; // Vieselbach - case "4": + case '4': return "36204"; // Stotternheim - case "5": + case '5': return "36205"; // Gräfenroda - case "6": + case '6': return "36206"; // Grossfahner - case "7": + case '7': return "36207"; // Plaue Thür - case "8": + case '8': return "36208"; // Ermstedt - case "9": + case '9': return "36209"; // Klettbach default: return ""; @@ -5421,22 +5431,22 @@ private static String fromNumber3625(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "36252"; // Tambach-Dietharz Thür Wald - case "3": + case '3': return "36253"; // Georgenthal Thür Wald - case "4": + case '4': return "36254"; // Friedrichswerth - case "5": + case '5': return "36255"; // Goldbach b Gotha - case "6": + case '6': return "36256"; // Wechmar - case "7": + case '7': return "36257"; // Luisenthal Thür - case "8": + case '8': return "36258"; // Friemar - case "9": + case '9': return "36259"; // Tabarz Thür Wald default: return ""; @@ -5448,20 +5458,20 @@ private static String fromNumber363(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3631"; // Nordhausen Thür - case "2": + case '2': return "3632"; // Sondershausen - case "3": + case '3': return fromNumber3633(number.substring(1)); - case "4": + case '4': return "3634"; // Sömmerda - case "5": + case '5': return "3635"; // Kölleda - case "6": + case '6': return "3636"; // Greussen - case "7": + case '7': return fromNumber3637(number.substring(1)); default: return ""; @@ -5473,24 +5483,24 @@ private static String fromNumber3633(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36330"; // Grossberndten - case "1": + case '1': return "36331"; // Ilfeld - case "2": + case '2': return "36332"; // Ellrich - case "3": + case '3': return "36333"; // Heringen Helme - case "4": + case '4': return "36334"; // Wolkramshausen - case "5": + case '5': return "36335"; // Grosswechsungen - case "6": + case '6': return "36336"; // Klettenberg - case "7": + case '7': return "36337"; // Schiedungen - case "8": + case '8': return "36338"; // Bleicherode default: return ""; @@ -5502,26 +5512,26 @@ private static String fromNumber3637(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36370"; // Grossenehrich - case "1": + case '1': return "36371"; // Schlossvippach - case "2": + case '2': return "36372"; // Kleinneuhausen - case "3": + case '3': return "36373"; // Buttstädt - case "4": + case '4': return "36374"; // Weissensee - case "5": + case '5': return "36375"; // Kindelbrück - case "6": + case '6': return "36376"; // Straussfurt - case "7": + case '7': return "36377"; // Rastenberg - case "8": + case '8': return "36378"; // Ostramondra - case "9": + case '9': return "36379"; // Holzengel default: return ""; @@ -5533,22 +5543,22 @@ private static String fromNumber364(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3641"; // Jena - case "2": + case '2': return fromNumber3642(number.substring(1)); - case "3": + case '3': return "3643"; // Weimar Thür - case "4": + case '4': return "3644"; // Apolda - case "5": + case '5': return fromNumber3645(number.substring(1)); - case "6": + case '6': return fromNumber3646(number.substring(1)); - case "7": + case '7': return "3647"; // Pößneck - case "8": + case '8': return fromNumber3648(number.substring(1)); default: return ""; @@ -5560,22 +5570,22 @@ private static String fromNumber3642(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36421"; // Camburg - case "2": + case '2': return "36422"; // Reinstädt Thür - case "3": + case '3': return "36423"; // Orlamünde - case "4": + case '4': return "36424"; // Kahla Thür - case "5": + case '5': return "36425"; // Isserstedt - case "6": + case '6': return "36426"; // Ottendorf b Stadtroda - case "7": + case '7': return "36427"; // Dornburg Saale - case "8": + case '8': return "36428"; // Stadtroda default: return ""; @@ -5587,20 +5597,20 @@ private static String fromNumber3645(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36450"; // Kranichfeld - case "1": + case '1': return "36451"; // Buttelstedt - case "2": + case '2': return "36452"; // Berlstedt - case "3": + case '3': return "36453"; // Mellingen - case "4": + case '4': return "36454"; // Magdala - case "8": + case '8': return "36458"; // Bad Berka - case "9": + case '9': return "36459"; // Blankenhain Thür default: return ""; @@ -5612,16 +5622,16 @@ private static String fromNumber3646(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36461"; // Bad Sulza - case "2": + case '2': return "36462"; // Ossmannstedt - case "3": + case '3': return "36463"; // Gebstedt - case "4": + case '4': return "36464"; // Wormstedt - case "5": + case '5': return "36465"; // Oberndorf b Apolda default: return ""; @@ -5633,14 +5643,14 @@ private static String fromNumber3648(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36481"; // Neustadt an der Orla - case "2": + case '2': return "36482"; // Triptis - case "3": + case '3': return "36483"; // Ziegenrück - case "4": + case '4': return "36484"; // Knau b Pößneck default: return ""; @@ -5652,20 +5662,20 @@ private static String fromNumber366(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3660(number.substring(1)); - case "1": + case '1': return "3661"; // Greiz - case "2": + case '2': return fromNumber3662(number.substring(1)); - case "3": + case '3': return "3663"; // Schleiz - case "4": + case '4': return fromNumber3664(number.substring(1)); - case "5": + case '5': return fromNumber3665(number.substring(1)); - case "9": + case '9': return fromNumber3669(number.substring(1)); default: return ""; @@ -5677,22 +5687,22 @@ private static String fromNumber3660(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36601"; // Hermsdorf Thür - case "2": + case '2': return "36602"; // Ronneburg Thür - case "3": + case '3': return "36603"; // Weida - case "4": + case '4': return "36604"; // Münchenbernsdorf - case "5": + case '5': return "36605"; // Bad Köstritz - case "6": + case '6': return "36606"; // Kraftsdorf - case "7": + case '7': return "36607"; // Niederpöllnitz - case "8": + case '8': return "36608"; // Seelingstädt b Gera default: return ""; @@ -5704,20 +5714,20 @@ private static String fromNumber3662(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36621"; // Elsterberg b Plauen - case "2": + case '2': return "36622"; // Triebes - case "3": + case '3': return "36623"; // Berga Elster - case "4": + case '4': return "36624"; // Teichwolframsdorf - case "5": + case '5': return "36625"; // Langenwetzendorf - case "6": + case '6': return "36626"; // Auma - case "8": + case '8': return "36628"; // Zeulenroda default: return ""; @@ -5729,24 +5739,24 @@ private static String fromNumber3664(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36640"; // Remptendorf - case "2": + case '2': return "36642"; // Harra - case "3": + case '3': return "36643"; // Thimmendorf - case "4": + case '4': return "36644"; // Hirschberg Saale - case "5": + case '5': return "36645"; // Mühltroff - case "6": + case '6': return "36646"; // Tanna b Schleiz - case "7": + case '7': return "36647"; // Saalburg Thür - case "8": + case '8': return "36648"; // Dittersdorf b Schleiz - case "9": + case '9': return "36649"; // Gefell b Schleiz default: return ""; @@ -5758,12 +5768,12 @@ private static String fromNumber3665(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36651"; // Lobenstein - case "2": + case '2': return "36652"; // Wurzbach - case "3": + case '3': return "36653"; // Lehesten Thür Wald default: return ""; @@ -5775,16 +5785,16 @@ private static String fromNumber3669(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36691"; // Eisenberg Thür - case "2": + case '2': return "36692"; // Bürgel - case "3": + case '3': return "36693"; // Crossen an der Elster - case "4": + case '4': return "36694"; // Schkölen Thür - case "5": + case '5': return "36695"; // Söllmnitz default: return ""; @@ -5796,26 +5806,26 @@ private static String fromNumber367(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3670(number.substring(1)); - case "1": + case '1': return "3671"; // Saalfeld Saale - case "2": + case '2': return "3672"; // Rudolstadt - case "3": + case '3': return fromNumber3673(number.substring(1)); - case "4": + case '4': return fromNumber3674(number.substring(1)); - case "5": + case '5': return "3675"; // Sonneberg Thür - case "6": + case '6': return fromNumber3676(number.substring(1)); - case "7": + case '7': return "3677"; // Ilmenau Thür - case "8": + case '8': return fromNumber3678(number.substring(1)); - case "9": + case '9': return "3679"; // Neuhaus a Rennweg default: return ""; @@ -5827,16 +5837,16 @@ private static String fromNumber3670(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36701"; // Lichte - case "2": + case '2': return "36702"; // Lauscha - case "3": + case '3': return "36703"; // Gräfenthal - case "4": + case '4': return "36704"; // Steinheid - case "5": + case '5': return "36705"; // Oberweißbach Thür Wald default: return ""; @@ -5848,26 +5858,26 @@ private static String fromNumber3673(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36730"; // Sitzendorf - case "1": + case '1': return "36731"; // Unterloquitz - case "2": + case '2': return "36732"; // Könitz - case "3": + case '3': return "36733"; // Kaulsdorf - case "4": + case '4': return "36734"; // Leutenberg - case "5": + case '5': return "36735"; // Probstzella - case "6": + case '6': return "36736"; // Arnsgereuth - case "7": + case '7': return "36737"; // Drognitz - case "8": + case '8': return "36738"; // Königsee - case "9": + case '9': return "36739"; // Rottenbach default: return ""; @@ -5879,14 +5889,14 @@ private static String fromNumber3674(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36741"; // Bad Blankenburg - case "2": + case '2': return "36742"; // Uhlstädt - case "3": + case '3': return "36743"; // Teichel - case "4": + case '4': return "36744"; // Remda default: return ""; @@ -5898,14 +5908,14 @@ private static String fromNumber3676(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36761"; // Heubisch - case "2": + case '2': return "36762"; // Steinach Thür - case "4": + case '4': return "36764"; // Neuhaus-Schierschnitz - case "6": + case '6': return "36766"; // Schalkau default: return ""; @@ -5917,16 +5927,16 @@ private static String fromNumber3678(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36781"; // Grossbreitenbach - case "2": + case '2': return "36782"; // Schmiedefeld a Rennsteig - case "3": + case '3': return "36783"; // Gehren Thür - case "4": + case '4': return "36784"; // Stützerbach - case "5": + case '5': return "36785"; // Gräfinau-Angstedt default: return ""; @@ -5938,20 +5948,20 @@ private static String fromNumber368(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3681"; // Suhl - case "2": + case '2': return "3682"; // Zella-Mehlis - case "3": + case '3': return "3683"; // Schmalkalden - case "4": + case '4': return fromNumber3684(number.substring(1)); - case "5": + case '5': return "3685"; // Hildburghausen - case "6": + case '6': return "3686"; // Eisfeld - case "7": + case '7': return fromNumber3687(number.substring(1)); default: return ""; @@ -5963,26 +5973,26 @@ private static String fromNumber3684(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36840"; // Trusetal - case "1": + case '1': return "36841"; // Schleusingen - case "2": + case '2': return "36842"; // Oberhof Thür - case "3": + case '3': return "36843"; // Benshausen - case "4": + case '4': return "36844"; // Rohr Thür - case "5": + case '5': return "36845"; // Gehlberg - case "6": + case '6': return "36846"; // Suhl-Dietzhausen - case "7": + case '7': return "36847"; // Steinbach-Hallenberg - case "8": + case '8': return "36848"; // Wernshausen - case "9": + case '9': return "36849"; // Kleinschmalkalden default: return ""; @@ -5994,18 +6004,18 @@ private static String fromNumber3687(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36870"; // Masserberg - case "1": + case '1': return "36871"; // Bad Colberg-Heldburg - case "3": + case '3': return "36873"; // Themar - case "4": + case '4': return "36874"; // Schönbrunn b Hildburghaus - case "5": + case '5': return "36875"; // Straufhain-Streufdorf - case "8": + case '8': return "36878"; // Oberland default: return ""; @@ -6017,18 +6027,18 @@ private static String fromNumber369(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3691"; // Eisenach Thür - case "2": + case '2': return fromNumber3692(number.substring(1)); - case "3": + case '3': return "3693"; // Meiningen - case "4": + case '4': return fromNumber3694(number.substring(1)); - case "5": + case '5': return "3695"; // Bad Salzungen - case "6": + case '6': return fromNumber3696(number.substring(1)); default: return ""; @@ -6040,26 +6050,26 @@ private static String fromNumber3692(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36920"; // Grossenlupnitz - case "1": + case '1': return "36921"; // Wutha-Farnroda - case "2": + case '2': return "36922"; // Gerstungen - case "3": + case '3': return "36923"; // Treffurt - case "4": + case '4': return "36924"; // Mihla - case "5": + case '5': return "36925"; // Marksuhl - case "6": + case '6': return "36926"; // Creuzburg - case "7": + case '7': return "36927"; // Unterellen - case "8": + case '8': return "36928"; // Neuenhof Thür - case "9": + case '9': return "36929"; // Ruhla default: return ""; @@ -6071,24 +6081,24 @@ private static String fromNumber3694(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "36940"; // Oepfershausen - case "1": + case '1': return "36941"; // Wasungen - case "3": + case '3': return "36943"; // Bettenhausen Thür - case "4": + case '4': return "36944"; // Rentwertshausen - case "5": + case '5': return "36945"; // Henneberg - case "6": + case '6': return "36946"; // Erbenhausen Thür - case "7": + case '7': return "36947"; // Jüchsen - case "8": + case '8': return "36948"; // Römhild - case "9": + case '9': return "36949"; // Obermaßfeld-Grimmenthal default: return ""; @@ -6100,24 +6110,24 @@ private static String fromNumber3696(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "36961"; // Bad Liebenstein - case "2": + case '2': return "36962"; // Vacha - case "3": + case '3': return "36963"; // Dorndorf Rhön - case "4": + case '4': return "36964"; // Dermbach Rhön - case "5": + case '5': return "36965"; // Stadtlengsfeld - case "6": + case '6': return "36966"; // Kaltennordheim - case "7": + case '7': return "36967"; // Geisa - case "8": + case '8': return "36968"; // Rossdorf Rhön - case "9": + case '9': return "36969"; // Merkers default: return ""; @@ -6129,20 +6139,20 @@ private static String fromNumber37(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "371"; // Chemnitz Sachs - case "2": + case '2': return fromNumber372(number.substring(1)); - case "3": + case '3': return fromNumber373(number.substring(1)); - case "4": + case '4': return fromNumber374(number.substring(1)); - case "5": + case '5': return "375"; // Zwickau - case "6": + case '6': return fromNumber376(number.substring(1)); - case "7": + case '7': return fromNumber377(number.substring(1)); default: return ""; @@ -6154,24 +6164,24 @@ private static String fromNumber372(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3720(number.substring(1)); - case "1": + case '1': return "3721"; // Meinersdorf - case "2": + case '2': return "3722"; // Limbach-Oberfrohna - case "3": + case '3': return "3723"; // Hohenstein-Ernstthal - case "4": + case '4': return "3724"; // Burgstädt - case "5": + case '5': return "3725"; // Zschopau - case "6": + case '6': return "3726"; // Flöha - case "7": + case '7': return "3727"; // Mittweida - case "9": + case '9': return fromNumber3729(number.substring(1)); default: return ""; @@ -6183,22 +6193,22 @@ private static String fromNumber3720(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37200"; // Wittgensdorf b Chemnitz - case "2": + case '2': return "37202"; // Claussnitz b Chemnitz - case "3": + case '3': return "37203"; // Gersdorf b Chemnitz - case "4": + case '4': return "37204"; // Lichtenstein Sachs - case "6": + case '6': return "37206"; // Frankenberg Sachs - case "7": + case '7': return "37207"; // Hainichen Sachs - case "8": + case '8': return "37208"; // Auerswalde - case "9": + case '9': return "37209"; // Einsiedel b Chemnitz default: return ""; @@ -6210,22 +6220,22 @@ private static String fromNumber3729(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37291"; // Augustusburg - case "2": + case '2': return "37292"; // Oederan - case "3": + case '3': return "37293"; // Eppendorf Sachs - case "4": + case '4': return "37294"; // Grünhainichen - case "5": + case '5': return "37295"; // Lugau Erzgeb - case "6": + case '6': return "37296"; // Stollberg Erzgeb - case "7": + case '7': return "37297"; // Thum Sachs - case "8": + case '8': return "37298"; // Oelsnitz Erzgeb default: return ""; @@ -6237,22 +6247,22 @@ private static String fromNumber373(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3731"; // Freiberg Sachs - case "2": + case '2': return fromNumber3732(number.substring(1)); - case "3": + case '3': return "3733"; // Annaberg-Buchholz - case "4": + case '4': return fromNumber3734(number.substring(1)); - case "5": + case '5': return "3735"; // Marienberg Sachs - case "6": + case '6': return fromNumber3736(number.substring(1)); - case "7": + case '7': return "3737"; // Rochlitz - case "8": + case '8': return fromNumber3738(number.substring(1)); default: return ""; @@ -6264,26 +6274,26 @@ private static String fromNumber3732(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37320"; // Mulda Sachs - case "1": + case '1': return "37321"; // Frankenstein Sachs - case "2": + case '2': return "37322"; // Brand-Erbisdorf - case "3": + case '3': return "37323"; // Lichtenberg Erzgeb - case "4": + case '4': return "37324"; // Reinsberg Sachs - case "5": + case '5': return "37325"; // Niederbobritzsch - case "6": + case '6': return "37326"; // Frauenstein Sachs - case "7": + case '7': return "37327"; // Rechenberg-Bienenmühle - case "8": + case '8': return "37328"; // Grossschirma - case "9": + case '9': return "37329"; // Grosshartmannsdorf default: return ""; @@ -6295,22 +6305,22 @@ private static String fromNumber3734(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37341"; // Ehrenfriedersdorf - case "2": + case '2': return "37342"; // Cranzahl - case "3": + case '3': return "37343"; // Jöhstadt - case "4": + case '4': return "37344"; // Crottendorf Sachs - case "6": + case '6': return "37346"; // Geyer - case "7": + case '7': return "37347"; // Bärenstein Kr Annaberg - case "8": + case '8': return "37348"; // Oberwiesenthal Kurort - case "9": + case '9': return "37349"; // Scheibenberg default: return ""; @@ -6322,26 +6332,26 @@ private static String fromNumber3736(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37360"; // Olbernhau - case "1": + case '1': return "37361"; // Neuhausen Erzgeb - case "2": + case '2': return "37362"; // Seiffen Erzgeb - case "3": + case '3': return "37363"; // Zöblitz - case "4": + case '4': return "37364"; // Reitzenhain Erzgeb - case "5": + case '5': return "37365"; // Sayda - case "6": + case '6': return "37366"; // Rübenau - case "7": + case '7': return "37367"; // Lengefeld Erzgeb - case "8": + case '8': return "37368"; // Deutschneudorf - case "9": + case '9': return "37369"; // Wolkenstein default: return ""; @@ -6353,14 +6363,14 @@ private static String fromNumber3738(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37381"; // Penig - case "2": + case '2': return "37382"; // Geringswalde - case "3": + case '3': return "37383"; // Lunzenau - case "4": + case '4': return "37384"; // Wechselburg default: return ""; @@ -6372,18 +6382,18 @@ private static String fromNumber374(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3741"; // Plauen - case "2": + case '2': return fromNumber3742(number.substring(1)); - case "3": + case '3': return fromNumber3743(number.substring(1)); - case "4": + case '4': return "3744"; // Auerbach Vogtl - case "5": + case '5': return "3745"; // Falkenstein Vogtl - case "6": + case '6': return fromNumber3746(number.substring(1)); default: return ""; @@ -6395,12 +6405,12 @@ private static String fromNumber3742(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "37421"; // Oelsnitz Vogtl - case "2": + case '2': return "37422"; // Markneukirchen - case "3": + case '3': return "37423"; // Adorf Vogtl default: return ""; @@ -6412,26 +6422,26 @@ private static String fromNumber3743(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37430"; // Eichigt - case "1": + case '1': return "37431"; // Mehltheuer Vogtl - case "2": + case '2': return "37432"; // Pausa Vogtl - case "3": + case '3': return "37433"; // Gutenfürst - case "4": + case '4': return "37434"; // Bobenneukirchen - case "5": + case '5': return "37435"; // Reuth b Plauen - case "6": + case '6': return "37436"; // Weischlitz - case "7": + case '7': return "37437"; // Bad Elster - case "8": + case '8': return "37438"; // Bad Brambach - case "9": + case '9': return "37439"; // Jocketa default: return ""; @@ -6443,18 +6453,18 @@ private static String fromNumber3746(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "37462"; // Rothenkirchen Vogtl - case "3": + case '3': return "37463"; // Bergen Vogtl - case "4": + case '4': return "37464"; // Schöneck Vogtl - case "5": + case '5': return "37465"; // Tannenbergsthal Vogtl - case "7": + case '7': return "37467"; // Klingenthal Sachs - case "8": + case '8': return "37468"; // Treuen Vogtl default: return ""; @@ -6466,18 +6476,18 @@ private static String fromNumber376(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3760(number.substring(1)); - case "1": + case '1': return "3761"; // Werdau Sachs - case "2": + case '2': return "3762"; // Crimmitschau - case "3": + case '3': return "3763"; // Glauchau - case "4": + case '4': return "3764"; // Meerane - case "5": + case '5': return "3765"; // Reichenbach Vogtl default: return ""; @@ -6489,26 +6499,26 @@ private static String fromNumber3760(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "37600"; // Neumark Sachs - case "1": + case '1': return "37601"; // Mülsen Skt Jacob - case "2": + case '2': return "37602"; // Kirchberg Sachs - case "3": + case '3': return "37603"; // Wildenfels - case "4": + case '4': return "37604"; // Mosel - case "5": + case '5': return "37605"; // Hartenstein Sachs - case "6": + case '6': return "37606"; // Lengenfeld Vogtl - case "7": + case '7': return "37607"; // Ebersbrunn Sachs - case "8": + case '8': return "37608"; // Waldenburg Sachs - case "9": + case '9': return "37609"; // Wolkenburg Mulde default: return ""; @@ -6520,16 +6530,16 @@ private static String fromNumber377(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3771"; // Aue Sachs - case "2": + case '2': return "3772"; // Schneeberg Erzgeb - case "3": + case '3': return "3773"; // Johanngeorgenstadt - case "4": + case '4': return "3774"; // Schwarzenberg - case "5": + case '5': return fromNumber3775(number.substring(1)); default: return ""; @@ -6541,16 +6551,16 @@ private static String fromNumber3775(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "37752"; // Eibenstock - case "4": + case '4': return "37754"; // Zwönitz - case "5": + case '5': return "37755"; // Schönheide Erzgeb - case "6": + case '6': return "37756"; // Breitenbrunn Erzgeb - case "7": + case '7': return "37757"; // Rittersgrün default: return ""; @@ -6562,22 +6572,22 @@ private static String fromNumber38(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "381"; // Rostock - case "2": + case '2': return fromNumber382(number.substring(1)); - case "3": + case '3': return fromNumber383(number.substring(1)); - case "4": + case '4': return fromNumber384(number.substring(1)); - case "5": + case '5': return "385"; // Schwerin Meckl - case "6": + case '6': return fromNumber386(number.substring(1)); - case "7": + case '7': return fromNumber387(number.substring(1)); - case "8": + case '8': return fromNumber388(number.substring(1)); default: return ""; @@ -6589,16 +6599,16 @@ private static String fromNumber382(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3820(number.substring(1)); - case "1": + case '1': return "3821"; // Ribnitz-Damgarten - case "2": + case '2': return fromNumber3822(number.substring(1)); - case "3": + case '3': return fromNumber3823(number.substring(1)); - case "9": + case '9': return fromNumber3829(number.substring(1)); default: return ""; @@ -6610,24 +6620,24 @@ private static String fromNumber3820(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38201"; // Gelbensande - case "2": + case '2': return "38202"; // Volkenshagen - case "3": + case '3': return "38203"; // Bad Doberan - case "4": + case '4': return "38204"; // Broderstorf - case "5": + case '5': return "38205"; // Tessin b Rostock - case "6": + case '6': return "38206"; // Graal-Müritz Seeheilbad - case "7": + case '7': return "38207"; // Stäbelow - case "8": + case '8': return "38208"; // Kavelstorf - case "9": + case '9': return "38209"; // Sanitz b Rostock default: return ""; @@ -6639,26 +6649,26 @@ private static String fromNumber3822(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38220"; // Wustrow Ostseebad - case "1": + case '1': return "38221"; // Marlow - case "2": + case '2': return "38222"; // Semlow - case "3": + case '3': return "38223"; // Saal Vorpom - case "4": + case '4': return "38224"; // Gresenhorst - case "5": + case '5': return "38225"; // Trinwillershagen - case "6": + case '6': return "38226"; // Dierhagen Ostseebad - case "7": + case '7': return "38227"; // Lüdershagen b Barth - case "8": + case '8': return "38228"; // Dettmannsdorf-Kölzow - case "9": + case '9': return "38229"; // Bad Sülze default: return ""; @@ -6670,14 +6680,14 @@ private static String fromNumber3823(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38231"; // Barth - case "2": + case '2': return "38232"; // Zingst Ostseebad - case "3": + case '3': return "38233"; // Prerow Ostseebad - case "4": + case '4': return "38234"; // Born a Darß default: return ""; @@ -6689,18 +6699,18 @@ private static String fromNumber3829(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "38292"; // Kröpelin - case "3": + case '3': return "38293"; // Kühlungsborn Ostseebad - case "4": + case '4': return "38294"; // Neubukow - case "5": + case '5': return "38295"; // Satow b Bad Doberan - case "6": + case '6': return "38296"; // Rerik Ostseebad - case "7": + case '7': return "38297"; // Moitin default: return ""; @@ -6712,26 +6722,26 @@ private static String fromNumber383(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3830(number.substring(1)); - case "1": + case '1': return "3831"; // Stralsund - case "2": + case '2': return fromNumber3832(number.substring(1)); - case "3": + case '3': return fromNumber3833(number.substring(1)); - case "4": + case '4': return "3834"; // Greifswald - case "5": + case '5': return fromNumber3835(number.substring(1)); - case "6": + case '6': return "3836"; // Wolgast - case "7": + case '7': return fromNumber3837(number.substring(1)); - case "8": + case '8': return "3838"; // Bergen auf Rügen - case "9": + case '9': return fromNumber3839(number.substring(1)); default: return ""; @@ -6743,26 +6753,26 @@ private static String fromNumber3830(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38300"; // Insel Hiddensee - case "1": + case '1': return "38301"; // Putbus - case "2": + case '2': return "38302"; // Sagard - case "3": + case '3': return "38303"; // Sellin Ostseebad - case "4": + case '4': return "38304"; // Garz Rügen - case "5": + case '5': return "38305"; // Gingst - case "6": + case '6': return "38306"; // Samtens - case "7": + case '7': return "38307"; // Poseritz - case "8": + case '8': return "38308"; // Göhren Rügen - case "9": + case '9': return "38309"; // Trent default: return ""; @@ -6774,24 +6784,24 @@ private static String fromNumber3832(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38320"; // Tribsees - case "1": + case '1': return "38321"; // Martensdorf b Stralsund - case "2": + case '2': return "38322"; // Richtenberg - case "3": + case '3': return "38323"; // Prohn - case "4": + case '4': return "38324"; // Velgast - case "5": + case '5': return "38325"; // Rolofshagen - case "6": + case '6': return "38326"; // Grimmen - case "7": + case '7': return "38327"; // Elmenhorst Vorpom - case "8": + case '8': return "38328"; // Miltzow default: return ""; @@ -6803,14 +6813,14 @@ private static String fromNumber3833(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38331"; // Rakow Vorpom - case "2": + case '2': return "38332"; // Gross Bisdorf - case "3": + case '3': return "38333"; // Horst b Grimmen - case "4": + case '4': return "38334"; // Grammendorf default: return ""; @@ -6822,18 +6832,18 @@ private static String fromNumber3835(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38351"; // Mesekenhagen - case "2": + case '2': return "38352"; // Kemnitz b Greifswald - case "3": + case '3': return "38353"; // Gützkow b Greifswald - case "4": + case '4': return "38354"; // Wusterhusen - case "5": + case '5': return "38355"; // Züssow - case "6": + case '6': return "38356"; // Behrenhoff default: return ""; @@ -6845,26 +6855,26 @@ private static String fromNumber3837(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38370"; // Kröslin - case "1": + case '1': return "38371"; // Karlshagen - case "2": + case '2': return "38372"; // Usedom - case "3": + case '3': return "38373"; // Katzow - case "4": + case '4': return "38374"; // Lassan b Wolgast - case "5": + case '5': return "38375"; // Koserow - case "6": + case '6': return "38376"; // Zirchow - case "7": + case '7': return "38377"; // Zinnowitz - case "8": + case '8': return "38378"; // Heringsdorf Seebad - case "9": + case '9': return "38379"; // Benz Usedom default: return ""; @@ -6876,12 +6886,12 @@ private static String fromNumber3839(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38391"; // Altenkirchen Rügen - case "2": + case '2': return "38392"; // Sassnitz - case "3": + case '3': return "38393"; // Binz Ostseebad default: return ""; @@ -6893,22 +6903,22 @@ private static String fromNumber384(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3841"; // Wismar Meckl - case "2": + case '2': return fromNumber3842(number.substring(1)); - case "3": + case '3': return "3843"; // Güstrow - case "4": + case '4': return "3844"; // Schwaan - case "5": + case '5': return fromNumber3845(number.substring(1)); - case "6": + case '6': return fromNumber3846(number.substring(1)); - case "7": + case '7': return "3847"; // Sternberg - case "8": + case '8': return fromNumber3848(number.substring(1)); default: return ""; @@ -6920,22 +6930,22 @@ private static String fromNumber3842(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "38422"; // Neukloster - case "3": + case '3': return "38423"; // Bad Kleinen - case "4": + case '4': return "38424"; // Bobitz - case "5": + case '5': return "38425"; // Kirchdorf Poel - case "6": + case '6': return "38426"; // Neuburg-Steinhausen - case "7": + case '7': return "38427"; // Blowatz - case "8": + case '8': return "38428"; // Hohenkirchen b Wismar - case "9": + case '9': return "38429"; // Glasin default: return ""; @@ -6947,26 +6957,26 @@ private static String fromNumber3845(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38450"; // Tarnow b Bützow - case "1": + case '1': return "38451"; // Hoppenrade b Güstrow - case "2": + case '2': return "38452"; // Lalendorf - case "3": + case '3': return "38453"; // Mistorf - case "4": + case '4': return "38454"; // Kritzkow - case "5": + case '5': return "38455"; // Plaaz - case "6": + case '6': return "38456"; // Langhagen b Güstrow - case "7": + case '7': return "38457"; // Krakow am See - case "8": + case '8': return "38458"; // Zehna - case "9": + case '9': return "38459"; // Laage default: return ""; @@ -6978,14 +6988,14 @@ private static String fromNumber3846(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38461"; // Bützow - case "2": + case '2': return "38462"; // Baumgarten Meckl - case "4": + case '4': return "38464"; // Bernitt - case "6": + case '6': return "38466"; // Jürgenshagen default: return ""; @@ -6997,20 +7007,20 @@ private static String fromNumber3848(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38481"; // Witzin - case "2": + case '2': return "38482"; // Warin - case "3": + case '3': return "38483"; // Brüel - case "4": + case '4': return "38484"; // Ventschow - case "5": + case '5': return "38485"; // Dabel - case "6": + case '6': return "38486"; // Gustävel - case "8": + case '8': return "38488"; // Demen default: return ""; @@ -7022,22 +7032,22 @@ private static String fromNumber386(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "3860"; // Raben Steinfeld - case "1": + case '1': return "3861"; // Plate - case "3": + case '3': return "3863"; // Crivitz - case "5": + case '5': return "3865"; // Holthusen - case "6": + case '6': return "3866"; // Cambs - case "7": + case '7': return "3867"; // Lübstorf - case "8": + case '8': return "3868"; // Rastow - case "9": + case '9': return "3869"; // Dümmer default: return ""; @@ -7049,24 +7059,24 @@ private static String fromNumber387(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3871"; // Parchim - case "2": + case '2': return fromNumber3872(number.substring(1)); - case "3": + case '3': return fromNumber3873(number.substring(1)); - case "4": + case '4': return "3874"; // Ludwigslust Meckl - case "5": + case '5': return fromNumber3875(number.substring(1)); - case "6": + case '6': return "3876"; // Perleberg - case "7": + case '7': return "3877"; // Wittenberge - case "8": + case '8': return fromNumber3878(number.substring(1)); - case "9": + case '9': return fromNumber3879(number.substring(1)); default: return ""; @@ -7078,26 +7088,26 @@ private static String fromNumber3872(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38720"; // Grebbin - case "1": + case '1': return "38721"; // Ziegendorf - case "2": + case '2': return "38722"; // Raduhn - case "3": + case '3': return "38723"; // Kladrum - case "4": + case '4': return "38724"; // Siggelkow - case "5": + case '5': return "38725"; // Gross Godems - case "6": + case '6': return "38726"; // Spornitz - case "7": + case '7': return "38727"; // Mestlin - case "8": + case '8': return "38728"; // Domsühl - case "9": + case '9': return "38729"; // Marnitz default: return ""; @@ -7109,20 +7119,20 @@ private static String fromNumber3873(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38731"; // Lübz - case "2": + case '2': return "38732"; // Gallin b Lübz - case "3": + case '3': return "38733"; // Karbow-Vietlübbe - case "5": + case '5': return "38735"; // Plau am See - case "6": + case '6': return "38736"; // Goldberg Meckl - case "7": + case '7': return "38737"; // Ganzlin - case "8": + case '8': return "38738"; // Karow b Lübz default: return ""; @@ -7134,26 +7144,26 @@ private static String fromNumber3875(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38750"; // Malliss - case "1": + case '1': return "38751"; // Picher - case "2": + case '2': return "38752"; // Zierzow b Ludwigslust - case "3": + case '3': return "38753"; // Wöbbelin - case "4": + case '4': return "38754"; // Leussow b Ludwigslust - case "5": + case '5': return "38755"; // Eldena - case "6": + case '6': return "38756"; // Grabow Meckl - case "7": + case '7': return "38757"; // Neustadt-Glewe - case "8": + case '8': return "38758"; // Dömitz - case "9": + case '9': return "38759"; // Tewswoos default: return ""; @@ -7165,24 +7175,24 @@ private static String fromNumber3878(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38780"; // Lanz Brandenb - case "1": + case '1': return "38781"; // Mellen - case "2": + case '2': return "38782"; // Reetz b Perleberg - case "3": + case '3': return "38783"; // Dallmin - case "4": + case '4': return "38784"; // Kleinow Kr Prignitz - case "5": + case '5': return "38785"; // Berge b Perleberg - case "7": + case '7': return "38787"; // Glöwen - case "8": + case '8': return "38788"; // Gross Warnow - case "9": + case '9': return "38789"; // Wolfshagen b Perleberg default: return ""; @@ -7194,18 +7204,18 @@ private static String fromNumber3879(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38791"; // Bad Wilsnack - case "2": + case '2': return "38792"; // Lenzen (Elbe) - case "3": + case '3': return "38793"; // Dergenthin - case "4": + case '4': return "38794"; // Cumlosen - case "6": + case '6': return "38796"; // Viesecke - case "7": + case '7': return "38797"; // Karstädt Kr Prignitz default: return ""; @@ -7217,20 +7227,20 @@ private static String fromNumber388(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3881"; // Grevesmühlen - case "2": + case '2': return fromNumber3882(number.substring(1)); - case "3": + case '3': return "3883"; // Hagenow - case "4": + case '4': return fromNumber3884(number.substring(1)); - case "5": + case '5': return fromNumber3885(number.substring(1)); - case "6": + case '6': return "3886"; // Gadebusch - case "7": + case '7': return fromNumber3887(number.substring(1)); default: return ""; @@ -7242,22 +7252,22 @@ private static String fromNumber3882(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38821"; // Lüdersdorf Meckl - case "2": + case '2': return "38822"; // Diedrichshagen b Grevesmühlen - case "3": + case '3': return "38823"; // Selmsdorf - case "4": + case '4': return "38824"; // Mallentin - case "5": + case '5': return "38825"; // Klütz - case "6": + case '6': return "38826"; // Dassow - case "7": + case '7': return "38827"; // Kalkhorst - case "8": + case '8': return "38828"; // Schönberg Meckl default: return ""; @@ -7269,20 +7279,20 @@ private static String fromNumber3884(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38841"; // Neuhaus Elbe - case "2": + case '2': return "38842"; // Lüttenmark - case "3": + case '3': return "38843"; // Bennin - case "4": + case '4': return "38844"; // Gülze - case "5": + case '5': return "38845"; // Kaarssen - case "7": + case '7': return "38847"; // Boizenburg Elbe - case "8": + case '8': return "38848"; // Vellahn default: return ""; @@ -7294,24 +7304,24 @@ private static String fromNumber3885(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "38850"; // Gammelin - case "1": + case '1': return "38851"; // Zarrentin Meckl - case "2": + case '2': return "38852"; // Wittenburg - case "3": + case '3': return "38853"; // Drönnewitz b Hagenow - case "4": + case '4': return "38854"; // Redefin - case "5": + case '5': return "38855"; // Lübtheen - case "6": + case '6': return "38856"; // Pritzier b Hagenow - case "8": + case '8': return "38858"; // Lassahn - case "9": + case '9': return "38859"; // Alt Zachun default: return ""; @@ -7323,18 +7333,18 @@ private static String fromNumber3887(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "38871"; // Mühlen Eichsen - case "2": + case '2': return "38872"; // Rehna - case "3": + case '3': return "38873"; // Carlow - case "4": + case '4': return "38874"; // Lützow - case "5": + case '5': return "38875"; // Schlagsdorf b Gadebusch - case "6": + case '6': return "38876"; // Roggendorf default: return ""; @@ -7346,26 +7356,26 @@ private static String fromNumber39(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber390(number.substring(1)); - case "1": + case '1': return "391"; // Magdeburg - case "2": + case '2': return fromNumber392(number.substring(1)); - case "3": + case '3': return fromNumber393(number.substring(1)); - case "4": + case '4': return fromNumber394(number.substring(1)); - case "5": + case '5': return "395"; // Neubrandenburg - case "6": + case '6': return fromNumber396(number.substring(1)); - case "7": + case '7': return fromNumber397(number.substring(1)); - case "8": + case '8': return fromNumber398(number.substring(1)); - case "9": + case '9': return fromNumber399(number.substring(1)); default: return ""; @@ -7377,26 +7387,26 @@ private static String fromNumber390(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3900(number.substring(1)); - case "1": + case '1': return "3901"; // Salzwedel - case "2": + case '2': return "3902"; // Diesdorf Altm - case "3": + case '3': return fromNumber3903(number.substring(1)); - case "4": + case '4': return "3904"; // Haldensleben - case "5": + case '5': return fromNumber3905(number.substring(1)); - case "6": + case '6': return fromNumber3906(number.substring(1)); - case "7": + case '7': return "3907"; // Gardelegen - case "8": + case '8': return fromNumber3908(number.substring(1)); - case "9": + case '9': return "3909"; // Klötze Altmark default: return ""; @@ -7408,26 +7418,26 @@ private static String fromNumber3900(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39000"; // Beetzendorf - case "1": + case '1': return "39001"; // Apenburg - case "2": + case '2': return "39002"; // Oebisfelde - case "3": + case '3': return "39003"; // Jübar - case "4": + case '4': return "39004"; // Köckte b Gardelegen - case "5": + case '5': return "39005"; // Kusey - case "6": + case '6': return "39006"; // Miesterhorst - case "7": + case '7': return "39007"; // Tangeln - case "8": + case '8': return "39008"; // Kunrau - case "9": + case '9': return "39009"; // Badel default: return ""; @@ -7439,26 +7449,26 @@ private static String fromNumber3903(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39030"; // Brunau - case "1": + case '1': return "39031"; // Dähre - case "2": + case '2': return "39032"; // Mahlsdorf b Salzwedel - case "3": + case '3': return "39033"; // Wallstawe - case "4": + case '4': return "39034"; // Fleetmark - case "5": + case '5': return "39035"; // Kuhfelde - case "6": + case '6': return "39036"; // Binde - case "7": + case '7': return "39037"; // Pretzier - case "8": + case '8': return "39038"; // Henningen - case "9": + case '9': return "39039"; // Bonese default: return ""; @@ -7470,26 +7480,26 @@ private static String fromNumber3905(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39050"; // Bartensleben - case "1": + case '1': return "39051"; // Calvörde - case "2": + case '2': return "39052"; // Erxleben b Haldensleben - case "3": + case '3': return "39053"; // Süplingen - case "4": + case '4': return "39054"; // Flechtingen - case "5": + case '5': return "39055"; // Hörsingen - case "6": + case '6': return "39056"; // Klüden - case "7": + case '7': return "39057"; // Rätzlingen Sachs-Anh - case "8": + case '8': return "39058"; // Uthmöden - case "9": + case '9': return "39059"; // Wegenstedt default: return ""; @@ -7501,10 +7511,10 @@ private static String fromNumber3906(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39061"; // Weferlingen - case "2": + case '2': return "39062"; // Bebertal default: return ""; @@ -7516,26 +7526,26 @@ private static String fromNumber3908(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39080"; // Kalbe Milde - case "1": + case '1': return "39081"; // Kakerbeck Sachs-Anh - case "2": + case '2': return "39082"; // Mieste - case "3": + case '3': return "39083"; // Messdorf - case "4": + case '4': return "39084"; // Lindstedt - case "5": + case '5': return "39085"; // Zichtau - case "6": + case '6': return "39086"; // Jävenitz - case "7": + case '7': return "39087"; // Jerchel Altmark - case "8": + case '8': return "39088"; // Letzlingen - case "9": + case '9': return "39089"; // Bismark Altmark default: return ""; @@ -7547,24 +7557,24 @@ private static String fromNumber392(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3920(number.substring(1)); - case "1": + case '1': return "3921"; // Burg b Magdeburg - case "2": + case '2': return fromNumber3922(number.substring(1)); - case "3": + case '3': return "3923"; // Zerbst - case "4": + case '4': return fromNumber3924(number.substring(1)); - case "5": + case '5': return "3925"; // Stassfurt - case "6": + case '6': return fromNumber3926(number.substring(1)); - case "8": + case '8': return "3928"; // Schönebeck Elbe - case "9": + case '9': return fromNumber3929(number.substring(1)); default: return ""; @@ -7576,26 +7586,26 @@ private static String fromNumber3920(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39200"; // Gommern - case "1": + case '1': return "39201"; // Wolmirstedt - case "2": + case '2': return "39202"; // Gross Ammensleben - case "3": + case '3': return "39203"; // Barleben - case "4": + case '4': return "39204"; // Niederndodeleben - case "5": + case '5': return "39205"; // Langenweddingen - case "6": + case '6': return "39206"; // Eichenbarleben - case "7": + case '7': return "39207"; // Colbitz - case "8": + case '8': return "39208"; // Loitsche - case "9": + case '9': return "39209"; // Wanzleben default: return ""; @@ -7607,18 +7617,18 @@ private static String fromNumber3922(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39221"; // Möckern b Magdeburg - case "2": + case '2': return "39222"; // Möser - case "3": + case '3': return "39223"; // Theessen - case "4": + case '4': return "39224"; // Büden - case "5": + case '5': return "39225"; // Altengrabow - case "6": + case '6': return "39226"; // Hohenziatz default: return ""; @@ -7630,22 +7640,22 @@ private static String fromNumber3924(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39241"; // Leitzkau - case "2": + case '2': return "39242"; // Prödel - case "3": + case '3': return "39243"; // Nedlitz b Zerbst - case "4": + case '4': return "39244"; // Steutz - case "5": + case '5': return "39245"; // Loburg - case "6": + case '6': return "39246"; // Lindau Anh - case "7": + case '7': return "39247"; // Güterglück - case "8": + case '8': return "39248"; // Dobritz default: return ""; @@ -7657,20 +7667,20 @@ private static String fromNumber3926(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "39262"; // Güsten Anh - case "3": + case '3': return "39263"; // Unseburg - case "4": + case '4': return "39264"; // Kroppenstedt - case "5": + case '5': return "39265"; // Löderburg - case "6": + case '6': return "39266"; // Förderstedt - case "7": + case '7': return "39267"; // Schneidlingen - case "8": + case '8': return "39268"; // Egeln default: return ""; @@ -7682,22 +7692,22 @@ private static String fromNumber3929(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39291"; // Calbe Saale - case "2": + case '2': return "39292"; // Biederitz - case "3": + case '3': return "39293"; // Dreileben - case "4": + case '4': return "39294"; // Gross Rosenburg - case "5": + case '5': return "39295"; // Zuchau - case "6": + case '6': return "39296"; // Welsleben - case "7": + case '7': return "39297"; // Eickendorf Kr Schönebeck - case "8": + case '8': return "39298"; // Barby Elbe default: return ""; @@ -7709,24 +7719,24 @@ private static String fromNumber393(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3931"; // Stendal - case "2": + case '2': return fromNumber3932(number.substring(1)); - case "3": + case '3': return "3933"; // Genthin - case "4": + case '4': return fromNumber3934(number.substring(1)); - case "5": + case '5': return "3935"; // Tangerhütte - case "6": + case '6': return fromNumber3936(number.substring(1)); - case "7": + case '7': return "3937"; // Osterburg Altmark - case "8": + case '8': return fromNumber3938(number.substring(1)); - case "9": + case '9': return fromNumber3939(number.substring(1)); default: return ""; @@ -7738,24 +7748,24 @@ private static String fromNumber3932(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39320"; // Schinne - case "1": + case '1': return "39321"; // Arneburg - case "2": + case '2': return "39322"; // Tangermünde - case "3": + case '3': return "39323"; // Schönhausen Elbe - case "4": + case '4': return "39324"; // Kläden b Stendal - case "5": + case '5': return "39325"; // Vinzelberg - case "7": + case '7': return "39327"; // Klietz - case "8": + case '8': return "39328"; // Rochau - case "9": + case '9': return "39329"; // Möringen default: return ""; @@ -7767,24 +7777,24 @@ private static String fromNumber3934(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39341"; // Redekin - case "2": + case '2': return "39342"; // Gladau - case "3": + case '3': return "39343"; // Jerichow - case "4": + case '4': return "39344"; // Güsen - case "5": + case '5': return "39345"; // Parchen - case "6": + case '6': return "39346"; // Tucheim - case "7": + case '7': return "39347"; // Kade - case "8": + case '8': return "39348"; // Klitsche - case "9": + case '9': return "39349"; // Parey Elbe default: return ""; @@ -7796,18 +7806,18 @@ private static String fromNumber3936(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39361"; // Lüderitz - case "2": + case '2': return "39362"; // Grieben b Tangerhütte - case "3": + case '3': return "39363"; // Angern - case "4": + case '4': return "39364"; // Dolle - case "5": + case '5': return "39365"; // Bellingen b Stendal - case "6": + case '6': return "39366"; // Kehnert default: return ""; @@ -7819,20 +7829,20 @@ private static String fromNumber3938(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "39382"; // Kamern - case "3": + case '3': return "39383"; // Sandau Elbe - case "4": + case '4': return "39384"; // Arendsee Altmark - case "6": + case '6': return "39386"; // Seehausen Altmark - case "7": + case '7': return "39387"; // Havelberg - case "8": + case '8': return "39388"; // Goldbeck Altm - case "9": + case '9': return "39389"; // Schollene default: return ""; @@ -7844,26 +7854,26 @@ private static String fromNumber3939(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39390"; // Iden - case "1": + case '1': return "39391"; // Lückstedt - case "2": + case '2': return "39392"; // Rönnebeck Sachs-Ahn - case "3": + case '3': return "39393"; // Werben Elbe - case "4": + case '4': return "39394"; // Hohenberg-Krusemark - case "5": + case '5': return "39395"; // Wanzer - case "6": + case '6': return "39396"; // Neukirchen Altmark - case "7": + case '7': return "39397"; // Geestgottberg - case "8": + case '8': return "39398"; // Gross Garz - case "9": + case '9': return "39399"; // Kleinau default: return ""; @@ -7875,26 +7885,26 @@ private static String fromNumber394(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3940(number.substring(1)); - case "1": + case '1': return "3941"; // Halberstadt - case "2": + case '2': return fromNumber3942(number.substring(1)); - case "3": + case '3': return "3943"; // Wernigerode - case "4": + case '4': return "3944"; // Blankenburg Harz - case "5": + case '5': return fromNumber3945(number.substring(1)); - case "6": + case '6': return "3946"; // Quedlinburg - case "7": + case '7': return "3947"; // Thale - case "8": + case '8': return fromNumber3948(number.substring(1)); - case "9": + case '9': return "3949"; // Oschersleben Bode default: return ""; @@ -7906,26 +7916,26 @@ private static String fromNumber3940(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39400"; // Wefensleben - case "1": + case '1': return "39401"; // Neuwegersleben - case "2": + case '2': return "39402"; // Völpke - case "3": + case '3': return "39403"; // Gröningen Sachs-Ahn - case "4": + case '4': return "39404"; // Ausleben - case "5": + case '5': return "39405"; // Hötensleben - case "6": + case '6': return "39406"; // Harbke - case "7": + case '7': return "39407"; // Seehausen Börde - case "8": + case '8': return "39408"; // Hadmersleben - case "9": + case '9': return "39409"; // Eilsleben default: return ""; @@ -7937,22 +7947,22 @@ private static String fromNumber3942(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39421"; // Osterwieck - case "2": + case '2': return "39422"; // Badersleben - case "3": + case '3': return "39423"; // Wegeleben - case "4": + case '4': return "39424"; // Schwanebeck Sachs-Anh - case "5": + case '5': return "39425"; // Dingelstedt a Huy - case "6": + case '6': return "39426"; // Hessen - case "7": + case '7': return "39427"; // Ströbeck - case "8": + case '8': return "39428"; // Pabstorf default: return ""; @@ -7964,24 +7974,24 @@ private static String fromNumber3945(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39451"; // Wasserleben - case "2": + case '2': return "39452"; // Ilsenburg - case "3": + case '3': return "39453"; // Derenburg - case "4": + case '4': return "39454"; // Elbingerode Harz - case "5": + case '5': return "39455"; // Schierke - case "6": + case '6': return "39456"; // Altenbrak - case "7": + case '7': return "39457"; // Benneckenstein Harz - case "8": + case '8': return "39458"; // Heudeber - case "9": + case '9': return "39459"; // Hasselfelde default: return ""; @@ -7993,22 +8003,22 @@ private static String fromNumber3948(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39481"; // Hedersleben b Aschersleben - case "2": + case '2': return "39482"; // Gatersleben - case "3": + case '3': return "39483"; // Ballenstedt - case "4": + case '4': return "39484"; // Harzgerode - case "5": + case '5': return "39485"; // Gernrode Harz - case "7": + case '7': return "39487"; // Friedrichsbrunn - case "8": + case '8': return "39488"; // Güntersberge - case "9": + case '9': return "39489"; // Strassberg Harz default: return ""; @@ -8020,26 +8030,26 @@ private static String fromNumber396(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber3960(number.substring(1)); - case "1": + case '1': return "3961"; // Altentreptow - case "2": + case '2': return "3962"; // Penzlin b Waren - case "3": + case '3': return "3963"; // Woldegk - case "4": + case '4': return "3964"; // Bredenfelde b Strasburg - case "5": + case '5': return "3965"; // Burow b Altentreptow - case "6": + case '6': return "3966"; // Cölpin - case "7": + case '7': return "3967"; // Oertzenhof b Strasburg - case "8": + case '8': return "3968"; // Schönbeck Meckl - case "9": + case '9': return "3969"; // Siedenbollentin default: return ""; @@ -8051,24 +8061,24 @@ private static String fromNumber3960(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39600"; // Zwiedorf - case "1": + case '1': return "39601"; // Friedland Meckl - case "2": + case '2': return "39602"; // Kleeth - case "3": + case '3': return "39603"; // Burg Stargard - case "4": + case '4': return "39604"; // Wildberg b Altentreptow - case "5": + case '5': return "39605"; // Gross Nemerow - case "6": + case '6': return "39606"; // Glienke - case "7": + case '7': return "39607"; // Kotelow - case "8": + case '8': return "39608"; // Staven default: return ""; @@ -8080,20 +8090,20 @@ private static String fromNumber397(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3971"; // Anklam - case "2": + case '2': return fromNumber3972(number.substring(1)); - case "3": + case '3': return "3973"; // Pasewalk - case "4": + case '4': return fromNumber3974(number.substring(1)); - case "5": + case '5': return fromNumber3975(number.substring(1)); - case "6": + case '6': return "3976"; // Torgelow b Ueckermünde - case "7": + case '7': return fromNumber3977(number.substring(1)); default: return ""; @@ -8105,20 +8115,20 @@ private static String fromNumber3972(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39721"; // Liepen b Anklam - case "2": + case '2': return "39722"; // Sarnow b Anklam - case "3": + case '3': return "39723"; // Krien - case "4": + case '4': return "39724"; // Klein Bünzow - case "6": + case '6': return "39726"; // Ducherow - case "7": + case '7': return "39727"; // Spantekow - case "8": + case '8': return "39728"; // Medow b Anklam default: return ""; @@ -8130,26 +8140,26 @@ private static String fromNumber3974(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39740"; // Nechlin - case "1": + case '1': return "39741"; // Jatznick - case "2": + case '2': return "39742"; // Brüssow b Pasewalk - case "3": + case '3': return "39743"; // Zerrenthin - case "4": + case '4': return "39744"; // Rothenklempenow - case "5": + case '5': return "39745"; // Hetzdorf b Strasburg - case "6": + case '6': return "39746"; // Krackow - case "7": + case '7': return "39747"; // Züsedom - case "8": + case '8': return "39748"; // Viereck - case "9": + case '9': return "39749"; // Grambow b Pasewalk default: return ""; @@ -8161,14 +8171,14 @@ private static String fromNumber3975(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39751"; // Penkun - case "2": + case '2': return "39752"; // Blumenhagen b Strasburg - case "3": + case '3': return "39753"; // Strasburg - case "4": + case '4': return "39754"; // Löcknitz Vorpom default: return ""; @@ -8180,24 +8190,24 @@ private static String fromNumber3977(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39771"; // Ueckermünde - case "2": + case '2': return "39772"; // Rothemühl - case "3": + case '3': return "39773"; // Altwarp - case "4": + case '4': return "39774"; // Mönkebude - case "5": + case '5': return "39775"; // Ahlbeck b Torgelow - case "6": + case '6': return "39776"; // Hintersee - case "7": + case '7': return "39777"; // Borkenfriede - case "8": + case '8': return "39778"; // Ferdinandshof b Torgelow - case "9": + case '9': return "39779"; // Eggesin default: return ""; @@ -8209,22 +8219,22 @@ private static String fromNumber398(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3981"; // Neustrelitz - case "2": + case '2': return fromNumber3982(number.substring(1)); - case "3": + case '3': return fromNumber3983(number.substring(1)); - case "4": + case '4': return "3984"; // Prenzlau - case "5": + case '5': return fromNumber3985(number.substring(1)); - case "6": + case '6': return fromNumber3986(number.substring(1)); - case "7": + case '7': return "3987"; // Templin - case "8": + case '8': return fromNumber3988(number.substring(1)); default: return ""; @@ -8236,26 +8246,26 @@ private static String fromNumber3982(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "39820"; // Triepkendorf - case "1": + case '1': return "39821"; // Carpin - case "2": + case '2': return "39822"; // Kratzeburg - case "3": + case '3': return "39823"; // Rechlin - case "4": + case '4': return "39824"; // Hohenzieritz - case "5": + case '5': return "39825"; // Wokuhl - case "6": + case '6': return "39826"; // Blankensee b Neustrelitz - case "7": + case '7': return "39827"; // Schwarz b Neustrelitz - case "8": + case '8': return "39828"; // Wustrow Kr Mecklenburg-Strelitz - case "9": + case '9': return "39829"; // Blankenförde default: return ""; @@ -8267,12 +8277,12 @@ private static String fromNumber3983(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39831"; // Feldberg Meckl - case "2": + case '2': return "39832"; // Wesenberg Meckl - case "3": + case '3': return "39833"; // Mirow Kr Neustrelitz default: return ""; @@ -8284,24 +8294,24 @@ private static String fromNumber3985(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39851"; // Göritz b Prenzlau - case "2": + case '2': return "39852"; // Schönermark b Prenzlau - case "3": + case '3': return "39853"; // Holzendorf b Prenzlau - case "4": + case '4': return "39854"; // Kleptow - case "5": + case '5': return "39855"; // Parmen-Weggun - case "6": + case '6': return "39856"; // Beenz b Prenzlau - case "7": + case '7': return "39857"; // Drense - case "8": + case '8': return "39858"; // Bietikow - case "9": + case '9': return "39859"; // Fürstenwerder default: return ""; @@ -8313,12 +8323,12 @@ private static String fromNumber3986(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39861"; // Gramzow b Prenzlau - case "2": + case '2': return "39862"; // Schmölln b Prenzlau - case "3": + case '3': return "39863"; // Seehausen b Prenzlau default: return ""; @@ -8330,24 +8340,24 @@ private static String fromNumber3988(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39881"; // Ringenwalde b Templin - case "2": + case '2': return "39882"; // Gollin - case "3": + case '3': return "39883"; // Groß Dölln - case "4": + case '4': return "39884"; // Hassleben b Prenzlau - case "5": + case '5': return "39885"; // Jakobshagen - case "6": + case '6': return "39886"; // Milmersdorf - case "7": + case '7': return "39887"; // Gerswalde - case "8": + case '8': return "39888"; // Lychen - case "9": + case '9': return "39889"; // Boitzenburg default: return ""; @@ -8359,24 +8369,24 @@ private static String fromNumber399(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "3991"; // Waren Müritz - case "2": + case '2': return fromNumber3992(number.substring(1)); - case "3": + case '3': return fromNumber3993(number.substring(1)); - case "4": + case '4': return "3994"; // Malchin - case "5": + case '5': return fromNumber3995(number.substring(1)); - case "6": + case '6': return "3996"; // Teterow - case "7": + case '7': return fromNumber3997(number.substring(1)); - case "8": + case '8': return "3998"; // Demmin - case "9": + case '9': return fromNumber3999(number.substring(1)); default: return ""; @@ -8388,24 +8398,24 @@ private static String fromNumber3992(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39921"; // Ankershagen - case "2": + case '2': return "39922"; // Dambeck b Röbel - case "3": + case '3': return "39923"; // Priborn - case "4": + case '4': return "39924"; // Stuer - case "5": + case '5': return "39925"; // Wredenhagen - case "6": + case '6': return "39926"; // Grabowhöfe - case "7": + case '7': return "39927"; // Nossentiner Hütte - case "8": + case '8': return "39928"; // Möllenhagen - case "9": + case '9': return "39929"; // Jabel b Waren default: return ""; @@ -8417,14 +8427,14 @@ private static String fromNumber3993(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39931"; // Röbel Müritz - case "2": + case '2': return "39932"; // Malchow b Waren - case "3": + case '3': return "39933"; // Vollrathsruhe - case "4": + case '4': return "39934"; // Groß Plasten default: return ""; @@ -8436,22 +8446,22 @@ private static String fromNumber3995(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39951"; // Faulenrost - case "2": + case '2': return "39952"; // Grammentin - case "3": + case '3': return "39953"; // Schwinkendorf - case "4": + case '4': return "39954"; // Stavenhagen Reuterstadt - case "5": + case '5': return "39955"; // Jürgenstorf Meckl - case "6": + case '6': return "39956"; // Neukalen - case "7": + case '7': return "39957"; // Gielow - case "9": + case '9': return "39959"; // Dargun default: return ""; @@ -8463,20 +8473,20 @@ private static String fromNumber3997(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39971"; // Gnoien - case "2": + case '2': return "39972"; // Walkendorf - case "3": + case '3': return "39973"; // Altkalen - case "5": + case '5': return "39975"; // Thürkow - case "6": + case '6': return "39976"; // Groß Bützin - case "7": + case '7': return "39977"; // Jördenstorf - case "8": + case '8': return "39978"; // Gross Roge default: return ""; @@ -8488,24 +8498,24 @@ private static String fromNumber3999(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "39991"; // Daberkow - case "2": + case '2': return "39992"; // Görmin - case "3": + case '3': return "39993"; // Hohenmocker - case "4": + case '4': return "39994"; // Metschow - case "5": + case '5': return "39995"; // Nossendorf - case "6": + case '6': return "39996"; // Törpin - case "7": + case '7': return "39997"; // Jarmen - case "8": + case '8': return "39998"; // Loitz b Demmin - case "9": + case '9': return "39999"; // Tutow default: return ""; @@ -8517,26 +8527,26 @@ private static String fromNumber4(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "40"; // Hamburg - case "1": + case '1': return fromNumber41(number.substring(1)); - case "2": + case '2': return fromNumber42(number.substring(1)); - case "3": + case '3': return fromNumber43(number.substring(1)); - case "4": + case '4': return fromNumber44(number.substring(1)); - case "5": + case '5': return fromNumber45(number.substring(1)); - case "6": + case '6': return fromNumber46(number.substring(1)); - case "7": + case '7': return fromNumber47(number.substring(1)); - case "8": + case '8': return fromNumber48(number.substring(1)); - case "9": + case '9': return fromNumber49(number.substring(1)); default: return ""; @@ -8548,24 +8558,24 @@ private static String fromNumber41(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber410(number.substring(1)); - case "2": + case '2': return fromNumber412(number.substring(1)); - case "3": + case '3': return fromNumber413(number.substring(1)); - case "4": + case '4': return fromNumber414(number.substring(1)); - case "5": + case '5': return fromNumber415(number.substring(1)); - case "6": + case '6': return fromNumber416(number.substring(1)); - case "7": + case '7': return fromNumber417(number.substring(1)); - case "8": + case '8': return fromNumber418(number.substring(1)); - case "9": + case '9': return fromNumber419(number.substring(1)); default: return ""; @@ -8577,24 +8587,24 @@ private static String fromNumber410(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4101"; // Pinneberg - case "2": + case '2': return "4102"; // Ahrensburg - case "3": + case '3': return "4103"; // Wedel - case "4": + case '4': return "4104"; // Aumühle b Hamburg - case "5": + case '5': return "4105"; // Seevetal - case "6": + case '6': return "4106"; // Quickborn Kr Pinneberg - case "7": + case '7': return "4107"; // Siek Kr Stormarn - case "8": + case '8': return "4108"; // Rosengarten Kr Harburg - case "9": + case '9': return "4109"; // Tangstedt Bz Hamburg default: return ""; @@ -8606,26 +8616,26 @@ private static String fromNumber412(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4120"; // Ellerhoop - case "1": + case '1': return "4121"; // Elmshorn - case "2": + case '2': return "4122"; // Uetersen - case "3": + case '3': return "4123"; // Barmstedt - case "4": + case '4': return "4124"; // Glückstadt - case "5": + case '5': return "4125"; // Seestermühe - case "6": + case '6': return "4126"; // Horst Holstein - case "7": + case '7': return "4127"; // Westerhorn - case "8": + case '8': return "4128"; // Kollmar - case "9": + case '9': return "4129"; // Haseldorf default: return ""; @@ -8637,24 +8647,24 @@ private static String fromNumber413(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4131"; // Lüneburg - case "2": + case '2': return "4132"; // Amelinghausen - case "3": + case '3': return "4133"; // Wittorf Kr Lünebeburg - case "4": + case '4': return "4134"; // Embsen Kr Lünebeburg - case "5": + case '5': return "4135"; // Kirchgellersen - case "6": + case '6': return "4136"; // Scharnebeck - case "7": + case '7': return "4137"; // Barendorf - case "8": + case '8': return "4138"; // Betzendorf Kr Lünebeburg - case "9": + case '9': return "4139"; // Hohnstorf Elbe default: return ""; @@ -8666,22 +8676,22 @@ private static String fromNumber414(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4140"; // Estorf Kr Stade - case "1": + case '1': return "4141"; // Stade - case "2": + case '2': return "4142"; // Steinkirchen Kr Stade - case "3": + case '3': return "4143"; // Drochtersen - case "4": + case '4': return "4144"; // Himmelpforten - case "6": + case '6': return "4146"; // Stade-Bützfleth - case "8": + case '8': return "4148"; // Drochtersen-Assel - case "9": + case '9': return "4149"; // Fredenbeck default: return ""; @@ -8693,22 +8703,22 @@ private static String fromNumber415(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4151"; // Schwarzenbek - case "2": + case '2': return "4152"; // Geesthacht - case "3": + case '3': return "4153"; // Lauenburg Elbe - case "4": + case '4': return "4154"; // Trittau - case "5": + case '5': return "4155"; // Büchen - case "6": + case '6': return "4156"; // Talkau - case "8": + case '8': return "4158"; // Roseburg - case "9": + case '9': return "4159"; // Basthorst default: return ""; @@ -8720,24 +8730,24 @@ private static String fromNumber416(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4161"; // Buxtehude - case "2": + case '2': return "4162"; // Jork - case "3": + case '3': return "4163"; // Horneburg Niederelbe - case "4": + case '4': return "4164"; // Harsefeld - case "5": + case '5': return "4165"; // Hollenstedt Nordheide - case "6": + case '6': return "4166"; // Ahlerstedt - case "7": + case '7': return "4167"; // Apensen - case "8": + case '8': return "4168"; // Neu Wulmstorf-Elstorf - case "9": + case '9': return "4169"; // Sauensiek default: return ""; @@ -8749,24 +8759,24 @@ private static String fromNumber417(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4171"; // Winsen Luhe - case "2": + case '2': return "4172"; // Salzhausen - case "3": + case '3': return "4173"; // Wulfsen - case "4": + case '4': return "4174"; // Stelle Kr Harburg - case "5": + case '5': return "4175"; // Egestorf Nordheide - case "6": + case '6': return "4176"; // Marschacht - case "7": + case '7': return "4177"; // Drage Elbe - case "8": + case '8': return "4178"; // Radbruch - case "9": + case '9': return "4179"; // Winsen-Tönnhausen default: return ""; @@ -8778,26 +8788,26 @@ private static String fromNumber418(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4180"; // Königsmoor - case "1": + case '1': return "4181"; // Buchholz in der Nordheide - case "2": + case '2': return "4182"; // Tostedt - case "3": + case '3': return "4183"; // Jesteburg - case "4": + case '4': return "4184"; // Hanstedt Nordheide - case "5": + case '5': return "4185"; // Marxen Auetal - case "6": + case '6': return "4186"; // Buchholz-Trelde - case "7": + case '7': return "4187"; // Holm-Seppensen - case "8": + case '8': return "4188"; // Welle Nordheide - case "9": + case '9': return "4189"; // Undeloh default: return ""; @@ -8809,16 +8819,16 @@ private static String fromNumber419(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4191"; // Kaltenkirchen Holst - case "2": + case '2': return "4192"; // Bad Bramstedt - case "3": + case '3': return "4193"; // Henstedt-Ulzburg - case "4": + case '4': return "4194"; // Sievershütten - case "5": + case '5': return "4195"; // Hartenholm default: return ""; @@ -8830,26 +8840,26 @@ private static String fromNumber42(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber420(number.substring(1)); - case "1": + case '1': return "421"; // Bremen - case "2": + case '2': return fromNumber422(number.substring(1)); - case "3": + case '3': return fromNumber423(number.substring(1)); - case "4": + case '4': return fromNumber424(number.substring(1)); - case "5": + case '5': return fromNumber425(number.substring(1)); - case "6": + case '6': return fromNumber426(number.substring(1)); - case "7": + case '7': return fromNumber427(number.substring(1)); - case "8": + case '8': return fromNumber428(number.substring(1)); - case "9": + case '9': return fromNumber429(number.substring(1)); default: return ""; @@ -8861,22 +8871,22 @@ private static String fromNumber420(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4202"; // Achim b Bremen - case "3": + case '3': return "4203"; // Weyhe b Bremen - case "4": + case '4': return "4204"; // Thedinghausen - case "5": + case '5': return "4205"; // Ottersberg - case "6": + case '6': return "4206"; // Stuhr-Heiligenrode - case "7": + case '7': return "4207"; // Oyten - case "8": + case '8': return "4208"; // Grasberg - case "9": + case '9': return "4209"; // Schwanewede default: return ""; @@ -8888,14 +8898,14 @@ private static String fromNumber422(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4221"; // Delmenhorst - case "2": + case '2': return "4222"; // Ganderkesee - case "3": + case '3': return "4223"; // Ganderkesee-Bookholzberg - case "4": + case '4': return "4224"; // Gross Ippener default: return ""; @@ -8907,26 +8917,26 @@ private static String fromNumber423(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4230"; // Verden-Walle - case "1": + case '1': return "4231"; // Verden Aller - case "2": + case '2': return "4232"; // Langwedel Kr Verden - case "3": + case '3': return "4233"; // Blender - case "4": + case '4': return "4234"; // Dörverden - case "5": + case '5': return "4235"; // Langwedel-Etelsen - case "6": + case '6': return "4236"; // Kirchlinteln - case "7": + case '7': return "4237"; // Bendingbostel - case "8": + case '8': return "4238"; // Neddenaverbergen - case "9": + case '9': return "4239"; // Dörverden-Westen default: return ""; @@ -8938,26 +8948,26 @@ private static String fromNumber424(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4240"; // Syke-Heiligenfelde - case "1": + case '1': return "4241"; // Bassum - case "2": + case '2': return "4242"; // Syke - case "3": + case '3': return "4243"; // Twistringen - case "4": + case '4': return "4244"; // Harpstedt - case "5": + case '5': return "4245"; // Neuenkirchen b Bassum - case "6": + case '6': return "4246"; // Twistringen-Heiligenloh - case "7": + case '7': return "4247"; // Affinghausen - case "8": + case '8': return "4248"; // Bassum-Neubruchhausen - case "9": + case '9': return "4249"; // Bassum-Nordwohlde default: return ""; @@ -8969,22 +8979,22 @@ private static String fromNumber425(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4251"; // Hoya - case "2": + case '2': return "4252"; // Bruchhausen-Vilsen - case "3": + case '3': return "4253"; // Asendorf Kr Diepholz - case "4": + case '4': return "4254"; // Eystrup - case "5": + case '5': return "4255"; // Martfeld - case "6": + case '6': return "4256"; // Hilgermissen - case "7": + case '7': return "4257"; // Schweringen - case "8": + case '8': return "4258"; // Schwarme default: return ""; @@ -8996,26 +9006,26 @@ private static String fromNumber426(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4260"; // Visselhövede-Wittorf - case "1": + case '1': return "4261"; // Rotenburg Wümme - case "2": + case '2': return "4262"; // Visselhövede - case "3": + case '3': return "4263"; // Scheessel - case "4": + case '4': return "4264"; // Sottrum Kr Rotenburg - case "5": + case '5': return "4265"; // Fintel - case "6": + case '6': return "4266"; // Brockel - case "7": + case '7': return "4267"; // Lauenbrück - case "8": + case '8': return "4268"; // Bötersen - case "9": + case '9': return "4269"; // Ahausen-Kirchwalsede default: return ""; @@ -9027,20 +9037,20 @@ private static String fromNumber427(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4271"; // Sulingen - case "2": + case '2': return "4272"; // Siedenburg - case "3": + case '3': return "4273"; // Kirchdorf b Sulingen - case "4": + case '4': return "4274"; // Varrel b Sulingen - case "5": + case '5': return "4275"; // Ehrenburg - case "6": + case '6': return "4276"; // Borstel b Sulingen - case "7": + case '7': return "4277"; // Schwaförden default: return ""; @@ -9052,24 +9062,24 @@ private static String fromNumber428(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4281"; // Zeven - case "2": + case '2': return "4282"; // Sittensen - case "3": + case '3': return "4283"; // Tarmstedt - case "4": + case '4': return "4284"; // Selsingen - case "5": + case '5': return "4285"; // Rhade b Zeven - case "6": + case '6': return "4286"; // Gyhum - case "7": + case '7': return "4287"; // Heeslingen-Boitzen - case "8": + case '8': return "4288"; // Horstedt Kr Rotenburg - case "9": + case '9': return "4289"; // Kirchtimke default: return ""; @@ -9081,20 +9091,20 @@ private static String fromNumber429(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4292"; // Ritterhude - case "3": + case '3': return "4293"; // Ottersberg-Fischerhude - case "4": + case '4': return "4294"; // Riede Kr Verden - case "5": + case '5': return "4295"; // Emtinghausen - case "6": + case '6': return "4296"; // Schwanewede-Aschwarden - case "7": + case '7': return "4297"; // Ottersberg-Posthausen - case "8": + case '8': return "4298"; // Lilienthal default: return ""; @@ -9106,26 +9116,26 @@ private static String fromNumber43(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber430(number.substring(1)); - case "1": + case '1': return "431"; // Kiel - case "2": + case '2': return fromNumber432(number.substring(1)); - case "3": + case '3': return fromNumber433(number.substring(1)); - case "4": + case '4': return fromNumber434(number.substring(1)); - case "5": + case '5': return fromNumber435(number.substring(1)); - case "6": + case '6': return fromNumber436(number.substring(1)); - case "7": + case '7': return fromNumber437(number.substring(1)); - case "8": + case '8': return fromNumber438(number.substring(1)); - case "9": + case '9': return fromNumber439(number.substring(1)); default: return ""; @@ -9137,16 +9147,16 @@ private static String fromNumber430(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4302"; // Kirchbarkau - case "3": + case '3': return "4303"; // Schlesen - case "5": + case '5': return "4305"; // Westensee - case "7": + case '7': return "4307"; // Raisdorf - case "8": + case '8': return "4308"; // Schwedeneck default: return ""; @@ -9158,24 +9168,24 @@ private static String fromNumber432(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4320"; // Heidmühlen - case "1": + case '1': return "4321"; // Neumünster - case "2": + case '2': return "4322"; // Bordesholm - case "3": + case '3': return "4323"; // Bornhöved - case "4": + case '4': return "4324"; // Brokstedt - case "6": + case '6': return "4326"; // Wankendorf - case "7": + case '7': return "4327"; // Grossenaspe - case "8": + case '8': return "4328"; // Rickling - case "9": + case '9': return "4329"; // Langwedel Holst default: return ""; @@ -9187,26 +9197,26 @@ private static String fromNumber433(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4330"; // Emkendorf - case "1": + case '1': return "4331"; // Rendsburg - case "2": + case '2': return "4332"; // Hamdorf b Rendsburg - case "3": + case '3': return "4333"; // Erfde - case "4": + case '4': return "4334"; // Bredenbek b Rendsburg - case "5": + case '5': return "4335"; // Hohn b Rendsburg - case "6": + case '6': return "4336"; // Owschlag - case "7": + case '7': return "4337"; // Jevenstedt - case "8": + case '8': return "4338"; // Alt Duvenstedt - case "9": + case '9': return "4339"; // Christiansholm default: return ""; @@ -9218,22 +9228,22 @@ private static String fromNumber434(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4340"; // Achterwehr - case "2": + case '2': return "4342"; // Preetz Kr Plön - case "3": + case '3': return "4343"; // Laboe - case "4": + case '4': return "4344"; // Schönberg Holstein - case "6": + case '6': return "4346"; // Gettorf - case "7": + case '7': return "4347"; // Flintbek - case "8": + case '8': return "4348"; // Schönkirchen - case "9": + case '9': return "4349"; // Dänischenhagen default: return ""; @@ -9245,22 +9255,22 @@ private static String fromNumber435(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4351"; // Eckernförde - case "2": + case '2': return "4352"; // Damp - case "3": + case '3': return "4353"; // Ascheffel - case "4": + case '4': return "4354"; // Fleckeby - case "5": + case '5': return "4355"; // Rieseby - case "6": + case '6': return "4356"; // Gross Wittensee - case "7": + case '7': return "4357"; // Sehestedt Eider - case "8": + case '8': return "4358"; // Loose b Eckernförde default: return ""; @@ -9272,20 +9282,20 @@ private static String fromNumber436(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4361"; // Oldenburg in Holstein - case "2": + case '2': return "4362"; // Heiligenhafen - case "3": + case '3': return "4363"; // Lensahn - case "4": + case '4': return "4364"; // Dahme Kr Ostholstein - case "5": + case '5': return "4365"; // Heringsdorf Holst - case "6": + case '6': return "4366"; // Grömitz-Cismar - case "7": + case '7': return "4367"; // Grossenbrode default: return ""; @@ -9297,10 +9307,10 @@ private static String fromNumber437(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4371"; // Burg auf Fehmarn - case "2": + case '2': return "4372"; // Westfehmarn default: return ""; @@ -9312,16 +9322,16 @@ private static String fromNumber438(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4381"; // Lütjenburg - case "2": + case '2': return "4382"; // Wangels - case "3": + case '3': return "4383"; // Grebin - case "4": + case '4': return "4384"; // Selent - case "5": + case '5': return "4385"; // Hohenfelde b Kiel default: return ""; @@ -9333,12 +9343,12 @@ private static String fromNumber439(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4392"; // Nortorf b Neumünster - case "3": + case '3': return "4393"; // Boostedt - case "4": + case '4': return "4394"; // Bokhorst default: return ""; @@ -9350,26 +9360,26 @@ private static String fromNumber44(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber440(number.substring(1)); - case "1": + case '1': return "441"; // Oldenburg (Oldb) - case "2": + case '2': return fromNumber442(number.substring(1)); - case "3": + case '3': return fromNumber443(number.substring(1)); - case "4": + case '4': return fromNumber444(number.substring(1)); - case "5": + case '5': return fromNumber445(number.substring(1)); - case "6": + case '6': return fromNumber446(number.substring(1)); - case "7": + case '7': return fromNumber447(number.substring(1)); - case "8": + case '8': return fromNumber448(number.substring(1)); - case "9": + case '9': return fromNumber449(number.substring(1)); default: return ""; @@ -9381,24 +9391,24 @@ private static String fromNumber440(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4401"; // Brake Unterweser - case "2": + case '2': return "4402"; // Rastede - case "3": + case '3': return "4403"; // Bad Zwischenahn - case "4": + case '4': return "4404"; // Elsfleth - case "5": + case '5': return "4405"; // Edewecht - case "6": + case '6': return "4406"; // Berne - case "7": + case '7': return "4407"; // Wardenburg - case "8": + case '8': return "4408"; // Hude Oldenburg - case "9": + case '9': return "4409"; // Westerstede-Ocholt default: return ""; @@ -9410,16 +9420,16 @@ private static String fromNumber442(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4421"; // Wilhelmshaven - case "2": + case '2': return "4422"; // Sande Kr Friesl - case "3": + case '3': return "4423"; // Fedderwarden - case "5": + case '5': return "4425"; // Wangerland-Hooksiel - case "6": + case '6': return "4426"; // Wangerland-Horumersiel default: return ""; @@ -9431,16 +9441,16 @@ private static String fromNumber443(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4431"; // Wildeshausen - case "2": + case '2': return "4432"; // Dötlingen-Brettorf - case "3": + case '3': return "4433"; // Dötlingen - case "4": + case '4': return "4434"; // Colnrade - case "5": + case '5': return "4435"; // Grossenkneten default: return ""; @@ -9452,20 +9462,20 @@ private static String fromNumber444(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4441"; // Vechta - case "2": + case '2': return "4442"; // Lohne Oldenburg - case "3": + case '3': return "4443"; // Dinklage - case "4": + case '4': return "4444"; // Goldenstedt - case "5": + case '5': return "4445"; // Visbek Kr Vechta - case "6": + case '6': return "4446"; // Bakum Kr Vechta - case "7": + case '7': return "4447"; // Vechta-Langförden default: return ""; @@ -9477,20 +9487,20 @@ private static String fromNumber445(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4451"; // Varel Jadebusen - case "2": + case '2': return "4452"; // Zetel-Neuenburg - case "3": + case '3': return "4453"; // Zetel - case "4": + case '4': return "4454"; // Jade - case "5": + case '5': return "4455"; // Jade-Schweiburg - case "6": + case '6': return "4456"; // Varel-Altjührden - case "8": + case '8': return "4458"; // Wiefelstede-Spohle default: return ""; @@ -9502,24 +9512,24 @@ private static String fromNumber446(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4461"; // Jever - case "2": + case '2': return "4462"; // Wittmund - case "3": + case '3': return "4463"; // Wangerland - case "4": + case '4': return "4464"; // Wittmund-Carolinensiel - case "5": + case '5': return "4465"; // Friedeburg Ostfriesl - case "6": + case '6': return "4466"; // Wittmund-Ardorf - case "7": + case '7': return "4467"; // Wittmund-Funnix - case "8": + case '8': return "4468"; // Friedeburg-Reepsholt - case "9": + case '9': return "4469"; // Wangerooge default: return ""; @@ -9531,22 +9541,22 @@ private static String fromNumber447(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4471"; // Cloppenburg - case "2": + case '2': return "4472"; // Lastrup - case "3": + case '3': return "4473"; // Emstek - case "4": + case '4': return "4474"; // Garrel - case "5": + case '5': return "4475"; // Molbergen - case "7": + case '7': return "4477"; // Lastrup-Hemmelte - case "8": + case '8': return "4478"; // Cappeln Oldenburg - case "9": + case '9': return "4479"; // Molbergen-Peheim default: return ""; @@ -9558,26 +9568,26 @@ private static String fromNumber448(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4480"; // Ovelgönne-Strückhausen - case "1": + case '1': return "4481"; // Hatten-Sandkrug - case "2": + case '2': return "4482"; // Hatten - case "3": + case '3': return "4483"; // Ovelgönne-Großenmeer - case "4": + case '4': return "4484"; // Hude-Wüsting - case "5": + case '5': return "4485"; // Elsfleth-Huntorf - case "6": + case '6': return "4486"; // Edewecht-Friedrichsfehn - case "7": + case '7': return "4487"; // Grossenkneten-Huntlosen - case "8": + case '8': return "4488"; // Westerstede - case "9": + case '9': return "4489"; // Apen default: return ""; @@ -9589,24 +9599,24 @@ private static String fromNumber449(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4491"; // Friesoythe - case "2": + case '2': return "4492"; // Saterland - case "3": + case '3': return "4493"; // Friesoythe-Gehlenberg - case "4": + case '4': return "4494"; // Bösel Oldenburg - case "5": + case '5': return "4495"; // Friesoythe-Thüle - case "6": + case '6': return "4496"; // Friesoythe-Markhausen - case "7": + case '7': return "4497"; // Barßel-Harkebrügge - case "8": + case '8': return "4498"; // Saterland-Ramsloh - case "9": + case '9': return "4499"; // Barssel default: return ""; @@ -9618,20 +9628,20 @@ private static String fromNumber45(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber450(number.substring(1)); - case "1": + case '1': return "451"; // Lübeck - case "2": + case '2': return fromNumber452(number.substring(1)); - case "3": + case '3': return fromNumber453(number.substring(1)); - case "4": + case '4': return fromNumber454(number.substring(1)); - case "5": + case '5': return fromNumber455(number.substring(1)); - case "6": + case '6': return fromNumber456(number.substring(1)); default: return ""; @@ -9643,22 +9653,22 @@ private static String fromNumber450(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4501"; // Kastorf Holst - case "2": + case '2': return "4502"; // Lübeck-Travemünde - case "3": + case '3': return "4503"; // Timmendorfer Strand - case "4": + case '4': return "4504"; // Ratekau - case "5": + case '5': return "4505"; // Stockelsdorf-Curau - case "6": + case '6': return "4506"; // Stockelsdorf-Krumbeck - case "8": + case '8': return "4508"; // Krummesse - case "9": + case '9': return "4509"; // Groß Grönau default: return ""; @@ -9670,24 +9680,24 @@ private static String fromNumber452(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4521"; // Eutin - case "2": + case '2': return "4522"; // Plön - case "3": + case '3': return "4523"; // Malente - case "4": + case '4': return "4524"; // Scharbeutz-Pönitz - case "5": + case '5': return "4525"; // Ahrensbök - case "6": + case '6': return "4526"; // Ascheberg Holstein - case "7": + case '7': return "4527"; // Bosau - case "8": + case '8': return "4528"; // Schönwalde am Bungsberg - case "9": + case '9': return "4529"; // Süsel-Bujendorf default: return ""; @@ -9699,22 +9709,22 @@ private static String fromNumber453(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4531"; // Bad Oldesloe - case "2": + case '2': return "4532"; // Bargteheide - case "3": + case '3': return "4533"; // Reinfeld Holstein - case "4": + case '4': return "4534"; // Steinburg Kr Storman - case "5": + case '5': return "4535"; // Nahe - case "6": + case '6': return "4536"; // Steinhorst Lauenb - case "7": + case '7': return "4537"; // Sülfeld Holst - case "9": + case '9': return "4539"; // Westerau default: return ""; @@ -9726,20 +9736,20 @@ private static String fromNumber454(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4541"; // Ratzeburg - case "2": + case '2': return "4542"; // Mölln Lauenb - case "3": + case '3': return "4543"; // Nusse - case "4": + case '4': return "4544"; // Berkenthin - case "5": + case '5': return "4545"; // Seedorf Lauenb - case "6": + case '6': return "4546"; // Mustin Lauenburg - case "7": + case '7': return "4547"; // Gudow Lauenb default: return ""; @@ -9751,26 +9761,26 @@ private static String fromNumber455(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4550"; // Bühnsdorf - case "1": + case '1': return "4551"; // Bad Segeberg - case "2": + case '2': return "4552"; // Leezen - case "3": + case '3': return "4553"; // Geschendorf - case "4": + case '4': return "4554"; // Wahlstedt - case "5": + case '5': return "4555"; // Seedorf b Bad Segeberg - case "6": + case '6': return "4556"; // Ahrensbök-Gnissau - case "7": + case '7': return "4557"; // Blunk - case "8": + case '8': return "4558"; // Todesfelde - case "9": + case '9': return "4559"; // Wensin default: return ""; @@ -9782,14 +9792,14 @@ private static String fromNumber456(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4561"; // Neustadt in Holstein - case "2": + case '2': return "4562"; // Grömitz - case "3": + case '3': return "4563"; // Scharbeutz-Haffkrug - case "4": + case '4': return "4564"; // Schashagen default: return ""; @@ -9801,24 +9811,24 @@ private static String fromNumber46(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber460(number.substring(1)); - case "1": + case '1': return "461"; // Flensburg - case "2": + case '2': return fromNumber462(number.substring(1)); - case "3": + case '3': return fromNumber463(number.substring(1)); - case "4": + case '4': return fromNumber464(number.substring(1)); - case "5": + case '5': return fromNumber465(number.substring(1)); - case "6": + case '6': return fromNumber466(number.substring(1)); - case "7": + case '7': return fromNumber467(number.substring(1)); - case "8": + case '8': return fromNumber468(number.substring(1)); default: return ""; @@ -9830,22 +9840,22 @@ private static String fromNumber460(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4602"; // Freienwill - case "3": + case '3': return "4603"; // Havetoft - case "4": + case '4': return "4604"; // Grossenwiehe - case "5": + case '5': return "4605"; // Medelby - case "6": + case '6': return "4606"; // Wanderup - case "7": + case '7': return "4607"; // Janneby - case "8": + case '8': return "4608"; // Handewitt - case "9": + case '9': return "4609"; // Eggebek default: return ""; @@ -9857,20 +9867,20 @@ private static String fromNumber462(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4621"; // Schleswig - case "2": + case '2': return "4622"; // Taarstedt - case "3": + case '3': return "4623"; // Böklund - case "4": + case '4': return "4624"; // Kropp - case "5": + case '5': return "4625"; // Jübek - case "6": + case '6': return "4626"; // Treia - case "7": + case '7': return "4627"; // Dörpstedt default: return ""; @@ -9882,26 +9892,26 @@ private static String fromNumber463(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4630"; // Barderup - case "1": + case '1': return "4631"; // Glücksburg Ostsee - case "2": + case '2': return "4632"; // Steinbergkirche - case "3": + case '3': return "4633"; // Satrup - case "4": + case '4': return "4634"; // Husby - case "5": + case '5': return "4635"; // Sörup - case "6": + case '6': return "4636"; // Langballig - case "7": + case '7': return "4637"; // Sterup - case "8": + case '8': return "4638"; // Tarp - case "9": + case '9': return "4639"; // Schafflund default: return ""; @@ -9913,16 +9923,16 @@ private static String fromNumber464(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4641"; // Süderbrarup - case "2": + case '2': return "4642"; // Kappeln Schlei - case "3": + case '3': return "4643"; // Gelting Angeln - case "4": + case '4': return "4644"; // Karby - case "6": + case '6': return "4646"; // Mohrkirch default: return ""; @@ -9934,8 +9944,8 @@ private static String fromNumber465(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4651"; // Sylt default: return ""; @@ -9947,22 +9957,22 @@ private static String fromNumber466(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4661"; // Niebüll - case "2": + case '2': return "4662"; // Leck - case "3": + case '3': return "4663"; // Süderlügum - case "4": + case '4': return "4664"; // Neukirchen b Niebüll - case "5": + case '5': return "4665"; // Emmelsbüll-Horsbüll - case "6": + case '6': return "4666"; // Ladelund - case "7": + case '7': return "4667"; // Dagebüll - case "8": + case '8': return "4668"; // Klanxbüll default: return ""; @@ -9974,14 +9984,14 @@ private static String fromNumber467(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4671"; // Bredstedt - case "2": + case '2': return "4672"; // Langenhorn - case "3": + case '3': return "4673"; // Joldelund - case "4": + case '4': return "4674"; // Ockholm default: return ""; @@ -9993,14 +10003,14 @@ private static String fromNumber468(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4681"; // Wyk auf Föhr - case "2": + case '2': return "4682"; // Amrum - case "3": + case '3': return "4683"; // Oldsum - case "4": + case '4': return "4684"; // Langeneß Hallig default: return ""; @@ -10012,24 +10022,24 @@ private static String fromNumber47(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber470(number.substring(1)); - case "1": + case '1': return "471"; // Bremerhaven - case "2": + case '2': return fromNumber472(number.substring(1)); - case "3": + case '3': return fromNumber473(number.substring(1)); - case "4": + case '4': return fromNumber474(number.substring(1)); - case "5": + case '5': return fromNumber475(number.substring(1)); - case "6": + case '6': return fromNumber476(number.substring(1)); - case "7": + case '7': return fromNumber477(number.substring(1)); - case "9": + case '9': return fromNumber479(number.substring(1)); default: return ""; @@ -10041,20 +10051,20 @@ private static String fromNumber470(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4702"; // Sandstedt - case "3": + case '3': return "4703"; // Loxstedt-Donnern - case "4": + case '4': return "4704"; // Drangstedt - case "5": + case '5': return "4705"; // Wremen - case "6": + case '6': return "4706"; // Schiffdorf - case "7": + case '7': return "4707"; // Langen-Neuenwalde - case "8": + case '8': return "4708"; // Ringstedt default: return ""; @@ -10066,16 +10076,16 @@ private static String fromNumber472(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4721"; // Cuxhaven - case "2": + case '2': return "4722"; // Cuxhaven-Altenbruch - case "3": + case '3': return "4723"; // Cuxhaven-Altenwalde - case "4": + case '4': return "4724"; // Cuxhaven-Lüdingworth - case "5": + case '5': return "4725"; // Helgoland default: return ""; @@ -10087,20 +10097,20 @@ private static String fromNumber473(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4731"; // Nordenham - case "2": + case '2': return "4732"; // Stadland-Rodenkirchen - case "3": + case '3': return "4733"; // Butjadingen-Burhave - case "4": + case '4': return "4734"; // Stadland-Seefeld - case "5": + case '5': return "4735"; // Butjadingen-Stollhamm - case "6": + case '6': return "4736"; // Butjadingen-Tossens - case "7": + case '7': return "4737"; // Stadland-Schwei default: return ""; @@ -10112,26 +10122,26 @@ private static String fromNumber474(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4740"; // Loxstedt-Dedesdorf - case "1": + case '1': return "4741"; // Nordholz b Bremerhaven - case "2": + case '2': return "4742"; // Dorum - case "3": + case '3': return "4743"; // Langen b Bremerhaven - case "4": + case '4': return "4744"; // Loxstedt - case "5": + case '5': return "4745"; // Bad Bederkesa - case "6": + case '6': return "4746"; // Hagen b Bremerhaven - case "7": + case '7': return "4747"; // Beverstedt - case "8": + case '8': return "4748"; // Stubben b Bremerhaven - case "9": + case '9': return "4749"; // Schiffdorf-Geestenseth default: return ""; @@ -10143,22 +10153,22 @@ private static String fromNumber475(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4751"; // Otterndorf - case "2": + case '2': return "4752"; // Neuhaus Oste - case "3": + case '3': return "4753"; // Balje - case "4": + case '4': return "4754"; // Bülkau - case "5": + case '5': return "4755"; // Ihlienworth - case "6": + case '6': return "4756"; // Odisheim - case "7": + case '7': return "4757"; // Wanna - case "8": + case '8': return "4758"; // Nordleda default: return ""; @@ -10170,24 +10180,24 @@ private static String fromNumber476(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4761"; // Bremervörde - case "2": + case '2': return "4762"; // Kutenholz - case "3": + case '3': return "4763"; // Gnarrenburg - case "4": + case '4': return "4764"; // Gnarrenburg-Klenkendorf - case "5": + case '5': return "4765"; // Ebersdorf b Bremervörde - case "6": + case '6': return "4766"; // Basdahl - case "7": + case '7': return "4767"; // Bremervörde-Bevern - case "8": + case '8': return "4768"; // Hipstedt - case "9": + case '9': return "4769"; // Bremervörde-Iselersheim default: return ""; @@ -10199,26 +10209,26 @@ private static String fromNumber477(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4770"; // Wischhafen - case "1": + case '1': return "4771"; // Hemmoor - case "2": + case '2': return "4772"; // Oberndorf Oste - case "3": + case '3': return "4773"; // Lamstedt - case "4": + case '4': return "4774"; // Hechthausen - case "5": + case '5': return "4775"; // Grossenwörden - case "6": + case '6': return "4776"; // Osten-Altendorf - case "7": + case '7': return "4777"; // Cadenberge - case "8": + case '8': return "4778"; // Wingst - case "9": + case '9': return "4779"; // Freiburg Elbe default: return ""; @@ -10230,18 +10240,18 @@ private static String fromNumber479(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4791"; // Osterholz-Scharmbeck - case "2": + case '2': return "4792"; // Worpswede - case "3": + case '3': return "4793"; // Hambergen - case "4": + case '4': return "4794"; // Worpswede-Ostersode - case "5": + case '5': return "4795"; // Garlstedt - case "6": + case '6': return "4796"; // Teufelsmoor default: return ""; @@ -10253,26 +10263,26 @@ private static String fromNumber48(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber480(number.substring(1)); - case "1": + case '1': return "481"; // Heide Holst - case "2": + case '2': return fromNumber482(number.substring(1)); - case "3": + case '3': return fromNumber483(number.substring(1)); - case "4": + case '4': return fromNumber484(number.substring(1)); - case "5": + case '5': return fromNumber485(number.substring(1)); - case "6": + case '6': return fromNumber486(number.substring(1)); - case "7": + case '7': return fromNumber487(number.substring(1)); - case "8": + case '8': return fromNumber488(number.substring(1)); - case "9": + case '9': return fromNumber489(number.substring(1)); default: return ""; @@ -10284,16 +10294,16 @@ private static String fromNumber480(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4802"; // Wrohm - case "3": + case '3': return "4803"; // Pahlen - case "4": + case '4': return "4804"; // Nordhastedt - case "5": + case '5': return "4805"; // Schafstedt - case "6": + case '6': return "4806"; // Sarzbüttel default: return ""; @@ -10305,24 +10315,24 @@ private static String fromNumber482(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4821"; // Itzehoe - case "2": + case '2': return "4822"; // Kellinghusen - case "3": + case '3': return "4823"; // Wilster - case "4": + case '4': return "4824"; // Krempe - case "5": + case '5': return "4825"; // Burg Dithmarschen - case "6": + case '6': return "4826"; // Hohenlockstedt - case "7": + case '7': return "4827"; // Wacken - case "8": + case '8': return "4828"; // Lägerdorf - case "9": + case '9': return "4829"; // Wewelsfleth default: return ""; @@ -10334,24 +10344,24 @@ private static String fromNumber483(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4830"; // Süderhastedt - case "2": + case '2': return "4832"; // Meldorf - case "3": + case '3': return "4833"; // Wesselburen - case "4": + case '4': return "4834"; // Büsum - case "5": + case '5': return "4835"; // Albersdorf Holst - case "6": + case '6': return "4836"; // Hennstedt Dithm - case "7": + case '7': return "4837"; // Neuenkirchen Dithm - case "8": + case '8': return "4838"; // Tellingstedt - case "9": + case '9': return "4839"; // Wöhrden Dithm default: return ""; @@ -10363,24 +10373,24 @@ private static String fromNumber484(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4841"; // Husum Nordsee - case "2": + case '2': return "4842"; // Nordstrand - case "3": + case '3': return "4843"; // Viöl - case "4": + case '4': return "4844"; // Pellworm - case "5": + case '5': return "4845"; // Ostenfeld Husum - case "6": + case '6': return "4846"; // Hattstedt - case "7": + case '7': return "4847"; // Oster-Ohrstedt - case "8": + case '8': return "4848"; // Rantrum - case "9": + case '9': return "4849"; // Hooge default: return ""; @@ -10392,24 +10402,24 @@ private static String fromNumber485(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4851"; // Marne - case "2": + case '2': return "4852"; // Brunsbüttel - case "3": + case '3': return "4853"; // Sankt Michaelisdonn - case "4": + case '4': return "4854"; // Friedrichskoog - case "5": + case '5': return "4855"; // Eddelak - case "6": + case '6': return "4856"; // Kronprinzenkoog - case "7": + case '7': return "4857"; // Barlt - case "8": + case '8': return "4858"; // Sankt Margarethen Holst - case "9": + case '9': return "4859"; // Windbergen default: return ""; @@ -10421,16 +10431,16 @@ private static String fromNumber486(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4861"; // Tönning - case "2": + case '2': return "4862"; // Garding - case "3": + case '3': return "4863"; // Sankt Peter-Ording - case "4": + case '4': return "4864"; // Oldenswort - case "5": + case '5': return "4865"; // Osterhever default: return ""; @@ -10442,20 +10452,20 @@ private static String fromNumber487(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4871"; // Hohenwestedt - case "2": + case '2': return "4872"; // Hanerau-Hademarschen - case "3": + case '3': return "4873"; // Aukrug - case "4": + case '4': return "4874"; // Todenbüttel - case "5": + case '5': return "4875"; // Stafstedt - case "6": + case '6': return "4876"; // Reher Holst - case "7": + case '7': return "4877"; // Hennstedt b Itzehoe default: return ""; @@ -10467,16 +10477,16 @@ private static String fromNumber488(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4881"; // Friedrichstadt - case "2": + case '2': return "4882"; // Lunden - case "3": + case '3': return "4883"; // Süderstapel - case "4": + case '4': return "4884"; // Schwabstedt - case "5": + case '5': return "4885"; // Bergenhusen default: return ""; @@ -10488,10 +10498,10 @@ private static String fromNumber489(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4892"; // Schenefeld Mittelholst - case "3": + case '3': return "4893"; // Hohenaspe default: return ""; @@ -10503,22 +10513,22 @@ private static String fromNumber49(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber490(number.substring(1)); - case "1": + case '1': return "491"; // Leer Ostfriesland - case "2": + case '2': return fromNumber492(number.substring(1)); - case "3": + case '3': return fromNumber493(number.substring(1)); - case "4": + case '4': return fromNumber494(number.substring(1)); - case "5": + case '5': return fromNumber495(number.substring(1)); - case "6": + case '6': return fromNumber496(number.substring(1)); - case "7": + case '7': return fromNumber497(number.substring(1)); default: return ""; @@ -10530,10 +10540,10 @@ private static String fromNumber490(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "4902"; // Jemgum-Ditzum - case "3": + case '3': return "4903"; // Wymeer default: return ""; @@ -10545,26 +10555,26 @@ private static String fromNumber492(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4920"; // Wirdum - case "1": + case '1': return "4921"; // Emden Stadt - case "2": + case '2': return "4922"; // Borkum - case "3": + case '3': return "4923"; // Krummhörn-Pewsum - case "4": + case '4': return "4924"; // Moormerland-Oldersum - case "5": + case '5': return "4925"; // Hinte - case "6": + case '6': return "4926"; // Krummhörn-Greetsiel - case "7": + case '7': return "4927"; // Krummhörn-Loquard - case "8": + case '8': return "4928"; // Ihlow-Riepe - case "9": + case '9': return "4929"; // Ihlow Kr Aurich default: return ""; @@ -10576,22 +10586,22 @@ private static String fromNumber493(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4931"; // Norden - case "2": + case '2': return "4932"; // Norderney - case "3": + case '3': return "4933"; // Dornum Ostfriesl - case "4": + case '4': return "4934"; // Marienhafe - case "5": + case '5': return "4935"; // Juist - case "6": + case '6': return "4936"; // Grossheide - case "8": + case '8': return "4938"; // Hagermarsch - case "9": + case '9': return "4939"; // Baltrum default: return ""; @@ -10603,22 +10613,22 @@ private static String fromNumber494(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4941"; // Aurich - case "2": + case '2': return "4942"; // Südbrookmerland - case "3": + case '3': return "4943"; // Grossefehn - case "4": + case '4': return "4944"; // Wiesmoor - case "5": + case '5': return "4945"; // Grossefehn-Timmel - case "6": + case '6': return "4946"; // Grossefehn-Bagband - case "7": + case '7': return "4947"; // Aurich-Ogenbargen - case "8": + case '8': return "4948"; // Wiesmoor-Marcardsmoor default: return ""; @@ -10630,26 +10640,26 @@ private static String fromNumber495(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "4950"; // Holtland - case "1": + case '1': return "4951"; // Weener - case "2": + case '2': return "4952"; // Rhauderfehn - case "3": + case '3': return "4953"; // Bunde - case "4": + case '4': return "4954"; // Moormerland - case "5": + case '5': return "4955"; // Westoverledingen - case "6": + case '6': return "4956"; // Uplengen - case "7": + case '7': return "4957"; // Detern - case "8": + case '8': return "4958"; // Jemgum - case "9": + case '9': return "4959"; // Dollart default: return ""; @@ -10661,22 +10671,22 @@ private static String fromNumber496(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4961"; // Papenburg - case "2": + case '2': return "4962"; // Papenburg-Aschendorf - case "3": + case '3': return "4963"; // Dörpen - case "4": + case '4': return "4964"; // Rhede Ems - case "5": + case '5': return "4965"; // Surwold - case "6": + case '6': return "4966"; // Neubörger - case "7": + case '7': return "4967"; // Rhauderfehn-Burlage - case "8": + case '8': return "4968"; // Neulehe default: return ""; @@ -10688,20 +10698,20 @@ private static String fromNumber497(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "4971"; // Esens - case "2": + case '2': return "4972"; // Langeoog - case "3": + case '3': return "4973"; // Wittmund-Burhafe - case "4": + case '4': return "4974"; // Neuharlingersiel - case "5": + case '5': return "4975"; // Westerholt Ostfriesl - case "6": + case '6': return "4976"; // Spiekeroog - case "7": + case '7': return "4977"; // Blomberg Ostfriesl default: return ""; @@ -10713,26 +10723,26 @@ private static String fromNumber5(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber50(number.substring(1)); - case "1": + case '1': return fromNumber51(number.substring(1)); - case "2": + case '2': return fromNumber52(number.substring(1)); - case "3": + case '3': return fromNumber53(number.substring(1)); - case "4": + case '4': return fromNumber54(number.substring(1)); - case "5": + case '5': return fromNumber55(number.substring(1)); - case "6": + case '6': return fromNumber56(number.substring(1)); - case "7": + case '7': return fromNumber57(number.substring(1)); - case "8": + case '8': return fromNumber58(number.substring(1)); - case "9": + case '9': return fromNumber59(number.substring(1)); default: return ""; @@ -10744,20 +10754,20 @@ private static String fromNumber50(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber502(number.substring(1)); - case "3": + case '3': return fromNumber503(number.substring(1)); - case "4": + case '4': return fromNumber504(number.substring(1)); - case "5": + case '5': return fromNumber505(number.substring(1)); - case "6": + case '6': return fromNumber506(number.substring(1)); - case "7": + case '7': return fromNumber507(number.substring(1)); - case "8": + case '8': return fromNumber508(number.substring(1)); default: return ""; @@ -10769,22 +10779,22 @@ private static String fromNumber502(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5021"; // Nienburg Weser - case "2": + case '2': return "5022"; // Wietzen - case "3": + case '3': return "5023"; // Liebenau Kr Nieburg Weser - case "4": + case '4': return "5024"; // Rohrsen Kr Nienburg Weser - case "5": + case '5': return "5025"; // Estorf Weser - case "6": + case '6': return "5026"; // Steimbke - case "7": + case '7': return "5027"; // Linsburg - case "8": + case '8': return "5028"; // Pennigsehl default: return ""; @@ -10796,20 +10806,20 @@ private static String fromNumber503(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5031"; // Wunstorf - case "2": + case '2': return "5032"; // Neustadt am Rübenberge - case "3": + case '3': return "5033"; // Wunstorf-Grossenheidorn - case "4": + case '4': return "5034"; // Neustadt-Hagen - case "5": + case '5': return "5035"; // Gross Munzel - case "6": + case '6': return "5036"; // Neustadt-Schneeren - case "7": + case '7': return "5037"; // Bad Rehburg default: return ""; @@ -10821,16 +10831,16 @@ private static String fromNumber504(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5041"; // Springe Deister - case "2": + case '2': return "5042"; // Bad Münder am Deister - case "3": + case '3': return "5043"; // Lauenau - case "4": + case '4': return "5044"; // Springe-Eldagsen - case "5": + case '5': return "5045"; // Springe-Bennigsen default: return ""; @@ -10842,18 +10852,18 @@ private static String fromNumber505(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5051"; // Bergen Kr Celle - case "2": + case '2': return "5052"; // Hermannsburg - case "3": + case '3': return "5053"; // Faßberg-Müden - case "4": + case '4': return "5054"; // Bergen-Sülze - case "5": + case '5': return "5055"; // Fassberg - case "6": + case '6': return "5056"; // Winsen-Meissendorf default: return ""; @@ -10865,24 +10875,24 @@ private static String fromNumber506(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5060"; // Bodenburg - case "2": + case '2': return "5062"; // Holle b Hildesheim - case "3": + case '3': return "5063"; // Bad Salzdetfurth - case "4": + case '4': return "5064"; // Groß Düngen - case "5": + case '5': return "5065"; // Sibbesse - case "6": + case '6': return "5066"; // Sarstedt - case "7": + case '7': return "5067"; // Bockenem - case "8": + case '8': return "5068"; // Elze Leine - case "9": + case '9': return "5069"; // Nordstemmen default: return ""; @@ -10894,14 +10904,14 @@ private static String fromNumber507(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5071"; // Schwarmstedt - case "2": + case '2': return "5072"; // Neustadt-Mandelsloh - case "3": + case '3': return "5073"; // Neustadt-Esperke - case "4": + case '4': return "5074"; // Rodewald default: return ""; @@ -10913,16 +10923,16 @@ private static String fromNumber508(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5082"; // Langlingen - case "3": + case '3': return "5083"; // Hohne b Celle - case "4": + case '4': return "5084"; // Hambühren - case "5": + case '5': return "5085"; // Burgdorf-Ehlershausen - case "6": + case '6': return "5086"; // Celle-Scheuen default: return ""; @@ -10934,26 +10944,26 @@ private static String fromNumber51(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber510(number.substring(1)); - case "1": + case '1': return "511"; // Hannover - case "2": + case '2': return fromNumber512(number.substring(1)); - case "3": + case '3': return fromNumber513(number.substring(1)); - case "4": + case '4': return fromNumber514(number.substring(1)); - case "5": + case '5': return fromNumber515(number.substring(1)); - case "6": + case '6': return fromNumber516(number.substring(1)); - case "7": + case '7': return fromNumber517(number.substring(1)); - case "8": + case '8': return fromNumber518(number.substring(1)); - case "9": + case '9': return fromNumber519(number.substring(1)); default: return ""; @@ -10965,18 +10975,18 @@ private static String fromNumber510(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5101"; // Pattensen - case "2": + case '2': return "5102"; // Laatzen - case "3": + case '3': return "5103"; // Wennigsen Deister - case "5": + case '5': return "5105"; // Barsinghausen - case "8": + case '8': return "5108"; // Gehrden Han - case "9": + case '9': return "5109"; // Ronnenberg default: return ""; @@ -10988,18 +10998,18 @@ private static String fromNumber512(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5121"; // Hildesheim - case "3": + case '3': return "5123"; // Schellerten - case "6": + case '6': return "5126"; // Algermissen - case "7": + case '7': return "5127"; // Harsum - case "8": + case '8': return "5128"; // Hohenhameln - case "9": + case '9': return "5129"; // Söhlde default: return ""; @@ -11011,22 +11021,22 @@ private static String fromNumber513(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5130"; // Wedemark - case "1": + case '1': return "5131"; // Garbsen - case "2": + case '2': return "5132"; // Lehrte - case "5": + case '5': return "5135"; // Burgwedel-Fuhrberg - case "6": + case '6': return "5136"; // Burgdorf Kr Hannover - case "7": + case '7': return "5137"; // Seelze - case "8": + case '8': return "5138"; // Sehnde - case "9": + case '9': return "5139"; // Burgwedel default: return ""; @@ -11038,24 +11048,24 @@ private static String fromNumber514(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5141"; // Celle - case "2": + case '2': return "5142"; // Eschede - case "3": + case '3': return "5143"; // Winsen Aller - case "4": + case '4': return "5144"; // Wathlingen - case "5": + case '5': return "5145"; // Beedenbostel - case "6": + case '6': return "5146"; // Wietze - case "7": + case '7': return "5147"; // Uetze-Hänigsen - case "8": + case '8': return "5148"; // Steinhorst Niedersachs - case "9": + case '9': return "5149"; // Wienhausen default: return ""; @@ -11067,24 +11077,24 @@ private static String fromNumber515(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5151"; // Hameln - case "2": + case '2': return "5152"; // Hessisch Oldendorf - case "3": + case '3': return "5153"; // Salzhemmendorf - case "4": + case '4': return "5154"; // Aerzen - case "5": + case '5': return "5155"; // Emmerthal - case "6": + case '6': return "5156"; // Coppenbrügge - case "7": + case '7': return "5157"; // Emmerthal-Börry - case "8": + case '8': return "5158"; // Hemeringen - case "9": + case '9': return "5159"; // Coppenbrügge-Bisperode default: return ""; @@ -11096,22 +11106,22 @@ private static String fromNumber516(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5161"; // Walsrode - case "2": + case '2': return "5162"; // Fallingbostel - case "3": + case '3': return "5163"; // Fallingbostel-Dorfmark - case "4": + case '4': return "5164"; // Hodenhagen - case "5": + case '5': return "5165"; // Rethem Aller - case "6": + case '6': return "5166"; // Walsrode-Kirchboitzen - case "7": + case '7': return "5167"; // Walsrode-Westenholz - case "8": + case '8': return "5168"; // Walsrode-Stellichte default: return ""; @@ -11123,20 +11133,20 @@ private static String fromNumber517(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5171"; // Peine - case "2": + case '2': return "5172"; // Ilsede - case "3": + case '3': return "5173"; // Uetze - case "4": + case '4': return "5174"; // Lahstedt - case "5": + case '5': return "5175"; // Lehrte-Arpke - case "6": + case '6': return "5176"; // Edemissen - case "7": + case '7': return "5177"; // Edemissen-Abbensen default: return ""; @@ -11148,20 +11158,20 @@ private static String fromNumber518(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5181"; // Alfeld Leine - case "2": + case '2': return "5182"; // Gronau Leine - case "3": + case '3': return "5183"; // Lamspringe - case "4": + case '4': return "5184"; // Freden Leine - case "5": + case '5': return "5185"; // Duingen - case "6": + case '6': return "5186"; // Salzhemmendorf-Wallensen - case "7": + case '7': return "5187"; // Delligsen default: return ""; @@ -11173,26 +11183,26 @@ private static String fromNumber519(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5190"; // Soltau-Emmingen - case "1": + case '1': return "5191"; // Soltau - case "2": + case '2': return "5192"; // Munster - case "3": + case '3': return "5193"; // Schneverdingen - case "4": + case '4': return "5194"; // Bispingen - case "5": + case '5': return "5195"; // Neuenkirchen b Soltau - case "6": + case '6': return "5196"; // Wietzendorf - case "7": + case '7': return "5197"; // Soltau-Frielingen - case "8": + case '8': return "5198"; // Schneverdingen-Wintermoor - case "9": + case '9': return "5199"; // Schneverdingen-Heber default: return ""; @@ -11204,26 +11214,26 @@ private static String fromNumber52(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber520(number.substring(1)); - case "1": + case '1': return "521"; // Bielefeld - case "2": + case '2': return fromNumber522(number.substring(1)); - case "3": + case '3': return fromNumber523(number.substring(1)); - case "4": + case '4': return fromNumber524(number.substring(1)); - case "5": + case '5': return fromNumber525(number.substring(1)); - case "6": + case '6': return fromNumber526(number.substring(1)); - case "7": + case '7': return fromNumber527(number.substring(1)); - case "8": + case '8': return fromNumber528(number.substring(1)); - case "9": + case '9': return fromNumber529(number.substring(1)); default: return ""; @@ -11235,24 +11245,24 @@ private static String fromNumber520(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5201"; // Halle Westf - case "2": + case '2': return "5202"; // Oerlinghausen - case "3": + case '3': return "5203"; // Werther Westf - case "4": + case '4': return "5204"; // Steinhagen Westf - case "5": + case '5': return "5205"; // Bielefeld-Sennestadt - case "6": + case '6': return "5206"; // Bielefeld-Jöllenbeck - case "7": + case '7': return "5207"; // Schloss Holte-Stukenbrock - case "8": + case '8': return "5208"; // Leopoldshöhe - case "9": + case '9': return "5209"; // Gütersloh-Friedrichsdorf default: return ""; @@ -11264,20 +11274,20 @@ private static String fromNumber522(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5221"; // Herford - case "2": + case '2': return "5222"; // Bad Salzuflen - case "3": + case '3': return "5223"; // Bünde - case "4": + case '4': return "5224"; // Enger Westf - case "5": + case '5': return "5225"; // Spenge - case "6": + case '6': return "5226"; // Bruchmühlen Westf - case "8": + case '8': return "5228"; // Vlotho-Exter default: return ""; @@ -11289,22 +11299,22 @@ private static String fromNumber523(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5231"; // Detmold - case "2": + case '2': return "5232"; // Lage Lippe - case "3": + case '3': return "5233"; // Steinheim Westf - case "4": + case '4': return "5234"; // Horn-Bad Meinberg - case "5": + case '5': return "5235"; // Blomberg Lippe - case "6": + case '6': return "5236"; // Blomberg-Grossenmarpe - case "7": + case '7': return "5237"; // Augustdorf - case "8": + case '8': return "5238"; // Nieheim-Himmighausen default: return ""; @@ -11316,20 +11326,20 @@ private static String fromNumber524(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5241"; // Gütersloh - case "2": + case '2': return "5242"; // Rheda-Wiedenbrück - case "4": + case '4': return "5244"; // Rietberg - case "5": + case '5': return "5245"; // Herzebrock-Clarholz - case "6": + case '6': return "5246"; // Verl - case "7": + case '7': return "5247"; // Harsewinkel - case "8": + case '8': return "5248"; // Langenberg Kr Gütersloh default: return ""; @@ -11341,24 +11351,24 @@ private static String fromNumber525(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5250"; // Delbrück Westf - case "1": + case '1': return "5251"; // Paderborn - case "2": + case '2': return "5252"; // Bad Lippspringe - case "3": + case '3': return "5253"; // Bad Driburg - case "4": + case '4': return "5254"; // Paderborn-Schloss Neuhaus - case "5": + case '5': return "5255"; // Altenbeken - case "7": + case '7': return "5257"; // Hövelhof - case "8": + case '8': return "5258"; // Salzkotten - case "9": + case '9': return "5259"; // Bad Driburg-Neuenheerse default: return ""; @@ -11370,18 +11380,18 @@ private static String fromNumber526(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5261"; // Lemgo - case "2": + case '2': return "5262"; // Extertal - case "3": + case '3': return "5263"; // Barntrup - case "4": + case '4': return "5264"; // Kalletal - case "5": + case '5': return "5265"; // Dörentrup - case "6": + case '6': return "5266"; // Lemgo-Kirchheide default: return ""; @@ -11393,22 +11403,22 @@ private static String fromNumber527(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5271"; // Höxter - case "2": + case '2': return "5272"; // Brakel Westf - case "3": + case '3': return "5273"; // Beverungen - case "4": + case '4': return "5274"; // Nieheim - case "5": + case '5': return "5275"; // Höxter-Ottbergen - case "6": + case '6': return "5276"; // Marienmünster - case "7": + case '7': return "5277"; // Höxter-Fürstenau - case "8": + case '8': return "5278"; // Höxter-Ovenhausen default: return ""; @@ -11420,18 +11430,18 @@ private static String fromNumber528(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5281"; // Bad Pyrmont - case "2": + case '2': return "5282"; // Schieder-Schwalenberg - case "3": + case '3': return "5283"; // Lügde-Rischenau - case "4": + case '4': return "5284"; // Schwalenberg - case "5": + case '5': return "5285"; // Bad Pyrmont-Kleinenberg - case "6": + case '6': return "5286"; // Ottenstein Niedersachs default: return ""; @@ -11443,14 +11453,14 @@ private static String fromNumber529(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5292"; // Lichtenau-Atteln - case "3": + case '3': return "5293"; // Paderborn-Dahl - case "4": + case '4': return "5294"; // Hövelhof-Espeln - case "5": + case '5': return "5295"; // Lichtenau Westf default: return ""; @@ -11462,24 +11472,24 @@ private static String fromNumber53(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber530(number.substring(1)); - case "1": + case '1': return "531"; // Braunschweig - case "2": + case '2': return fromNumber532(number.substring(1)); - case "3": + case '3': return fromNumber533(number.substring(1)); - case "4": + case '4': return fromNumber534(number.substring(1)); - case "5": + case '5': return fromNumber535(number.substring(1)); - case "6": + case '6': return fromNumber536(number.substring(1)); - case "7": + case '7': return fromNumber537(number.substring(1)); - case "8": + case '8': return fromNumber538(number.substring(1)); default: return ""; @@ -11491,26 +11501,26 @@ private static String fromNumber530(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5300"; // Salzgitter-Üfingen - case "1": + case '1': return "5301"; // Lehre-Essenrode - case "2": + case '2': return "5302"; // Vechelde - case "3": + case '3': return "5303"; // Wendeburg - case "4": + case '4': return "5304"; // Meine - case "5": + case '5': return "5305"; // Sickte - case "6": + case '6': return "5306"; // Cremlingen - case "7": + case '7': return "5307"; // Braunschweig-Wenden - case "8": + case '8': return "5308"; // Lehre - case "9": + case '9': return "5309"; // Lehre-Wendhausen default: return ""; @@ -11522,26 +11532,26 @@ private static String fromNumber532(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5320"; // Torfhaus - case "1": + case '1': return "5321"; // Goslar - case "2": + case '2': return "5322"; // Bad Harzburg - case "3": + case '3': return "5323"; // Clausthal-Zellerfeld - case "4": + case '4': return "5324"; // Vienenburg - case "5": + case '5': return "5325"; // Goslar-Hahnenklee - case "6": + case '6': return "5326"; // Langelsheim - case "7": + case '7': return "5327"; // Bad Grund Harz - case "8": + case '8': return "5328"; // Altenau Harz - case "9": + case '9': return "5329"; // Schulenberg im Oberharz default: return ""; @@ -11553,22 +11563,22 @@ private static String fromNumber533(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5331"; // Wolfenbüttel - case "2": + case '2': return "5332"; // Schöppenstedt - case "3": + case '3': return "5333"; // Dettum - case "4": + case '4': return "5334"; // Hornburg Kr Wolfenbüttel - case "5": + case '5': return "5335"; // Schladen - case "6": + case '6': return "5336"; // Semmenstedt - case "7": + case '7': return "5337"; // Kissenbrück - case "9": + case '9': return "5339"; // Gielde default: return ""; @@ -11580,16 +11590,16 @@ private static String fromNumber534(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5341"; // Salzgitter - case "4": + case '4': return "5344"; // Lengede - case "5": + case '5': return "5345"; // Baddeckenstedt - case "6": + case '6': return "5346"; // Liebenburg - case "7": + case '7': return "5347"; // Burgdorf b Salzgitter default: return ""; @@ -11601,22 +11611,22 @@ private static String fromNumber535(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5351"; // Helmstedt - case "2": + case '2': return "5352"; // Schöningen - case "3": + case '3': return "5353"; // Königslutter am Elm - case "4": + case '4': return "5354"; // Jerxheim - case "5": + case '5': return "5355"; // Frellstedt - case "6": + case '6': return "5356"; // Helmstedt-Barmke - case "7": + case '7': return "5357"; // Grasleben - case "8": + case '8': return "5358"; // Bahrdorf-Mackendorf default: return ""; @@ -11628,22 +11638,22 @@ private static String fromNumber536(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5361"; // Wolfsburg - case "2": + case '2': return "5362"; // Wolfsburg-Fallersleben - case "3": + case '3': return "5363"; // Wolfsburg-Vorsfelde - case "4": + case '4': return "5364"; // Velpke - case "5": + case '5': return "5365"; // Wolfsburg-Neindorf - case "6": + case '6': return "5366"; // Jembke - case "7": + case '7': return "5367"; // Rühen - case "8": + case '8': return "5368"; // Parsau default: return ""; @@ -11655,24 +11665,24 @@ private static String fromNumber537(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5371"; // Gifhorn - case "2": + case '2': return "5372"; // Meinersen - case "3": + case '3': return "5373"; // Hillerse Kr Gifhorn - case "4": + case '4': return "5374"; // Isenbüttel - case "5": + case '5': return "5375"; // Müden Aller - case "6": + case '6': return "5376"; // Wesendorf Kr Gifhorn - case "7": + case '7': return "5377"; // Ehra-Lessien - case "8": + case '8': return "5378"; // Sassenburg-Platendorf - case "9": + case '9': return "5379"; // Sassenburg-Grussendorf default: return ""; @@ -11684,14 +11694,14 @@ private static String fromNumber538(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5381"; // Seesen - case "2": + case '2': return "5382"; // Bad Gandersheim - case "3": + case '3': return "5383"; // Lutter am Barenberge - case "4": + case '4': return "5384"; // Seesen-Groß Rhüden default: return ""; @@ -11703,26 +11713,26 @@ private static String fromNumber54(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber540(number.substring(1)); - case "1": + case '1': return "541"; // Osnabrück - case "2": + case '2': return fromNumber542(number.substring(1)); - case "3": + case '3': return fromNumber543(number.substring(1)); - case "4": + case '4': return fromNumber544(number.substring(1)); - case "5": + case '5': return fromNumber545(number.substring(1)); - case "6": + case '6': return fromNumber546(number.substring(1)); - case "7": + case '7': return fromNumber547(number.substring(1)); - case "8": + case '8': return fromNumber548(number.substring(1)); - case "9": + case '9': return fromNumber549(number.substring(1)); default: return ""; @@ -11734,22 +11744,22 @@ private static String fromNumber540(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5401"; // Georgsmarienhütte - case "2": + case '2': return "5402"; // Bissendorf Kr Osnabrück - case "3": + case '3': return "5403"; // Bad Iburg - case "4": + case '4': return "5404"; // Westerkappeln - case "5": + case '5': return "5405"; // Hasbergen Kr Osnabrück - case "6": + case '6': return "5406"; // Belm - case "7": + case '7': return "5407"; // Wallenhorst - case "9": + case '9': return "5409"; // Hilter am Teutoburger Wald default: return ""; @@ -11761,24 +11771,24 @@ private static String fromNumber542(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5421"; // Dissen am Teutoburger Wald - case "2": + case '2': return "5422"; // Melle - case "3": + case '3': return "5423"; // Versmold - case "4": + case '4': return "5424"; // Bad Rothenfelde - case "5": + case '5': return "5425"; // Borgholzhausen - case "6": + case '6': return "5426"; // Glandorf - case "7": + case '7': return "5427"; // Melle-Buer - case "8": + case '8': return "5428"; // Melle-Neuenkirchen - case "9": + case '9': return "5429"; // Melle-Wellingholzhausen default: return ""; @@ -11790,24 +11800,24 @@ private static String fromNumber543(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5431"; // Quakenbrück - case "2": + case '2': return "5432"; // Löningen - case "3": + case '3': return "5433"; // Badbergen - case "4": + case '4': return "5434"; // Essen Oldenburg - case "5": + case '5': return "5435"; // Berge b Quakenbrück - case "6": + case '6': return "5436"; // Nortrup - case "7": + case '7': return "5437"; // Menslage - case "8": + case '8': return "5438"; // Bakum-Lüsche - case "9": + case '9': return "5439"; // Bersenbrück default: return ""; @@ -11819,22 +11829,22 @@ private static String fromNumber544(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5441"; // Diepholz - case "2": + case '2': return "5442"; // Barnstorf Kr Diepholz - case "3": + case '3': return "5443"; // Lemförde - case "4": + case '4': return "5444"; // Wagenfeld - case "5": + case '5': return "5445"; // Drebber - case "6": + case '6': return "5446"; // Rehden - case "7": + case '7': return "5447"; // Lembruch - case "8": + case '8': return "5448"; // Barver default: return ""; @@ -11846,24 +11856,24 @@ private static String fromNumber545(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5451"; // Ibbenbüren - case "2": + case '2': return "5452"; // Mettingen Westf - case "3": + case '3': return "5453"; // Recke - case "4": + case '4': return "5454"; // Hörstel-Riesenbeck - case "5": + case '5': return "5455"; // Tecklenburg-Brochterbeck - case "6": + case '6': return "5456"; // Westerkappeln-Velpe - case "7": + case '7': return "5457"; // Hopsten-Schale - case "8": + case '8': return "5458"; // Hopsten - case "9": + case '9': return "5459"; // Hörstel default: return ""; @@ -11875,20 +11885,20 @@ private static String fromNumber546(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5461"; // Bramsche Hase - case "2": + case '2': return "5462"; // Ankum - case "4": + case '4': return "5464"; // Alfhausen - case "5": + case '5': return "5465"; // Neuenkirchen b Bramsche - case "6": + case '6': return "5466"; // Merzen - case "7": + case '7': return "5467"; // Voltlage - case "8": + case '8': return "5468"; // Bramsche-Engter default: return ""; @@ -11900,18 +11910,18 @@ private static String fromNumber547(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5471"; // Bohmte - case "2": + case '2': return "5472"; // Bad Essen - case "3": + case '3': return "5473"; // Ostercappeln - case "4": + case '4': return "5474"; // Stemwede-Dielingen - case "5": + case '5': return "5475"; // Bohmte-Hunteburg - case "6": + case '6': return "5476"; // Ostercappeln-Venne default: return ""; @@ -11923,16 +11933,16 @@ private static String fromNumber548(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5481"; // Lengerich Westf - case "2": + case '2': return "5482"; // Tecklenburg - case "3": + case '3': return "5483"; // Lienen - case "4": + case '4': return "5484"; // Lienen-Kattenvenne - case "5": + case '5': return "5485"; // Ladbergen default: return ""; @@ -11944,16 +11954,16 @@ private static String fromNumber549(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5491"; // Damme Dümmer - case "2": + case '2': return "5492"; // Steinfeld Oldenburg - case "3": + case '3': return "5493"; // Neuenkirchen Kr Vechta - case "4": + case '4': return "5494"; // Holdorf Niedersachs - case "5": + case '5': return "5495"; // Vörden Kr Vechta default: return ""; @@ -11965,26 +11975,26 @@ private static String fromNumber55(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber550(number.substring(1)); - case "1": + case '1': return "551"; // Göttingen - case "2": + case '2': return fromNumber552(number.substring(1)); - case "3": + case '3': return fromNumber553(number.substring(1)); - case "4": + case '4': return fromNumber554(number.substring(1)); - case "5": + case '5': return fromNumber555(number.substring(1)); - case "6": + case '6': return fromNumber556(number.substring(1)); - case "7": + case '7': return fromNumber557(number.substring(1)); - case "8": + case '8': return fromNumber558(number.substring(1)); - case "9": + case '9': return fromNumber559(number.substring(1)); default: return ""; @@ -11996,22 +12006,22 @@ private static String fromNumber550(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5502"; // Dransfeld - case "3": + case '3': return "5503"; // Nörten-Hardenberg - case "4": + case '4': return "5504"; // Friedland Kr Göttingen - case "5": + case '5': return "5505"; // Hardegsen - case "6": + case '6': return "5506"; // Adelebsen - case "7": + case '7': return "5507"; // Ebergötzen - case "8": + case '8': return "5508"; // Gleichen-Rittmarshausen - case "9": + case '9': return "5509"; // Rosdorf Kr Göttingen default: return ""; @@ -12023,24 +12033,24 @@ private static String fromNumber552(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5520"; // Braunlage - case "1": + case '1': return "5521"; // Herzberg am Harz - case "2": + case '2': return "5522"; // Osterode am Harz - case "3": + case '3': return "5523"; // Bad Sachsa - case "4": + case '4': return "5524"; // Bad Lauterberg im Harz - case "5": + case '5': return "5525"; // Walkenried - case "7": + case '7': return "5527"; // Duderstadt - case "8": + case '8': return "5528"; // Gieboldehausen - case "9": + case '9': return "5529"; // Rhumspringe default: return ""; @@ -12052,18 +12062,18 @@ private static String fromNumber553(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5531"; // Holzminden - case "2": + case '2': return "5532"; // Stadtoldendorf - case "3": + case '3': return "5533"; // Bodenwerder - case "4": + case '4': return "5534"; // Eschershausen a d Lenne - case "5": + case '5': return "5535"; // Polle - case "6": + case '6': return "5536"; // Holzminden-Neuhaus default: return ""; @@ -12075,18 +12085,18 @@ private static String fromNumber554(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5541"; // Hann. Münden - case "2": + case '2': return "5542"; // Witzenhausen - case "3": + case '3': return "5543"; // Staufenberg Niedersachs - case "4": + case '4': return "5544"; // Reinhardshagen - case "5": + case '5': return "5545"; // Hedemünden - case "6": + case '6': return "5546"; // Scheden default: return ""; @@ -12098,18 +12108,18 @@ private static String fromNumber555(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5551"; // Northeim - case "2": + case '2': return "5552"; // Katlenburg - case "3": + case '3': return "5553"; // Kalefeld - case "4": + case '4': return "5554"; // Moringen - case "5": + case '5': return "5555"; // Moringen-Fredelsloh - case "6": + case '6': return "5556"; // Lindau Harz default: return ""; @@ -12121,16 +12131,16 @@ private static String fromNumber556(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5561"; // Einbeck - case "2": + case '2': return "5562"; // Dassel-Markoldendorf - case "3": + case '3': return "5563"; // Kreiensen - case "4": + case '4': return "5564"; // Dassel - case "5": + case '5': return "5565"; // Einbeck-Wenzen default: return ""; @@ -12142,14 +12152,14 @@ private static String fromNumber557(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5571"; // Uslar - case "2": + case '2': return "5572"; // Bodenfelde - case "3": + case '3': return "5573"; // Uslar-Volpriehausen - case "4": + case '4': return "5574"; // Oberweser default: return ""; @@ -12161,16 +12171,16 @@ private static String fromNumber558(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5582"; // Sankt Andreasberg - case "3": + case '3': return "5583"; // Braunlage-Hohegeiss - case "4": + case '4': return "5584"; // Hattorf am Harz - case "5": + case '5': return "5585"; // Herzberg-Sieber - case "6": + case '6': return "5586"; // Wieda default: return ""; @@ -12182,12 +12192,12 @@ private static String fromNumber559(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5592"; // Gleichen-Bremke - case "3": + case '3': return "5593"; // Bovenden-Lenglern - case "4": + case '4': return "5594"; // Bovenden-Reyershausen default: return ""; @@ -12199,26 +12209,26 @@ private static String fromNumber56(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber560(number.substring(1)); - case "1": + case '1': return "561"; // Kassel - case "2": + case '2': return fromNumber562(number.substring(1)); - case "3": + case '3': return fromNumber563(number.substring(1)); - case "4": + case '4': return fromNumber564(number.substring(1)); - case "5": + case '5': return fromNumber565(number.substring(1)); - case "6": + case '6': return fromNumber566(number.substring(1)); - case "7": + case '7': return fromNumber567(number.substring(1)); - case "8": + case '8': return fromNumber568(number.substring(1)); - case "9": + case '9': return fromNumber569(number.substring(1)); default: return ""; @@ -12230,24 +12240,24 @@ private static String fromNumber560(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5601"; // Schauenburg - case "2": + case '2': return "5602"; // Hessisch Lichtenau - case "3": + case '3': return "5603"; // Gudensberg - case "4": + case '4': return "5604"; // Grossalmerode - case "5": + case '5': return "5605"; // Kaufungen Hess - case "6": + case '6': return "5606"; // Zierenberg - case "7": + case '7': return "5607"; // Fuldatal - case "8": + case '8': return "5608"; // Söhrewald - case "9": + case '9': return "5609"; // Ahnatal default: return ""; @@ -12259,18 +12269,18 @@ private static String fromNumber562(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5621"; // Bad Wildungen - case "2": + case '2': return "5622"; // Fritzlar - case "3": + case '3': return "5623"; // Edertal - case "4": + case '4': return "5624"; // Bad Emstal - case "5": + case '5': return "5625"; // Naumburg Hess - case "6": + case '6': return "5626"; // Bad Zwesten default: return ""; @@ -12282,18 +12292,18 @@ private static String fromNumber563(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5631"; // Korbach - case "2": + case '2': return "5632"; // Willingen Upland - case "3": + case '3': return "5633"; // Diemelsee - case "4": + case '4': return "5634"; // Waldeck-Sachsenhausen - case "5": + case '5': return "5635"; // Vöhl - case "6": + case '6': return "5636"; // Lichtenfels-Goddelsheim default: return ""; @@ -12305,22 +12315,22 @@ private static String fromNumber564(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5641"; // Warburg - case "2": + case '2': return "5642"; // Warburg-Scherfede - case "3": + case '3': return "5643"; // Borgentreich - case "4": + case '4': return "5644"; // Willebadessen-Peckelsheim - case "5": + case '5': return "5645"; // Borgentreich-Borgholz - case "6": + case '6': return "5646"; // Willebadessen - case "7": + case '7': return "5647"; // Lichtenau-Kleinenberg - case "8": + case '8': return "5648"; // Brakel-Gehrden default: return ""; @@ -12332,26 +12342,26 @@ private static String fromNumber565(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5650"; // Cornberg - case "1": + case '1': return "5651"; // Eschwege - case "2": + case '2': return "5652"; // Bad Sooden-Allendorf - case "3": + case '3': return "5653"; // Sontra - case "4": + case '4': return "5654"; // Herleshausen - case "5": + case '5': return "5655"; // Wanfried - case "6": + case '6': return "5656"; // Waldkappel - case "7": + case '7': return "5657"; // Meissner - case "8": + case '8': return "5658"; // Wehretal - case "9": + case '9': return "5659"; // Ringgau default: return ""; @@ -12363,16 +12373,16 @@ private static String fromNumber566(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5661"; // Melsungen - case "2": + case '2': return "5662"; // Felsberg Hess - case "3": + case '3': return "5663"; // Spangenberg - case "4": + case '4': return "5664"; // Morschen - case "5": + case '5': return "5665"; // Guxhagen default: return ""; @@ -12384,20 +12394,20 @@ private static String fromNumber567(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5671"; // Hofgeismar - case "2": + case '2': return "5672"; // Bad Karlshafen - case "3": + case '3': return "5673"; // Immenhausen Hess - case "4": + case '4': return "5674"; // Grebenstein - case "5": + case '5': return "5675"; // Trendelburg - case "6": + case '6': return "5676"; // Liebenau Hess - case "7": + case '7': return "5677"; // Calden-Westuffeln default: return ""; @@ -12409,18 +12419,18 @@ private static String fromNumber568(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5681"; // Homberg Efze - case "2": + case '2': return "5682"; // Borken Hessen - case "3": + case '3': return "5683"; // Wabern Hess - case "4": + case '4': return "5684"; // Frielendorf - case "5": + case '5': return "5685"; // Knüllwald - case "6": + case '6': return "5686"; // Schwarzenborn Knüll default: return ""; @@ -12432,18 +12442,18 @@ private static String fromNumber569(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5691"; // Bad Arolsen - case "2": + case '2': return "5692"; // Wolfhagen - case "3": + case '3': return "5693"; // Volkmarsen - case "4": + case '4': return "5694"; // Diemelstadt - case "5": + case '5': return "5695"; // Twistetal - case "6": + case '6': return "5696"; // Bad Arolsen-Landau default: return ""; @@ -12455,22 +12465,22 @@ private static String fromNumber57(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber570(number.substring(1)); - case "1": + case '1': return "571"; // Minden Westf - case "2": + case '2': return fromNumber572(number.substring(1)); - case "3": + case '3': return fromNumber573(number.substring(1)); - case "4": + case '4': return fromNumber574(number.substring(1)); - case "5": + case '5': return fromNumber575(number.substring(1)); - case "6": + case '6': return fromNumber576(number.substring(1)); - case "7": + case '7': return fromNumber577(number.substring(1)); default: return ""; @@ -12482,18 +12492,18 @@ private static String fromNumber570(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5702"; // Petershagen-Lahde - case "3": + case '3': return "5703"; // Hille - case "4": + case '4': return "5704"; // Petershagen-Friedewalde - case "5": + case '5': return "5705"; // Petershagen-Windheim - case "6": + case '6': return "5706"; // Porta Westfalica - case "7": + case '7': return "5707"; // Petershagen Weser default: return ""; @@ -12505,18 +12515,18 @@ private static String fromNumber572(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5721"; // Stadthagen - case "2": + case '2': return "5722"; // Bückeburg - case "3": + case '3': return "5723"; // Bad Nenndorf - case "4": + case '4': return "5724"; // Obernkirchen - case "5": + case '5': return "5725"; // Lindhorst b Stadthagen - case "6": + case '6': return "5726"; // Wiedensahl default: return ""; @@ -12528,14 +12538,14 @@ private static String fromNumber573(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5731"; // Bad Oeynhausen - case "2": + case '2': return "5732"; // Löhne - case "3": + case '3': return "5733"; // Vlotho - case "4": + case '4': return "5734"; // Bergkirchen Westf default: return ""; @@ -12547,18 +12557,18 @@ private static String fromNumber574(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5741"; // Lübbecke - case "2": + case '2': return "5742"; // Preussisch Oldendorf - case "3": + case '3': return "5743"; // Espelkamp-Gestringen - case "4": + case '4': return "5744"; // Hüllhorst - case "5": + case '5': return "5745"; // Stemwede-Levern - case "6": + case '6': return "5746"; // Rödinghausen default: return ""; @@ -12570,16 +12580,16 @@ private static String fromNumber575(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5751"; // Rinteln - case "2": + case '2': return "5752"; // Auetal-Hattendorf - case "3": + case '3': return "5753"; // Auetal-Bernsen - case "4": + case '4': return "5754"; // Extertal-Bremke - case "5": + case '5': return "5755"; // Kalletal-Varenholz default: return ""; @@ -12591,22 +12601,22 @@ private static String fromNumber576(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5761"; // Stolzenau - case "3": + case '3': return "5763"; // Uchte - case "4": + case '4': return "5764"; // Steyerberg - case "5": + case '5': return "5765"; // Raddestorf - case "6": + case '6': return "5766"; // Rehburg-Loccum - case "7": + case '7': return "5767"; // Warmsen - case "8": + case '8': return "5768"; // Petershagen-Heimsen - case "9": + case '9': return "5769"; // Steyerberg-Voigtei default: return ""; @@ -12618,20 +12628,20 @@ private static String fromNumber577(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5771"; // Rahden Westf - case "2": + case '2': return "5772"; // Espelkamp - case "3": + case '3': return "5773"; // Stemwede-Wehdem - case "4": + case '4': return "5774"; // Wagenfeld-Ströhen - case "5": + case '5': return "5775"; // Diepenau - case "6": + case '6': return "5776"; // Preussisch Ströhen - case "7": + case '7': return "5777"; // Diepenau-Essern default: return ""; @@ -12643,24 +12653,24 @@ private static String fromNumber58(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber580(number.substring(1)); - case "1": + case '1': return "581"; // Uelzen - case "2": + case '2': return fromNumber582(number.substring(1)); - case "3": + case '3': return fromNumber583(number.substring(1)); - case "4": + case '4': return fromNumber584(number.substring(1)); - case "5": + case '5': return fromNumber585(number.substring(1)); - case "6": + case '6': return fromNumber586(number.substring(1)); - case "7": + case '7': return fromNumber587(number.substring(1)); - case "8": + case '8': return fromNumber588(number.substring(1)); default: return ""; @@ -12672,20 +12682,20 @@ private static String fromNumber580(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5802"; // Wrestedt - case "3": + case '3': return "5803"; // Rosche - case "4": + case '4': return "5804"; // Rätzlingen Kr Uelzen - case "5": + case '5': return "5805"; // Oetzen - case "6": + case '6': return "5806"; // Barum b Bad Bevensen - case "7": + case '7': return "5807"; // Altenmedingen - case "8": + case '8': return "5808"; // Gerdau default: return ""; @@ -12697,26 +12707,26 @@ private static String fromNumber582(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5820"; // Suhlendorf - case "1": + case '1': return "5821"; // Bad Bevensen - case "2": + case '2': return "5822"; // Ebstorf - case "3": + case '3': return "5823"; // Bienenbüttel - case "4": + case '4': return "5824"; // Bad Bodenteich - case "5": + case '5': return "5825"; // Wieren - case "6": + case '6': return "5826"; // Suderburg - case "7": + case '7': return "5827"; // Unterlüß - case "8": + case '8': return "5828"; // Himbergen - case "9": + case '9': return "5829"; // Wriedel default: return ""; @@ -12728,24 +12738,24 @@ private static String fromNumber583(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5831"; // Wittingen - case "2": + case '2': return "5832"; // Hankensbüttel - case "3": + case '3': return "5833"; // Brome - case "4": + case '4': return "5834"; // Wittingen-Knesebeck - case "5": + case '5': return "5835"; // Wahrenholz - case "6": + case '6': return "5836"; // Wittingen-Radenbeck - case "7": + case '7': return "5837"; // Sprakensehl - case "8": + case '8': return "5838"; // Gross Oesingen - case "9": + case '9': return "5839"; // Wittingen-Ohrdorf default: return ""; @@ -12757,24 +12767,24 @@ private static String fromNumber584(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5840"; // Schnackenburg - case "1": + case '1': return "5841"; // Lüchow Wendland - case "2": + case '2': return "5842"; // Schnega - case "3": + case '3': return "5843"; // Wustrow Wendland - case "4": + case '4': return "5844"; // Clenze - case "5": + case '5': return "5845"; // Bergen Dumme - case "6": + case '6': return "5846"; // Gartow Niedersachs - case "8": + case '8': return "5848"; // Trebel - case "9": + case '9': return "5849"; // Waddeweitz default: return ""; @@ -12786,24 +12796,24 @@ private static String fromNumber585(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "5850"; // Neetze - case "1": + case '1': return "5851"; // Dahlenburg - case "2": + case '2': return "5852"; // Bleckede - case "3": + case '3': return "5853"; // Neu Darchau - case "4": + case '4': return "5854"; // Bleckede-Barskamp - case "5": + case '5': return "5855"; // Nahrendorf - case "7": + case '7': return "5857"; // Bleckede-Brackede - case "8": + case '8': return "5858"; // Hitzacker-Wietzetze - case "9": + case '9': return "5859"; // Thomasburg default: return ""; @@ -12815,16 +12825,16 @@ private static String fromNumber586(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5861"; // Dannenberg Elbe - case "2": + case '2': return "5862"; // Hitzacker Elbe - case "3": + case '3': return "5863"; // Zernien - case "4": + case '4': return "5864"; // Jameln - case "5": + case '5': return "5865"; // Gusborn default: return ""; @@ -12836,14 +12846,14 @@ private static String fromNumber587(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5872"; // Stoetze - case "3": + case '3': return "5873"; // Eimke - case "4": + case '4': return "5874"; // Soltendieck - case "5": + case '5': return "5875"; // Emmendorf default: return ""; @@ -12855,10 +12865,10 @@ private static String fromNumber588(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "5882"; // Gorleben - case "3": + case '3': return "5883"; // Lemgow default: return ""; @@ -12870,22 +12880,22 @@ private static String fromNumber59(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber590(number.substring(1)); - case "1": + case '1': return "591"; // Lingen (Ems) - case "2": + case '2': return fromNumber592(number.substring(1)); - case "3": + case '3': return fromNumber593(number.substring(1)); - case "4": + case '4': return fromNumber594(number.substring(1)); - case "5": + case '5': return fromNumber595(number.substring(1)); - case "6": + case '6': return fromNumber596(number.substring(1)); - case "7": + case '7': return fromNumber597(number.substring(1)); default: return ""; @@ -12897,24 +12907,24 @@ private static String fromNumber590(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5901"; // Fürstenau b Bramsche - case "2": + case '2': return "5902"; // Freren - case "3": + case '3': return "5903"; // Emsbüren - case "4": + case '4': return "5904"; // Lengerich Emsl - case "5": + case '5': return "5905"; // Beesten - case "6": + case '6': return "5906"; // Lünne - case "7": + case '7': return "5907"; // Geeste - case "8": + case '8': return "5908"; // Wietmarschen-Lohne - case "9": + case '9': return "5909"; // Wettrup default: return ""; @@ -12926,18 +12936,18 @@ private static String fromNumber592(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5921"; // Nordhorn - case "2": + case '2': return "5922"; // Bad Bentheim - case "3": + case '3': return "5923"; // Schüttorf - case "4": + case '4': return "5924"; // Bad Bentheim-Gildehaus - case "5": + case '5': return "5925"; // Wietmarschen - case "6": + case '6': return "5926"; // Engden default: return ""; @@ -12949,22 +12959,22 @@ private static String fromNumber593(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5931"; // Meppen - case "2": + case '2': return "5932"; // Haren Ems - case "3": + case '3': return "5933"; // Lathen - case "4": + case '4': return "5934"; // Haren-Rütenbrock - case "5": + case '5': return "5935"; // Twist-Schöninghsdorf - case "6": + case '6': return "5936"; // Twist - case "7": + case '7': return "5937"; // Geeste-Gross Hesepe - case "9": + case '9': return "5939"; // Sustrum default: return ""; @@ -12976,22 +12986,22 @@ private static String fromNumber594(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5941"; // Neuenhaus Dinkel - case "2": + case '2': return "5942"; // Uelsen - case "3": + case '3': return "5943"; // Emlichheim - case "4": + case '4': return "5944"; // Hoogstede - case "5": + case '5': return "5945"; // Wilsum - case "6": + case '6': return "5946"; // Georgsdorf - case "7": + case '7': return "5947"; // Laar Vechte - case "8": + case '8': return "5948"; // Itterbeck default: return ""; @@ -13003,20 +13013,20 @@ private static String fromNumber595(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5951"; // Werlte - case "2": + case '2': return "5952"; // Sögel - case "3": + case '3': return "5953"; // Börger - case "4": + case '4': return "5954"; // Lorup - case "5": + case '5': return "5955"; // Esterwegen - case "6": + case '6': return "5956"; // Rastdorf - case "7": + case '7': return "5957"; // Lindern Oldenburg default: return ""; @@ -13028,18 +13038,18 @@ private static String fromNumber596(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5961"; // Haselünne - case "2": + case '2': return "5962"; // Herzlake - case "3": + case '3': return "5963"; // Bawinkel - case "4": + case '4': return "5964"; // Lähden - case "5": + case '5': return "5965"; // Klein Berssen - case "6": + case '6': return "5966"; // Meppen-Apeldorn default: return ""; @@ -13051,18 +13061,18 @@ private static String fromNumber597(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "5971"; // Rheine - case "3": + case '3': return "5973"; // Neuenkirchen Kr Steinfurt - case "5": + case '5': return "5975"; // Rheine-Mesum - case "6": + case '6': return "5976"; // Salzbergen - case "7": + case '7': return "5977"; // Spelle - case "8": + case '8': return "5978"; // Hörstel-Dreierwalde default: return ""; @@ -13074,26 +13084,26 @@ private static String fromNumber6(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber60(number.substring(1)); - case "1": + case '1': return fromNumber61(number.substring(1)); - case "2": + case '2': return fromNumber62(number.substring(1)); - case "3": + case '3': return fromNumber63(number.substring(1)); - case "4": + case '4': return fromNumber64(number.substring(1)); - case "5": + case '5': return fromNumber65(number.substring(1)); - case "6": + case '6': return fromNumber66(number.substring(1)); - case "7": + case '7': return fromNumber67(number.substring(1)); - case "8": + case '8': return fromNumber68(number.substring(1)); - case "9": + case '9': return "69"; // Frankfurt am Main default: return ""; @@ -13105,24 +13115,24 @@ private static String fromNumber60(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber600(number.substring(1)); - case "2": + case '2': return fromNumber602(number.substring(1)); - case "3": + case '3': return fromNumber603(number.substring(1)); - case "4": + case '4': return fromNumber604(number.substring(1)); - case "5": + case '5': return fromNumber605(number.substring(1)); - case "6": + case '6': return fromNumber606(number.substring(1)); - case "7": + case '7': return fromNumber607(number.substring(1)); - case "8": + case '8': return fromNumber608(number.substring(1)); - case "9": + case '9': return fromNumber609(number.substring(1)); default: return ""; @@ -13134,16 +13144,16 @@ private static String fromNumber600(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6002"; // Ober-Mörlen - case "3": + case '3': return "6003"; // Rosbach v d Höhe - case "4": + case '4': return "6004"; // Lich-Eberstadt - case "7": + case '7': return "6007"; // Rosbach-Rodheim - case "8": + case '8': return "6008"; // Echzell default: return ""; @@ -13155,24 +13165,24 @@ private static String fromNumber602(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6020"; // Heigenbrücken - case "1": + case '1': return "6021"; // Aschaffenburg - case "2": + case '2': return "6022"; // Obernburg a Main - case "3": + case '3': return "6023"; // Alzenau i Ufr - case "4": + case '4': return "6024"; // Schöllkrippen - case "6": + case '6': return "6026"; // Grossostheim - case "7": + case '7': return "6027"; // Stockstadt a Main - case "8": + case '8': return "6028"; // Sulzbach a Main - case "9": + case '9': return "6029"; // Mömbris default: return ""; @@ -13184,20 +13194,20 @@ private static String fromNumber603(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6031"; // Friedberg Hess - case "2": + case '2': return "6032"; // Bad Nauheim - case "3": + case '3': return "6033"; // Butzbach - case "4": + case '4': return "6034"; // Wöllstadt - case "5": + case '5': return "6035"; // Reichelsheim Wetterau - case "6": + case '6': return "6036"; // Wölfersheim - case "9": + case '9': return "6039"; // Karben default: return ""; @@ -13209,24 +13219,24 @@ private static String fromNumber604(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6041"; // Glauburg - case "2": + case '2': return "6042"; // Büdingen Hess - case "3": + case '3': return "6043"; // Nidda - case "4": + case '4': return "6044"; // Schotten Hess - case "5": + case '5': return "6045"; // Gedern - case "6": + case '6': return "6046"; // Ortenberg Hess - case "7": + case '7': return "6047"; // Altenstadt Hess - case "8": + case '8': return "6048"; // Büdingen-Eckartshausen - case "9": + case '9': return "6049"; // Kefenrod default: return ""; @@ -13238,26 +13248,26 @@ private static String fromNumber605(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6050"; // Biebergemünd - case "1": + case '1': return "6051"; // Gelnhausen - case "2": + case '2': return "6052"; // Bad Orb - case "3": + case '3': return "6053"; // Wächtersbach - case "4": + case '4': return "6054"; // Birstein - case "5": + case '5': return "6055"; // Freigericht - case "6": + case '6': return "6056"; // Bad Soden-Salmünster - case "7": + case '7': return "6057"; // Flörsbachtal - case "8": + case '8': return "6058"; // Gründau - case "9": + case '9': return "6059"; // Jossgrund default: return ""; @@ -13269,16 +13279,16 @@ private static String fromNumber606(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6061"; // Michelstadt - case "2": + case '2': return "6062"; // Erbach Odenw - case "3": + case '3': return "6063"; // Bad König - case "6": + case '6': return "6066"; // Michelstadt-Vielbrunn - case "8": + case '8': return "6068"; // Beerfelden default: return ""; @@ -13290,14 +13300,14 @@ private static String fromNumber607(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6071"; // Dieburg - case "3": + case '3': return "6073"; // Babenhausen Hess - case "4": + case '4': return "6074"; // Rödermark - case "8": + case '8': return "6078"; // Gross-Umstadt default: return ""; @@ -13309,20 +13319,20 @@ private static String fromNumber608(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6081"; // Usingen - case "2": + case '2': return "6082"; // Niederreifenberg - case "3": + case '3': return "6083"; // Weilrod - case "4": + case '4': return "6084"; // Schmitten Taunus - case "5": + case '5': return "6085"; // Waldsolms - case "6": + case '6': return "6086"; // Grävenwiesbach - case "7": + case '7': return "6087"; // Waldems default: return ""; @@ -13334,16 +13344,16 @@ private static String fromNumber609(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6092"; // Heimbuchenthal - case "3": + case '3': return "6093"; // Laufach - case "4": + case '4': return "6094"; // Weibersbrunn - case "5": + case '5': return "6095"; // Bessenbach - case "6": + case '6': return "6096"; // Wiesen Unterfr default: return ""; @@ -13355,26 +13365,26 @@ private static String fromNumber61(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber610(number.substring(1)); - case "1": + case '1': return "611"; // Wiesbaden - case "2": + case '2': return fromNumber612(number.substring(1)); - case "3": + case '3': return fromNumber613(number.substring(1)); - case "4": + case '4': return fromNumber614(number.substring(1)); - case "5": + case '5': return fromNumber615(number.substring(1)); - case "6": + case '6': return fromNumber616(number.substring(1)); - case "7": + case '7': return fromNumber617(number.substring(1)); - case "8": + case '8': return fromNumber618(number.substring(1)); - case "9": + case '9': return fromNumber619(number.substring(1)); default: return ""; @@ -13386,24 +13396,24 @@ private static String fromNumber610(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6101"; // Bad Vilbel - case "2": + case '2': return "6102"; // Neu-Isenburg - case "3": + case '3': return "6103"; // Langen Hess - case "4": + case '4': return "6104"; // Heusenstamm - case "5": + case '5': return "6105"; // Mörfelden-Walldorf - case "6": + case '6': return "6106"; // Rodgau - case "7": + case '7': return "6107"; // Kelsterbach - case "8": + case '8': return "6108"; // Mühlheim am Main - case "9": + case '9': return "6109"; // Frankfurt-Bergen-Enkheim default: return ""; @@ -13415,22 +13425,22 @@ private static String fromNumber612(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6120"; // Aarbergen - case "2": + case '2': return "6122"; // Hofheim-Wallau - case "3": + case '3': return "6123"; // Eltville am Rhein - case "4": + case '4': return "6124"; // Bad Schwalbach - case "6": + case '6': return "6126"; // Idstein - case "7": + case '7': return "6127"; // Niedernhausen Taunus - case "8": + case '8': return "6128"; // Taunusstein - case "9": + case '9': return "6129"; // Schlangenbad default: return ""; @@ -13442,24 +13452,24 @@ private static String fromNumber613(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6130"; // Schwabenheim an der Selz - case "1": + case '1': return "6131"; // Mainz - case "2": + case '2': return "6132"; // Ingelheim am Rhein - case "3": + case '3': return "6133"; // Oppenheim - case "4": + case '4': return "6134"; // Mainz-Kastel - case "5": + case '5': return "6135"; // Bodenheim Rhein - case "6": + case '6': return "6136"; // Nieder-Olm - case "8": + case '8': return "6138"; // Mommenheim - case "9": + case '9': return "6139"; // Budenheim default: return ""; @@ -13471,16 +13481,16 @@ private static String fromNumber614(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6142"; // Rüsselsheim - case "4": + case '4': return "6144"; // Bischofsheim b Rüsselsheim - case "5": + case '5': return "6145"; // Flörsheim am Main - case "6": + case '6': return "6146"; // Hochheim am Main - case "7": + case '7': return "6147"; // Trebur default: return ""; @@ -13492,22 +13502,22 @@ private static String fromNumber615(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6150"; // Weiterstadt - case "1": + case '1': return "6151"; // Darmstadt - case "2": + case '2': return "6152"; // Gross-Gerau - case "4": + case '4': return "6154"; // Ober-Ramstadt - case "5": + case '5': return "6155"; // Griesheim Hess - case "7": + case '7': return "6157"; // Pfungstadt - case "8": + case '8': return "6158"; // Riedstadt - case "9": + case '9': return "6159"; // Messel default: return ""; @@ -13519,20 +13529,20 @@ private static String fromNumber616(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6161"; // Brensbach - case "2": + case '2': return "6162"; // Reinheim Odenw - case "3": + case '3': return "6163"; // Höchst i Odw - case "4": + case '4': return "6164"; // Reichelsheim Odenwald - case "5": + case '5': return "6165"; // Breuberg - case "6": + case '6': return "6166"; // Fischbachtal - case "7": + case '7': return "6167"; // Modautal default: return ""; @@ -13544,16 +13554,16 @@ private static String fromNumber617(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6171"; // Oberursel Taunus - case "2": + case '2': return "6172"; // Bad Homburg v d Höhe - case "3": + case '3': return "6173"; // Kronberg im Taunus - case "4": + case '4': return "6174"; // Königstein im Taunus - case "5": + case '5': return "6175"; // Friedrichsdorf Taunus default: return ""; @@ -13565,22 +13575,22 @@ private static String fromNumber618(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6181"; // Hanau - case "2": + case '2': return "6182"; // Seligenstadt - case "3": + case '3': return "6183"; // Erlensee - case "4": + case '4': return "6184"; // Langenselbold - case "5": + case '5': return "6185"; // Hammersbach Hess - case "6": + case '6': return "6186"; // Grosskrotzenburg - case "7": + case '7': return "6187"; // Schöneck - case "8": + case '8': return "6188"; // Kahl a Main default: return ""; @@ -13592,16 +13602,16 @@ private static String fromNumber619(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6190"; // Hattersheim a Main - case "2": + case '2': return "6192"; // Hofheim am Taunus - case "5": + case '5': return "6195"; // Kelkheim Taunus - case "6": + case '6': return "6196"; // Bad Soden am Taunus - case "8": + case '8': return "6198"; // Eppstein default: return ""; @@ -13613,26 +13623,26 @@ private static String fromNumber62(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber620(number.substring(1)); - case "1": + case '1': return "621"; // Mannheim - case "2": + case '2': return fromNumber622(number.substring(1)); - case "3": + case '3': return fromNumber623(number.substring(1)); - case "4": + case '4': return fromNumber624(number.substring(1)); - case "5": + case '5': return fromNumber625(number.substring(1)); - case "6": + case '6': return fromNumber626(number.substring(1)); - case "7": + case '7': return fromNumber627(number.substring(1)); - case "8": + case '8': return fromNumber628(number.substring(1)); - case "9": + case '9': return fromNumber629(number.substring(1)); default: return ""; @@ -13644,22 +13654,22 @@ private static String fromNumber620(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6201"; // Weinheim Bergstr - case "2": + case '2': return "6202"; // Schwetzingen - case "3": + case '3': return "6203"; // Ladenburg - case "4": + case '4': return "6204"; // Viernheim - case "5": + case '5': return "6205"; // Hockenheim - case "6": + case '6': return "6206"; // Lampertheim - case "7": + case '7': return "6207"; // Wald-Michelbach - case "9": + case '9': return "6209"; // Mörlenbach default: return ""; @@ -13671,24 +13681,24 @@ private static String fromNumber622(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6220"; // Wilhelmsfeld - case "1": + case '1': return "6221"; // Heidelberg - case "2": + case '2': return "6222"; // Wiesloch - case "3": + case '3': return "6223"; // Neckargemünd - case "4": + case '4': return "6224"; // Sandhausen Baden - case "6": + case '6': return "6226"; // Meckesheim - case "7": + case '7': return "6227"; // Walldorf Baden - case "8": + case '8': return "6228"; // Schönau Odenw - case "9": + case '9': return "6229"; // Neckarsteinach default: return ""; @@ -13700,24 +13710,24 @@ private static String fromNumber623(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6231"; // Hochdorf-Assenheim - case "2": + case '2': return "6232"; // Speyer - case "3": + case '3': return "6233"; // Frankenthal Pfalz - case "4": + case '4': return "6234"; // Mutterstadt - case "5": + case '5': return "6235"; // Schifferstadt - case "6": + case '6': return "6236"; // Neuhofen Pfalz - case "7": + case '7': return "6237"; // Maxdorf - case "8": + case '8': return "6238"; // Dirmstein - case "9": + case '9': return "6239"; // Bobenheim-Roxheim default: return ""; @@ -13729,22 +13739,22 @@ private static String fromNumber624(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6241"; // Worms - case "2": + case '2': return "6242"; // Osthofen - case "3": + case '3': return "6243"; // Monsheim - case "4": + case '4': return "6244"; // Westhofen Rheinhess - case "5": + case '5': return "6245"; // Biblis - case "6": + case '6': return "6246"; // Eich Rheinhess - case "7": + case '7': return "6247"; // Worms-Pfeddersheim - case "9": + case '9': return "6249"; // Guntersblum default: return ""; @@ -13756,22 +13766,22 @@ private static String fromNumber625(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6251"; // Bensheim - case "2": + case '2': return "6252"; // Heppenheim Bergstraße - case "3": + case '3': return "6253"; // Fürth Odenw - case "4": + case '4': return "6254"; // Lautertal Odenwald - case "5": + case '5': return "6255"; // Lindenfels - case "6": + case '6': return "6256"; // Lampertheim-Hüttenfeld - case "7": + case '7': return "6257"; // Seeheim-Jugenheim - case "8": + case '8': return "6258"; // Gernsheim default: return ""; @@ -13783,24 +13793,24 @@ private static String fromNumber626(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6261"; // Mosbach Baden - case "2": + case '2': return "6262"; // Aglasterhausen - case "3": + case '3': return "6263"; // Neckargerach - case "4": + case '4': return "6264"; // Neudenau - case "5": + case '5': return "6265"; // Billigheim Baden - case "6": + case '6': return "6266"; // Hassmersheim - case "7": + case '7': return "6267"; // Fahrenbach Baden - case "8": + case '8': return "6268"; // Hüffenhardt - case "9": + case '9': return "6269"; // Gundelsheim Württ default: return ""; @@ -13812,16 +13822,16 @@ private static String fromNumber627(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6271"; // Eberbach Baden - case "2": + case '2': return "6272"; // Hirschhorn Neckar - case "4": + case '4': return "6274"; // Waldbrunn Odenw - case "5": + case '5': return "6275"; // Rothenberg Odenw - case "6": + case '6': return "6276"; // Hesseneck default: return ""; @@ -13833,20 +13843,20 @@ private static String fromNumber628(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6281"; // Buchen Odenwald - case "2": + case '2': return "6282"; // Walldürn - case "3": + case '3': return "6283"; // Hardheim Odenw - case "4": + case '4': return "6284"; // Mudau - case "5": + case '5': return "6285"; // Walldürn-Altheim - case "6": + case '6': return "6286"; // Walldürn-Rippberg - case "7": + case '7': return "6287"; // Limbach Baden default: return ""; @@ -13858,22 +13868,22 @@ private static String fromNumber629(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6291"; // Adelsheim - case "2": + case '2': return "6292"; // Seckach - case "3": + case '3': return "6293"; // Schefflenz - case "4": + case '4': return "6294"; // Krautheim Jagst - case "5": + case '5': return "6295"; // Rosenberg Baden - case "6": + case '6': return "6296"; // Ahorn Baden - case "7": + case '7': return "6297"; // Ravenstein Baden - case "8": + case '8': return "6298"; // Möckmühl default: return ""; @@ -13885,26 +13895,26 @@ private static String fromNumber63(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber630(number.substring(1)); - case "1": + case '1': return "631"; // Kaiserslautern - case "2": + case '2': return fromNumber632(number.substring(1)); - case "3": + case '3': return fromNumber633(number.substring(1)); - case "4": + case '4': return fromNumber634(number.substring(1)); - case "5": + case '5': return fromNumber635(number.substring(1)); - case "6": + case '6': return fromNumber636(number.substring(1)); - case "7": + case '7': return fromNumber637(number.substring(1)); - case "8": + case '8': return fromNumber638(number.substring(1)); - case "9": + case '9': return fromNumber639(number.substring(1)); default: return ""; @@ -13916,22 +13926,22 @@ private static String fromNumber630(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6301"; // Otterbach Pfalz - case "2": + case '2': return "6302"; // Winnweiler - case "3": + case '3': return "6303"; // Enkenbach-Alsenborn - case "4": + case '4': return "6304"; // Wolfstein Pfalz - case "5": + case '5': return "6305"; // Hochspeyer - case "6": + case '6': return "6306"; // Trippstadt - case "7": + case '7': return "6307"; // Schopp - case "8": + case '8': return "6308"; // Olsbrücken default: return ""; @@ -13943,24 +13953,24 @@ private static String fromNumber632(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6321"; // Neustadt an der Weinstraße - case "2": + case '2': return "6322"; // Bad Dürkheim - case "3": + case '3': return "6323"; // Edenkoben - case "4": + case '4': return "6324"; // Hassloch - case "5": + case '5': return "6325"; // Lambrecht Pfalz - case "6": + case '6': return "6326"; // Deidesheim - case "7": + case '7': return "6327"; // Neustadt-Lachen - case "8": + case '8': return "6328"; // Elmstein - case "9": + case '9': return "6329"; // Weidenthal Pfalz default: return ""; @@ -13972,24 +13982,24 @@ private static String fromNumber633(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6331"; // Pirmasens - case "2": + case '2': return "6332"; // Zweibrücken - case "3": + case '3': return "6333"; // Waldfischbach-Burgalben - case "4": + case '4': return "6334"; // Thaleischweiler-Fröschen - case "5": + case '5': return "6335"; // Trulben - case "6": + case '6': return "6336"; // Dellfeld - case "7": + case '7': return "6337"; // Grossbundenbach - case "8": + case '8': return "6338"; // Hornbach Pfalz - case "9": + case '9': return "6339"; // Grosssteinhausen default: return ""; @@ -14001,26 +14011,26 @@ private static String fromNumber634(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6340"; // Wörth-Schaidt - case "1": + case '1': return "6341"; // Landau in der Pfalz - case "2": + case '2': return "6342"; // Schweigen-Rechtenbach - case "3": + case '3': return "6343"; // Bad Bergzabern - case "4": + case '4': return "6344"; // Schwegenheim - case "5": + case '5': return "6345"; // Albersweiler - case "6": + case '6': return "6346"; // Annweiler am Trifels - case "7": + case '7': return "6347"; // Hochstadt Pfalz - case "8": + case '8': return "6348"; // Offenbach an der Queich - case "9": + case '9': return "6349"; // Billigheim-Ingenheim default: return ""; @@ -14032,22 +14042,22 @@ private static String fromNumber635(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6351"; // Eisenberg Pfalz - case "2": + case '2': return "6352"; // Kirchheimbolanden - case "3": + case '3': return "6353"; // Freinsheim - case "5": + case '5': return "6355"; // Albisheim Pfrimm - case "6": + case '6': return "6356"; // Carlsberg Pfalz - case "7": + case '7': return "6357"; // Standenbühl - case "8": + case '8': return "6358"; // Kriegsfeld - case "9": + case '9': return "6359"; // Grünstadt default: return ""; @@ -14059,14 +14069,14 @@ private static String fromNumber636(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6361"; // Rockenhausen - case "2": + case '2': return "6362"; // Alsenz - case "3": + case '3': return "6363"; // Niederkirchen - case "4": + case '4': return "6364"; // Nußbach Pfalz default: return ""; @@ -14078,16 +14088,16 @@ private static String fromNumber637(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6371"; // Landstuhl - case "2": + case '2': return "6372"; // Bruchmühlbach-Miesau - case "3": + case '3': return "6373"; // Schönenberg-Kübelberg - case "4": + case '4': return "6374"; // Weilerbach - case "5": + case '5': return "6375"; // Wallhalben default: return ""; @@ -14099,20 +14109,20 @@ private static String fromNumber638(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6381"; // Kusel - case "2": + case '2': return "6382"; // Lauterecken - case "3": + case '3': return "6383"; // Glan-Münchweiler - case "4": + case '4': return "6384"; // Konken - case "5": + case '5': return "6385"; // Reichenbach-Steegen - case "6": + case '6': return "6386"; // Altenkirchen Pfalz - case "7": + case '7': return "6387"; // Sankt Julian default: return ""; @@ -14124,22 +14134,22 @@ private static String fromNumber639(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6391"; // Dahn - case "2": + case '2': return "6392"; // Hauenstein Pfalz - case "3": + case '3': return "6393"; // Fischbach bei Dahn - case "4": + case '4': return "6394"; // Bundenthal - case "5": + case '5': return "6395"; // Münchweiler an der Rodalb - case "6": + case '6': return "6396"; // Hinterweidenthal - case "7": + case '7': return "6397"; // Leimen Pfalz - case "8": + case '8': return "6398"; // Vorderweidenthal default: return ""; @@ -14151,24 +14161,24 @@ private static String fromNumber64(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber640(number.substring(1)); - case "1": + case '1': return "641"; // Giessen - case "2": + case '2': return fromNumber642(number.substring(1)); - case "3": + case '3': return fromNumber643(number.substring(1)); - case "4": + case '4': return fromNumber644(number.substring(1)); - case "5": + case '5': return fromNumber645(number.substring(1)); - case "6": + case '6': return fromNumber646(number.substring(1)); - case "7": + case '7': return fromNumber647(number.substring(1)); - case "8": + case '8': return fromNumber648(number.substring(1)); default: return ""; @@ -14180,26 +14190,26 @@ private static String fromNumber640(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6400"; // Mücke - case "1": + case '1': return "6401"; // Grünberg Hess - case "2": + case '2': return "6402"; // Hungen - case "3": + case '3': return "6403"; // Linden Hess - case "4": + case '4': return "6404"; // Lich Hess - case "5": + case '5': return "6405"; // Laubach Hess - case "6": + case '6': return "6406"; // Lollar - case "7": + case '7': return "6407"; // Rabenau Hess - case "8": + case '8': return "6408"; // Buseck - case "9": + case '9': return "6409"; // Biebertal default: return ""; @@ -14211,26 +14221,26 @@ private static String fromNumber642(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6420"; // Lahntal - case "1": + case '1': return "6421"; // Marburg - case "2": + case '2': return "6422"; // Kirchhain - case "3": + case '3': return "6423"; // Wetter Hessen - case "4": + case '4': return "6424"; // Ebsdorfergrund - case "5": + case '5': return "6425"; // Rauschenberg Hess - case "6": + case '6': return "6426"; // Fronhausen - case "7": + case '7': return "6427"; // Cölbe-Schönstadt - case "8": + case '8': return "6428"; // Stadtallendorf - case "9": + case '9': return "6429"; // Schweinsberg Hess default: return ""; @@ -14242,24 +14252,24 @@ private static String fromNumber643(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6430"; // Hahnstätten - case "1": + case '1': return "6431"; // Limburg a d Lahn - case "2": + case '2': return "6432"; // Diez - case "3": + case '3': return "6433"; // Hadamar - case "4": + case '4': return "6434"; // Bad Camberg - case "5": + case '5': return "6435"; // Wallmerod - case "6": + case '6': return "6436"; // Dornburg Hess - case "8": + case '8': return "6438"; // Hünfelden - case "9": + case '9': return "6439"; // Holzappel default: return ""; @@ -14271,24 +14281,24 @@ private static String fromNumber644(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6440"; // Kölschhausen - case "1": + case '1': return "6441"; // Wetzlar - case "2": + case '2': return "6442"; // Braunfels - case "3": + case '3': return "6443"; // Ehringshausen Dill - case "4": + case '4': return "6444"; // Bischoffen - case "5": + case '5': return "6445"; // Schöffengrund - case "6": + case '6': return "6446"; // Hohenahr - case "7": + case '7': return "6447"; // Langgöns-Niederkleen - case "9": + case '9': return "6449"; // Ehringshausen-Katzenfurt default: return ""; @@ -14300,22 +14310,22 @@ private static String fromNumber645(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6451"; // Frankenberg Eder - case "2": + case '2': return "6452"; // Battenberg Eder - case "3": + case '3': return "6453"; // Gemünden Wohra - case "4": + case '4': return "6454"; // Lichtenfels-Sachsenberg - case "5": + case '5': return "6455"; // Frankenau Hess - case "6": + case '6': return "6456"; // Haina Kloster - case "7": + case '7': return "6457"; // Burgwald Eder - case "8": + case '8': return "6458"; // Rosenthal Hess default: return ""; @@ -14327,20 +14337,20 @@ private static String fromNumber646(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6461"; // Biedenkopf - case "2": + case '2': return "6462"; // Gladenbach - case "4": + case '4': return "6464"; // Angelburg - case "5": + case '5': return "6465"; // Breidenbach b Biedenkopf - case "6": + case '6': return "6466"; // Dautphetal-Friedensdorf - case "7": + case '7': return "6467"; // Hatzfeld Eder - case "8": + case '8': return "6468"; // Dautphetal-Mornshausen default: return ""; @@ -14352,24 +14362,24 @@ private static String fromNumber647(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6471"; // Weilburg - case "2": + case '2': return "6472"; // Weilmünster - case "3": + case '3': return "6473"; // Leun - case "4": + case '4': return "6474"; // Villmar-Aumenau - case "5": + case '5': return "6475"; // Weilmünster-Wolfenhausen - case "6": + case '6': return "6476"; // Mengerskirchen - case "7": + case '7': return "6477"; // Greifenstein-Nenderoth - case "8": + case '8': return "6478"; // Greifenstein-Ulm - case "9": + case '9': return "6479"; // Waldbrunn Westerwald default: return ""; @@ -14381,16 +14391,16 @@ private static String fromNumber648(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6482"; // Runkel - case "3": + case '3': return "6483"; // Selters Taunus - case "4": + case '4': return "6484"; // Beselich - case "5": + case '5': return "6485"; // Nentershausen Westerw - case "6": + case '6': return "6486"; // Katzenelnbogen default: return ""; @@ -14402,26 +14412,26 @@ private static String fromNumber65(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber650(number.substring(1)); - case "1": + case '1': return "651"; // Trier - case "2": + case '2': return fromNumber652(number.substring(1)); - case "3": + case '3': return fromNumber653(number.substring(1)); - case "4": + case '4': return fromNumber654(number.substring(1)); - case "5": + case '5': return fromNumber655(number.substring(1)); - case "6": + case '6': return fromNumber656(number.substring(1)); - case "7": + case '7': return fromNumber657(number.substring(1)); - case "8": + case '8': return fromNumber658(number.substring(1)); - case "9": + case '9': return fromNumber659(number.substring(1)); default: return ""; @@ -14433,26 +14443,26 @@ private static String fromNumber650(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6500"; // Waldrach - case "1": + case '1': return "6501"; // Konz - case "2": + case '2': return "6502"; // Schweich - case "3": + case '3': return "6503"; // Hermeskeil - case "4": + case '4': return "6504"; // Thalfang - case "5": + case '5': return "6505"; // Kordel - case "6": + case '6': return "6506"; // Welschbillig - case "7": + case '7': return "6507"; // Neumagen-Dhron - case "8": + case '8': return "6508"; // Hetzerath Mosel - case "9": + case '9': return "6509"; // Büdlich default: return ""; @@ -14464,18 +14474,18 @@ private static String fromNumber652(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6522"; // Mettendorf - case "3": + case '3': return "6523"; // Holsthum - case "4": + case '4': return "6524"; // Rodershausen - case "5": + case '5': return "6525"; // Irrel - case "6": + case '6': return "6526"; // Bollendorf - case "7": + case '7': return "6527"; // Oberweis default: return ""; @@ -14487,18 +14497,18 @@ private static String fromNumber653(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6531"; // Bernkastel-Kues - case "2": + case '2': return "6532"; // Zeltingen-Rachtig - case "3": + case '3': return "6533"; // Morbach Hunsrück - case "4": + case '4': return "6534"; // Mülheim Mosel - case "5": + case '5': return "6535"; // Osann-Monzel - case "6": + case '6': return "6536"; // Kleinich default: return ""; @@ -14510,16 +14520,16 @@ private static String fromNumber654(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6541"; // Traben-Trarbach - case "2": + case '2': return "6542"; // Bullay - case "3": + case '3': return "6543"; // Büchenbeuren - case "4": + case '4': return "6544"; // Rhaunen - case "5": + case '5': return "6545"; // Blankenrath default: return ""; @@ -14531,26 +14541,26 @@ private static String fromNumber655(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6550"; // Irrhausen - case "1": + case '1': return "6551"; // Prüm - case "2": + case '2': return "6552"; // Olzheim - case "3": + case '3': return "6553"; // Schönecken - case "4": + case '4': return "6554"; // Waxweiler - case "5": + case '5': return "6555"; // Bleialf - case "6": + case '6': return "6556"; // Pronsfeld - case "7": + case '7': return "6557"; // Hallschlag - case "8": + case '8': return "6558"; // Büdesheim Eifel - case "9": + case '9': return "6559"; // Leidenborn default: return ""; @@ -14562,24 +14572,24 @@ private static String fromNumber656(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6561"; // Bitburg - case "2": + case '2': return "6562"; // Speicher - case "3": + case '3': return "6563"; // Kyllburg - case "4": + case '4': return "6564"; // Neuerburg Eifel - case "5": + case '5': return "6565"; // Dudeldorf - case "6": + case '6': return "6566"; // Körperich - case "7": + case '7': return "6567"; // Oberkail - case "8": + case '8': return "6568"; // Wolsfeld - case "9": + case '9': return "6569"; // Bickendorf default: return ""; @@ -14591,18 +14601,18 @@ private static String fromNumber657(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6571"; // Wittlich - case "2": + case '2': return "6572"; // Manderscheid Eifel - case "3": + case '3': return "6573"; // Gillenfeld - case "4": + case '4': return "6574"; // Hasborn - case "5": + case '5': return "6575"; // Landscheid - case "8": + case '8': return "6578"; // Salmtal default: return ""; @@ -14614,26 +14624,26 @@ private static String fromNumber658(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6580"; // Zemmer - case "1": + case '1': return "6581"; // Saarburg - case "2": + case '2': return "6582"; // Freudenburg - case "3": + case '3': return "6583"; // Palzem - case "4": + case '4': return "6584"; // Wellen Mosel - case "5": + case '5': return "6585"; // Ralingen - case "6": + case '6': return "6586"; // Beuren Hochwald - case "7": + case '7': return "6587"; // Zerf - case "8": + case '8': return "6588"; // Pluwig - case "9": + case '9': return "6589"; // Kell am See default: return ""; @@ -14645,22 +14655,22 @@ private static String fromNumber659(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6591"; // Gerolstein - case "2": + case '2': return "6592"; // Daun - case "3": + case '3': return "6593"; // Hillesheim Eifel - case "4": + case '4': return "6594"; // Birresborn - case "5": + case '5': return "6595"; // Dockweiler - case "6": + case '6': return "6596"; // Üdersdorf - case "7": + case '7': return "6597"; // Jünkerath - case "9": + case '9': return "6599"; // Weidenbach b Gerolstein default: return ""; @@ -14672,24 +14682,24 @@ private static String fromNumber66(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "661"; // Fulda - case "2": + case '2': return fromNumber662(number.substring(1)); - case "3": + case '3': return fromNumber663(number.substring(1)); - case "4": + case '4': return fromNumber664(number.substring(1)); - case "5": + case '5': return fromNumber665(number.substring(1)); - case "6": + case '6': return fromNumber666(number.substring(1)); - case "7": + case '7': return fromNumber667(number.substring(1)); - case "8": + case '8': return fromNumber668(number.substring(1)); - case "9": + case '9': return fromNumber669(number.substring(1)); default: return ""; @@ -14701,26 +14711,26 @@ private static String fromNumber662(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6620"; // Philippsthal Werra - case "1": + case '1': return "6621"; // Bad Hersfeld - case "2": + case '2': return "6622"; // Bebra - case "3": + case '3': return "6623"; // Rotenburg a d Fulda - case "4": + case '4': return "6624"; // Heringen Werra - case "5": + case '5': return "6625"; // Niederaula - case "6": + case '6': return "6626"; // Wildeck-Obersuhl - case "7": + case '7': return "6627"; // Nentershausen Hess - case "8": + case '8': return "6628"; // Oberaula - case "9": + case '9': return "6629"; // Schenklengsfeld default: return ""; @@ -14732,24 +14742,24 @@ private static String fromNumber663(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6630"; // Schwalmtal-Storndorf - case "1": + case '1': return "6631"; // Alsfeld - case "3": + case '3': return "6633"; // Homberg Ohm - case "4": + case '4': return "6634"; // Gemünden Felda - case "5": + case '5': return "6635"; // Kirtorf - case "6": + case '6': return "6636"; // Romrod - case "7": + case '7': return "6637"; // Feldatal - case "8": + case '8': return "6638"; // Schwalmtal-Renzendorf - case "9": + case '9': return "6639"; // Ottrau default: return ""; @@ -14761,22 +14771,22 @@ private static String fromNumber664(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6641"; // Lauterbach Hessen - case "2": + case '2': return "6642"; // Schlitz - case "3": + case '3': return "6643"; // Herbstein - case "4": + case '4': return "6644"; // Grebenhain - case "5": + case '5': return "6645"; // Ulrichstein - case "6": + case '6': return "6646"; // Grebenau - case "7": + case '7': return "6647"; // Herbstein-Stockhausen - case "8": + case '8': return "6648"; // Bad Salzschlirf default: return ""; @@ -14788,26 +14798,26 @@ private static String fromNumber665(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6650"; // Hosenfeld - case "1": + case '1': return "6651"; // Rasdorf - case "2": + case '2': return "6652"; // Hünfeld - case "3": + case '3': return "6653"; // Burghaun - case "4": + case '4': return "6654"; // Gersfeld Rhön - case "5": + case '5': return "6655"; // Neuhof Kr Fulda - case "6": + case '6': return "6656"; // Ebersburg - case "7": + case '7': return "6657"; // Hofbieber - case "8": + case '8': return "6658"; // Poppenhausen Wasserkuppe - case "9": + case '9': return "6659"; // Eichenzell default: return ""; @@ -14819,24 +14829,24 @@ private static String fromNumber666(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6660"; // Steinau-Marjoss - case "1": + case '1': return "6661"; // Schlüchtern - case "3": + case '3': return "6663"; // Steinau an der Straße - case "4": + case '4': return "6664"; // Sinntal-Sterbfritz - case "5": + case '5': return "6665"; // Sinntal-Altengronau - case "6": + case '6': return "6666"; // Freiensteinau - case "7": + case '7': return "6667"; // Steinau-Ulmbach - case "8": + case '8': return "6668"; // Birstein-Lichenroth - case "9": + case '9': return "6669"; // Neuhof-Hauswurz default: return ""; @@ -14848,22 +14858,22 @@ private static String fromNumber667(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "6670"; // Ludwigsau Hess - case "2": + case '2': return "6672"; // Eiterfeld - case "3": + case '3': return "6673"; // Haunetal - case "4": + case '4': return "6674"; // Friedewald Hess - case "5": + case '5': return "6675"; // Breitenbach a Herzberg - case "6": + case '6': return "6676"; // Hohenroda Hess - case "7": + case '7': return "6677"; // Neuenstein Hess - case "8": + case '8': return "6678"; // Wildeck-Hönebach default: return ""; @@ -14875,14 +14885,14 @@ private static String fromNumber668(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6681"; // Hilders - case "2": + case '2': return "6682"; // Tann Rhön - case "3": + case '3': return "6683"; // Ehrenberg Rhön - case "4": + case '4': return "6684"; // Hofbieber-Schwarzbach default: return ""; @@ -14894,22 +14904,22 @@ private static String fromNumber669(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6691"; // Schwalmstadt - case "2": + case '2': return "6692"; // Neustadt Hessen - case "3": + case '3': return "6693"; // Neuental - case "4": + case '4': return "6694"; // Neukirchen Knüll - case "5": + case '5': return "6695"; // Jesberg - case "6": + case '6': return "6696"; // Gilserberg - case "7": + case '7': return "6697"; // Willingshausen - case "8": + case '8': return "6698"; // Schrecksbach default: return ""; @@ -14921,24 +14931,24 @@ private static String fromNumber67(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber670(number.substring(1)); - case "1": + case '1': return "671"; // Bad Kreuznach - case "2": + case '2': return fromNumber672(number.substring(1)); - case "3": + case '3': return fromNumber673(number.substring(1)); - case "4": + case '4': return fromNumber674(number.substring(1)); - case "5": + case '5': return fromNumber675(number.substring(1)); - case "6": + case '6': return fromNumber676(number.substring(1)); - case "7": + case '7': return fromNumber677(number.substring(1)); - case "8": + case '8': return fromNumber678(number.substring(1)); default: return ""; @@ -14950,20 +14960,20 @@ private static String fromNumber670(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6701"; // Sprendlingen Rheinhess - case "3": + case '3': return "6703"; // Wöllstein Rheinhess - case "4": + case '4': return "6704"; // Langenlonsheim - case "6": + case '6': return "6706"; // Wallhausen Nahe - case "7": + case '7': return "6707"; // Windesheim - case "8": + case '8': return "6708"; // Bad Münster am Stein-Ebernburg - case "9": + case '9': return "6709"; // Fürfeld Kr Bad Kreuznach default: return ""; @@ -14975,22 +14985,22 @@ private static String fromNumber672(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6721"; // Bingen am Rhein - case "2": + case '2': return "6722"; // Rüdesheim am Rhein - case "3": + case '3': return "6723"; // Oestrich-Winkel - case "4": + case '4': return "6724"; // Stromberg Hunsrück - case "5": + case '5': return "6725"; // Gau-Algesheim - case "6": + case '6': return "6726"; // Lorch Rheingau - case "7": + case '7': return "6727"; // Gensingen - case "8": + case '8': return "6728"; // Ober-Hilbersheim default: return ""; @@ -15002,20 +15012,20 @@ private static String fromNumber673(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6731"; // Alzey - case "2": + case '2': return "6732"; // Wörrstadt - case "3": + case '3': return "6733"; // Gau-Odernheim - case "4": + case '4': return "6734"; // Flonheim - case "5": + case '5': return "6735"; // Eppelsheim - case "6": + case '6': return "6736"; // Bechenheim - case "7": + case '7': return "6737"; // Köngernheim default: return ""; @@ -15027,20 +15037,20 @@ private static String fromNumber674(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6741"; // St Goar - case "2": + case '2': return "6742"; // Boppard - case "3": + case '3': return "6743"; // Bacharach - case "4": + case '4': return "6744"; // Oberwesel - case "5": + case '5': return "6745"; // Gondershausen - case "6": + case '6': return "6746"; // Pfalzfeld - case "7": + case '7': return "6747"; // Emmelshausen default: return ""; @@ -15052,22 +15062,22 @@ private static String fromNumber675(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6751"; // Bad Sobernheim - case "2": + case '2': return "6752"; // Kirn Nahe - case "3": + case '3': return "6753"; // Meisenheim - case "4": + case '4': return "6754"; // Martinstein - case "5": + case '5': return "6755"; // Odernheim am Glan - case "6": + case '6': return "6756"; // Winterbach Soonwald - case "7": + case '7': return "6757"; // Becherbach bei Kirn - case "8": + case '8': return "6758"; // Waldböckelheim default: return ""; @@ -15079,18 +15089,18 @@ private static String fromNumber676(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6761"; // Simmern Hunsrück - case "2": + case '2': return "6762"; // Kastellaun - case "3": + case '3': return "6763"; // Kirchberg Hunsrück - case "4": + case '4': return "6764"; // Rheinböllen - case "5": + case '5': return "6765"; // Gemünden Hunsrück - case "6": + case '6': return "6766"; // Kisselbach default: return ""; @@ -15102,18 +15112,18 @@ private static String fromNumber677(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6771"; // St Goarshausen - case "2": + case '2': return "6772"; // Nastätten - case "3": + case '3': return "6773"; // Kamp-Bornhofen - case "4": + case '4': return "6774"; // Kaub - case "5": + case '5': return "6775"; // Strüth Taunus - case "6": + case '6': return "6776"; // Dachsenhausen default: return ""; @@ -15125,24 +15135,24 @@ private static String fromNumber678(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6781"; // Idar-Oberstein - case "2": + case '2': return "6782"; // Birkenfeld Nahe - case "3": + case '3': return "6783"; // Baumholder - case "4": + case '4': return "6784"; // Weierbach - case "5": + case '5': return "6785"; // Herrstein - case "6": + case '6': return "6786"; // Kempfeld - case "7": + case '7': return "6787"; // Niederbrombach - case "8": + case '8': return "6788"; // Sien - case "9": + case '9': return "6789"; // Heimbach Nahe default: return ""; @@ -15154,26 +15164,26 @@ private static String fromNumber68(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber680(number.substring(1)); - case "1": + case '1': return "681"; // Saarbrücken - case "2": + case '2': return fromNumber682(number.substring(1)); - case "3": + case '3': return fromNumber683(number.substring(1)); - case "4": + case '4': return fromNumber684(number.substring(1)); - case "5": + case '5': return fromNumber685(number.substring(1)); - case "6": + case '6': return fromNumber686(number.substring(1)); - case "7": + case '7': return fromNumber687(number.substring(1)); - case "8": + case '8': return fromNumber688(number.substring(1)); - case "9": + case '9': return fromNumber689(number.substring(1)); default: return ""; @@ -15185,18 +15195,18 @@ private static String fromNumber680(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "6802"; // Völklingen-Lauterbach - case "3": + case '3': return "6803"; // Mandelbachtal-Ommersheim - case "4": + case '4': return "6804"; // Mandelbachtal - case "5": + case '5': return "6805"; // Kleinblittersdorf - case "6": + case '6': return "6806"; // Heusweiler - case "9": + case '9': return "6809"; // Grossrosseln default: return ""; @@ -15208,16 +15218,16 @@ private static String fromNumber682(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6821"; // Neunkirchen Saar - case "4": + case '4': return "6824"; // Ottweiler - case "5": + case '5': return "6825"; // Illingen Saar - case "6": + case '6': return "6826"; // Bexbach - case "7": + case '7': return "6827"; // Eppelborn default: return ""; @@ -15229,22 +15239,22 @@ private static String fromNumber683(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6831"; // Saarlouis - case "2": + case '2': return "6832"; // Beckingen-Reimsbach - case "3": + case '3': return "6833"; // Rehlingen-Siersburg - case "4": + case '4': return "6834"; // Bous - case "5": + case '5': return "6835"; // Beckingen - case "6": + case '6': return "6836"; // Überherrn - case "7": + case '7': return "6837"; // Wallerfangen - case "8": + case '8': return "6838"; // Saarwellingen default: return ""; @@ -15256,18 +15266,18 @@ private static String fromNumber684(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6841"; // Homburg Saar - case "2": + case '2': return "6842"; // Blieskastel - case "3": + case '3': return "6843"; // Gersheim - case "4": + case '4': return "6844"; // Blieskastel-Altheim - case "8": + case '8': return "6848"; // Homburg-Einöd - case "9": + case '9': return "6849"; // Kirkel default: return ""; @@ -15279,22 +15289,22 @@ private static String fromNumber685(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6851"; // St Wendel - case "2": + case '2': return "6852"; // Nohfelden - case "3": + case '3': return "6853"; // Marpingen - case "4": + case '4': return "6854"; // Oberthal Saar - case "5": + case '5': return "6855"; // Freisen - case "6": + case '6': return "6856"; // St Wendel-Niederkirchen - case "7": + case '7': return "6857"; // Namborn - case "8": + case '8': return "6858"; // Ottweiler-Fürth default: return ""; @@ -15306,20 +15316,20 @@ private static String fromNumber686(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6861"; // Merzig - case "4": + case '4': return "6864"; // Mettlach - case "5": + case '5': return "6865"; // Mettlach-Orscholz - case "6": + case '6': return "6866"; // Perl-Nennig - case "7": + case '7': return "6867"; // Perl - case "8": + case '8': return "6868"; // Mettlach-Tünsdorf - case "9": + case '9': return "6869"; // Merzig-Silwingen default: return ""; @@ -15331,18 +15341,18 @@ private static String fromNumber687(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6871"; // Wadern - case "2": + case '2': return "6872"; // Losheim am See - case "3": + case '3': return "6873"; // Nonnweiler - case "4": + case '4': return "6874"; // Wadern-Nunkirchen - case "5": + case '5': return "6875"; // Nonnweiler-Primstal - case "6": + case '6': return "6876"; // Weiskirchen Saar default: return ""; @@ -15354,12 +15364,12 @@ private static String fromNumber688(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "6881"; // Lebach - case "7": + case '7': return "6887"; // Schmelz Saar - case "8": + case '8': return "6888"; // Lebach-Steinbach default: return ""; @@ -15371,14 +15381,14 @@ private static String fromNumber689(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "6893"; // Saarbrücken-Ensheim - case "4": + case '4': return "6894"; // St Ingbert - case "7": + case '7': return "6897"; // Sulzbach Saar - case "8": + case '8': return "6898"; // Völklingen default: return ""; @@ -15390,26 +15400,26 @@ private static String fromNumber7(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber70(number.substring(1)); - case "1": + case '1': return fromNumber71(number.substring(1)); - case "2": + case '2': return fromNumber72(number.substring(1)); - case "3": + case '3': return fromNumber73(number.substring(1)); - case "4": + case '4': return fromNumber74(number.substring(1)); - case "5": + case '5': return fromNumber75(number.substring(1)); - case "6": + case '6': return fromNumber76(number.substring(1)); - case "7": + case '7': return fromNumber77(number.substring(1)); - case "8": + case '8': return fromNumber78(number.substring(1)); - case "9": + case '9': return fromNumber79(number.substring(1)); default: return ""; @@ -15421,20 +15431,20 @@ private static String fromNumber70(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber702(number.substring(1)); - case "3": + case '3': return fromNumber703(number.substring(1)); - case "4": + case '4': return fromNumber704(number.substring(1)); - case "5": + case '5': return fromNumber705(number.substring(1)); - case "6": + case '6': return fromNumber706(number.substring(1)); - case "7": + case '7': return fromNumber707(number.substring(1)); - case "8": + case '8': return fromNumber708(number.substring(1)); default: return ""; @@ -15446,18 +15456,18 @@ private static String fromNumber702(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7021"; // Kirchheim unter Teck - case "2": + case '2': return "7022"; // Nürtingen - case "3": + case '3': return "7023"; // Weilheim an der Teck - case "4": + case '4': return "7024"; // Wendlingen am Neckar - case "5": + case '5': return "7025"; // Neuffen - case "6": + case '6': return "7026"; // Lenningen default: return ""; @@ -15469,14 +15479,14 @@ private static String fromNumber703(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7031"; // Böblingen - case "2": + case '2': return "7032"; // Herrenberg - case "3": + case '3': return "7033"; // Weil Der Stadt - case "4": + case '4': return "7034"; // Ehningen default: return ""; @@ -15488,18 +15498,18 @@ private static String fromNumber704(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7041"; // Mühlacker - case "2": + case '2': return "7042"; // Vaihingen an der Enz - case "3": + case '3': return "7043"; // Maulbronn - case "4": + case '4': return "7044"; // Mönsheim - case "5": + case '5': return "7045"; // Oberderdingen - case "6": + case '6': return "7046"; // Zaberfeld default: return ""; @@ -15511,18 +15521,18 @@ private static String fromNumber705(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7051"; // Calw - case "2": + case '2': return "7052"; // Bad Liebenzell - case "3": + case '3': return "7053"; // Bad Teinach-Zavelstein - case "4": + case '4': return "7054"; // Wildberg Württ - case "5": + case '5': return "7055"; // Neuweiler Kr Calw - case "6": + case '6': return "7056"; // Gechingen default: return ""; @@ -15534,12 +15544,12 @@ private static String fromNumber706(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7062"; // Beilstein Württ - case "3": + case '3': return "7063"; // Bad Wimpfen - case "6": + case '6': return "7066"; // Bad Rappenau-Bonfeld default: return ""; @@ -15551,12 +15561,12 @@ private static String fromNumber707(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7071"; // Tübingen - case "2": + case '2': return "7072"; // Gomaringen - case "3": + case '3': return "7073"; // Ammerbuch default: return ""; @@ -15568,16 +15578,16 @@ private static String fromNumber708(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7081"; // Bad Wildbad - case "2": + case '2': return "7082"; // Neuenbürg Württ - case "3": + case '3': return "7083"; // Bad Herrenalb - case "4": + case '4': return "7084"; // Schömberg b Neuenbürg - case "5": + case '5': return "7085"; // Enzklösterle default: return ""; @@ -15589,24 +15599,24 @@ private static String fromNumber71(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "711"; // Stuttgart - case "2": + case '2': return fromNumber712(number.substring(1)); - case "3": + case '3': return fromNumber713(number.substring(1)); - case "4": + case '4': return fromNumber714(number.substring(1)); - case "5": + case '5': return fromNumber715(number.substring(1)); - case "6": + case '6': return fromNumber716(number.substring(1)); - case "7": + case '7': return fromNumber717(number.substring(1)); - case "8": + case '8': return fromNumber718(number.substring(1)); - case "9": + case '9': return fromNumber719(number.substring(1)); default: return ""; @@ -15618,24 +15628,24 @@ private static String fromNumber712(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7121"; // Reutlingen - case "2": + case '2': return "7122"; // St Johann Württ - case "3": + case '3': return "7123"; // Metzingen Württ - case "4": + case '4': return "7124"; // Trochtelfingen Hohenz - case "5": + case '5': return "7125"; // Bad Urach - case "6": + case '6': return "7126"; // Burladingen-Melchingen - case "7": + case '7': return "7127"; // Neckartenzlingen - case "8": + case '8': return "7128"; // Sonnenbühl - case "9": + case '9': return "7129"; // Lichtenstein Württ default: return ""; @@ -15647,24 +15657,24 @@ private static String fromNumber713(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7130"; // Löwenstein Württ - case "1": + case '1': return "7131"; // Heilbronn Neckar - case "2": + case '2': return "7132"; // Neckarsulm - case "3": + case '3': return "7133"; // Lauffen am Neckar - case "4": + case '4': return "7134"; // Weinsberg - case "5": + case '5': return "7135"; // Brackenheim - case "6": + case '6': return "7136"; // Bad Friedrichshall - case "8": + case '8': return "7138"; // Schwaigern - case "9": + case '9': return "7139"; // Neuenstadt am Kocher default: return ""; @@ -15676,22 +15686,22 @@ private static String fromNumber714(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7141"; // Ludwigsburg Württ - case "2": + case '2': return "7142"; // Bietigheim-Bissingen - case "3": + case '3': return "7143"; // Besigheim - case "4": + case '4': return "7144"; // Marbach am Neckar - case "5": + case '5': return "7145"; // Markgröningen - case "6": + case '6': return "7146"; // Remseck am Neckar - case "7": + case '7': return "7147"; // Sachsenheim Württ - case "8": + case '8': return "7148"; // Grossbottwar default: return ""; @@ -15703,24 +15713,24 @@ private static String fromNumber715(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7150"; // Korntal-Münchingen - case "1": + case '1': return "7151"; // Waiblingen - case "2": + case '2': return "7152"; // Leonberg Württ - case "3": + case '3': return "7153"; // Plochingen - case "4": + case '4': return "7154"; // Kornwestheim - case "6": + case '6': return "7156"; // Ditzingen - case "7": + case '7': return "7157"; // Waldenbuch - case "8": + case '8': return "7158"; // Neuhausen auf den Fildern - case "9": + case '9': return "7159"; // Renningen default: return ""; @@ -15732,18 +15742,18 @@ private static String fromNumber716(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7161"; // Göppingen - case "2": + case '2': return "7162"; // Süßen - case "3": + case '3': return "7163"; // Ebersbach an der Fils - case "4": + case '4': return "7164"; // Boll Kr Göppingen - case "5": + case '5': return "7165"; // Göppingen-Hohenstaufen - case "6": + case '6': return "7166"; // Adelberg default: return ""; @@ -15755,18 +15765,18 @@ private static String fromNumber717(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7171"; // Schwäbisch Gmünd - case "2": + case '2': return "7172"; // Lorch Württ - case "3": + case '3': return "7173"; // Heubach - case "4": + case '4': return "7174"; // Mögglingen - case "5": + case '5': return "7175"; // Leinzell - case "6": + case '6': return "7176"; // Spraitbach default: return ""; @@ -15778,14 +15788,14 @@ private static String fromNumber718(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7181"; // Schorndorf Württ - case "2": + case '2': return "7182"; // Welzheim - case "3": + case '3': return "7183"; // Rudersberg Württ - case "4": + case '4': return "7184"; // Kaisersbach default: return ""; @@ -15797,16 +15807,16 @@ private static String fromNumber719(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7191"; // Backnang - case "2": + case '2': return "7192"; // Murrhardt - case "3": + case '3': return "7193"; // Sulzbach an der Murr - case "4": + case '4': return "7194"; // Spiegelberg - case "5": + case '5': return "7195"; // Winnenden default: return ""; @@ -15818,22 +15828,22 @@ private static String fromNumber72(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber720(number.substring(1)); - case "1": + case '1': return "721"; // Karlsruhe - case "2": + case '2': return fromNumber722(number.substring(1)); - case "3": + case '3': return fromNumber723(number.substring(1)); - case "4": + case '4': return fromNumber724(number.substring(1)); - case "5": + case '5': return fromNumber725(number.substring(1)); - case "6": + case '6': return fromNumber726(number.substring(1)); - case "7": + case '7': return fromNumber727(number.substring(1)); default: return ""; @@ -15845,12 +15855,12 @@ private static String fromNumber720(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7202"; // Karlsbad - case "3": + case '3': return "7203"; // Walzbachtal - case "4": + case '4': return "7204"; // Malsch-Völkersbach default: return ""; @@ -15862,26 +15872,26 @@ private static String fromNumber722(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7220"; // Forbach-Hundsbach - case "1": + case '1': return "7221"; // Baden-Baden - case "2": + case '2': return "7222"; // Rastatt - case "3": + case '3': return "7223"; // Bühl Baden - case "4": + case '4': return "7224"; // Gernsbach - case "5": + case '5': return "7225"; // Gaggenau - case "6": + case '6': return "7226"; // Bühl-Sand - case "7": + case '7': return "7227"; // Lichtenau Baden - case "8": + case '8': return "7228"; // Forbach - case "9": + case '9': return "7229"; // Iffezheim default: return ""; @@ -15893,20 +15903,20 @@ private static String fromNumber723(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7231"; // Pforzheim - case "2": + case '2': return "7232"; // Königsbach-Stein - case "3": + case '3': return "7233"; // Niefern-Öschelbronn - case "4": + case '4': return "7234"; // Tiefenbronn - case "5": + case '5': return "7235"; // Unterreichenbach Kr Calw - case "6": + case '6': return "7236"; // Keltern - case "7": + case '7': return "7237"; // Neulingen Enzkreis default: return ""; @@ -15918,24 +15928,24 @@ private static String fromNumber724(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7240"; // Pfinztal - case "2": + case '2': return "7242"; // Rheinstetten - case "3": + case '3': return "7243"; // Ettlingen - case "4": + case '4': return "7244"; // Weingarten Baden - case "5": + case '5': return "7245"; // Durmersheim - case "6": + case '6': return "7246"; // Malsch Kr Karlsruhe - case "7": + case '7': return "7247"; // Linkenheim-Hochstetten - case "8": + case '8': return "7248"; // Marxzell - case "9": + case '9': return "7249"; // Stutensee default: return ""; @@ -15947,26 +15957,26 @@ private static String fromNumber725(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7250"; // Kraichtal - case "1": + case '1': return "7251"; // Bruchsal - case "2": + case '2': return "7252"; // Bretten - case "3": + case '3': return "7253"; // Bad Schönborn - case "4": + case '4': return "7254"; // Waghäusel - case "5": + case '5': return "7255"; // Graben-Neudorf - case "6": + case '6': return "7256"; // Philippsburg - case "7": + case '7': return "7257"; // Bruchsal-Untergrombach - case "8": + case '8': return "7258"; // Oberderdingen-Flehingen - case "9": + case '9': return "7259"; // Östringen-Odenheim default: return ""; @@ -15978,26 +15988,26 @@ private static String fromNumber726(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7260"; // Sinsheim-Hilsbach - case "1": + case '1': return "7261"; // Sinsheim - case "2": + case '2': return "7262"; // Eppingen - case "3": + case '3': return "7263"; // Waibstadt - case "4": + case '4': return "7264"; // Bad Rappenau - case "5": + case '5': return "7265"; // Angelbachtal - case "6": + case '6': return "7266"; // Kirchardt - case "7": + case '7': return "7267"; // Gemmingen - case "8": + case '8': return "7268"; // Bad Rappenau-Obergimpern - case "9": + case '9': return "7269"; // Sulzfeld Baden default: return ""; @@ -16009,20 +16019,20 @@ private static String fromNumber727(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7271"; // Wörth am Rhein - case "2": + case '2': return "7272"; // Rülzheim - case "3": + case '3': return "7273"; // Hagenbach Pfalz - case "4": + case '4': return "7274"; // Germersheim - case "5": + case '5': return "7275"; // Kandel - case "6": + case '6': return "7276"; // Herxheim bei Landau Pfalz - case "7": + case '7': return "7277"; // Wörth-Büchelberg default: return ""; @@ -16034,26 +16044,26 @@ private static String fromNumber73(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber730(number.substring(1)); - case "1": + case '1': return "731"; // Ulm Donau - case "2": + case '2': return fromNumber732(number.substring(1)); - case "3": + case '3': return fromNumber733(number.substring(1)); - case "4": + case '4': return fromNumber734(number.substring(1)); - case "5": + case '5': return fromNumber735(number.substring(1)); - case "6": + case '6': return fromNumber736(number.substring(1)); - case "7": + case '7': return fromNumber737(number.substring(1)); - case "8": + case '8': return fromNumber738(number.substring(1)); - case "9": + case '9': return fromNumber739(number.substring(1)); default: return ""; @@ -16065,24 +16075,24 @@ private static String fromNumber730(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7300"; // Roggenburg - case "2": + case '2': return "7302"; // Pfaffenhofen a d Roth - case "3": + case '3': return "7303"; // Illertissen - case "4": + case '4': return "7304"; // Blaustein Württ - case "5": + case '5': return "7305"; // Erbach Donau - case "6": + case '6': return "7306"; // Vöhringen Iller - case "7": + case '7': return "7307"; // Senden Iller - case "8": + case '8': return "7308"; // Nersingen - case "9": + case '9': return "7309"; // Weissenhorn default: return ""; @@ -16094,24 +16104,24 @@ private static String fromNumber732(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7321"; // Heidenheim a d Brenz - case "2": + case '2': return "7322"; // Giengen a d Brenz - case "3": + case '3': return "7323"; // Gerstetten - case "4": + case '4': return "7324"; // Herbrechtingen - case "5": + case '5': return "7325"; // Sontheim a d Brenz - case "6": + case '6': return "7326"; // Neresheim - case "7": + case '7': return "7327"; // Dischingen - case "8": + case '8': return "7328"; // Königsbronn - case "9": + case '9': return "7329"; // Steinheim am Albuch default: return ""; @@ -16123,20 +16133,20 @@ private static String fromNumber733(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7331"; // Geislingen an der Steige - case "2": + case '2': return "7332"; // Lauterstein - case "3": + case '3': return "7333"; // Laichingen - case "4": + case '4': return "7334"; // Deggingen - case "5": + case '5': return "7335"; // Wiesensteig - case "6": + case '6': return "7336"; // Lonsee - case "7": + case '7': return "7337"; // Nellingen Alb default: return ""; @@ -16148,20 +16158,20 @@ private static String fromNumber734(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7340"; // Neenstetten - case "3": + case '3': return "7343"; // Buch b Illertissen - case "4": + case '4': return "7344"; // Blaubeuren - case "5": + case '5': return "7345"; // Langenau Württ - case "6": + case '6': return "7346"; // Illerkirchberg - case "7": + case '7': return "7347"; // Dietenheim - case "8": + case '8': return "7348"; // Beimerstetten default: return ""; @@ -16173,22 +16183,22 @@ private static String fromNumber735(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7351"; // Biberach an der Riß - case "2": + case '2': return "7352"; // Ochsenhausen - case "3": + case '3': return "7353"; // Schwendi - case "4": + case '4': return "7354"; // Erolzheim - case "5": + case '5': return "7355"; // Hochdorf Riß - case "6": + case '6': return "7356"; // Schemmerhofen - case "7": + case '7': return "7357"; // Attenweiler - case "8": + case '8': return "7358"; // Eberhardzell-Füramoos default: return ""; @@ -16200,20 +16210,20 @@ private static String fromNumber736(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7361"; // Aalen - case "2": + case '2': return "7362"; // Bopfingen - case "3": + case '3': return "7363"; // Lauchheim - case "4": + case '4': return "7364"; // Oberkochen - case "5": + case '5': return "7365"; // Essingen Württ - case "6": + case '6': return "7366"; // Abtsgmünd - case "7": + case '7': return "7367"; // Aalen-Ebnat default: return ""; @@ -16225,16 +16235,16 @@ private static String fromNumber737(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7371"; // Riedlingen Württ - case "3": + case '3': return "7373"; // Zwiefalten - case "4": + case '4': return "7374"; // Uttenweiler - case "5": + case '5': return "7375"; // Obermarchtal - case "6": + case '6': return "7376"; // Langenenslingen default: return ""; @@ -16246,24 +16256,24 @@ private static String fromNumber738(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7381"; // Münsingen - case "2": + case '2': return "7382"; // Römerstein - case "3": + case '3': return "7383"; // Münsingen-Buttenhausen - case "4": + case '4': return "7384"; // Schelklingen-Hütten - case "5": + case '5': return "7385"; // Gomadingen - case "6": + case '6': return "7386"; // Hayingen - case "7": + case '7': return "7387"; // Hohenstein Württ - case "8": + case '8': return "7388"; // Pfronstetten - case "9": + case '9': return "7389"; // Heroldstatt default: return ""; @@ -16275,16 +16285,16 @@ private static String fromNumber739(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7391"; // Ehingen Donau - case "2": + case '2': return "7392"; // Laupheim - case "3": + case '3': return "7393"; // Munderkingen - case "4": + case '4': return "7394"; // Schelklingen - case "5": + case '5': return "7395"; // Ehingen-Dächingen default: return ""; @@ -16296,24 +16306,24 @@ private static String fromNumber74(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber740(number.substring(1)); - case "1": + case '1': return "741"; // Rottweil - case "2": + case '2': return fromNumber742(number.substring(1)); - case "3": + case '3': return fromNumber743(number.substring(1)); - case "4": + case '4': return fromNumber744(number.substring(1)); - case "5": + case '5': return fromNumber745(number.substring(1)); - case "6": + case '6': return fromNumber746(number.substring(1)); - case "7": + case '7': return fromNumber747(number.substring(1)); - case "8": + case '8': return fromNumber748(number.substring(1)); default: return ""; @@ -16325,12 +16335,12 @@ private static String fromNumber740(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7402"; // Fluorn-Winzeln - case "3": + case '3': return "7403"; // Dunningen - case "4": + case '4': return "7404"; // Epfendorf default: return ""; @@ -16342,24 +16352,24 @@ private static String fromNumber742(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7420"; // Deisslingen - case "2": + case '2': return "7422"; // Schramberg - case "3": + case '3': return "7423"; // Oberndorf am Neckar - case "4": + case '4': return "7424"; // Spaichingen - case "5": + case '5': return "7425"; // Trossingen - case "6": + case '6': return "7426"; // Gosheim - case "7": + case '7': return "7427"; // Schömberg b Balingen - case "8": + case '8': return "7428"; // Rosenfeld - case "9": + case '9': return "7429"; // Egesheim default: return ""; @@ -16371,18 +16381,18 @@ private static String fromNumber743(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7431"; // Albstadt-Ebingen - case "2": + case '2': return "7432"; // Albstadt-Tailfingen - case "3": + case '3': return "7433"; // Balingen - case "4": + case '4': return "7434"; // Winterlingen - case "5": + case '5': return "7435"; // Albstadt-Laufen - case "6": + case '6': return "7436"; // Messstetten-Oberdigisheim default: return ""; @@ -16394,26 +16404,26 @@ private static String fromNumber744(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7440"; // Bad Rippoldsau - case "1": + case '1': return "7441"; // Freudenstadt - case "2": + case '2': return "7442"; // Baiersbronn - case "3": + case '3': return "7443"; // Dornstetten - case "4": + case '4': return "7444"; // Alpirsbach - case "5": + case '5': return "7445"; // Pfalzgrafenweiler - case "6": + case '6': return "7446"; // Lossburg - case "7": + case '7': return "7447"; // Baiersbronn-Schwarzenberg - case "8": + case '8': return "7448"; // Seewald - case "9": + case '9': return "7449"; // Baiersbronn-Obertal default: return ""; @@ -16425,24 +16435,24 @@ private static String fromNumber745(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7451"; // Horb am Neckar - case "2": + case '2': return "7452"; // Nagold - case "3": + case '3': return "7453"; // Altensteig Württ - case "4": + case '4': return "7454"; // Sulz am Neckar - case "5": + case '5': return "7455"; // Dornhan - case "6": + case '6': return "7456"; // Haiterbach - case "7": + case '7': return "7457"; // Rottenburg-Ergenzingen - case "8": + case '8': return "7458"; // Ebhausen - case "9": + case '9': return "7459"; // Nagold-Hochdorf default: return ""; @@ -16454,20 +16464,20 @@ private static String fromNumber746(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7461"; // Tuttlingen - case "2": + case '2': return "7462"; // Immendingen - case "3": + case '3': return "7463"; // Mühlheim an der Donau - case "4": + case '4': return "7464"; // Talheim Kr Tuttlingen - case "5": + case '5': return "7465"; // Emmingen-Liptingen - case "6": + case '6': return "7466"; // Beuron - case "7": + case '7': return "7467"; // Neuhausen ob Eck default: return ""; @@ -16479,22 +16489,22 @@ private static String fromNumber747(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7471"; // Hechingen - case "2": + case '2': return "7472"; // Rottenburg am Neckar - case "3": + case '3': return "7473"; // Mössingen - case "4": + case '4': return "7474"; // Haigerloch - case "5": + case '5': return "7475"; // Burladingen - case "6": + case '6': return "7476"; // Bisingen - case "7": + case '7': return "7477"; // Jungingen b Hechingen - case "8": + case '8': return "7478"; // Hirrlingen default: return ""; @@ -16506,16 +16516,16 @@ private static String fromNumber748(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7482"; // Horb-Dettingen - case "3": + case '3': return "7483"; // Horb-Mühringen - case "4": + case '4': return "7484"; // Simmersfeld - case "5": + case '5': return "7485"; // Empfingen - case "6": + case '6': return "7486"; // Horb-Altheim default: return ""; @@ -16527,24 +16537,24 @@ private static String fromNumber75(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber750(number.substring(1)); - case "1": + case '1': return "751"; // Ravensburg - case "2": + case '2': return fromNumber752(number.substring(1)); - case "3": + case '3': return fromNumber753(number.substring(1)); - case "4": + case '4': return fromNumber754(number.substring(1)); - case "5": + case '5': return fromNumber755(number.substring(1)); - case "6": + case '6': return fromNumber756(number.substring(1)); - case "7": + case '7': return fromNumber757(number.substring(1)); - case "8": + case '8': return fromNumber758(number.substring(1)); default: return ""; @@ -16556,16 +16566,16 @@ private static String fromNumber750(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7502"; // Wolpertswende - case "3": + case '3': return "7503"; // Wilhelmsdorf Württ - case "4": + case '4': return "7504"; // Horgenzell - case "5": + case '5': return "7505"; // Fronreute - case "6": + case '6': return "7506"; // Wangen-Leupolz default: return ""; @@ -16577,20 +16587,20 @@ private static String fromNumber752(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7520"; // Bodnegg - case "2": + case '2': return "7522"; // Wangen im Allgäu - case "4": + case '4': return "7524"; // Bad Waldsee - case "5": + case '5': return "7525"; // Aulendorf - case "7": + case '7': return "7527"; // Wolfegg - case "8": + case '8': return "7528"; // Neukirch b Tettnang - case "9": + case '9': return "7529"; // Waldburg Württ default: return ""; @@ -16602,14 +16612,14 @@ private static String fromNumber753(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7531"; // Konstanz - case "2": + case '2': return "7532"; // Meersburg - case "3": + case '3': return "7533"; // Allensbach - case "4": + case '4': return "7534"; // Reichenau Baden default: return ""; @@ -16621,18 +16631,18 @@ private static String fromNumber754(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7541"; // Friedrichshafen - case "2": + case '2': return "7542"; // Tettnang - case "3": + case '3': return "7543"; // Kressbronn am Bodensee - case "4": + case '4': return "7544"; // Markdorf - case "5": + case '5': return "7545"; // Immenstaad am Bodensee - case "6": + case '6': return "7546"; // Oberteuringen default: return ""; @@ -16644,22 +16654,22 @@ private static String fromNumber755(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7551"; // Überlingen Bodensee - case "2": + case '2': return "7552"; // Pfullendorf - case "3": + case '3': return "7553"; // Salem Baden - case "4": + case '4': return "7554"; // Heiligenberg Baden - case "5": + case '5': return "7555"; // Deggenhausertal - case "6": + case '6': return "7556"; // Uhldingen-Mühlhofen - case "7": + case '7': return "7557"; // Herdwangen-Schönach - case "8": + case '8': return "7558"; // Illmensee default: return ""; @@ -16671,24 +16681,24 @@ private static String fromNumber756(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7561"; // Leutkirch im Allgäu - case "2": + case '2': return "7562"; // Isny im Allgäu - case "3": + case '3': return "7563"; // Kisslegg - case "4": + case '4': return "7564"; // Bad Wurzach - case "5": + case '5': return "7565"; // Aichstetten Kr Ravensburg - case "6": + case '6': return "7566"; // Argenbühl - case "7": + case '7': return "7567"; // Leutkirch-Friesenhofen - case "8": + case '8': return "7568"; // Bad Wurzach-Hauerz - case "9": + case '9': return "7569"; // Isny-Eisenbach default: return ""; @@ -16700,26 +16710,26 @@ private static String fromNumber757(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7570"; // Sigmaringen-Gutenstein - case "1": + case '1': return "7571"; // Sigmaringen - case "2": + case '2': return "7572"; // Mengen Württ - case "3": + case '3': return "7573"; // Stetten am kalten Markt - case "4": + case '4': return "7574"; // Gammertingen - case "5": + case '5': return "7575"; // Messkirch - case "6": + case '6': return "7576"; // Krauchenwies - case "7": + case '7': return "7577"; // Veringenstadt - case "8": + case '8': return "7578"; // Wald Hohenz - case "9": + case '9': return "7579"; // Schwenningen Baden default: return ""; @@ -16731,20 +16741,20 @@ private static String fromNumber758(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7581"; // Saulgau - case "2": + case '2': return "7582"; // Bad Buchau - case "3": + case '3': return "7583"; // Bad Schussenried - case "4": + case '4': return "7584"; // Altshausen - case "5": + case '5': return "7585"; // Ostrach - case "6": + case '6': return "7586"; // Herbertingen - case "7": + case '7': return "7587"; // Hosskirch default: return ""; @@ -16756,24 +16766,24 @@ private static String fromNumber76(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber760(number.substring(1)); - case "1": + case '1': return "761"; // Freiburg im Breisgau - case "2": + case '2': return fromNumber762(number.substring(1)); - case "3": + case '3': return fromNumber763(number.substring(1)); - case "4": + case '4': return fromNumber764(number.substring(1)); - case "5": + case '5': return fromNumber765(number.substring(1)); - case "6": + case '6': return fromNumber766(number.substring(1)); - case "7": + case '7': return fromNumber767(number.substring(1)); - case "8": + case '8': return fromNumber768(number.substring(1)); default: return ""; @@ -16785,8 +16795,8 @@ private static String fromNumber760(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7602"; // Oberried Breisgau default: return ""; @@ -16798,26 +16808,26 @@ private static String fromNumber762(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7620"; // Schopfheim-Gersbach - case "1": + case '1': return "7621"; // Lörrach - case "2": + case '2': return "7622"; // Schopfheim - case "3": + case '3': return "7623"; // Rheinfelden Baden - case "4": + case '4': return "7624"; // Grenzach-Wyhlen - case "5": + case '5': return "7625"; // Zell im Wiesental - case "6": + case '6': return "7626"; // Kandern - case "7": + case '7': return "7627"; // Steinen Kr Lörrach - case "8": + case '8': return "7628"; // Efringen-Kirchen - case "9": + case '9': return "7629"; // Tegernau Baden default: return ""; @@ -16829,18 +16839,18 @@ private static String fromNumber763(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7631"; // Müllheim Baden - case "2": + case '2': return "7632"; // Badenweiler - case "3": + case '3': return "7633"; // Staufen im Breisgau - case "4": + case '4': return "7634"; // Sulzburg - case "5": + case '5': return "7635"; // Schliengen - case "6": + case '6': return "7636"; // Münstertal Schwarzwald default: return ""; @@ -16852,18 +16862,18 @@ private static String fromNumber764(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7641"; // Emmendingen - case "2": + case '2': return "7642"; // Endingen Kaiserstuhl - case "3": + case '3': return "7643"; // Herbolzheim Breisgau - case "4": + case '4': return "7644"; // Kenzingen - case "5": + case '5': return "7645"; // Freiamt - case "6": + case '6': return "7646"; // Weisweil Breisgau default: return ""; @@ -16875,20 +16885,20 @@ private static String fromNumber765(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7651"; // Titisee-Neustadt - case "2": + case '2': return "7652"; // Hinterzarten - case "3": + case '3': return "7653"; // Lenzkirch - case "4": + case '4': return "7654"; // Löffingen - case "5": + case '5': return "7655"; // Feldberg-Altglashütten - case "6": + case '6': return "7656"; // Schluchsee - case "7": + case '7': return "7657"; // Eisenbach Hochschwarzwald default: return ""; @@ -16900,26 +16910,26 @@ private static String fromNumber766(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7660"; // St Peter Schwarzw - case "1": + case '1': return "7661"; // Kirchzarten - case "2": + case '2': return "7662"; // Vogtsburg im Kaiserstuhl - case "3": + case '3': return "7663"; // Eichstetten - case "4": + case '4': return "7664"; // Freiburg-Tiengen - case "5": + case '5': return "7665"; // March Breisgau - case "6": + case '6': return "7666"; // Denzlingen - case "7": + case '7': return "7667"; // Breisach am Rhein - case "8": + case '8': return "7668"; // Ihringen - case "9": + case '9': return "7669"; // St Märgen default: return ""; @@ -16931,18 +16941,18 @@ private static String fromNumber767(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7671"; // Todtnau - case "2": + case '2': return "7672"; // St Blasien - case "3": + case '3': return "7673"; // Schönau im Schwarzwald - case "4": + case '4': return "7674"; // Todtmoos - case "5": + case '5': return "7675"; // Bernau Baden - case "6": + case '6': return "7676"; // Feldberg Schwarzwald default: return ""; @@ -16954,16 +16964,16 @@ private static String fromNumber768(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7681"; // Waldkirch Breisgau - case "2": + case '2': return "7682"; // Elzach - case "3": + case '3': return "7683"; // Simonswald - case "4": + case '4': return "7684"; // Glottertal - case "5": + case '5': return "7685"; // Gutach-Bleibach default: return ""; @@ -16975,22 +16985,22 @@ private static String fromNumber77(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber770(number.substring(1)); - case "1": + case '1': return "771"; // Donaueschingen - case "2": + case '2': return fromNumber772(number.substring(1)); - case "3": + case '3': return fromNumber773(number.substring(1)); - case "4": + case '4': return fromNumber774(number.substring(1)); - case "5": + case '5': return fromNumber775(number.substring(1)); - case "6": + case '6': return fromNumber776(number.substring(1)); - case "7": + case '7': return fromNumber777(number.substring(1)); default: return ""; @@ -17002,22 +17012,22 @@ private static String fromNumber770(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7702"; // Blumberg Baden - case "3": + case '3': return "7703"; // Bonndorf im Schwarzwald - case "4": + case '4': return "7704"; // Geisingen Baden - case "5": + case '5': return "7705"; // Wolterdingen Schwarzw - case "6": + case '6': return "7706"; // Oberbaldingen - case "7": + case '7': return "7707"; // Bräunlingen - case "8": + case '8': return "7708"; // Geisingen-Leipferdingen - case "9": + case '9': return "7709"; // Wutach default: return ""; @@ -17029,26 +17039,26 @@ private static String fromNumber772(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7720"; // Schwenningen a Neckar - case "1": + case '1': return "7721"; // Villingen i Schwarzw - case "2": + case '2': return "7722"; // Triberg im Schwarzwald - case "3": + case '3': return "7723"; // Furtwangen im Schwarzwald - case "4": + case '4': return "7724"; // St Georgen im Schwarzwald - case "5": + case '5': return "7725"; // Königsfeld im Schwarzwald - case "6": + case '6': return "7726"; // Bad Dürrheim - case "7": + case '7': return "7727"; // Vöhrenbach - case "8": + case '8': return "7728"; // Niedereschach - case "9": + case '9': return "7729"; // Tennenbronn default: return ""; @@ -17060,22 +17070,22 @@ private static String fromNumber773(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7731"; // Singen Hohentwiel - case "2": + case '2': return "7732"; // Radolfzell am Bodensee - case "3": + case '3': return "7733"; // Engen Hegau - case "4": + case '4': return "7734"; // Gailingen - case "5": + case '5': return "7735"; // Öhningen - case "6": + case '6': return "7736"; // Tengen - case "8": + case '8': return "7738"; // Steisslingen - case "9": + case '9': return "7739"; // Hilzingen default: return ""; @@ -17087,22 +17097,22 @@ private static String fromNumber774(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7741"; // Tiengen Hochrhein - case "2": + case '2': return "7742"; // Klettgau - case "3": + case '3': return "7743"; // Ühlingen-Birkendorf - case "4": + case '4': return "7744"; // Stühlingen - case "5": + case '5': return "7745"; // Jestetten - case "6": + case '6': return "7746"; // Wutöschingen - case "7": + case '7': return "7747"; // Berau - case "8": + case '8': return "7748"; // Grafenhausen Hochschwarzw default: return ""; @@ -17114,14 +17124,14 @@ private static String fromNumber775(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7751"; // Waldshut - case "3": + case '3': return "7753"; // Albbruck - case "4": + case '4': return "7754"; // Görwihl - case "5": + case '5': return "7755"; // Weilheim Kr Waldshut default: return ""; @@ -17133,16 +17143,16 @@ private static String fromNumber776(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7761"; // Bad Säckingen - case "2": + case '2': return "7762"; // Wehr Baden - case "3": + case '3': return "7763"; // Murg - case "4": + case '4': return "7764"; // Herrischried - case "5": + case '5': return "7765"; // Rickenbach Hotzenw default: return ""; @@ -17154,16 +17164,16 @@ private static String fromNumber777(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7771"; // Stockach - case "3": + case '3': return "7773"; // Bodman-Ludwigshafen - case "4": + case '4': return "7774"; // Eigeltingen - case "5": + case '5': return "7775"; // Mühlingen - case "7": + case '7': return "7777"; // Sauldorf default: return ""; @@ -17175,18 +17185,18 @@ private static String fromNumber78(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber780(number.substring(1)); - case "1": + case '1': return "781"; // Offenburg - case "2": + case '2': return fromNumber782(number.substring(1)); - case "3": + case '3': return fromNumber783(number.substring(1)); - case "4": + case '4': return fromNumber784(number.substring(1)); - case "5": + case '5': return fromNumber785(number.substring(1)); default: return ""; @@ -17198,20 +17208,20 @@ private static String fromNumber780(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "7802"; // Oberkirch Baden - case "3": + case '3': return "7803"; // Gengenbach - case "4": + case '4': return "7804"; // Oppenau - case "5": + case '5': return "7805"; // Appenweier - case "6": + case '6': return "7806"; // Bad Peterstal-Griesbach - case "7": + case '7': return "7807"; // Neuried Ortenaukreis - case "8": + case '8': return "7808"; // Hohberg b Offenburg default: return ""; @@ -17223,18 +17233,18 @@ private static String fromNumber782(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7821"; // Lahr Schwarzwald - case "2": + case '2': return "7822"; // Ettenheim - case "3": + case '3': return "7823"; // Seelbach Schutter - case "4": + case '4': return "7824"; // Schwanau - case "5": + case '5': return "7825"; // Kippenheim - case "6": + case '6': return "7826"; // Schuttertal default: return ""; @@ -17246,24 +17256,24 @@ private static String fromNumber783(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7831"; // Hausach - case "2": + case '2': return "7832"; // Haslach im Kinzigtal - case "3": + case '3': return "7833"; // Hornberg Schwarzwaldbahn - case "4": + case '4': return "7834"; // Wolfach - case "5": + case '5': return "7835"; // Zell am Harmersbach - case "6": + case '6': return "7836"; // Schiltach - case "7": + case '7': return "7837"; // Oberharmersbach - case "8": + case '8': return "7838"; // Nordrach - case "9": + case '9': return "7839"; // Schapbach default: return ""; @@ -17275,14 +17285,14 @@ private static String fromNumber784(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7841"; // Achern - case "2": + case '2': return "7842"; // Kappelrodeck - case "3": + case '3': return "7843"; // Renchen - case "4": + case '4': return "7844"; // Rheinau default: return ""; @@ -17294,14 +17304,14 @@ private static String fromNumber785(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7851"; // Kehl - case "2": + case '2': return "7852"; // Willstätt - case "3": + case '3': return "7853"; // Kehl-Bodersweier - case "4": + case '4': return "7854"; // Kehl-Goldscheuer default: return ""; @@ -17313,20 +17323,20 @@ private static String fromNumber79(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber790(number.substring(1)); - case "1": + case '1': return "791"; // Schwäbisch Hall - case "3": + case '3': return fromNumber793(number.substring(1)); - case "4": + case '4': return fromNumber794(number.substring(1)); - case "5": + case '5': return fromNumber795(number.substring(1)); - case "6": + case '6': return fromNumber796(number.substring(1)); - case "7": + case '7': return fromNumber797(number.substring(1)); default: return ""; @@ -17338,16 +17348,16 @@ private static String fromNumber790(String number) { return ""; } - switch (number.substring(0, 1)) { - case "3": + switch (number.charAt(0)) { + case '3': return "7903"; // Mainhardt - case "4": + case '4': return "7904"; // Ilshofen - case "5": + case '5': return "7905"; // Langenburg - case "6": + case '6': return "7906"; // Braunsbach - case "7": + case '7': return "7907"; // Schwäbisch Hall-Sulzdorf default: return ""; @@ -17359,26 +17369,26 @@ private static String fromNumber793(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7930"; // Boxberg Baden - case "1": + case '1': return "7931"; // Bad Mergentheim - case "2": + case '2': return "7932"; // Niederstetten Württ - case "3": + case '3': return "7933"; // Creglingen - case "4": + case '4': return "7934"; // Weikersheim - case "5": + case '5': return "7935"; // Schrozberg - case "6": + case '6': return "7936"; // Schrozberg-Bartenstein - case "7": + case '7': return "7937"; // Dörzbach - case "8": + case '8': return "7938"; // Mulfingen Jagst - case "9": + case '9': return "7939"; // Schrozberg-Spielbach default: return ""; @@ -17390,26 +17400,26 @@ private static String fromNumber794(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7940"; // Künzelsau - case "1": + case '1': return "7941"; // Öhringen - case "2": + case '2': return "7942"; // Neuenstein Württ - case "3": + case '3': return "7943"; // Schöntal Jagst - case "4": + case '4': return "7944"; // Kupferzell - case "5": + case '5': return "7945"; // Wüstenrot - case "6": + case '6': return "7946"; // Bretzfeld - case "7": + case '7': return "7947"; // Forchtenberg - case "8": + case '8': return "7948"; // Öhringen-Ohrnberg - case "9": + case '9': return "7949"; // Pfedelbach-Untersteinbach default: return ""; @@ -17421,24 +17431,24 @@ private static String fromNumber795(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "7950"; // Schnelldorf - case "1": + case '1': return "7951"; // Crailsheim - case "2": + case '2': return "7952"; // Gerabronn - case "3": + case '3': return "7953"; // Blaufelden - case "4": + case '4': return "7954"; // Kirchberg an der Jagst - case "5": + case '5': return "7955"; // Wallhausen Württ - case "7": + case '7': return "7957"; // Kressberg - case "8": + case '8': return "7958"; // Rot Am See-Brettheim - case "9": + case '9': return "7959"; // Frankenhardt default: return ""; @@ -17450,20 +17460,20 @@ private static String fromNumber796(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7961"; // Ellwangen Jagst - case "2": + case '2': return "7962"; // Fichtenau - case "3": + case '3': return "7963"; // Adelmannsfelden - case "4": + case '4': return "7964"; // Stödtlen - case "5": + case '5': return "7965"; // Ellwangen-Röhlingen - case "6": + case '6': return "7966"; // Unterschneidheim - case "7": + case '7': return "7967"; // Jagstzell default: return ""; @@ -17475,20 +17485,20 @@ private static String fromNumber797(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "7971"; // Gaildorf - case "2": + case '2': return "7972"; // Gschwend b Gaildorf - case "3": + case '3': return "7973"; // Obersontheim - case "4": + case '4': return "7974"; // Bühlerzell - case "5": + case '5': return "7975"; // Untergröningen - case "6": + case '6': return "7976"; // Sulzbach-Laufen - case "7": + case '7': return "7977"; // Oberrot b Gaildorf default: return ""; @@ -17500,26 +17510,26 @@ private static String fromNumber8(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber80(number.substring(1)); - case "1": + case '1': return fromNumber81(number.substring(1)); - case "2": + case '2': return fromNumber82(number.substring(1)); - case "3": + case '3': return fromNumber83(number.substring(1)); - case "4": + case '4': return fromNumber84(number.substring(1)); - case "5": + case '5': return fromNumber85(number.substring(1)); - case "6": + case '6': return fromNumber86(number.substring(1)); - case "7": + case '7': return fromNumber87(number.substring(1)); - case "8": + case '8': return fromNumber88(number.substring(1)); - case "9": + case '9': return "89"; // München default: return ""; @@ -17531,22 +17541,22 @@ private static String fromNumber80(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return fromNumber802(number.substring(1)); - case "3": + case '3': return fromNumber803(number.substring(1)); - case "4": + case '4': return fromNumber804(number.substring(1)); - case "5": + case '5': return fromNumber805(number.substring(1)); - case "6": + case '6': return fromNumber806(number.substring(1)); - case "7": + case '7': return fromNumber807(number.substring(1)); - case "8": + case '8': return fromNumber808(number.substring(1)); - case "9": + case '9': return fromNumber809(number.substring(1)); default: return ""; @@ -17558,26 +17568,26 @@ private static String fromNumber802(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8020"; // Weyarn - case "1": + case '1': return "8021"; // Waakirchen - case "2": + case '2': return "8022"; // Tegernsee - case "3": + case '3': return "8023"; // Bayrischzell - case "4": + case '4': return "8024"; // Holzkirchen - case "5": + case '5': return "8025"; // Miesbach - case "6": + case '6': return "8026"; // Hausham - case "7": + case '7': return "8027"; // Dietramszell - case "8": + case '8': return "8028"; // Fischbachau - case "9": + case '9': return "8029"; // Kreuth b Tegernsee default: return ""; @@ -17589,22 +17599,22 @@ private static String fromNumber803(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8031"; // Rosenheim Oberbay - case "2": + case '2': return "8032"; // Rohrdorf Kr Rosenheim - case "3": + case '3': return "8033"; // Oberaudorf - case "4": + case '4': return "8034"; // Brannenburg - case "5": + case '5': return "8035"; // Raubling - case "6": + case '6': return "8036"; // Stephanskirchen Simssee - case "8": + case '8': return "8038"; // Vogtareuth - case "9": + case '9': return "8039"; // Rott a Inn default: return ""; @@ -17616,16 +17626,16 @@ private static String fromNumber804(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8041"; // Bad Tölz - case "2": + case '2': return "8042"; // Lenggries - case "3": + case '3': return "8043"; // Jachenau - case "5": + case '5': return "8045"; // Lenggries-Fall - case "6": + case '6': return "8046"; // Bad Heilbrunn default: return ""; @@ -17637,20 +17647,20 @@ private static String fromNumber805(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8051"; // Prien a Chiemsee - case "2": + case '2': return "8052"; // Aschau i Chiemgau - case "3": + case '3': return "8053"; // Bad Endorf - case "4": + case '4': return "8054"; // Breitbrunn a Chiemsee - case "5": + case '5': return "8055"; // Halfing - case "6": + case '6': return "8056"; // Eggstätt - case "7": + case '7': return "8057"; // Aschau-Sachrang default: return ""; @@ -17662,20 +17672,20 @@ private static String fromNumber806(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8061"; // Bad Aibling - case "2": + case '2': return "8062"; // Bruckmühl Mangfall - case "3": + case '3': return "8063"; // Feldkirchen-Westerham - case "4": + case '4': return "8064"; // Au b Bad Aibling - case "5": + case '5': return "8065"; // Tuntenhausen-Schönau - case "6": + case '6': return "8066"; // Bad Feilnbach - case "7": + case '7': return "8067"; // Tuntenhausen default: return ""; @@ -17687,18 +17697,18 @@ private static String fromNumber807(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8071"; // Wasserburg a Inn - case "2": + case '2': return "8072"; // Haag i OB - case "3": + case '3': return "8073"; // Gars a Inn - case "4": + case '4': return "8074"; // Schnaitsee - case "5": + case '5': return "8075"; // Amerang - case "6": + case '6': return "8076"; // Pfaffing default: return ""; @@ -17710,18 +17720,18 @@ private static String fromNumber808(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8081"; // Dorfen Stadt - case "2": + case '2': return "8082"; // Schwindegg - case "3": + case '3': return "8083"; // Isen - case "4": + case '4': return "8084"; // Taufkirchen Vils - case "5": + case '5': return "8085"; // Sankt Wolfgang - case "6": + case '6': return "8086"; // Buchbach Oberbay default: return ""; @@ -17733,16 +17743,16 @@ private static String fromNumber809(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8091"; // Kirchseeon - case "2": + case '2': return "8092"; // Grafing b München - case "3": + case '3': return "8093"; // Glonn Kr Ebersberg - case "4": + case '4': return "8094"; // Steinhöring - case "5": + case '5': return "8095"; // Aying default: return ""; @@ -17754,24 +17764,24 @@ private static String fromNumber81(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber810(number.substring(1)); - case "1": + case '1': return "811"; // Hallbergmoos - case "2": + case '2': return fromNumber812(number.substring(1)); - case "3": + case '3': return fromNumber813(number.substring(1)); - case "4": + case '4': return fromNumber814(number.substring(1)); - case "5": + case '5': return fromNumber815(number.substring(1)); - case "6": + case '6': return fromNumber816(number.substring(1)); - case "7": + case '7': return fromNumber817(number.substring(1)); - case "9": + case '9': return fromNumber819(number.substring(1)); default: return ""; @@ -17783,14 +17793,14 @@ private static String fromNumber810(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8102"; // Höhenkirchen-Siegertsbrunn - case "4": + case '4': return "8104"; // Sauerlach - case "5": + case '5': return "8105"; // Gilching - case "6": + case '6': return "8106"; // Vaterstetten default: return ""; @@ -17802,14 +17812,14 @@ private static String fromNumber812(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8121"; // Markt Schwaben - case "2": + case '2': return "8122"; // Erding - case "3": + case '3': return "8123"; // Moosinning - case "4": + case '4': return "8124"; // Forstern Oberbay default: return ""; @@ -17821,22 +17831,22 @@ private static String fromNumber813(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8131"; // Dachau - case "3": + case '3': return "8133"; // Haimhausen Oberbay - case "4": + case '4': return "8134"; // Odelzhausen - case "5": + case '5': return "8135"; // Sulzemoos - case "6": + case '6': return "8136"; // Markt Indersdorf - case "7": + case '7': return "8137"; // Petershausen - case "8": + case '8': return "8138"; // Schwabhausen b Dachau - case "9": + case '9': return "8139"; // Röhrmoos default: return ""; @@ -17848,18 +17858,18 @@ private static String fromNumber814(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8141"; // Fürstenfeldbruck - case "2": + case '2': return "8142"; // Olching - case "3": + case '3': return "8143"; // Inning a Ammersee - case "4": + case '4': return "8144"; // Grafrath - case "5": + case '5': return "8145"; // Mammendorf - case "6": + case '6': return "8146"; // Moorenweis default: return ""; @@ -17871,16 +17881,16 @@ private static String fromNumber815(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8151"; // Starnberg - case "2": + case '2': return "8152"; // Herrsching a Ammersee - case "3": + case '3': return "8153"; // Wessling - case "7": + case '7': return "8157"; // Feldafing - case "8": + case '8': return "8158"; // Tutzing default: return ""; @@ -17892,16 +17902,16 @@ private static String fromNumber816(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8161"; // Freising - case "5": + case '5': return "8165"; // Neufahrn b Freising - case "6": + case '6': return "8166"; // Allershausen Oberbay - case "7": + case '7': return "8167"; // Zolling - case "8": + case '8': return "8168"; // Attenkirchen default: return ""; @@ -17913,18 +17923,18 @@ private static String fromNumber817(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8170"; // Straßlach-Dingharting - case "1": + case '1': return "8171"; // Wolfratshausen - case "6": + case '6': return "8176"; // Egling b Wolfratshausen - case "7": + case '7': return "8177"; // Münsing Starnberger See - case "8": + case '8': return "8178"; // Icking - case "9": + case '9': return "8179"; // Eurasburg a d Loisach default: return ""; @@ -17936,18 +17946,18 @@ private static String fromNumber819(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8191"; // Landsberg a Lech - case "2": + case '2': return "8192"; // Schondorf a Ammersee - case "3": + case '3': return "8193"; // Geltendorf - case "4": + case '4': return "8194"; // Vilgertshofen - case "5": + case '5': return "8195"; // Weil Kr Landsberg a Lech - case "6": + case '6': return "8196"; // Pürgen default: return ""; @@ -17959,26 +17969,26 @@ private static String fromNumber82(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber820(number.substring(1)); - case "1": + case '1': return "821"; // Augsburg - case "2": + case '2': return fromNumber822(number.substring(1)); - case "3": + case '3': return fromNumber823(number.substring(1)); - case "4": + case '4': return fromNumber824(number.substring(1)); - case "5": + case '5': return fromNumber825(number.substring(1)); - case "6": + case '6': return fromNumber826(number.substring(1)); - case "7": + case '7': return fromNumber827(number.substring(1)); - case "8": + case '8': return fromNumber828(number.substring(1)); - case "9": + case '9': return fromNumber829(number.substring(1)); default: return ""; @@ -17990,20 +18000,20 @@ private static String fromNumber820(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8202"; // Althegnenberg - case "3": + case '3': return "8203"; // Grossaitingen - case "4": + case '4': return "8204"; // Mickhausen - case "5": + case '5': return "8205"; // Dasing - case "6": + case '6': return "8206"; // Egling a d Paar - case "7": + case '7': return "8207"; // Affing - case "8": + case '8': return "8208"; // Eurasburg b Augsburg default: return ""; @@ -18015,18 +18025,18 @@ private static String fromNumber822(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8221"; // Günzburg - case "2": + case '2': return "8222"; // Burgau Schwab - case "3": + case '3': return "8223"; // Ichenhausen - case "4": + case '4': return "8224"; // Offingen Donau - case "5": + case '5': return "8225"; // Jettingen-Scheppach - case "6": + case '6': return "8226"; // Bibertal default: return ""; @@ -18038,24 +18048,24 @@ private static String fromNumber823(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8230"; // Gablingen - case "1": + case '1': return "8231"; // Königsbrunn b Augsburg - case "2": + case '2': return "8232"; // Schwabmünchen - case "3": + case '3': return "8233"; // Kissing - case "4": + case '4': return "8234"; // Bobingen - case "6": + case '6': return "8236"; // Fischach - case "7": + case '7': return "8237"; // Aindling - case "8": + case '8': return "8238"; // Gessertshausen - case "9": + case '9': return "8239"; // Langenneufnach default: return ""; @@ -18067,20 +18077,20 @@ private static String fromNumber824(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8241"; // Buchloe - case "3": + case '3': return "8243"; // Fuchstal - case "5": + case '5': return "8245"; // Türkheim Wertach - case "6": + case '6': return "8246"; // Waal - case "7": + case '7': return "8247"; // Bad Wörishofen - case "8": + case '8': return "8248"; // Lamerdingen - case "9": + case '9': return "8249"; // Ettringen Wertach default: return ""; @@ -18092,22 +18102,22 @@ private static String fromNumber825(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8250"; // Hilgertshausen-Tandern - case "1": + case '1': return "8251"; // Aichach - case "2": + case '2': return "8252"; // Schrobenhausen - case "3": + case '3': return "8253"; // Pöttmes - case "4": + case '4': return "8254"; // Altomünster - case "7": + case '7': return "8257"; // Inchenhofen - case "8": + case '8': return "8258"; // Sielenbach - case "9": + case '9': return "8259"; // Schiltberg default: return ""; @@ -18119,22 +18129,22 @@ private static String fromNumber826(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8261"; // Mindelheim - case "2": + case '2': return "8262"; // Mittelneufnach - case "3": + case '3': return "8263"; // Breitenbrunn Schwab - case "5": + case '5': return "8265"; // Pfaffenhausen Schwab - case "6": + case '6': return "8266"; // Kirchheim i Schw - case "7": + case '7': return "8267"; // Dirlewang - case "8": + case '8': return "8268"; // Tussenhausen - case "9": + case '9': return "8269"; // Unteregg b Mindelheim default: return ""; @@ -18146,16 +18156,16 @@ private static String fromNumber827(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8271"; // Meitingen - case "2": + case '2': return "8272"; // Wertingen - case "3": + case '3': return "8273"; // Nordendorf - case "4": + case '4': return "8274"; // Buttenwiesen - case "6": + case '6': return "8276"; // Baar Schwaben default: return ""; @@ -18167,16 +18177,16 @@ private static String fromNumber828(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8281"; // Thannhausen Schwab - case "2": + case '2': return "8282"; // Krumbach Schwaben - case "3": + case '3': return "8283"; // Neuburg a d Kammel - case "4": + case '4': return "8284"; // Ziemetshausen - case "5": + case '5': return "8285"; // Burtenbach default: return ""; @@ -18188,18 +18198,18 @@ private static String fromNumber829(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8291"; // Zusmarshausen - case "2": + case '2': return "8292"; // Dinkelscherben - case "3": + case '3': return "8293"; // Welden b Augsburg - case "4": + case '4': return "8294"; // Horgau - case "5": + case '5': return "8295"; // Altenmünster Schwab - case "6": + case '6': return "8296"; // Villenbach default: return ""; @@ -18211,24 +18221,24 @@ private static String fromNumber83(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber830(number.substring(1)); - case "1": + case '1': return "831"; // Kempten Allgäu - case "2": + case '2': return fromNumber832(number.substring(1)); - case "3": + case '3': return fromNumber833(number.substring(1)); - case "4": + case '4': return fromNumber834(number.substring(1)); - case "6": + case '6': return fromNumber836(number.substring(1)); - case "7": + case '7': return fromNumber837(number.substring(1)); - case "8": + case '8': return fromNumber838(number.substring(1)); - case "9": + case '9': return fromNumber839(number.substring(1)); default: return ""; @@ -18240,14 +18250,14 @@ private static String fromNumber830(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8302"; // Görisried - case "3": + case '3': return "8303"; // Waltenhofen - case "4": + case '4': return "8304"; // Wildpoldsried - case "6": + case '6': return "8306"; // Ronsberg default: return ""; @@ -18259,24 +18269,24 @@ private static String fromNumber832(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8320"; // Missen-Wilhams - case "1": + case '1': return "8321"; // Sonthofen - case "2": + case '2': return "8322"; // Oberstdorf - case "3": + case '3': return "8323"; // Immenstadt i Allgäu - case "4": + case '4': return "8324"; // Hindelang - case "5": + case '5': return "8325"; // Oberstaufen-Thalkirchdorf - case "6": + case '6': return "8326"; // Fischen i Allgäu - case "7": + case '7': return "8327"; // Rettenberg - case "8": + case '8': return "8328"; // Balderschwang default: return ""; @@ -18288,24 +18298,24 @@ private static String fromNumber833(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8330"; // Legau - case "1": + case '1': return "8331"; // Memmingen - case "2": + case '2': return "8332"; // Ottobeuren - case "3": + case '3': return "8333"; // Babenhausen Schwab - case "4": + case '4': return "8334"; // Bad Grönenbach - case "5": + case '5': return "8335"; // Fellheim - case "6": + case '6': return "8336"; // Erkheim - case "7": + case '7': return "8337"; // Altenstadt Iller - case "8": + case '8': return "8338"; // Böhen default: return ""; @@ -18317,26 +18327,26 @@ private static String fromNumber834(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8340"; // Baisweil - case "1": + case '1': return "8341"; // Kaufbeuren - case "2": + case '2': return "8342"; // Marktoberdorf - case "3": + case '3': return "8343"; // Aitrang - case "4": + case '4': return "8344"; // Westendorf b Kaufbeuren - case "5": + case '5': return "8345"; // Stöttwang - case "6": + case '6': return "8346"; // Pforzen - case "7": + case '7': return "8347"; // Friesenried - case "8": + case '8': return "8348"; // Bidingen - case "9": + case '9': return "8349"; // Stötten a Auerberg default: return ""; @@ -18348,24 +18358,24 @@ private static String fromNumber836(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8361"; // Nesselwang - case "2": + case '2': return "8362"; // Füssen - case "3": + case '3': return "8363"; // Pfronten - case "4": + case '4': return "8364"; // Seeg - case "5": + case '5': return "8365"; // Wertach - case "6": + case '6': return "8366"; // Oy-Mittelberg - case "7": + case '7': return "8367"; // Roßhaupten Forggensee - case "8": + case '8': return "8368"; // Halblech - case "9": + case '9': return "8369"; // Rückholz default: return ""; @@ -18377,24 +18387,24 @@ private static String fromNumber837(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8370"; // Wiggensbach - case "2": + case '2': return "8372"; // Obergünzburg - case "3": + case '3': return "8373"; // Altusried - case "4": + case '4': return "8374"; // Dietmannsried - case "5": + case '5': return "8375"; // Weitnau - case "6": + case '6': return "8376"; // Sulzberg Allgäu - case "7": + case '7': return "8377"; // Unterthingau - case "8": + case '8': return "8378"; // Buchenberg b Kempten - case "9": + case '9': return "8379"; // Waltenhofen-Oberdorf default: return ""; @@ -18406,26 +18416,26 @@ private static String fromNumber838(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8380"; // Achberg - case "1": + case '1': return "8381"; // Lindenberg i Allgäu - case "2": + case '2': return "8382"; // Lindau Bodensee - case "3": + case '3': return "8383"; // Grünenbach Allgäu - case "4": + case '4': return "8384"; // Röthenbach Allgäu - case "5": + case '5': return "8385"; // Hergatz - case "6": + case '6': return "8386"; // Oberstaufen - case "7": + case '7': return "8387"; // Weiler-Simmerberg - case "8": + case '8': return "8388"; // Hergensweiler - case "9": + case '9': return "8389"; // Weissensberg default: return ""; @@ -18437,14 +18447,14 @@ private static String fromNumber839(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8392"; // Markt Rettenbach - case "3": + case '3': return "8393"; // Holzgünz - case "4": + case '4': return "8394"; // Lautrach - case "5": + case '5': return "8395"; // Tannheim Württ default: return ""; @@ -18456,20 +18466,20 @@ private static String fromNumber84(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber840(number.substring(1)); - case "1": + case '1': return "841"; // Ingolstadt Donau - case "2": + case '2': return fromNumber842(number.substring(1)); - case "3": + case '3': return fromNumber843(number.substring(1)); - case "4": + case '4': return fromNumber844(number.substring(1)); - case "5": + case '5': return fromNumber845(number.substring(1)); - case "6": + case '6': return fromNumber846(number.substring(1)); default: return ""; @@ -18481,18 +18491,18 @@ private static String fromNumber840(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8402"; // Münchsmünster - case "3": + case '3': return "8403"; // Pförring - case "4": + case '4': return "8404"; // Oberdolling - case "5": + case '5': return "8405"; // Stammham b Ingolstadt - case "6": + case '6': return "8406"; // Böhmfeld - case "7": + case '7': return "8407"; // Grossmehring default: return ""; @@ -18504,18 +18514,18 @@ private static String fromNumber842(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8421"; // Eichstätt Bay - case "2": + case '2': return "8422"; // Dollnstein - case "3": + case '3': return "8423"; // Titting - case "4": + case '4': return "8424"; // Nassenfels - case "6": + case '6': return "8426"; // Walting Kr Eichstätt - case "7": + case '7': return "8427"; // Wellheim default: return ""; @@ -18527,16 +18537,16 @@ private static String fromNumber843(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8431"; // Neuburg a d Donau - case "2": + case '2': return "8432"; // Burgheim - case "3": + case '3': return "8433"; // Königsmoos - case "4": + case '4': return "8434"; // Rennertshofen - case "5": + case '5': return "8435"; // Ehekirchen default: return ""; @@ -18548,18 +18558,18 @@ private static String fromNumber844(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8441"; // Pfaffenhofen a d Ilm - case "2": + case '2': return "8442"; // Wolnzach - case "3": + case '3': return "8443"; // Hohenwart Paar - case "4": + case '4': return "8444"; // Schweitenkirchen - case "5": + case '5': return "8445"; // Gerolsbach - case "6": + case '6': return "8446"; // Pörnbach default: return ""; @@ -18571,22 +18581,22 @@ private static String fromNumber845(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8450"; // Ingolstadt-Zuchering - case "2": + case '2': return "8452"; // Geisenfeld - case "3": + case '3': return "8453"; // Reichertshofen Oberbay - case "4": + case '4': return "8454"; // Karlshuld - case "6": + case '6': return "8456"; // Lenting - case "7": + case '7': return "8457"; // Vohburg a d Donau - case "8": + case '8': return "8458"; // Gaimersheim - case "9": + case '9': return "8459"; // Manching default: return ""; @@ -18598,26 +18608,26 @@ private static String fromNumber846(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8460"; // Berching-Holnstein - case "1": + case '1': return "8461"; // Beilngries - case "2": + case '2': return "8462"; // Berching - case "3": + case '3': return "8463"; // Greding - case "4": + case '4': return "8464"; // Dietfurt a d Altmühl - case "5": + case '5': return "8465"; // Kipfenberg - case "6": + case '6': return "8466"; // Denkendorf Oberbay - case "7": + case '7': return "8467"; // Kinding - case "8": + case '8': return "8468"; // Altmannstein-Pondorf - case "9": + case '9': return "8469"; // Freystadt-Burggriesbach default: return ""; @@ -18629,24 +18639,24 @@ private static String fromNumber85(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber850(number.substring(1)); - case "1": + case '1': return "851"; // Passau - case "3": + case '3': return fromNumber853(number.substring(1)); - case "4": + case '4': return fromNumber854(number.substring(1)); - case "5": + case '5': return fromNumber855(number.substring(1)); - case "6": + case '6': return fromNumber856(number.substring(1)); - case "7": + case '7': return fromNumber857(number.substring(1)); - case "8": + case '8': return fromNumber858(number.substring(1)); - case "9": + case '9': return fromNumber859(number.substring(1)); default: return ""; @@ -18658,22 +18668,22 @@ private static String fromNumber850(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8501"; // Thyrnau - case "2": + case '2': return "8502"; // Fürstenzell - case "3": + case '3': return "8503"; // Neuhaus a Inn - case "4": + case '4': return "8504"; // Tittling - case "5": + case '5': return "8505"; // Hutthurm - case "6": + case '6': return "8506"; // Bad Höhenstadt - case "7": + case '7': return "8507"; // Neuburg a Inn - case "9": + case '9': return "8509"; // Ruderting default: return ""; @@ -18685,22 +18695,22 @@ private static String fromNumber853(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8531"; // Pocking - case "2": + case '2': return "8532"; // Griesbach i Rottal - case "3": + case '3': return "8533"; // Rotthalmünster - case "4": + case '4': return "8534"; // Tettenweis - case "5": + case '5': return "8535"; // Haarbach - case "6": + case '6': return "8536"; // Kößlarn - case "7": + case '7': return "8537"; // Bad Füssing-Aigen - case "8": + case '8': return "8538"; // Pocking-Hartkirchen default: return ""; @@ -18712,24 +18722,24 @@ private static String fromNumber854(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8541"; // Vilshofen Niederbay - case "2": + case '2': return "8542"; // Ortenburg - case "3": + case '3': return "8543"; // Aidenbach - case "4": + case '4': return "8544"; // Eging a See - case "5": + case '5': return "8545"; // Hofkirchen Bay - case "6": + case '6': return "8546"; // Windorf-Otterskirchen - case "7": + case '7': return "8547"; // Osterhofen-Gergweis - case "8": + case '8': return "8548"; // Vilshofen-Sandbach - case "9": + case '9': return "8549"; // Vilshofen-Pleinting default: return ""; @@ -18741,24 +18751,24 @@ private static String fromNumber855(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8550"; // Philippsreut - case "1": + case '1': return "8551"; // Freyung - case "2": + case '2': return "8552"; // Grafenau Niederbay - case "3": + case '3': return "8553"; // Spiegelau - case "4": + case '4': return "8554"; // Schönberg Niederbay - case "5": + case '5': return "8555"; // Perlesreut - case "6": + case '6': return "8556"; // Haidmühle - case "7": + case '7': return "8557"; // Mauth - case "8": + case '8': return "8558"; // Hohenau Niederbay default: return ""; @@ -18770,16 +18780,16 @@ private static String fromNumber856(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8561"; // Pfarrkirchen Niederbay - case "2": + case '2': return "8562"; // Triftern - case "3": + case '3': return "8563"; // Bad Birnbach Rottal - case "4": + case '4': return "8564"; // Johanniskirchen - case "5": + case '5': return "8565"; // Dietersburg-Baumgarten default: return ""; @@ -18791,14 +18801,14 @@ private static String fromNumber857(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8571"; // Simbach a Inn - case "2": + case '2': return "8572"; // Tann Niederbay - case "3": + case '3': return "8573"; // Ering - case "4": + case '4': return "8574"; // Wittibreut default: return ""; @@ -18810,18 +18820,18 @@ private static String fromNumber858(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8581"; // Waldkirchen Niederbay - case "2": + case '2': return "8582"; // Röhrnbach - case "3": + case '3': return "8583"; // Neureichenau - case "4": + case '4': return "8584"; // Breitenberg Niederbay - case "5": + case '5': return "8585"; // Grainet - case "6": + case '6': return "8586"; // Hauzenberg default: return ""; @@ -18833,12 +18843,12 @@ private static String fromNumber859(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8591"; // Obernzell - case "2": + case '2': return "8592"; // Wegscheid Niederbay - case "3": + case '3': return "8593"; // Untergriesbach default: return ""; @@ -18850,22 +18860,22 @@ private static String fromNumber86(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "861"; // Traunstein - case "2": + case '2': return fromNumber862(number.substring(1)); - case "3": + case '3': return fromNumber863(number.substring(1)); - case "4": + case '4': return fromNumber864(number.substring(1)); - case "5": + case '5': return fromNumber865(number.substring(1)); - case "6": + case '6': return fromNumber866(number.substring(1)); - case "7": + case '7': return fromNumber867(number.substring(1)); - case "8": + case '8': return fromNumber868(number.substring(1)); default: return ""; @@ -18877,18 +18887,18 @@ private static String fromNumber862(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8621"; // Trostberg - case "2": + case '2': return "8622"; // Tacherting- Peterskirchen - case "3": + case '3': return "8623"; // Kirchweidach - case "4": + case '4': return "8624"; // Obing - case "8": + case '8': return "8628"; // Kienberg Oberbay - case "9": + case '9': return "8629"; // Palling default: return ""; @@ -18900,24 +18910,24 @@ private static String fromNumber863(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8630"; // Oberneukirchen - case "1": + case '1': return "8631"; // Mühldorf a Inn - case "3": + case '3': return "8633"; // Tüßling - case "4": + case '4': return "8634"; // Garching a d Alz - case "5": + case '5': return "8635"; // Pleiskirchen - case "6": + case '6': return "8636"; // Ampfing - case "7": + case '7': return "8637"; // Lohkirchen - case "8": + case '8': return "8638"; // Waldkraiburg - case "9": + case '9': return "8639"; // Neumarkt-Sankt Veit default: return ""; @@ -18929,14 +18939,14 @@ private static String fromNumber864(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8640"; // Reit Im Winkl - case "1": + case '1': return "8641"; // Grassau Kr Traunstein - case "2": + case '2': return "8642"; // Übersee - case "9": + case '9': return "8649"; // Schleching default: return ""; @@ -18948,18 +18958,18 @@ private static String fromNumber865(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8650"; // Marktschellenberg - case "1": + case '1': return "8651"; // Bad Reichenhall - case "2": + case '2': return "8652"; // Berchtesgaden - case "4": + case '4': return "8654"; // Freilassing - case "6": + case '6': return "8656"; // Anger - case "7": + case '7': return "8657"; // Ramsau b Berchtesgaden default: return ""; @@ -18971,22 +18981,22 @@ private static String fromNumber866(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8661"; // Grabenstätt Chiemsee - case "2": + case '2': return "8662"; // Siegsdorf Kr Traunstein - case "3": + case '3': return "8663"; // Ruhpolding - case "4": + case '4': return "8664"; // Chieming - case "5": + case '5': return "8665"; // Inzell - case "6": + case '6': return "8666"; // Teisendorf - case "7": + case '7': return "8667"; // Seeon-Seebruck - case "9": + case '9': return "8669"; // Traunreut default: return ""; @@ -18998,16 +19008,16 @@ private static String fromNumber867(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8670"; // Reischach Kr Altötting - case "1": + case '1': return "8671"; // Altötting - case "7": + case '7': return "8677"; // Burghausen Salzach - case "8": + case '8': return "8678"; // Marktl - case "9": + case '9': return "8679"; // Burgkirchen a d Alz default: return ""; @@ -19019,20 +19029,20 @@ private static String fromNumber868(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8681"; // Waging a See - case "2": + case '2': return "8682"; // Laufen Salzach - case "3": + case '3': return "8683"; // Tittmoning - case "4": + case '4': return "8684"; // Fridolfing - case "5": + case '5': return "8685"; // Kirchanschöring - case "6": + case '6': return "8686"; // Petting - case "7": + case '7': return "8687"; // Taching-Tengling default: return ""; @@ -19044,24 +19054,24 @@ private static String fromNumber87(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber870(number.substring(1)); - case "1": + case '1': return "871"; // Landshut - case "2": + case '2': return fromNumber872(number.substring(1)); - case "3": + case '3': return fromNumber873(number.substring(1)); - case "4": + case '4': return fromNumber874(number.substring(1)); - case "5": + case '5': return fromNumber875(number.substring(1)); - case "6": + case '6': return fromNumber876(number.substring(1)); - case "7": + case '7': return fromNumber877(number.substring(1)); - case "8": + case '8': return fromNumber878(number.substring(1)); default: return ""; @@ -19073,22 +19083,22 @@ private static String fromNumber870(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "8702"; // Wörth a d Isar - case "3": + case '3': return "8703"; // Essenbach - case "4": + case '4': return "8704"; // Altdorf-Pfettrach - case "5": + case '5': return "8705"; // Altfraunhofen - case "6": + case '6': return "8706"; // Vilsheim - case "7": + case '7': return "8707"; // Adlkofen - case "8": + case '8': return "8708"; // Weihmichl-Unterneuhausen - case "9": + case '9': return "8709"; // Eching Niederbay default: return ""; @@ -19100,22 +19110,22 @@ private static String fromNumber872(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8721"; // Eggenfelden - case "2": + case '2': return "8722"; // Gangkofen - case "3": + case '3': return "8723"; // Arnstorf - case "4": + case '4': return "8724"; // Massing - case "5": + case '5': return "8725"; // Wurmannsquick - case "6": + case '6': return "8726"; // Schönau Niederbay - case "7": + case '7': return "8727"; // Falkenberg Niederbay - case "8": + case '8': return "8728"; // Geratskirchen default: return ""; @@ -19127,16 +19137,16 @@ private static String fromNumber873(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8731"; // Dingolfing - case "2": + case '2': return "8732"; // Frontenhausen - case "3": + case '3': return "8733"; // Mengkofen - case "4": + case '4': return "8734"; // Reisbach Niederbay - case "5": + case '5': return "8735"; // Gangkofen-Kollbach default: return ""; @@ -19148,16 +19158,16 @@ private static String fromNumber874(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8741"; // Vilsbiburg - case "2": + case '2': return "8742"; // Velden Vils - case "3": + case '3': return "8743"; // Geisenhausen - case "4": + case '4': return "8744"; // Gerzen - case "5": + case '5': return "8745"; // Bodenkirchen default: return ""; @@ -19169,16 +19179,16 @@ private static String fromNumber875(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8751"; // Mainburg - case "2": + case '2': return "8752"; // Au i d Hallertau - case "3": + case '3': return "8753"; // Elsendorf Niederbay - case "4": + case '4': return "8754"; // Volkenschwand - case "6": + case '6': return "8756"; // Nandlstadt default: return ""; @@ -19190,16 +19200,16 @@ private static String fromNumber876(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8761"; // Moosburg a d Isar - case "2": + case '2': return "8762"; // Wartenberg Oberbay - case "4": + case '4': return "8764"; // Mauern Kr Freising - case "5": + case '5': return "8765"; // Bruckberg Niederbay - case "6": + case '6': return "8766"; // Gammelsdorf default: return ""; @@ -19211,14 +19221,14 @@ private static String fromNumber877(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8771"; // Ergoldsbach - case "2": + case '2': return "8772"; // Mallersdorf-Pfaffenberg - case "3": + case '3': return "8773"; // Neufahrn i NB - case "4": + case '4': return "8774"; // Bayerbach b Ergoldsbach default: return ""; @@ -19230,16 +19240,16 @@ private static String fromNumber878(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8781"; // Rottenburg a d Laaber - case "2": + case '2': return "8782"; // Pfeffenhausen - case "3": + case '3': return "8783"; // Rohr i NB - case "4": + case '4': return "8784"; // Hohenthann - case "5": + case '5': return "8785"; // Rottenburg-Oberroning default: return ""; @@ -19251,18 +19261,18 @@ private static String fromNumber88(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber880(number.substring(1)); - case "1": + case '1': return "881"; // Weilheim i OB - case "2": + case '2': return fromNumber882(number.substring(1)); - case "4": + case '4': return fromNumber884(number.substring(1)); - case "5": + case '5': return fromNumber885(number.substring(1)); - case "6": + case '6': return fromNumber886(number.substring(1)); default: return ""; @@ -19274,22 +19284,22 @@ private static String fromNumber880(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8801"; // Seeshaupt - case "2": + case '2': return "8802"; // Huglfing - case "3": + case '3': return "8803"; // Peissenberg - case "5": + case '5': return "8805"; // Hohenpeissenberg - case "6": + case '6': return "8806"; // Utting a Ammersee - case "7": + case '7': return "8807"; // Dießen a Ammersee - case "8": + case '8': return "8808"; // Pähl - case "9": + case '9': return "8809"; // Wessobrunn default: return ""; @@ -19301,16 +19311,16 @@ private static String fromNumber882(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8821"; // Garmisch-Partenkirchen - case "2": + case '2': return "8822"; // Oberammergau - case "3": + case '3': return "8823"; // Mittenwald - case "4": + case '4': return "8824"; // Oberau Loisach - case "5": + case '5': return "8825"; // Krün default: return ""; @@ -19322,14 +19332,14 @@ private static String fromNumber884(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8841"; // Murnau a Staffelsee - case "5": + case '5': return "8845"; // Bad Kohlgrub - case "6": + case '6': return "8846"; // Uffing a Staffelsee - case "7": + case '7': return "8847"; // Obersöchering default: return ""; @@ -19341,14 +19351,14 @@ private static String fromNumber885(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "8851"; // Kochel a See - case "6": + case '6': return "8856"; // Penzberg - case "7": + case '7': return "8857"; // Benediktbeuern - case "8": + case '8': return "8858"; // Kochel-Walchensee default: return ""; @@ -19360,18 +19370,18 @@ private static String fromNumber886(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "8860"; // Bernbeuren - case "1": + case '1': return "8861"; // Schongau - case "2": + case '2': return "8862"; // Steingaden Oberbay - case "7": + case '7': return "8867"; // Rottenbuch Oberbay - case "8": + case '8': return "8868"; // Schwabsoien - case "9": + case '9': return "8869"; // Kinsau default: return ""; @@ -19383,26 +19393,26 @@ private static String fromNumber9(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber90(number.substring(1)); - case "1": + case '1': return fromNumber91(number.substring(1)); - case "2": + case '2': return fromNumber92(number.substring(1)); - case "3": + case '3': return fromNumber93(number.substring(1)); - case "4": + case '4': return fromNumber94(number.substring(1)); - case "5": + case '5': return fromNumber95(number.substring(1)); - case "6": + case '6': return fromNumber96(number.substring(1)); - case "7": + case '7': return fromNumber97(number.substring(1)); - case "8": + case '8': return fromNumber98(number.substring(1)); - case "9": + case '9': return fromNumber99(number.substring(1)); default: return ""; @@ -19414,14 +19424,14 @@ private static String fromNumber90(String number) { return ""; } - switch (number.substring(0, 1)) { - case "6": + switch (number.charAt(0)) { + case '6': return "906"; // Donauwörth - case "7": + case '7': return fromNumber907(number.substring(1)); - case "8": + case '8': return fromNumber908(number.substring(1)); - case "9": + case '9': return fromNumber909(number.substring(1)); default: return ""; @@ -19433,24 +19443,24 @@ private static String fromNumber907(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9070"; // Tapfheim - case "1": + case '1': return "9071"; // Dillingen a d Donau - case "2": + case '2': return "9072"; // Lauingen Donau - case "3": + case '3': return "9073"; // Gundelfingen a d Donau - case "4": + case '4': return "9074"; // Höchstädt a d Donau - case "5": + case '5': return "9075"; // Glött - case "6": + case '6': return "9076"; // Wittislingen - case "7": + case '7': return "9077"; // Bachhagel - case "8": + case '8': return "9078"; // Mertingen default: return ""; @@ -19462,26 +19472,26 @@ private static String fromNumber908(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9080"; // Harburg Schwaben - case "1": + case '1': return "9081"; // Nördlingen - case "2": + case '2': return "9082"; // Oettingen i Bay - case "3": + case '3': return "9083"; // Möttingen - case "4": + case '4': return "9084"; // Bissingen Schwab - case "5": + case '5': return "9085"; // Alerheim - case "6": + case '6': return "9086"; // Fremdingen - case "7": + case '7': return "9087"; // Marktoffingen - case "8": + case '8': return "9088"; // Mönchsdeggingen - case "9": + case '9': return "9089"; // Bissingen-Unterringingen default: return ""; @@ -19493,20 +19503,20 @@ private static String fromNumber909(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9090"; // Rain Lech - case "1": + case '1': return "9091"; // Monheim Schwab - case "2": + case '2': return "9092"; // Wemding - case "3": + case '3': return "9093"; // Polsingen - case "4": + case '4': return "9094"; // Tagmersheim - case "7": + case '7': return "9097"; // Marxheim - case "9": + case '9': return "9099"; // Kaisheim default: return ""; @@ -19518,26 +19528,26 @@ private static String fromNumber91(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber910(number.substring(1)); - case "1": + case '1': return "911"; // Nürnberg - case "2": + case '2': return fromNumber912(number.substring(1)); - case "3": + case '3': return fromNumber913(number.substring(1)); - case "4": + case '4': return fromNumber914(number.substring(1)); - case "5": + case '5': return fromNumber915(number.substring(1)); - case "6": + case '6': return fromNumber916(number.substring(1)); - case "7": + case '7': return fromNumber917(number.substring(1)); - case "8": + case '8': return fromNumber918(number.substring(1)); - case "9": + case '9': return fromNumber919(number.substring(1)); default: return ""; @@ -19549,20 +19559,20 @@ private static String fromNumber910(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9101"; // Langenzenn - case "2": + case '2': return "9102"; // Wilhermsdorf - case "3": + case '3': return "9103"; // Cadolzburg - case "4": + case '4': return "9104"; // Emskirchen - case "5": + case '5': return "9105"; // Grosshabersdorf - case "6": + case '6': return "9106"; // Markt Erlbach - case "7": + case '7': return "9107"; // Trautskirchen default: return ""; @@ -19574,20 +19584,20 @@ private static String fromNumber912(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9120"; // Leinburg - case "2": + case '2': return "9122"; // Schwabach - case "3": + case '3': return "9123"; // Lauf a d Pegnitz - case "6": + case '6': return "9126"; // Eckental - case "7": + case '7': return "9127"; // Rosstal Mittelfr - case "8": + case '8': return "9128"; // Feucht - case "9": + case '9': return "9129"; // Wendelstein default: return ""; @@ -19599,16 +19609,16 @@ private static String fromNumber913(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9131"; // Erlangen - case "2": + case '2': return "9132"; // Herzogenaurach - case "3": + case '3': return "9133"; // Baiersdorf Mittelfr - case "4": + case '4': return "9134"; // Neunkirchen a Brand - case "5": + case '5': return "9135"; // Heßdorf Mittelfr default: return ""; @@ -19620,24 +19630,24 @@ private static String fromNumber914(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9141"; // Weißenburg i Bay - case "2": + case '2': return "9142"; // Treuchtlingen - case "3": + case '3': return "9143"; // Pappenheim Mittelfr - case "4": + case '4': return "9144"; // Pleinfeld - case "5": + case '5': return "9145"; // Solnhofen - case "6": + case '6': return "9146"; // Markt Berolzheim - case "7": + case '7': return "9147"; // Nennslingen - case "8": + case '8': return "9148"; // Ettenstatt - case "9": + case '9': return "9149"; // Weissenburg-Suffersheim default: return ""; @@ -19649,22 +19659,22 @@ private static String fromNumber915(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9151"; // Hersbruck - case "2": + case '2': return "9152"; // Hartenstein Mittelfr - case "3": + case '3': return "9153"; // Schnaittach - case "4": + case '4': return "9154"; // Pommelsbrunn - case "5": + case '5': return "9155"; // Simmelsdorf - case "6": + case '6': return "9156"; // Neuhaus a d Pegnitz - case "7": + case '7': return "9157"; // Alfeld Mittelfr - case "8": + case '8': return "9158"; // Offenhausen Mittelfr default: return ""; @@ -19676,20 +19686,20 @@ private static String fromNumber916(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9161"; // Neustadt a d Aisch - case "2": + case '2': return "9162"; // Scheinfeld - case "3": + case '3': return "9163"; // Dachsbach - case "4": + case '4': return "9164"; // Langenfeld Mittelfr - case "5": + case '5': return "9165"; // Sugenheim - case "6": + case '6': return "9166"; // Münchsteinach - case "7": + case '7': return "9167"; // Oberscheinfeld default: return ""; @@ -19701,26 +19711,26 @@ private static String fromNumber917(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9170"; // Schwanstetten - case "1": + case '1': return "9171"; // Roth Mittelfr - case "2": + case '2': return "9172"; // Georgensgmünd - case "3": + case '3': return "9173"; // Thalmässing - case "4": + case '4': return "9174"; // Hilpoltstein - case "5": + case '5': return "9175"; // Spalt - case "6": + case '6': return "9176"; // Allersberg - case "7": + case '7': return "9177"; // Heideck - case "8": + case '8': return "9178"; // Abenberg Mittelfr - case "9": + case '9': return "9179"; // Freystadt default: return ""; @@ -19732,26 +19742,26 @@ private static String fromNumber918(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9180"; // Pyrbaum - case "1": + case '1': return "9181"; // Neumarkt i d Opf - case "2": + case '2': return "9182"; // Velburg - case "3": + case '3': return "9183"; // Burgthann - case "4": + case '4': return "9184"; // Deining Oberpf - case "5": + case '5': return "9185"; // Mühlhausen Oberpf - case "6": + case '6': return "9186"; // Lauterhofen Oberpf - case "7": + case '7': return "9187"; // Altdorf b Nürnberg - case "8": + case '8': return "9188"; // Postbauer-Heng - case "9": + case '9': return "9189"; // Berg b Neumarkt i d Opf default: return ""; @@ -19763,26 +19773,26 @@ private static String fromNumber919(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9190"; // Heroldsbach - case "1": + case '1': return "9191"; // Forchheim Oberfr - case "2": + case '2': return "9192"; // Gräfenberg - case "3": + case '3': return "9193"; // Höchstadt a d Aisch - case "4": + case '4': return "9194"; // Ebermannstadt - case "5": + case '5': return "9195"; // Adelsdorf Mittelfr - case "6": + case '6': return "9196"; // Wiesenttal - case "7": + case '7': return "9197"; // Egloffstein - case "8": + case '8': return "9198"; // Heiligenstadt i Ofr - case "9": + case '9': return "9199"; // Kunreuth default: return ""; @@ -19794,26 +19804,26 @@ private static String fromNumber92(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber920(number.substring(1)); - case "1": + case '1': return "921"; // Bayreuth - case "2": + case '2': return fromNumber922(number.substring(1)); - case "3": + case '3': return fromNumber923(number.substring(1)); - case "4": + case '4': return fromNumber924(number.substring(1)); - case "5": + case '5': return fromNumber925(number.substring(1)); - case "6": + case '6': return fromNumber926(number.substring(1)); - case "7": + case '7': return fromNumber927(number.substring(1)); - case "8": + case '8': return fromNumber928(number.substring(1)); - case "9": + case '9': return fromNumber929(number.substring(1)); default: return ""; @@ -19825,24 +19835,24 @@ private static String fromNumber920(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9201"; // Gesees - case "2": + case '2': return "9202"; // Waischenfeld - case "3": + case '3': return "9203"; // Neudrossenfeld - case "4": + case '4': return "9204"; // Plankenfels - case "5": + case '5': return "9205"; // Vorbach - case "6": + case '6': return "9206"; // Mistelgau-Obernsees - case "7": + case '7': return "9207"; // Königsfeld Oberfr - case "8": + case '8': return "9208"; // Bindlach - case "9": + case '9': return "9209"; // Emtmannsberg default: return ""; @@ -19854,22 +19864,22 @@ private static String fromNumber922(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9220"; // Kasendorf-Azendorf - case "1": + case '1': return "9221"; // Kulmbach - case "2": + case '2': return "9222"; // Presseck - case "3": + case '3': return "9223"; // Rugendorf - case "5": + case '5': return "9225"; // Stadtsteinach - case "7": + case '7': return "9227"; // Neuenmarkt - case "8": + case '8': return "9228"; // Thurnau - case "9": + case '9': return "9229"; // Mainleus default: return ""; @@ -19881,20 +19891,20 @@ private static String fromNumber923(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9231"; // Marktredwitz - case "2": + case '2': return "9232"; // Wunsiedel - case "3": + case '3': return "9233"; // Arzberg Oberfr - case "4": + case '4': return "9234"; // Neusorg - case "5": + case '5': return "9235"; // Thierstein - case "6": + case '6': return "9236"; // Nagel - case "8": + case '8': return "9238"; // Röslau default: return ""; @@ -19906,18 +19916,18 @@ private static String fromNumber924(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9241"; // Pegnitz - case "2": + case '2': return "9242"; // Gößweinstein - case "3": + case '3': return "9243"; // Pottenstein - case "4": + case '4': return "9244"; // Betzenstein - case "5": + case '5': return "9245"; // Obertrubach - case "6": + case '6': return "9246"; // Pegnitz-Trockau default: return ""; @@ -19929,20 +19939,20 @@ private static String fromNumber925(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9251"; // Münchberg - case "2": + case '2': return "9252"; // Helmbrechts - case "3": + case '3': return "9253"; // Weissenstadt - case "4": + case '4': return "9254"; // Gefrees - case "5": + case '5': return "9255"; // Marktleugast - case "6": + case '6': return "9256"; // Stammbach - case "7": + case '7': return "9257"; // Zell Oberfr default: return ""; @@ -19954,26 +19964,26 @@ private static String fromNumber926(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9260"; // Wilhelmsthal Oberfr - case "1": + case '1': return "9261"; // Kronach - case "2": + case '2': return "9262"; // Wallenfels - case "3": + case '3': return "9263"; // Ludwigsstadt - case "4": + case '4': return "9264"; // Küps - case "5": + case '5': return "9265"; // Pressig - case "6": + case '6': return "9266"; // Mitwitz - case "7": + case '7': return "9267"; // Nordhalben - case "8": + case '8': return "9268"; // Teuschnitz - case "9": + case '9': return "9269"; // Tettau Kr Kronach default: return ""; @@ -19985,26 +19995,26 @@ private static String fromNumber927(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9270"; // Creussen - case "1": + case '1': return "9271"; // Thurnau-Alladorf - case "2": + case '2': return "9272"; // Fichtelberg - case "3": + case '3': return "9273"; // Bad Berneck i Fichtelgebirge - case "4": + case '4': return "9274"; // Hollfeld - case "5": + case '5': return "9275"; // Speichersdorf - case "6": + case '6': return "9276"; // Bischofsgrün - case "7": + case '7': return "9277"; // Warmensteinach - case "8": + case '8': return "9278"; // Weidenberg - case "9": + case '9': return "9279"; // Mistelgau default: return ""; @@ -20016,26 +20026,26 @@ private static String fromNumber928(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9280"; // Selbitz Oberfr - case "1": + case '1': return "9281"; // Hof Saale - case "2": + case '2': return "9282"; // Naila - case "3": + case '3': return "9283"; // Rehau - case "4": + case '4': return "9284"; // Schwarzenbach a d Saale - case "5": + case '5': return "9285"; // Kirchenlamitz - case "6": + case '6': return "9286"; // Oberkotzau - case "7": + case '7': return "9287"; // Selb - case "8": + case '8': return "9288"; // Bad Steben - case "9": + case '9': return "9289"; // Schwarzenbach a Wald default: return ""; @@ -20047,14 +20057,14 @@ private static String fromNumber929(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9292"; // Konradsreuth - case "3": + case '3': return "9293"; // Berg Oberfr - case "4": + case '4': return "9294"; // Regnitzlosau - case "5": + case '5': return "9295"; // Töpen default: return ""; @@ -20066,26 +20076,26 @@ private static String fromNumber93(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber930(number.substring(1)); - case "1": + case '1': return "931"; // Würzburg - case "2": + case '2': return fromNumber932(number.substring(1)); - case "3": + case '3': return fromNumber933(number.substring(1)); - case "4": + case '4': return fromNumber934(number.substring(1)); - case "5": + case '5': return fromNumber935(number.substring(1)); - case "6": + case '6': return fromNumber936(number.substring(1)); - case "7": + case '7': return fromNumber937(number.substring(1)); - case "8": + case '8': return fromNumber938(number.substring(1)); - case "9": + case '9': return fromNumber939(number.substring(1)); default: return ""; @@ -20097,16 +20107,16 @@ private static String fromNumber930(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9302"; // Rottendorf Unterfr - case "3": + case '3': return "9303"; // Eibelstadt - case "5": + case '5': return "9305"; // Estenfeld - case "6": + case '6': return "9306"; // Kist - case "7": + case '7': return "9307"; // Altertheim default: return ""; @@ -20118,16 +20128,16 @@ private static String fromNumber932(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9321"; // Kitzingen - case "3": + case '3': return "9323"; // Iphofen - case "4": + case '4': return "9324"; // Dettelbach - case "5": + case '5': return "9325"; // Kleinlangheim - case "6": + case '6': return "9326"; // Markt Einersheim default: return ""; @@ -20139,24 +20149,24 @@ private static String fromNumber933(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9331"; // Ochsenfurt - case "2": + case '2': return "9332"; // Marktbreit - case "3": + case '3': return "9333"; // Sommerhausen - case "4": + case '4': return "9334"; // Giebelstadt - case "5": + case '5': return "9335"; // Aub Kr Würzburg - case "6": + case '6': return "9336"; // Bütthard - case "7": + case '7': return "9337"; // Gaukönigshofen - case "8": + case '8': return "9338"; // Röttingen Unterfr - case "9": + case '9': return "9339"; // Ippesheim default: return ""; @@ -20168,26 +20178,26 @@ private static String fromNumber934(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9340"; // Königheim-Brehmen - case "1": + case '1': return "9341"; // Tauberbischofsheim - case "2": + case '2': return "9342"; // Wertheim - case "3": + case '3': return "9343"; // Lauda-Königshofen - case "4": + case '4': return "9344"; // Gerchsheim - case "5": + case '5': return "9345"; // Külsheim Baden - case "6": + case '6': return "9346"; // Grünsfeld - case "7": + case '7': return "9347"; // Wittighausen - case "8": + case '8': return "9348"; // Werbach-Gamburg - case "9": + case '9': return "9349"; // Werbach-Wenkheim default: return ""; @@ -20199,26 +20209,26 @@ private static String fromNumber935(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9350"; // Eussenheim-Hundsbach - case "1": + case '1': return "9351"; // Gemünden a Main - case "2": + case '2': return "9352"; // Lohr a Main - case "3": + case '3': return "9353"; // Karlstadt - case "4": + case '4': return "9354"; // Rieneck - case "5": + case '5': return "9355"; // Frammersbach - case "6": + case '6': return "9356"; // Burgsinn - case "7": + case '7': return "9357"; // Gräfendorf Bay - case "8": + case '8': return "9358"; // Gössenheim - case "9": + case '9': return "9359"; // Karlstadt-Wiesenfeld default: return ""; @@ -20230,20 +20240,20 @@ private static String fromNumber936(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9360"; // Thüngen - case "3": + case '3': return "9363"; // Arnstein Unterfr - case "4": + case '4': return "9364"; // Zellingen - case "5": + case '5': return "9365"; // Rimpar - case "6": + case '6': return "9366"; // Geroldshausen Unterfr - case "7": + case '7': return "9367"; // Unterpleichfeld - case "9": + case '9': return "9369"; // Uettingen default: return ""; @@ -20255,22 +20265,22 @@ private static String fromNumber937(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9371"; // Miltenberg - case "2": + case '2': return "9372"; // Klingenberg a Main - case "3": + case '3': return "9373"; // Amorbach - case "4": + case '4': return "9374"; // Eschau - case "5": + case '5': return "9375"; // Freudenberg Baden - case "6": + case '6': return "9376"; // Collenberg - case "7": + case '7': return "9377"; // Freudenberg-Boxtal - case "8": + case '8': return "9378"; // Eichenbühl-Riedern default: return ""; @@ -20282,18 +20292,18 @@ private static String fromNumber938(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9381"; // Volkach - case "2": + case '2': return "9382"; // Gerolzhofen - case "3": + case '3': return "9383"; // Wiesentheid - case "4": + case '4': return "9384"; // Schwanfeld - case "5": + case '5': return "9385"; // Kolitzheim - case "6": + case '6': return "9386"; // Prosselsheim default: return ""; @@ -20305,22 +20315,22 @@ private static String fromNumber939(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9391"; // Marktheidenfeld - case "2": + case '2': return "9392"; // Faulbach Unterfr - case "3": + case '3': return "9393"; // Rothenfels Unterfr - case "4": + case '4': return "9394"; // Esselbach - case "5": + case '5': return "9395"; // Triefenstein - case "6": + case '6': return "9396"; // Urspringen b Lohr - case "7": + case '7': return "9397"; // Wertheim-Dertingen - case "8": + case '8': return "9398"; // Birkenfeld b Würzburg default: return ""; @@ -20332,26 +20342,26 @@ private static String fromNumber94(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber940(number.substring(1)); - case "1": + case '1': return "941"; // Regensburg - case "2": + case '2': return fromNumber942(number.substring(1)); - case "3": + case '3': return fromNumber943(number.substring(1)); - case "4": + case '4': return fromNumber944(number.substring(1)); - case "5": + case '5': return fromNumber945(number.substring(1)); - case "6": + case '6': return fromNumber946(number.substring(1)); - case "7": + case '7': return fromNumber947(number.substring(1)); - case "8": + case '8': return fromNumber948(number.substring(1)); - case "9": + case '9': return fromNumber949(number.substring(1)); default: return ""; @@ -20363,24 +20373,24 @@ private static String fromNumber940(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9401"; // Neutraubling - case "2": + case '2': return "9402"; // Regenstauf - case "3": + case '3': return "9403"; // Donaustauf - case "4": + case '4': return "9404"; // Nittendorf - case "5": + case '5': return "9405"; // Bad Abbach - case "6": + case '6': return "9406"; // Mintraching - case "7": + case '7': return "9407"; // Wenzenbach - case "8": + case '8': return "9408"; // Altenthann - case "9": + case '9': return "9409"; // Pielenhofen default: return ""; @@ -20392,24 +20402,24 @@ private static String fromNumber942(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9420"; // Feldkirchen Niederbay - case "1": + case '1': return "9421"; // Straubing - case "2": + case '2': return "9422"; // Bogen Niederbay - case "3": + case '3': return "9423"; // Geiselhöring - case "4": + case '4': return "9424"; // Strasskirchen - case "6": + case '6': return "9426"; // Oberschneiding - case "7": + case '7': return "9427"; // Leiblfing - case "8": + case '8': return "9428"; // Kirchroth - case "9": + case '9': return "9429"; // Rain Niederbay default: return ""; @@ -20421,20 +20431,20 @@ private static String fromNumber943(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9431"; // Schwandorf - case "3": + case '3': return "9433"; // Nabburg - case "4": + case '4': return "9434"; // Bodenwöhr - case "5": + case '5': return "9435"; // Schwarzenfeld - case "6": + case '6': return "9436"; // Nittenau - case "8": + case '8': return "9438"; // Fensterbach - case "9": + case '9': return "9439"; // Neunburg-Kemnath default: return ""; @@ -20446,22 +20456,22 @@ private static String fromNumber944(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9441"; // Kelheim - case "2": + case '2': return "9442"; // Riedenburg - case "3": + case '3': return "9443"; // Abensberg - case "4": + case '4': return "9444"; // Siegenburg - case "5": + case '5': return "9445"; // Neustadt a d Donau - case "6": + case '6': return "9446"; // Altmannstein - case "7": + case '7': return "9447"; // Essing - case "8": + case '8': return "9448"; // Hausen Niederbay default: return ""; @@ -20473,14 +20483,14 @@ private static String fromNumber945(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9451"; // Schierling - case "2": + case '2': return "9452"; // Langquaid - case "3": + case '3': return "9453"; // Thalmassing - case "4": + case '4': return "9454"; // Aufhausen Oberpf default: return ""; @@ -20492,24 +20502,24 @@ private static String fromNumber946(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9461"; // Roding - case "2": + case '2': return "9462"; // Falkenstein Oberpf - case "3": + case '3': return "9463"; // Wald Oberpf - case "4": + case '4': return "9464"; // Walderbach - case "5": + case '5': return "9465"; // Neukirchen-Balbini - case "6": + case '6': return "9466"; // Stamsried - case "7": + case '7': return "9467"; // Michelsneukirchen - case "8": + case '8': return "9468"; // Zell Oberpf - case "9": + case '9': return "9469"; // Roding-Neubäu default: return ""; @@ -20521,14 +20531,14 @@ private static String fromNumber947(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9471"; // Burglengenfeld - case "2": + case '2': return "9472"; // Hohenfels Oberpf - case "3": + case '3': return "9473"; // Kallmünz - case "4": + case '4': return "9474"; // Schmidmühlen default: return ""; @@ -20540,14 +20550,14 @@ private static String fromNumber948(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9480"; // Sünching - case "1": + case '1': return "9481"; // Pfatter - case "2": + case '2': return "9482"; // Wörth a d Donau - case "4": + case '4': return "9484"; // Brennberg default: return ""; @@ -20559,20 +20569,20 @@ private static String fromNumber949(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9491"; // Hemau - case "2": + case '2': return "9492"; // Parsberg - case "3": + case '3': return "9493"; // Beratzhausen - case "5": + case '5': return "9495"; // Breitenbrunn Oberpf - case "7": + case '7': return "9497"; // Seubersdorf i d Opf - case "8": + case '8': return "9498"; // Laaber - case "9": + case '9': return "9499"; // Painten default: return ""; @@ -20584,22 +20594,22 @@ private static String fromNumber95(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber950(number.substring(1)); - case "1": + case '1': return "951"; // Bamberg - case "2": + case '2': return fromNumber952(number.substring(1)); - case "3": + case '3': return fromNumber953(number.substring(1)); - case "4": + case '4': return fromNumber954(number.substring(1)); - case "5": + case '5': return fromNumber955(number.substring(1)); - case "6": + case '6': return fromNumber956(number.substring(1)); - case "7": + case '7': return fromNumber957(number.substring(1)); default: return ""; @@ -20611,14 +20621,14 @@ private static String fromNumber950(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9502"; // Frensdorf - case "3": + case '3': return "9503"; // Oberhaid Oberfr - case "4": + case '4': return "9504"; // Stadelhofen - case "5": + case '5': return "9505"; // Litzendorf default: return ""; @@ -20630,24 +20640,24 @@ private static String fromNumber952(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9521"; // Hassfurt - case "2": + case '2': return "9522"; // Eltmann - case "3": + case '3': return "9523"; // Hofheim i Ufr - case "4": + case '4': return "9524"; // Zeil a Main - case "5": + case '5': return "9525"; // Königsberg i Bay - case "6": + case '6': return "9526"; // Riedbach - case "7": + case '7': return "9527"; // Knetzgau - case "8": + case '8': return "9528"; // Donnersdorf - case "9": + case '9': return "9529"; // Oberaurach default: return ""; @@ -20659,18 +20669,18 @@ private static String fromNumber953(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9531"; // Ebern - case "2": + case '2': return "9532"; // Maroldsweisach - case "3": + case '3': return "9533"; // Untermerzbach - case "4": + case '4': return "9534"; // Burgpreppach - case "5": + case '5': return "9535"; // Pfarrweisach - case "6": + case '6': return "9536"; // Kirchlauter default: return ""; @@ -20682,22 +20692,22 @@ private static String fromNumber954(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9542"; // Schesslitz - case "3": + case '3': return "9543"; // Hirschaid - case "4": + case '4': return "9544"; // Baunach - case "5": + case '5': return "9545"; // Buttenheim - case "6": + case '6': return "9546"; // Burgebrach - case "7": + case '7': return "9547"; // Zapfendorf - case "8": + case '8': return "9548"; // Mühlhausen Mittelfr - case "9": + case '9': return "9549"; // Lisberg default: return ""; @@ -20709,18 +20719,18 @@ private static String fromNumber955(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9551"; // Burgwindheim - case "2": + case '2': return "9552"; // Burghaslach - case "3": + case '3': return "9553"; // Ebrach Oberfr - case "4": + case '4': return "9554"; // Untersteinbach Unterfr - case "5": + case '5': return "9555"; // Schlüsselfeld-Aschbach - case "6": + case '6': return "9556"; // Geiselwind default: return ""; @@ -20732,26 +20742,26 @@ private static String fromNumber956(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9560"; // Grub a Forst - case "1": + case '1': return "9561"; // Coburg - case "2": + case '2': return "9562"; // Sonnefeld - case "3": + case '3': return "9563"; // Rödental - case "4": + case '4': return "9564"; // Bad Rodach - case "5": + case '5': return "9565"; // Untersiemau - case "6": + case '6': return "9566"; // Meeder - case "7": + case '7': return "9567"; // Seßlach-Gemünda - case "8": + case '8': return "9568"; // Neustadt b Coburg - case "9": + case '9': return "9569"; // Sesslach default: return ""; @@ -20763,18 +20773,18 @@ private static String fromNumber957(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9571"; // Lichtenfels Bay - case "2": + case '2': return "9572"; // Burgkunstadt - case "3": + case '3': return "9573"; // Staffelstein Oberfr - case "4": + case '4': return "9574"; // Marktzeuln - case "5": + case '5': return "9575"; // Weismain - case "6": + case '6': return "9576"; // Lichtenfels-Isling default: return ""; @@ -20786,24 +20796,24 @@ private static String fromNumber96(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber960(number.substring(1)); - case "1": + case '1': return "961"; // Weiden i d Opf - case "2": + case '2': return fromNumber962(number.substring(1)); - case "3": + case '3': return fromNumber963(number.substring(1)); - case "4": + case '4': return fromNumber964(number.substring(1)); - case "5": + case '5': return fromNumber965(number.substring(1)); - case "6": + case '6': return fromNumber966(number.substring(1)); - case "7": + case '7': return fromNumber967(number.substring(1)); - case "8": + case '8': return fromNumber968(number.substring(1)); default: return ""; @@ -20815,20 +20825,20 @@ private static String fromNumber960(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9602"; // Neustadt a d Waldnaab - case "3": + case '3': return "9603"; // Floss - case "4": + case '4': return "9604"; // Wernberg-Köblitz - case "5": + case '5': return "9605"; // Weiherhammer - case "6": + case '6': return "9606"; // Pfreimd - case "7": + case '7': return "9607"; // Luhe-Wildenau - case "8": + case '8': return "9608"; // Kohlberg Oberpf default: return ""; @@ -20840,20 +20850,20 @@ private static String fromNumber962(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9621"; // Amberg Oberpf - case "2": + case '2': return "9622"; // Hirschau Oberpf - case "4": + case '4': return "9624"; // Ensdorf Oberpf - case "5": + case '5': return "9625"; // Kastl b Amberg - case "6": + case '6': return "9626"; // Hohenburg - case "7": + case '7': return "9627"; // Freudenberg Oberpf - case "8": + case '8': return "9628"; // Ursensollen default: return ""; @@ -20865,24 +20875,24 @@ private static String fromNumber963(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9631"; // Tirschenreuth - case "2": + case '2': return "9632"; // Waldsassen - case "3": + case '3': return "9633"; // Mitterteich - case "4": + case '4': return "9634"; // Wiesau - case "5": + case '5': return "9635"; // Bärnau - case "6": + case '6': return "9636"; // Plößberg - case "7": + case '7': return "9637"; // Falkenberg Oberpf - case "8": + case '8': return "9638"; // Neualbenreuth - case "9": + case '9': return "9639"; // Mähring default: return ""; @@ -20894,22 +20904,22 @@ private static String fromNumber964(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9641"; // Grafenwöhr - case "2": + case '2': return "9642"; // Kemnath Stadt - case "3": + case '3': return "9643"; // Auerbach i d Opf - case "4": + case '4': return "9644"; // Pressath - case "5": + case '5': return "9645"; // Eschenbach i d Opf - case "6": + case '6': return "9646"; // Freihung - case "7": + case '7': return "9647"; // Kirchenthumbach - case "8": + case '8': return "9648"; // Neustadt a Kulm default: return ""; @@ -20921,24 +20931,24 @@ private static String fromNumber965(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9651"; // Vohenstrauss - case "2": + case '2': return "9652"; // Waidhaus - case "3": + case '3': return "9653"; // Eslarn - case "4": + case '4': return "9654"; // Pleystein - case "5": + case '5': return "9655"; // Tännesberg - case "6": + case '6': return "9656"; // Moosbach b Vohenstrauß - case "7": + case '7': return "9657"; // Waldthurn - case "8": + case '8': return "9658"; // Georgenberg - case "9": + case '9': return "9659"; // Leuchtenberg default: return ""; @@ -20950,18 +20960,18 @@ private static String fromNumber966(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9661"; // Sulzbach-Rosenberg - case "2": + case '2': return "9662"; // Vilseck - case "3": + case '3': return "9663"; // Neukirchen b Sulzbach-Rosenberg - case "4": + case '4': return "9664"; // Hahnbach - case "5": + case '5': return "9665"; // Königstein Oberpf - case "6": + case '6': return "9666"; // Illschwang default: return ""; @@ -20973,20 +20983,20 @@ private static String fromNumber967(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9671"; // Oberviechtach - case "2": + case '2': return "9672"; // Neunburg vorm Wald - case "3": + case '3': return "9673"; // Tiefenbach Oberpf - case "4": + case '4': return "9674"; // Schönsee - case "5": + case '5': return "9675"; // Altendorf a Nabburg - case "6": + case '6': return "9676"; // Winklarn - case "7": + case '7': return "9677"; // Oberviechtach-Pullenried default: return ""; @@ -20998,12 +21008,12 @@ private static String fromNumber968(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9681"; // Windischeschenbach - case "2": + case '2': return "9682"; // Erbendorf - case "3": + case '3': return "9683"; // Friedenfels default: return ""; @@ -21015,20 +21025,20 @@ private static String fromNumber97(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber970(number.substring(1)); - case "1": + case '1': return "971"; // Bad Kissingen - case "2": + case '2': return fromNumber972(number.substring(1)); - case "3": + case '3': return fromNumber973(number.substring(1)); - case "4": + case '4': return fromNumber974(number.substring(1)); - case "6": + case '6': return fromNumber976(number.substring(1)); - case "7": + case '7': return fromNumber977(number.substring(1)); default: return ""; @@ -21040,12 +21050,12 @@ private static String fromNumber970(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9701"; // Sandberg Unterfr - case "4": + case '4': return "9704"; // Euerdorf - case "8": + case '8': return "9708"; // Bad Bocklet default: return ""; @@ -21057,26 +21067,26 @@ private static String fromNumber972(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9720"; // Üchtelhausen - case "1": + case '1': return "9721"; // Schweinfurt - case "2": + case '2': return "9722"; // Werneck - case "3": + case '3': return "9723"; // Röthlein - case "4": + case '4': return "9724"; // Stadtlauringen - case "5": + case '5': return "9725"; // Poppenhausen Unterfr - case "6": + case '6': return "9726"; // Euerbach - case "7": + case '7': return "9727"; // Schonungen-Marktsteinach - case "8": + case '8': return "9728"; // Wülfershausen Unterfr - case "9": + case '9': return "9729"; // Grettstadt default: return ""; @@ -21088,20 +21098,20 @@ private static String fromNumber973(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9732"; // Hammelburg - case "3": + case '3': return "9733"; // Münnerstadt - case "4": + case '4': return "9734"; // Burkardroth - case "5": + case '5': return "9735"; // Massbach - case "6": + case '6': return "9736"; // Oberthulba - case "7": + case '7': return "9737"; // Wartmannsroth - case "8": + case '8': return "9738"; // Rottershausen default: return ""; @@ -21113,22 +21123,22 @@ private static String fromNumber974(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9741"; // Bad Brückenau - case "2": + case '2': return "9742"; // Kalbach Rhön - case "4": + case '4': return "9744"; // Zeitlofs-Detter - case "5": + case '5': return "9745"; // Wildflecken - case "6": + case '6': return "9746"; // Zeitlofs - case "7": + case '7': return "9747"; // Geroda Bay - case "8": + case '8': return "9748"; // Motten - case "9": + case '9': return "9749"; // Oberbach Unterfr default: return ""; @@ -21140,18 +21150,18 @@ private static String fromNumber976(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9761"; // Bad Königshofen i Grabfeld - case "2": + case '2': return "9762"; // Saal a d Saale - case "3": + case '3': return "9763"; // Sulzdorf a d Lederhecke - case "4": + case '4': return "9764"; // Höchheim - case "5": + case '5': return "9765"; // Trappstadt - case "6": + case '6': return "9766"; // Grosswenkheim default: return ""; @@ -21163,24 +21173,24 @@ private static String fromNumber977(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9771"; // Bad Neustadt a d Saale - case "2": + case '2': return "9772"; // Bischofsheim a d Rhön - case "3": + case '3': return "9773"; // Unsleben - case "4": + case '4': return "9774"; // Oberelsbach - case "5": + case '5': return "9775"; // Schönau a d Brend - case "6": + case '6': return "9776"; // Mellrichstadt - case "7": + case '7': return "9777"; // Ostheim v d Rhön - case "8": + case '8': return "9778"; // Fladungen - case "9": + case '9': return "9779"; // Nordheim v d Rhön default: return ""; @@ -21192,22 +21202,22 @@ private static String fromNumber98(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber980(number.substring(1)); - case "1": + case '1': return "981"; // Ansbach - case "2": + case '2': return fromNumber982(number.substring(1)); - case "3": + case '3': return fromNumber983(number.substring(1)); - case "4": + case '4': return fromNumber984(number.substring(1)); - case "5": + case '5': return fromNumber985(number.substring(1)); - case "6": + case '6': return fromNumber986(number.substring(1)); - case "7": + case '7': return fromNumber987(number.substring(1)); default: return ""; @@ -21219,14 +21229,14 @@ private static String fromNumber980(String number) { return ""; } - switch (number.substring(0, 1)) { - case "2": + switch (number.charAt(0)) { + case '2': return "9802"; // Ansbach-Katterbach - case "3": + case '3': return "9803"; // Colmberg - case "4": + case '4': return "9804"; // Aurach - case "5": + case '5': return "9805"; // Burgoberbach default: return ""; @@ -21238,24 +21248,24 @@ private static String fromNumber982(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9820"; // Lehrberg - case "2": + case '2': return "9822"; // Bechhofen a d Heide - case "3": + case '3': return "9823"; // Leutershausen - case "4": + case '4': return "9824"; // Dietenhofen - case "5": + case '5': return "9825"; // Herrieden - case "6": + case '6': return "9826"; // Weidenbach Mittelfr - case "7": + case '7': return "9827"; // Lichtenau Mittelfr - case "8": + case '8': return "9828"; // Rügland - case "9": + case '9': return "9829"; // Flachslanden default: return ""; @@ -21267,20 +21277,20 @@ private static String fromNumber983(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9831"; // Gunzenhausen - case "2": + case '2': return "9832"; // Wassertrüdingen - case "3": + case '3': return "9833"; // Heidenheim Mittelfr - case "4": + case '4': return "9834"; // Theilenhofen - case "5": + case '5': return "9835"; // Ehingen Mittelfr - case "6": + case '6': return "9836"; // Gunzenhausen-Cronheim - case "7": + case '7': return "9837"; // Haundorf default: return ""; @@ -21292,22 +21302,22 @@ private static String fromNumber984(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9841"; // Bad Windsheim - case "2": + case '2': return "9842"; // Uffenheim - case "3": + case '3': return "9843"; // Burgbernheim - case "4": + case '4': return "9844"; // Obernzenn - case "5": + case '5': return "9845"; // Oberdachstetten - case "6": + case '6': return "9846"; // Ipsheim - case "7": + case '7': return "9847"; // Ergersheim - case "8": + case '8': return "9848"; // Simmershofen default: return ""; @@ -21319,20 +21329,20 @@ private static String fromNumber985(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9851"; // Dinkelsbühl - case "2": + case '2': return "9852"; // Feuchtwangen - case "3": + case '3': return "9853"; // Wilburgstetten - case "4": + case '4': return "9854"; // Wittelshofen - case "5": + case '5': return "9855"; // Dentlein a Forst - case "6": + case '6': return "9856"; // Dürrwangen - case "7": + case '7': return "9857"; // Schopfloch Mittelfr default: return ""; @@ -21344,16 +21354,16 @@ private static String fromNumber986(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9861"; // Rothenburg ob der Tauber - case "5": + case '5': return "9865"; // Adelshofen Mittelfr - case "7": + case '7': return "9867"; // Geslau - case "8": + case '8': return "9868"; // Schillingsfürst - case "9": + case '9': return "9869"; // Wettringen Mittelfr default: return ""; @@ -21365,18 +21375,18 @@ private static String fromNumber987(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9871"; // Windsbach - case "2": + case '2': return "9872"; // Heilsbronn - case "3": + case '3': return "9873"; // Abenberg-Wassermungenau - case "4": + case '4': return "9874"; // Neuendettelsau - case "5": + case '5': return "9875"; // Wolframs-Eschenbach - case "6": + case '6': return "9876"; // Rohr Mittelfr default: return ""; @@ -21388,22 +21398,22 @@ private static String fromNumber99(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return fromNumber990(number.substring(1)); - case "1": + case '1': return "991"; // Deggendorf - case "2": + case '2': return fromNumber992(number.substring(1)); - case "3": + case '3': return fromNumber993(number.substring(1)); - case "4": + case '4': return fromNumber994(number.substring(1)); - case "5": + case '5': return fromNumber995(number.substring(1)); - case "6": + case '6': return fromNumber996(number.substring(1)); - case "7": + case '7': return fromNumber997(number.substring(1)); default: return ""; @@ -21415,20 +21425,20 @@ private static String fromNumber990(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9901"; // Hengersberg Bay - case "3": + case '3': return "9903"; // Schöllnach - case "4": + case '4': return "9904"; // Lalling - case "5": + case '5': return "9905"; // Bernried Niederbay - case "6": + case '6': return "9906"; // Mariaposching - case "7": + case '7': return "9907"; // Zenting - case "8": + case '8': return "9908"; // Schöfweg default: return ""; @@ -21440,26 +21450,26 @@ private static String fromNumber992(String number) { return ""; } - switch (number.substring(0, 1)) { - case "0": + switch (number.charAt(0)) { + case '0': return "9920"; // Bischofsmais - case "1": + case '1': return "9921"; // Regen - case "2": + case '2': return "9922"; // Zwiesel - case "3": + case '3': return "9923"; // Teisnach - case "4": + case '4': return "9924"; // Bodenmais - case "5": + case '5': return "9925"; // Bayerisch Eisenstein - case "6": + case '6': return "9926"; // Frauenau - case "7": + case '7': return "9927"; // Kirchberg Wald - case "8": + case '8': return "9928"; // Kirchdorf i Wald - case "9": + case '9': return "9929"; // Ruhmannsfelden default: return ""; @@ -21471,20 +21481,20 @@ private static String fromNumber993(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9931"; // Plattling - case "2": + case '2': return "9932"; // Osterhofen - case "3": + case '3': return "9933"; // Wallersdorf - case "5": + case '5': return "9935"; // Stephansposching - case "6": + case '6': return "9936"; // Wallerfing - case "7": + case '7': return "9937"; // Oberpöring - case "8": + case '8': return "9938"; // Moos Niederbay default: return ""; @@ -21496,22 +21506,22 @@ private static String fromNumber994(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9941"; // Kötzting - case "2": + case '2': return "9942"; // Viechtach - case "3": + case '3': return "9943"; // Lam Oberpf - case "4": + case '4': return "9944"; // Miltach - case "5": + case '5': return "9945"; // Arnbruck - case "6": + case '6': return "9946"; // Hohenwarth b Kötzing - case "7": + case '7': return "9947"; // Neukirchen b Hl Blut - case "8": + case '8': return "9948"; // Eschlkam default: return ""; @@ -21523,18 +21533,18 @@ private static String fromNumber995(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9951"; // Landau a d Isar - case "2": + case '2': return "9952"; // Eichendorf - case "3": + case '3': return "9953"; // Pilsting - case "4": + case '4': return "9954"; // Simbach Niederbay - case "5": + case '5': return "9955"; // Mamming - case "6": + case '6': return "9956"; // Eichendorf-Aufhausen default: return ""; @@ -21546,18 +21556,18 @@ private static String fromNumber996(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9961"; // Mitterfels - case "2": + case '2': return "9962"; // Schwarzach Niederbay - case "3": + case '3': return "9963"; // Konzell - case "4": + case '4': return "9964"; // Stallwang - case "5": + case '5': return "9965"; // Sankt Englmar - case "6": + case '6': return "9966"; // Wiesenfelden default: return ""; @@ -21569,27 +21579,28 @@ private static String fromNumber997(String number) { return ""; } - switch (number.substring(0, 1)) { - case "1": + switch (number.charAt(0)) { + case '1': return "9971"; // Cham - case "2": + case '2': return "9972"; // Waldmünchen - case "3": + case '3': return "9973"; // Furth i Wald - case "4": + case '4': return "9974"; // Traitsching - case "5": + case '5': return "9975"; // Waldmünchen-Geigant - case "6": + case '6': return "9976"; // Rötz - case "7": + case '7': return "9977"; // Arnschwang - case "8": + case '8': return "9978"; // Schönthal Oberpf default: return ""; } } + /* End of generated code. */ From 8779bbcbf6d5b75ac38b0cfc5ed27ceac31a677f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 22 May 2024 15:51:03 +0200 Subject: [PATCH 57/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../IsPossibleNumberWithReasonTest.groovy | 12 ++++++++++++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 1948c2f..109c516 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -77,14 +77,20 @@ class IsPossibleNumberWithReasonTest extends Specification { "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 110 @@ -109,14 +115,20 @@ class IsPossibleNumberWithReasonTest extends Specification { "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 112 diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 28e7038..d2f84ae 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -77,14 +77,20 @@ class IsValidNumberTest extends Specification { // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "0110" | "DE" | false | false + "0175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | false | true "0203 110555" | "DE" | false | true "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false + "+49175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | false | true "+49203 110555" | "DE" | false | true "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false + "+49175 110" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | false | true "+49203 110555" | "FR" | false | true // end of 110 @@ -109,14 +115,20 @@ class IsValidNumberTest extends Specification { "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "0112" | "DE" | false | false "0112 556677" | "DE" | false | false + "0175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | false | true "0203 112555" | "DE" | false | true "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false + "+49175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | false | true "+49203 112555" | "DE" | false | true "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false + "+49175 112" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 1125555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | false | true "+49203 112555" | "FR" | false | true // end of 112 From 6db8ae10c6ee6fd84fc6582f5f90caf5de77b2ef Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 30 May 2024 17:47:41 +0200 Subject: [PATCH 58/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../GermanAreaCodeExtractor/mobil.py | 95 ++++++++++ .../PhoneNumberValidatorImpl.java | 93 ++++++---- .../numberplans/NumberPlan.java | 36 ++++ .../constants/DeFixedLineNumberPlan.java | 175 ++++++++++++++++++ .../constants/GermanAreaCodeExtractor.java | 3 + .../PhoneNumberValidatorImplTest.groovy | 66 ++++++- .../IsPossibleNumberWithReasonTest.groovy | 33 +++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 45 +++-- 8 files changed, 489 insertions(+), 57 deletions(-) create mode 100644 src/generators/GermanAreaCodeExtractor/mobil.py diff --git a/src/generators/GermanAreaCodeExtractor/mobil.py b/src/generators/GermanAreaCodeExtractor/mobil.py new file mode 100644 index 0000000..44f774b --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/mobil.py @@ -0,0 +1,95 @@ +import csv + +last_ndc = "xxx" + + +def add(leaf, keypart, name): + if len(keypart) == 1: + leaf[keypart] = name + else: + if not keypart[0] in leaf: + leaf[keypart[0]] = {} + add(leaf[keypart[0]], keypart[1:], name) + + +def print_function(leaf, prefix): + for k in leaf: + if isinstance(leaf[k], dict): + print_function(leaf[k], prefix + k) + else: + ndc = prefix+k + l = 7 + if ndc.startswith("15"): + l = 11 - len(ndc) + if ndc == '176': + l = 8 + if ndc == '160': + print(' Map.entry("' + ndc + '", new NDCDetails(7, 8, false, 1)), // ' + leaf[k]) + print(' // NDC 160 uses first digit of number for deviating ranges with different length') + for i in range(10): + if i == 9: + l = 8 + else: + l = 7 + print(' Map.entry("' + ndc + str(i) +'", new NDCDetails(' + str(l) + ', ' + str(l) + ', false)), // ' + leaf[k]) + else: + if ndc == last_ndc: + print(' Map.entry("' + ndc + '", new NDCDetails(' + str(l) + ', ' + str(l) + ', false)) // ' + leaf[k]) + else: + print(' Map.entry("'+ndc+'", new NDCDetails('+str(l)+', '+str(l)+', false)), // '+ leaf[k]) + + + + +# Start, creating a dictonary for placing the Numberplan as a tree +onkz = {} + +# Website for used mobile NDCs: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/zugeteilte%20RNB/start.html +with open('mobile_ndcs.html', newline='') as f: + data = f.read().replace('\n', '') + data = data.split("Liste der zugeteilten Rufnummernblöcke / Mobile Dienste")[1] + data = data.split("")[1] + data = data.split("")[0] + data = data.split("")[2] + + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('(0)', "") + data = data.replace('', ",") + data = data.replace('', ",") + data = data.replace('', "{+}") + data = data.replace('&', "&") + data = data.replace(' ', " ") + data = data.replace(' ', " ") + data = data.replace(', ', ",") + data = data.replace(',', "{:}") + + data = data.replace('15-', "15") + mf_ndcs = data.split('{+}') + + for mf_ndc in mf_ndcs: + ndc = mf_ndc.split('{:}') + if len(ndc) == 2: + last_ndc = ndc[0] + add(onkz, ndc[0], ndc[1]) + +onkz = dict(sorted(onkz.items())) + +# print code from three +print_function(onkz, "") + + + + + diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index a2f8756..457a514 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -79,22 +79,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after CC: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } } } else { @@ -114,23 +123,32 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after CC: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } } } @@ -158,24 +176,37 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } // Check for NDC after Nac: - String nac = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); - if (Objects.equals(nac, "")) { + if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - String numberWithoutNationDestinationCode = numberWithOutNac.substring(nac.length()); - // Check for Shortnumber after NDC - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + + String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); + if (shortNumberKey.length() > 0) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } } + + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } - // Todo: Own Length test + + // As fallback check by libPhone PhoneNumberValidationResult fallBackResult = wrapper.validate(); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index b491780..a295a3c 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -80,6 +80,42 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn return ""; } + public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { + return -1; + } + + public int getNationDestinationCodeMaximumNumberLength(String ndc, String number) { + return -1; + } + + public int getDefaultMinimalNumberLength() { + return -1; + } + + public int getDefaultMaximumNumberLength() { + return -1; + } + + public boolean isNumberTooShortForNationalDestinationCode(String ndc, String number) { + int minLength = getNationDestinationCodeMinimalNumberLength(ndc, number); + if (minLength == -1) { + minLength = getDefaultMinimalNumberLength(); + } + return ((minLength != -1) && (minLength>number.length())); + } + + public boolean isNumberTooLongForNationalDestinationCode(String ndc, String number) { + int maxLength = getNationDestinationCodeMaximumNumberLength(ndc, number); + if (maxLength == -1) { + maxLength = getDefaultMaximumNumberLength(); + } + return ((maxLength != -1) && (maxLength NDC_DETAILS; + + static { + NDC_DETAILS = Map.ofEntries( + /* https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/LaengeRufnummernbloecke/start.html */ + /* + The following Code is generated by the python script: src/generators/GermanAreaCodeExtractor/mobile.py + it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new + code and past it between the comments below. + + TODO: special NDC need to be added to the script (mobile is done) + */ + + /* + * Generation started + */ + Map.entry("15019", new NDCDetails(6, 6, false)), // Tismi BV + Map.entry("15020", new NDCDetails(6, 6, false)), // Legos - Local Exchange Global Operation Services + Map.entry("1511", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1512", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1514", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1515", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1516", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1517", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("15180", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15181", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15182", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15183", new NDCDetails(6, 6, false)), // Telekom Deutschland GmbH + Map.entry("15310", new NDCDetails(6, 6, false)), // MTEL Deutschland GmbH + Map.entry("1520", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1521", new NDCDetails(7, 7, false)), // Lycamobile Europe Ltd. + Map.entry("1522", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1523", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1525", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1526", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("1529", new NDCDetails(7, 7, false)), // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH ) + Map.entry("15510", new NDCDetails(6, 6, false)), // Lebara Limited + Map.entry("15511", new NDCDetails(6, 6, false)), // Lebara Limited + Map.entry("15560", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15561", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15562", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15563", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15564", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15565", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15566", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15567", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15568", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15569", new NDCDetails(6, 6, false)), // 1&1 Mobilfunk GmbH + Map.entry("15630", new NDCDetails(6, 6, false)), // multiConnect GmbH + Map.entry("15678", new NDCDetails(6, 6, false)), // Argon Networks UG + Map.entry("15679", new NDCDetails(6, 6, false)), // Argon Networks UG + Map.entry("15700", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15701", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15702", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15703", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15704", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("15706", new NDCDetails(6, 6, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("1573", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1575", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1577", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("1578", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("15888", new NDCDetails(6, 6, false)), // TelcoVillage GmbH + Map.entry("1590", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("160", new NDCDetails(7, 8, false, 1)), // Telekom Deutschland GmbH + // NDC 160 uses first digit of number for deviating ranges with different length + Map.entry("1600", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1601", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1602", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1603", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1604", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1605", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1606", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1607", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1608", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("1609", new NDCDetails(8, 8, false)), // Telekom Deutschland GmbH + Map.entry("162", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("163", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("170", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("171", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("172", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("173", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("174", new NDCDetails(7, 7, false)), // Vodafone GmbH + Map.entry("175", new NDCDetails(7, 7, false)), // Telekom Deutschland GmbH + Map.entry("176", new NDCDetails(8, 8, false)), // Telefónica Germany GmbH & Co. OHG + Map.entry("177", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("178", new NDCDetails(7, 7, false)), // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + Map.entry("179", new NDCDetails(7, 7, false)) // Telefónica Germany GmbH & Co. OHG + /* + * Generation ended + */ + ); + } + /** * Constant for German short numbers in fixed-line as extracted from the details above */ private static final Map SHORT_NUMBER_CODES = SHORT_NUMBER_CODES_DETAILS.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().length)); + + public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { + + if (NDC_DETAILS.containsKey(ndc)) { + + NDCDetails details = NDC_DETAILS.get(ndc); + + if ((details.lengthOfNumberPrefix > 0) && (number != null) && (number.length()>=details.lengthOfNumberPrefix)) { + for (int i=details.lengthOfNumberPrefix; i>0; i--){ + String ndcWithPrefix = ndc + number.substring(0, i); + if (NDC_DETAILS.containsKey(ndcWithPrefix)) { + return NDC_DETAILS.get(ndcWithPrefix).minNumberLength; + } + } + } + + return details.minNumberLength; + } + + return -1; + } + + public int getNationDestinationCodeMaximumNumberLength(String ndc, String number) { + if (NDC_DETAILS.containsKey(ndc)) { + + NDCDetails details = NDC_DETAILS.get(ndc); + + if ((details.lengthOfNumberPrefix > 0) && (number != null) && (number.length()>=details.lengthOfNumberPrefix)) { + for (int i=details.lengthOfNumberPrefix; i>0; i--){ + String ndcWithPrefix = ndc + number.substring(0, i); + if (NDC_DETAILS.containsKey(ndcWithPrefix)) { + return NDC_DETAILS.get(ndcWithPrefix).maxNumberLength; + } + } + } + + return details.maxNumberLength; + } + + return -1; + } + + public int getDefaultMinimalNumberLength() { + return 2; // VW in Wolfsburg (NDC: 5361) Number: 90 + } + + public int getDefaultMaximumNumberLength() { + return 11; // National number is max 13 digits long, while shortest NDC is 2 digits, so 11 left for the number itself. + } + + @Override + public boolean isNDCOptional(String ndc) { + if (NDC_DETAILS.containsKey(ndc)) { + return NDC_DETAILS.get(ndc).isOptional; + } + + return GermanAreaCodeExtractor.isNDCOptional(ndc); + } + @Override public boolean isUsableWithIDPandCCfromOutside(String number) { return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index 9e123ce..aedd38b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -10,6 +10,9 @@ public class GermanAreaCodeExtractor { TODO: special NDC need to be added to the script (mobile is done) */ + public static Boolean isNDCOptional(String number) { + return ! (number.startsWith("1")); + } /* Start of generated code diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 0539399..1128d52 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -81,25 +81,79 @@ class PhoneNumberValidatorImplTest extends Specification { "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49175 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49175 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // end of 110 } + def "validate police short code 112 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // short code for Police (112) is not dial-able internationally nor does it has additional numbers + "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "112556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + // end of 112 + } } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 109c516..a03d2cd 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -75,23 +75,32 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 110 } @@ -113,22 +122,32 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 112 diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index d2f84ae..965afae 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -76,21 +76,31 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "110556677" | "DE" | false | false "0110" | "DE" | false | false - "0175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110" | "DE" | false | false + "0175 110555" | "DE" | false | false + "0175 1105555" | "DE" | true | false + "0175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 110555555" | "DE" | false | false "0203 110" | "DE" | false | true "0203 110555" | "DE" | false | true "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false - "+49175 110" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "DE" | false | false + "+49175 110555" | "DE" | false | false + "+49175 1105555" | "DE" | true | false + "+49175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "DE" | false | false "+49203 110" | "DE" | false | true "+49203 110555" | "DE" | false | true "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false - "+49175 110" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110" | "FR" | false | false + "+49175 110555" | "FR" | false | false + "+49175 1105555" | "FR" | true | false + "+49175 11055555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 110555555" | "FR" | false | false "+49203 110" | "FR" | false | true "+49203 110555" | "FR" | false | true // end of 110 @@ -113,22 +123,31 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "112556677" | "DE" | false | false "0112" | "DE" | false | false - "0112 556677" | "DE" | false | false - "0175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "0175 112" | "DE" | false | false + "0175 112555" | "DE" | false | false + "0175 1125555" | "DE" | true | false + "0175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 112555555" | "DE" | false | false "0203 112" | "DE" | false | true "0203 112555" | "DE" | false | true "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false - "+49175 112" | "DE" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "DE" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112" | "DE" | false | false + "+49175 112555" | "DE" | false | false + "+49175 1125555" | "DE" | true | false + "+49175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 112555555" | "DE" | false | false "+49203 112" | "DE" | false | true "+49203 112555" | "DE" | false | true "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false - "+49175 112" | "FR" | false | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "FR" | true | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 + "+49175 112" | "FR" | false | false + "+49175 112555" | "FR" | false | false + "+49175 1125555" | "FR" | true | false + "+49175 11255555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 112555555" | "FR" | false | false "+49203 112" | "FR" | false | true "+49203 112555" | "FR" | false | true // end of 112 From 35c60b3d9a4e51b53fe1c5791ceb27554ee35209 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 11:01:48 +0200 Subject: [PATCH 59/98] Introducing INVALID_PREFIX_OF_SUBSCRIBER_NUMBER and reorganize expected results for 110 and 112 short code tests. Also add test to check a subscriber number is not starting with a digit equaling NAC, when (used) NDC not mandatory. --- .../PhoneNumberValidatorImpl.java | 87 +++++++---- .../PhoneNumberValidationResult.java | 6 + .../PhoneNumberValidatorImplTest.groovy | 145 +++++++++++------- .../IsPossibleNumberWithReasonTest.groovy | 25 +++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 26 ++++ 5 files changed, 204 insertions(+), 85 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 457a514..82e011a 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -71,11 +71,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // Check for ShortNumber directly after CC String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } + if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after CC: @@ -90,12 +92,21 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { @@ -115,11 +126,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // Check for ShortNumber directly after CC String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } + if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after CC: @@ -134,12 +147,21 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { @@ -168,11 +190,13 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // check if a shortnumber is used directly after NAC and if that is allowed String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNAC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } + if (numberWithOutNac.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithNAC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } + } // else path of invalid NDC is checked explicitly here after also for non short number cases. } // Check for NDC after Nac: @@ -181,22 +205,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (Objects.equals(ndc, "")) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? } - - String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); if (shortNumberKey.length() > 0) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + } } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { return PhoneNumberValidationResult.TOO_SHORT; } @@ -233,7 +266,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } else { - return PhoneNumberValidationResult.INVALID_LENGTH; + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index 7e81d7e..ed8a6ba 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -102,6 +102,12 @@ public enum PhoneNumberValidationResult { /** The number has an invalid national destination code (aka NDC) for this region or the specific number must not be used with used NDC. */ INVALID_NATIONAL_DESTINATION_CODE(ValidationResult.INVALID_LENGTH), + /** The subscriber number starts with digits which makes the number invalid, e.g. overlapping special numbers when NDC is optional, so those numbers could not be distinct in digit by digit calling from those special numbers + * - If Region is using NAC and NDC is optional, the number must not start with NAC + * - IF Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers + * */ + INVALID_PREFIX_OF_SUBSCRIBER_NUMBER(ValidationResult.INVALID_LENGTH), + /** The number is shorter than all valid numbers for this region or used NDC. */ TOO_SHORT(ValidationResult.TOO_SHORT), diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 1128d52..8ae498f 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -15,6 +15,7 @@ */ package de.telekom.phonenumbernormalizer +import com.google.i18n.phonenumbers.PhoneNumberUtil import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult import spock.lang.Specification @@ -26,6 +27,30 @@ class PhoneNumberValidatorImplTest extends Specification { target = new PhoneNumberValidatorImpl() } + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, countryCode, expectedResult) { + given: + + + when: + "get number isPossibleNumberWithReason: $number" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | countryCode | expectedResult + "0203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // after CCC+mandatory NDC number may start with digit equal to NAC + } + def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { given: @@ -77,35 +102,37 @@ class PhoneNumberValidatorImplTest extends Specification { number | regionCode | expectedResult // short code for Police (110) is not dial-able internationally nor does it has additional numbers - "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "110556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH - "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "110" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "110556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203 110555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49110" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49110 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 110" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1105555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11055555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 110" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 110555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49110" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49110 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 110" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1105555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11055555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 110555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 110" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 110555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // end of 110 } @@ -123,35 +150,37 @@ class PhoneNumberValidatorImplTest extends Specification { number | regionCode | expectedResult // short code for Police (112) is not dial-able internationally nor does it has additional numbers - "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "112556677" | "DE" | PhoneNumberValidationResult.INVALID_LENGTH - "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE - "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE - "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT - "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE - "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG - "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE - "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "112" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "112556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203 112555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49112" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49112 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 112" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1125555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11255555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 112" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 112555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49112" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means CC is the problem + "+49112 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 112" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1125555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11255555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 112555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 112" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203 112555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // end of 112 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index a03d2cd..7f49eb1 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -7608,6 +7608,31 @@ class IsPossibleNumberWithReasonTest extends Specification { "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true } + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, regionCode, expectedResult, expectingFail) { + given: + + def phoneNumber = phoneUtil.parse(number, regionCode) + + when: + "get number isPossibleNumberWithReason: $number" + + def result = phoneUtil.isPossibleNumberWithReason(phoneNumber) + + then: + "is number expected: $expectedResult" + this.logResult(result, expectedResult, expectingFail, number, regionCode) + + where: + + number | regionCode | expectedResult | expectingFail + "0203056677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // after CCC+mandatory NDC number may start with digit equal to NAC + } + def "check if original lib fixed non check of NAC"(String number, regionCode, expectedResult, expectingFail) { given: diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 965afae..15557f3 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -7364,4 +7364,30 @@ class IsValidNumberTest extends Specification { "0998" | "DE" | false | false "0999" | "DE" | false | false } + + + def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, regionCode, expectedResult, expectingFail) { + given: + + def phoneNumber = phoneUtil.parse(number, regionCode) + + when: + "get number isPossibleNumberWithReason: $number" + + def result = phoneUtil.isValidNumber(phoneNumber) + + then: + "is number expected: $expectedResult" + this.logResult(result, expectedResult, expectingFail, number, regionCode) + + where: + + number | regionCode | expectedResult | expectingFail + "0203056677" | "DE" | false | true // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | false | true // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | false | true // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | true | false // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | true | false // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | true | false // after CCC+mandatory NDC number may start with digit equal to NAC + } } \ No newline at end of file From 57db6a9f2f6fb31cc8c291659129cec99bfaf16f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 60/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImpl.java | 24 +++++++-- .../constants/DeFixedLineNumberPlan.java | 2 +- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ .../IsPossibleNumberWithReasonTest.groovy | 31 ++++++++---- .../PhoneNumberUtil/IsValidNumberTest.groovy | 33 +++++++++---- 5 files changed, 115 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 82e011a..12ebc29 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -75,7 +75,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } } // else path of invalid NDC is checked explicitly here after also for non short number cases. } @@ -96,7 +100,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; + } } } else { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; @@ -130,7 +138,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; + } } } // else path of invalid NDC is checked explicitly here after also for non short number cases. } @@ -151,7 +163,11 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international + if (numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; + } } } else { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index f1f9b6f..f56d761 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -98,7 +98,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { private static final Map SHORT_NUMBER_CODES_DETAILS = Map.of( "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), - "115", new ShortNumberDetails(3, false, false, false, false, false, false, true), + "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 8ae498f..362526d 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -185,4 +185,53 @@ class PhoneNumberValidatorImplTest extends Specification { } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 7f49eb1..9cc3940 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -170,20 +170,33 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false + "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // not valid by BnetzA definition from within Germany - "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // TODO: Maybe IS_POSSIBLE_LOCAL_ONLY is also acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49203115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49203115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - // 155 does not have additional digits - "115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175 1155555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49203 115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // end of 115 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 15557f3..d47cbd3 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -167,23 +167,36 @@ class IsValidNumberTest extends Specification { where: - number | regionCode | expectedResult | expectingFail + number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers + "115556677" | "DE" | true | true "0115" | "DE" | false | false // not valid by BnetzA definition from within Germany - "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203115" | "DE" | true | false - "+49203115" | "DE" | true | false - "+49203115" | "FR" | true | false - // 155 does not have additional digits - "115555" | "DE" | false | false "0115 556677" | "DE" | false | false + "0175 115" | "DE" | false | false + "0175 115555" | "DE" | false | false + "0175 1155555" | "DE" | true | false + "0175 11555555" | "DE" | false | true + "0175 115555555" | "DE" | false | false + "0203 115" | "DE" | true | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "0203 115555" | "DE" | false | true + "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | false | false - "+49115 556677" | "FR" | false | false + "+49175 115" | "DE" | false | false + "+49175 115555" | "DE" | false | false + "+49175 1155555" | "DE" | true | false + "+49175 11555555" | "DE" | false | true + "+49175 115555555" | "DE" | false | false + "+49203 115" | "DE" | true | false "+49203 115555" | "DE" | false | true + "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49115 556677" | "FR" | false | false + "+49175 115" | "FR" | false | false + "+49175 115555" | "FR" | false | false + "+49175 1155555" | "FR" | true | false + "+49175 11555555" | "FR" | false | true + "+49175 115555555" | "FR" | false | false + "+49203 115" | "FR" | true | false "+49203 115555" | "FR" | false | true // end of 115 } From e87cadbbacdef2fb6b7356bd2183759a1f3ad94d Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 61/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../PhoneNumberValidatorImpl.java | 171 ++++++++---------- .../numberplans/NumberPlan.java | 25 +++ .../numberplans/ShortCodeUseable.java | 12 ++ .../PhoneNumberValidatorImplTest.groovy | 2 +- 4 files changed, 112 insertions(+), 98 deletions(-) create mode 100644 src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 12ebc29..a71bbac 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -16,10 +16,7 @@ package de.telekom.phonenumbernormalizer; import de.telekom.phonenumbernormalizer.dto.DeviceContextLineType; -import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; -import de.telekom.phonenumbernormalizer.numberplans.NumberPlanFactory; -import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; -import de.telekom.phonenumbernormalizer.numberplans.PhoneLibWrapper; +import de.telekom.phonenumbernormalizer.numberplans.*; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +35,29 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { private static final Logger LOGGER = LoggerFactory.getLogger(PhoneNumberValidatorImpl.class); + private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberplan, String numberToCheck, ShortCodeUseable mainSet, ShortCodeUseable oppositeSet, + PhoneNumberValidationResult notUseableInMainSet, PhoneNumberValidationResult useableOnlyInMainSet, + PhoneNumberValidationResult longerThanShortCode) { + String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); + if (shortNumberKey.length() > 0) { + if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { + if (!numberplan.isUsable(mainSet, shortNumberKey)) { + return notUseableInMainSet; + } else { + if (numberplan.isUsable(oppositeSet, shortNumberKey)) { + return PhoneNumberValidationResult.IS_POSSIBLE; + } else { + return useableOnlyInMainSet; + } + } + } else { + return longerThanShortCode; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { @@ -65,23 +85,14 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (regionCountryCode.equals(numberCountryCode)) { // Calling within the country - if (numberplan!=null) { - // Check for ShortNumber directly after CC - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - if (numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterCC!=null) { + return isShortCodeDirectlyAfterCC; } // Check for NDC after CC: @@ -94,22 +105,15 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - if (numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterCCandNDC!=null) { + return isShortCodeDirectlyAfterCCandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { @@ -131,20 +135,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // calling from outside the country if (numberplan!=null) { - // Check for ShortNumber directly after CC - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutCountryCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutCountryCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_COUNTRY_CODE; - } else { - if (numberplan.isUsableWithIDPandCCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; - } - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterCC!=null) { + return isShortCodeDirectlyAfterCC; } // Check for NDC after CC: @@ -157,22 +153,15 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithIDPandCCandNDCfromOutside(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - if (numberplan.isUsableWithIDPandCCandNDCfromInside(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY; - } - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterCCandNDC!=null) { + return isShortCodeDirectlyAfterCCandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { @@ -204,17 +193,16 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan!=null) { // check if a shortnumber is used directly after NAC and if that is allowed - String shortNumberKey = numberplan.startingWithShortNumberKey(numberWithOutNac); - if (shortNumberKey.length() > 0) { - if (numberWithOutNac.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithNAC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; - } - } // else path of invalid NDC is checked explicitly here after also for non short number cases. + + PhoneNumberValidationResult isShortCodeDirectlyAfterNAC = checkShortCodeOverlapping(numberplan, numberWithOutNac, + ShortCodeUseable.WITH_NAC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + + if (isShortCodeDirectlyAfterNAC!=null) { + return isShortCodeDirectlyAfterNAC; } + // Check for NDC after Nac: String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); @@ -224,28 +212,22 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) if (numberplan.isNDCOptional(ndc)) { - shortNumberKey = numberplan.startingWithShortNumberKey(numberWithoutNationDestinationCode); - if (shortNumberKey.length() > 0) { - if (numberWithoutNationDestinationCode.length() == numberplan.getShortCodeLength(shortNumberKey)) { - if (!numberplan.isUsableWithNACandNDC(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; - } else { - return PhoneNumberValidationResult.IS_POSSIBLE; // TODO: check if only international - } - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } + + PhoneNumberValidationResult isShortCodeDirectlyAfterNACandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + ShortCodeUseable.WITH_NAC_AND_NDC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterNACandNDC!=null) { + return isShortCodeDirectlyAfterNACandNDC; } + // when NDC is optional, then number must not start with NAC again. String nac = wrapper.getNationalAccessCode(); if (numberWithoutNationDestinationCode.startsWith(nac)) { return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { return PhoneNumberValidationResult.TOO_SHORT; } @@ -274,17 +256,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; } - String shortNumberKey = numberplan.startingWithShortNumberKey(wrapper.getDialableNumber()); - if (shortNumberKey.length()>0) { - if (!numberplan.isUsableDirectly(shortNumberKey)) { - return PhoneNumberValidationResult.INVALID_LENGTH; - } else { - if (wrapper.getDialableNumber().length() == numberplan.getShortCodeLength(shortNumberKey)) { - return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; - } else { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } + PhoneNumberValidationResult isShortCodeDirectly = checkShortCodeOverlapping(numberplan, wrapper.getDialableNumber(), + ShortCodeUseable.DIRECTLY, null, + PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectly!=null) { + return isShortCodeDirectly; } return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index a295a3c..0be7406 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -144,6 +144,31 @@ public boolean isUsableDirectly(String number) { } + public boolean isUsable(ShortCodeUseable how, String number) { + + if (how == null) { + return false; + } + + switch (how) { + case WITH_IDP_AND_CC_FROM_OUTSIDE: + return isUsableWithIDPandCCfromOutside(number); + case WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE: + return isUsableWithIDPandCCandNDCfromOutside(number); + case WITH_IDP_AND_CC_FROM_INSIDE: + return isUsableWithIDPandCCfromInside(number); + case WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE: + return isUsableWithIDPandCCandNDCfromInside(number); + case WITH_NAC: + return isUsableWithNAC(number); + case WITH_NAC_AND_NDC: + return isUsableWithNACandNDC(number); + case DIRECTLY: + return isUsableDirectly(number); + } + return false; + } + /** * Finds the longest prefix of a short number rule of the current number plan, at the beginning of a number. * diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java new file mode 100644 index 0000000..5f3c8cb --- /dev/null +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/ShortCodeUseable.java @@ -0,0 +1,12 @@ +package de.telekom.phonenumbernormalizer.numberplans; + +public enum ShortCodeUseable { + + WITH_IDP_AND_CC_FROM_OUTSIDE(), + WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE(), + WITH_IDP_AND_CC_FROM_INSIDE(), + WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE(), + WITH_NAC(), + WITH_NAC_AND_NDC(), + DIRECTLY(); +} diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 362526d..e17fa0c 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -208,7 +208,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From 3eb8cd45663ffaa895a21970e7a8c0c30c523359 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:38:15 +0200 Subject: [PATCH 62/98] Optimize Validation Code by moving duplicate code structure into checkExitCodeUsingNumber method --- .../PhoneNumberValidatorImpl.java | 207 +++++++----------- 1 file changed, 76 insertions(+), 131 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index a71bbac..b71d50b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -58,6 +58,58 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp } + private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, + ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, + ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, + PhoneNumberValidationResult invalidInitialExitCode, + PhoneNumberValidationResult mainSetResult){ + if (numberplan!=null) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, + mainSetIDPCC, oppositeSetIDPCC, + invalidInitialExitCode, mainSetResult, null); + + if (isShortCodeDirectlyAfterInitalExitCode!=null) { + return isShortCodeDirectlyAfterInitalExitCode; + } + + // Check for NDC after InitalExitCode: + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); + + if (Objects.equals(ndc, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + mainSetIDPCCNDC, oppositeSetIDPCCNDC, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { + return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } + + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { @@ -82,105 +134,31 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number String numberWithoutCountryCode = wrapper.removeIDP().substring(numberCountryCode.length()); + // using IDP as initial Exit Code + PhoneNumberValidationResult isIDPNumberValid; + if (regionCountryCode.equals(numberCountryCode)) { // Calling within the country - - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, - ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, - PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); - - if (isShortCodeDirectlyAfterCC!=null) { - return isShortCodeDirectlyAfterCC; - } - - // Check for NDC after CC: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterCCandNDC!=null) { - return isShortCodeDirectlyAfterCCandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - + isIDPNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY); } else { - + // replacing the number plan by the one specified by the number's CC numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, numberCountryCode); // calling from outside the country - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCC = checkShortCodeOverlapping(numberplan, numberWithoutCountryCode, - ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, - PhoneNumberValidationResult.INVALID_COUNTRY_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, null); - - if (isShortCodeDirectlyAfterCC!=null) { - return isShortCodeDirectlyAfterCC; - } - - // Check for NDC after CC: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutCountryCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutCountryCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterCCandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterCCandNDC!=null) { - return isShortCodeDirectlyAfterCCandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } + isIDPNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithoutCountryCode, + ShortCodeUseable.WITH_IDP_AND_CC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_FROM_INSIDE, + ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_OUTSIDE, ShortCodeUseable.WITH_IDP_AND_CC_AND_NDC_FROM_INSIDE, + PhoneNumberValidationResult.INVALID_COUNTRY_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY); + } + if (isIDPNumberValid != null) { + return isIDPNumberValid; } - // return wrapper.validate(); } else { // No Country Exit Code has been used, so no CC is following. if (Objects.equals(wrapper.getNationalAccessCode(), "")) { @@ -194,51 +172,18 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (numberplan!=null) { // check if a shortnumber is used directly after NAC and if that is allowed - PhoneNumberValidationResult isShortCodeDirectlyAfterNAC = checkShortCodeOverlapping(numberplan, numberWithOutNac, + // using NAC as initial Exit Code + PhoneNumberValidationResult isNACNumberValid = checkExitCodeUsingNumber(wrapper, numberplan, numberWithOutNac, ShortCodeUseable.WITH_NAC, null, - PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, null); + ShortCodeUseable.WITH_NAC_AND_NDC, null, + PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE, + PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY); - if (isShortCodeDirectlyAfterNAC!=null) { - return isShortCodeDirectlyAfterNAC; + if (isNACNumberValid != null) { + return isNACNumberValid; } - - - // Check for NDC after Nac: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithOutNac); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - String numberWithoutNationDestinationCode = numberWithOutNac.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterNACandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - ShortCodeUseable.WITH_NAC_AND_NDC, null, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterNACandNDC!=null) { - return isShortCodeDirectlyAfterNACandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - - // As fallback check by libPhone PhoneNumberValidationResult fallBackResult = wrapper.validate(); From 2911dc329813a6a4ae3475e6e419d0581e64cf82 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:43:27 +0200 Subject: [PATCH 63/98] Adding todo in Validation Code to support not yet supported PhoneNumberValidationResult types. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index b71d50b..adaa239 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -214,9 +214,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number } } - // boolean hasNoCCAndNoNAC = wrapper.hasNoCountryCodeNorNationalAccessCode(); - - // return PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + // TODO: PhoneNumberValidationResult.INVALID_DRAMA_NUMBER; + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_VPN_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_VPN_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY + // TODO: PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY + // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX return wrapper.validate(); } From d12300bed2d7b1b1077071017487ea3a90977868 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 8 Jun 2024 17:56:11 +0200 Subject: [PATCH 64/98] Update Comments on 110 & 112 & 115 number checks to explain reason and link to issues reported to google Added new issue for 115 and updated issue status information. --- REPORTED_ISSUES.md | 14 ++ .../PhoneNumberValidatorImplTest.groovy | 2 +- .../IsPossibleNumberWithReasonTest.groovy | 153 +++++++++--------- .../PhoneNumberUtil/IsValidNumberTest.groovy | 54 +++---- 4 files changed, 119 insertions(+), 104 deletions(-) diff --git a/REPORTED_ISSUES.md b/REPORTED_ISSUES.md index 6560aeb..6b7efbc 100644 --- a/REPORTED_ISSUES.md +++ b/REPORTED_ISSUES.md @@ -13,6 +13,8 @@ However, it’s possible that this has caused confusion about which parts of the This issue addresses special short codes used for phone number directory assistant services. This issue has been resolved. +Google [fixed](https://github.com/google/libphonenumber/pull/2601/files#diff-1887949025d4940ce0f39cc4ba17666b5d93be2f143867b77c26bcddb36ac696R3400) ít with [8.12.21](https://github.com/google/libphonenumber/pull/2601) on 15.05.2024. + ### 2021-03-25 - [Germany (DE, +49): 116xxx Short Number valid vs. assigned](https://issuetracker.google.com/issues/183669955) This issue pertains to the EU-wide special social number short code definition. Although the regulation clearly defines a range, PhoneLib is not validating against that range, but against a list of currently assigned/operated numbers. At least for the German number space, as mentioned in the initial issue discussion (see first one above), the library is only partly or even completely checking the whole range in other EU number spaces. @@ -50,6 +52,18 @@ We have provided Ludwighafen in our labeling data. Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8e5b3fb2cb4a7ed9856289ea12d54947bfaa10549e6c1058fec7f3a1359dbbR3260) ít with [8.13.37](https://github.com/google/libphonenumber/pull/3473) on 15.05.2024. +### 2024-05-22 - [Emergency Numbers must not be used with National Destination Code in Germany fixed line](https://issuetracker.google.com/issues/341947688) + +BnetzA [described emergency short codes 110 & 112 as numbers without local NDC](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/np_nummernraum.pdf?__blob=publicationFile&v=1), since NDC is optional in fixed line, no number might start with those three digits (otherwise using such a number without NDC would trigger the emergency call). In mobile networks NDC is mandatory, so a number might start with those three digits, since NDC would be a prefix. Real live examples have been found. + +Google acknowledged the issue, but marked it as "**Won't fix (Intended behavior)**" because "*We will definitely think about it but it is not a priority right now. Also we have already mentioned about the complexity and invalid or false positive numbers in our XML file of Germany https://github.com/google/libphonenumber/blob/30db8f67a1c06b3ab052497477be1d9f18312387/resources/PhoneNumberMetadata.xml#L8126*" on 27.05.2024 +Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8e5b3fb2cb4a7ed9856289ea12d54947bfaa10549e6c1058fec7f3a1359dbbR3260) ít with [8.13.37](https://github.com/google/libphonenumber/pull/3473) on 15.05.2024. + +### 2024-06-08 - [Government Service Numbers may be used with National Destination Code in Germany fixed line, but subscriber numbers may not start with it](https://issuetracker.google.com/issues/345753226) + +BnetzA [described government short codes 115](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1), no number might start with those three digits (otherwise using such a number would trigger the short code). Furthermore the short code might be called with IDP and Country code (**+49115**) but from outside Germany and not from within - here the used region must have an influence on the evaluation. + + ### 2024-09-03 - [German Mobile number length validation for range 17x inconsistently differentiated in 8.13.43](https://issuetracker.google.com/issues/364179199) Previous to Version 8.13.43 any German number within the range 17x was identified valid for both length 10 & 11. Now the 11 length case (176) is differentiated, that 176 is not validated valid with 10 digits. But 170-175, 177-179 is still validated valid for both length, but should be only valid with length of 10. diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index e17fa0c..02a9c97 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -184,7 +184,6 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 112 } - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { given: @@ -234,4 +233,5 @@ class PhoneNumberValidatorImplTest extends Specification { } + } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 9cc3940..73f5412 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -75,33 +75,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for Police (110) is not dial-able internationally nor does it has additional numbers "110" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked - "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "110556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "0110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "0110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "0175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "0203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "0203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "+49110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49110 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "+49175 110" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 1105555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11055555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49203 110" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 + "+49110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49110 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 110 + "+49175 110" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 1105555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11055555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49175 110555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 - TODO: ISSUE Mobile number length + "+49203 110" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 // end of 110 } @@ -122,34 +123,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // checked - "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also acceptable - "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "112556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "0112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "0112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "0175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "0203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "0203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "+49112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49112 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "+49175 112" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 1125555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11255555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49203 112" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 + "+49112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 - IS_POSSIBLE_LOCAL_ONLY would also acceptable + "+49112 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 NDC must not start with 112 + "+49175 112" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 1125555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11255555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49175 112555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 112 - TODO: ISSUE Mobile number length + "+49203 112" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 // end of 112 } @@ -170,34 +171,34 @@ class IsPossibleNumberWithReasonTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE_LOCAL_ONLY | false - "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // not valid by BnetzA definition from within Germany - "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "115556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "0115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "0115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 NDC must not start with 115 + "0175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "0175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "0175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "0175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "0175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "0203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 - "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49115" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 IS_POSSIBLE_LOCAL_ONLY would also be acceptable, if used on +49110 & +49112 + see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 + "+49115 556677" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49175 115" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49175 1155555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 11555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49203 115" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203 115555" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "+49115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html - "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true - "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49115 556677" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 NDC must not start with 115 + "+49175 115" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49175 1155555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true - "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true + "+49175 11555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length + "+49175 115555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // see https://issuetracker.google.com/issues/345753226 mobile number may start with 115 - TODO: ISSUE Mobile number length "+49203 115" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203 115555" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 // end of 115 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index d47cbd3..434ba41 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -81,28 +81,28 @@ class IsValidNumberTest extends Specification { "0175 110" | "DE" | false | false "0175 110555" | "DE" | false | false "0175 1105555" | "DE" | true | false - "0175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 110555555" | "DE" | false | false - "0203 110" | "DE" | false | true - "0203 110555" | "DE" | false | true + "0203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "0203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 "+49110" | "DE" | false | false "+49110 556677" | "DE" | false | false "+49175 110" | "DE" | false | false "+49175 110555" | "DE" | false | false "+49175 1105555" | "DE" | true | false - "+49175 11055555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 110555555" | "DE" | false | false - "+49203 110" | "DE" | false | true - "+49203 110555" | "DE" | false | true + "+49203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 "+49110" | "FR" | false | false "+49110 556677" | "FR" | false | false "+49175 110" | "FR" | false | false "+49175 110555" | "FR" | false | false "+49175 1105555" | "FR" | true | false - "+49175 11055555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11055555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 110555555" | "FR" | false | false - "+49203 110" | "FR" | false | true - "+49203 110555" | "FR" | false | true + "+49203 110" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 + "+49203 110555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 // end of 110 } @@ -120,7 +120,7 @@ class IsValidNumberTest extends Specification { where: - number | regionCode | expectedResult | expectingFail + number | regionCode | expectedResult | expectingFail // short code for emergency (112) is not dial-able internationally nor does it has additional numbers "112" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "112556677" | "DE" | false | false @@ -128,28 +128,28 @@ class IsValidNumberTest extends Specification { "0175 112" | "DE" | false | false "0175 112555" | "DE" | false | false "0175 1125555" | "DE" | true | false - "0175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "0175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 112555555" | "DE" | false | false - "0203 112" | "DE" | false | true - "0203 112555" | "DE" | false | true + "0203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "0203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 "+49112" | "DE" | false | false "+49112 556677" | "DE" | false | false "+49175 112" | "DE" | false | false "+49175 112555" | "DE" | false | false "+49175 1125555" | "DE" | true | false - "+49175 11255555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 112555555" | "DE" | false | false - "+49203 112" | "DE" | false | true - "+49203 112555" | "DE" | false | true + "+49203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 "+49112" | "FR" | false | false "+49112 556677" | "FR" | false | false "+49175 112" | "FR" | false | false "+49175 112555" | "FR" | false | false "+49175 1125555" | "FR" | true | false - "+49175 11255555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 mobile number may start with 110 + "+49175 11255555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 112555555" | "FR" | false | false - "+49203 112" | "FR" | false | true - "+49203 112555" | "FR" | false | true + "+49203 112" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 + "+49203 112555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 // end of 112 } @@ -170,34 +170,34 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // 155 is Public Service Number for German administration, it is internationally reachable only from foreign countries "115" | "DE" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers - "115556677" | "DE" | true | true + "115556677" | "DE" | true | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "0115" | "DE" | false | false // not valid by BnetzA definition from within Germany "0115 556677" | "DE" | false | false "0175 115" | "DE" | false | false "0175 115555" | "DE" | false | false "0175 1155555" | "DE" | true | false - "0175 11555555" | "DE" | false | true + "0175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length "0175 115555555" | "DE" | false | false "0203 115" | "DE" | true | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 - "0203 115555" | "DE" | false | true + "0203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 "+49115" | "DE" | false | false // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 at chapter 2.3 "+49115 556677" | "DE" | false | false "+49175 115" | "DE" | false | false "+49175 115555" | "DE" | false | false "+49175 1155555" | "DE" | true | false - "+49175 11555555" | "DE" | false | true + "+49175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length "+49175 115555555" | "DE" | false | false "+49203 115" | "DE" | true | false - "+49203 115555" | "DE" | false | true - "+49115" | "FR" | true | true // see https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html + "+49203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 + "+49115" | "FR" | true | true // see https://issuetracker.google.com/issues/345753226 - https://www.115.de/SharedDocs/Nachrichten/DE/2018/115_aus_dem_ausland_erreichbar.html "+49115 556677" | "FR" | false | false "+49175 115" | "FR" | false | false "+49175 115555" | "FR" | false | false "+49175 1155555" | "FR" | true | false - "+49175 11555555" | "FR" | false | true + "+49175 11555555" | "FR" | false | true // TODO: ISSUE Mobile number length "+49175 115555555" | "FR" | false | false "+49203 115" | "FR" | true | false - "+49203 115555" | "FR" | false | true + "+49203 115555" | "FR" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 // end of 115 } From c456673887066cb272a9fc4d08c69c3a9f16ebc9 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 65/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImpl.java | 22 +++-- .../constants/DeFixedLineNumberPlan.java | 2 +- .../PhoneNumberValidatorImplTest.groovy | 88 ++++++++++++++++++- .../IsPossibleNumberWithReasonTest.groovy | 30 +++++++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 30 +++++++ 5 files changed, 165 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index adaa239..937ecc4 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -37,7 +37,7 @@ public class PhoneNumberValidatorImpl implements PhoneNumberValidator { private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberplan, String numberToCheck, ShortCodeUseable mainSet, ShortCodeUseable oppositeSet, PhoneNumberValidationResult notUseableInMainSet, PhoneNumberValidationResult useableOnlyInMainSet, - PhoneNumberValidationResult longerThanShortCode) { + PhoneNumberValidationResult longerThanShortCode, PhoneNumberValidationResult shorterThanShortCode) { String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); if (shortNumberKey.length() > 0) { if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { @@ -51,7 +51,19 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp } } } else { - return longerThanShortCode; + if (!numberplan.isUsable(mainSet, shortNumberKey) || !numberplan.isUsable(oppositeSet, shortNumberKey)) { + if (numberToCheck.length() < numberplan.getShortCodeLength(shortNumberKey)) { + return shorterThanShortCode; + } else { + return longerThanShortCode; + } + } else { + if (numberToCheck.length() < numberplan.getShortCodeLength(shortNumberKey)) { + return PhoneNumberValidationResult.TOO_SHORT; + } else { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; // similar to TOO_LONG, but more accurate + } + } } } return null; @@ -67,7 +79,7 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, mainSetIDPCC, oppositeSetIDPCC, - invalidInitialExitCode, mainSetResult, null); + invalidInitialExitCode, mainSetResult, null, null); if (isShortCodeDirectlyAfterInitalExitCode!=null) { return isShortCodeDirectlyAfterInitalExitCode; @@ -86,7 +98,7 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, mainSetIDPCCNDC, oppositeSetIDPCCNDC, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { return isShortCodeDirectlyAfterInitalExitCodeandNDC; @@ -203,7 +215,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneNumberValidationResult isShortCodeDirectly = checkShortCodeOverlapping(numberplan, wrapper.getDialableNumber(), ShortCodeUseable.DIRECTLY, null, - PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + PhoneNumberValidationResult.INVALID_LENGTH, PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER, PhoneNumberValidationResult.TOO_SHORT); if (isShortCodeDirectly!=null) { return isShortCodeDirectly; diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index f56d761..4935c87 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -99,7 +99,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { "110", new ShortNumberDetails(3, false, false, false, false, false, false, true), "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), - "116", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "116", new ShortNumberDetails(6, true, false, true, false, false, false, true), "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 02a9c97..bcc375c 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -229,9 +229,95 @@ class PhoneNumberValidatorImplTest extends Specification { "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 + // end of 1105 } + def "validate EU social short codes 116xxx in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // 116 is mentioned in number plan as 1160 and 1161 but in special ruling a full 6 digit number block: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/116xyz/StrukturAusgestNrBereich_Id11155pdf.pdf?__blob=publicationFile&v=4 + // 116xyz is nationally and internationally reachable - special check 116000 as initial number, 116116 as assigned number and 116999 as max legal number + "116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits + "116000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (not assigned yet but in BnetzA defined range) + "116116" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (already assigned) + "116999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is valid short code (not assigned yet but in BnetzA defined range) + "1165566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "11655" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits + // https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/116xyz/116116.html + // NAC + 116xxx + // see no. 7: national 0116116 is not a valid number, but may be replaced by 116116 by the operator - caller could reach target. ( T-Mobile is doing so currently 03.11.2023 - no guarantee for the future nor for any other operator. Best practice, assuming call will not reach target=. + "0116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0116 5566" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0116 55" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, normally NDC would follow and since short code length is not correct, not assuming Short Code is intended => which means NDC is wrong + "0175 116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 116555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1165555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11655555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 116555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "0203116" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "0203116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "0203116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "0203116 55" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + + // using IDP+CC within the region + "+49116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + "+49116000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116116" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code & assigned and is Valid with IDP & CC + "+49116999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC (TOO_LONG would be too general, the SN can't start with the short code) + "+49116 55" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + + "+49175 116" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1165555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11655555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "+49203116" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116116" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116 5566" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116 55" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + + // using IDP+CC from outside the region + "+49116" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + "+49116000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116116" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code & assigned and is Valid with IDP & CC + "+49116999" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number is valid short code (not assigned yet but in BnetzA defined range) and is Valid with IDP & CC + "+49116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC (TOO_LONG would be too general, the SN can't start with the short code) + "+49116 55" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number is to short, needs to be exactly 6 digits and is Valid with IDP & CC + + "+49175 116" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1165555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11655555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 116555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + + "+49203116" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116116" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used + "+49203116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + "+49203116 55" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 1105 + } } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 73f5412..0a95c8a 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -235,6 +235,13 @@ class IsPossibleNumberWithReasonTest extends Specification { "0116 5566" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0116 55" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // NAC + NDC (mobile) + 116xxx + "0175 116" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "0175 116555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "0175 1165555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "0175 11655555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "0175 116555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + // NAC + NDC (e.g. for Duisburg) + 116xxx "0203116" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203116000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -251,6 +258,13 @@ class IsPossibleNumberWithReasonTest extends Specification { "+49116 5566" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "+49116 55" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + // CC + NDC (mobile) + 116xxx + "+49175 116" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 116555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 1165555" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11655555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + // CC + NDC (e.g. for Duisburg) + 116xxx "+49203116" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203116000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -266,6 +280,22 @@ class IsPossibleNumberWithReasonTest extends Specification { "+49116999" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false "+49116 5566" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "+49116 55" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + + // CC + NDC (mobile) + 116xxx from outside Germany + "+49175 116" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 116555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true // TODO: ISSUE Mobile number length + "+49175 1165555" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+49175 11655555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // TODO: ISSUE Mobile number length + + // CC + NDC (e.g. for Duisburg) + 116xxx from outside Germany + "+49203116" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116116" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116 5566" | "FR " | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203116 55" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // end of 116 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 434ba41..640c59a 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -234,6 +234,13 @@ class IsValidNumberTest extends Specification { "0116 5566" | "DE" | false | false "0116 55" | "DE" | false | false + // NAC + NDC (mobile) + 116xxx + "0175 116" | "DE" | false | false + "0175 116555" | "DE" | false | false + "0175 1165555" | "DE" | true | false + "0175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 116555555" | "DE" | false | false + // NAC + NDC (e.g. for Duisburg) + 116xxx "0203116" | "DE" | false | true "0203116000" | "DE" | false | true @@ -250,6 +257,13 @@ class IsValidNumberTest extends Specification { "+49116 5566" | "DE" | false | false "+49116 55" | "DE" | false | false + // CC + NDC (mobile) + 116xxx + "+49175 116" | "DE" | false | false + "+49175 116555" | "DE" | false | false + "+49175 1165555" | "DE" | true | false + "+49175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "DE" | false | false + // CC + NDC (e.g. for Duisburg) + 116xxx "+49203116" | "DE" | false | true "+49203116000" | "DE" | false | true @@ -265,6 +279,22 @@ class IsValidNumberTest extends Specification { "+49116999" | "FR" | true | true // known as intended to use ShortNumberInfo see https://github.com/google/libphonenumber/blob/master/FAQ.md#why-does-phonenumberutil-return-false-for-valid-short-numbers "+49116 5566" | "FR" | false | false "+49116 55" | "FR" | false | false + + // CC + NDC (mobile) + 116xxx from outside Germany + "+49175 116" | "FR" | false | false + "+49175 116555" | "FR" | false | false + "+49175 1165555" | "FR" | true | false + "+49175 11655555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 116555555" | "FR" | false | false + + // CC + NDC (e.g. for Duisburg) + 116xxx from outside Germany + "+49203116" | "FR" | false | true + "+49203116000" | "FR" | false | true + "+49203116116" | "FR" | false | true + "+49203116999" | "FR" | false | true + "+49203116 5566" | "FR" | false | true + "+49203116 55" | "FR" | false | true + // end of 116 } From 0e8af06441f5c78d8d041d9eacb34db54c49a593 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 21 Jun 2024 22:13:36 +0200 Subject: [PATCH 66/98] Issue for +49115 resubmitted --- REPORTED_ISSUES.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/REPORTED_ISSUES.md b/REPORTED_ISSUES.md index 6b7efbc..f221f98 100644 --- a/REPORTED_ISSUES.md +++ b/REPORTED_ISSUES.md @@ -63,6 +63,11 @@ Google [fixed](https://github.com/google/libphonenumber/pull/3473/files#diff-db8 BnetzA [described government short codes 115](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1), no number might start with those three digits (otherwise using such a number would trigger the short code). Furthermore the short code might be called with IDP and Country code (**+49115**) but from outside Germany and not from within - here the used region must have an influence on the evaluation. +Google since 09.07.2024, the Issue is not publicly accessible anymore - we wrote a [post in the Google discussion group](https://groups.google.com/g/libphonenumber-discuss/c/WQv244-PVmI). + +### 2024-06-16 - [+49115 German Government short number with IDP+CC is only valid from outside Germany but not within (so IS_POSSIBLE_LOCAL_ONLY is also wrong)](https://issuetracker.google.com/issues/347356467) + +Since the previous Issue "disappeared" without notice, we assume, it was structural too similar to the emergencies number issue and the reviewer did not recordnized the differences. So we reported the main difference - again and this time the issue is at least accepted. But the reviewer comment seems only to focus on the short number call-ability from outside the country and not that IDP+CC+115 must not be used from inside. ### 2024-09-03 - [German Mobile number length validation for range 17x inconsistently differentiated in 8.13.43](https://issuetracker.google.com/issues/364179199) From adb0915e2aeac53654f3909bc67d330ec44ea619 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 23 Jun 2024 17:04:57 +0200 Subject: [PATCH 67/98] Adding Validation test for 118(y)xx call assitant. Adapting Validation Code to handle short code definition which marks a short code as reserve (not valid at all) and introducing a new result type: INVALID_RESERVE_NUMBER --- .../PhoneNumberValidatorImpl.java | 22 ++ .../numberplans/NumberPlan.java | 4 + .../PhoneNumberValidationResult.java | 5 +- .../constants/DeFixedLineNumberPlan.java | 28 ++- .../PhoneNumberValidatorImplTest.groovy | 188 +++++++++++++++++- .../IsPossibleNumberWithReasonTest.groovy | 83 +++++++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 82 +++++++- 7 files changed, 406 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 937ecc4..50d6a1b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -40,6 +40,10 @@ private PhoneNumberValidationResult checkShortCodeOverlapping(NumberPlan numberp PhoneNumberValidationResult longerThanShortCode, PhoneNumberValidationResult shorterThanShortCode) { String shortNumberKey = numberplan.startingWithShortNumberKey(numberToCheck); if (shortNumberKey.length() > 0) { + if (numberplan.isReserved(shortNumberKey)) { + return null; + } + if (numberToCheck.length() == numberplan.getShortCodeLength(shortNumberKey)) { if (!numberplan.isUsable(mainSet, shortNumberKey)) { return notUseableInMainSet; @@ -102,6 +106,10 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } else { + if (numberplan.isReserved(numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } } // when NDC is optional, then number must not start with NAC again. @@ -219,6 +227,19 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (isShortCodeDirectly!=null) { return isShortCodeDirectly; + } else { + if (numberplan.isReserved(wrapper.getDialableNumber())) { + Integer lengthMatch = numberplan.isMatchingLength(wrapper.getDialableNumber()); + if (lengthMatch!=null) { + if (lengthMatch>0) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (lengthMatch<0) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } } return PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY; @@ -232,6 +253,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // TODO: PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY // TODO: PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX + // TODO: PhoneNumberValidationResult.INVALID_RESERVE_NUMBER return wrapper.validate(); } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 0be7406..57fc744 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -116,6 +116,10 @@ public boolean isNDCOptional(String ndc) { return true; } + public boolean isReserved(String number) {return false; } + + public Integer isMatchingLength(String number) {return null;} + public boolean isUsableWithIDPandCCfromOutside(String number) { return false; } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java index ed8a6ba..c2ab969 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneNumberValidationResult.java @@ -104,10 +104,13 @@ public enum PhoneNumberValidationResult { /** The subscriber number starts with digits which makes the number invalid, e.g. overlapping special numbers when NDC is optional, so those numbers could not be distinct in digit by digit calling from those special numbers * - If Region is using NAC and NDC is optional, the number must not start with NAC - * - IF Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers + * - If Region is using shortnumbers valid only without any prefix and NDC is optional, the number must not start with a prefix equal to those shortnumbers * */ INVALID_PREFIX_OF_SUBSCRIBER_NUMBER(ValidationResult.INVALID_LENGTH), + /** The region is using a definition for a number (range), which matches for the number, but the definition is marked as reserve for future use. So currently it is not a valid number */ + INVALID_RESERVE_NUMBER(ValidationResult.INVALID_LENGTH), + /** The number is shorter than all valid numbers for this region or used NDC. */ TOO_SHORT(ValidationResult.TOO_SHORT), diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 4935c87..e0ea687 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -100,7 +100,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { "112", new ShortNumberDetails(3, false, false, false, false, false, false, true), "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), "116", new ShortNumberDetails(6, true, false, true, false, false, false, true), - "1180", new ShortNumberDetails(6, false, false, false, false, false, false, true), + "1180", new ShortNumberDetails(6, false, false, false, false, false, false, false), // 1180xx is currently just reserved for future used "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. ); @@ -262,6 +262,32 @@ public boolean isNDCOptional(String ndc) { return GermanAreaCodeExtractor.isNDCOptional(ndc); } + @Override + public boolean isReserved(String number) { + // if the number is not usable at all, but it is defined so it is reserved (not valid yet - but maybe in the future) + ShortNumberDetails numberDetails = SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)); + if (numberDetails == null) { + return false; + } + return !(numberDetails.usableWithIDPandCCfromOutside || + numberDetails.usableWithIDPandCCandNDCfromOutside || + numberDetails.usableWithIDPandCCfromInside || + numberDetails.usableWithIDPandCCandNDCfromInside || + numberDetails.usableWithNAC || + numberDetails.usableWithNACandNDC || + numberDetails.usableDirectly); + } + + @Override + public Integer isMatchingLength(String number) { + ShortNumberDetails numberDetails = SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)); + if (numberDetails == null) { + return null; + } + return numberDetails.length - number.length(); + } + + @Override public boolean isUsableWithIDPandCCfromOutside(String number) { return SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)).usableWithIDPandCCfromOutside; diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index bcc375c..61e2e20 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -316,7 +316,193 @@ class PhoneNumberValidatorImplTest extends Specification { "+49203116999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, optional fixed line NDC follows, SN equals short code (but overlapping) => assuming Short Code is intended, which means NDC is wrongly used "+49203116 5566" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong "+49203116 55" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 1105 + // end of 116xxx + } + + def "validate German Call Assistant short codes in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/118xy/118xyNummernplan.pdf?__blob=publicationFile&v=1 + // it is mentioned, that those numbers are nationally reachable - which excludes them from locally, so no local number should work this way because without NDC it could not be seperated from the national number + // implicitly it could also mean that those numbers are not routed from outside germany + + // 118 is starting part and in general 5 digits long - except if the 4th digit is 0, than it is six digits long + "118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "1180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "118000" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER + "118099" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER + "1180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "1181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11810" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + // Call Assistant of Deutsche Telekom - will be retired on 01.12.2024 see https://www.telekom.com/de/blog/konzern/artikel/telekom-stellt-auskunftsdienste-ein-1065536 + "11833" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "1189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "11899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // Tested on 26.12.2023 - 11833 works on TMD, but neither 011833 nor +4911833 is working on T-Mobile Germany + // NAC + 118(y)xx belongs to the number reserve of NAC + 11 + + "0118" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01180" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011800" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0118000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0118099" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01180000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01181" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "011833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0118100" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "01189" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "011899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE + "0118999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // NAC + NDC (e.g. for Duisburg) + 118(y)xx + "0203118" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031180" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311800" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "0203118000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "0203118099" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031181" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "020311833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "02031189" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "020311899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "0203118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118099" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751180000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "017511800000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "01751181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511810" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511833" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118100" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751181000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // special for mobile + "017511810000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "01751189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "017511899" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "0175118999" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "01751189999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // special for mobile + "017511899999" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // CC + 118(y)xx + "+49118" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911800" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118099" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180000" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491181" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911810" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+4911833" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118100" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491189" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911899" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118999" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // CC + NDC (e.g. for Duisburg) + 118(y)xx + "+49203118" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311800" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+49203118000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180000" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031181" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311810" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4920311833" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118100" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031189" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311899" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118999" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751180" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511800" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118099" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751180000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+4917511800000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751181" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511810" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511833" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118100" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751181000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511810000" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751189" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+4917511899" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+49175118999" | "DE" | PhoneNumberValidationResult.TOO_SHORT + "+491751189999" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511899999" | "DE" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // CC + 118(y)xx from outside Germany + "+49118" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911800" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49118099" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491180000" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491181" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911810" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+4911833" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118100" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+491189" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4911899" | "FR" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE + "+49118999" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311800" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+49203118000" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031180000" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031181" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311810" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+4920311833" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118100" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+492031189" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + "+4920311899" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE + "+49203118999" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751180" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511800" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118099" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751180000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+4917511800000" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751181" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511810" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511833" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118100" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751181000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511810000" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + "+491751189" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+4917511899" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49175118999" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+491751189999" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // special for mobile + "+4917511899999" | "FR" | PhoneNumberValidationResult.TOO_LONG // special for mobile + + // end of 118 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy index 0a95c8a..764cce5 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsPossibleNumberWithReasonTest.groovy @@ -323,11 +323,12 @@ class IsPossibleNumberWithReasonTest extends Specification { "118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "1180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "11800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true - "118000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "118000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // since it is reserve INVALID_LENGTH could also be possible + "118099" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // since it is reserve INVALID_LENGTH could also be possible "1180000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "1181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true "11810" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false - // Call Assistant of Deutsche Telekom + // Call Assistant of Deutsche Telekom - will be retired on 01.12.2024 see https://www.telekom.com/de/blog/konzern/artikel/telekom-stellt-auskunftsdienste-ein-1065536 "11833" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false "118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true "1189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true @@ -341,6 +342,7 @@ class IsPossibleNumberWithReasonTest extends Specification { "01180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "011800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "01180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "01181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "011810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -355,6 +357,7 @@ class IsPossibleNumberWithReasonTest extends Specification { "02031180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "020311800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "0203118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "02031180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "02031181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "020311810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -364,11 +367,32 @@ class IsPossibleNumberWithReasonTest extends Specification { "020311899" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "0203118999" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118099" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751180000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "017511800000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "01751181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511810" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511833" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751181000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "017511810000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "01751189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "017511899" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "0175118999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "01751189999" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "017511899999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // CC + 118(y)xx "+49118" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911800" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49118099" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180000" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491181" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911810" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -392,11 +416,32 @@ class IsPossibleNumberWithReasonTest extends Specification { "+4920311899" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49203118999" | "DE" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511800" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118099" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+4917511800000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751181" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511810" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511833" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118100" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751181000" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511810000" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751189" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511899" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751189999" | "DE" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511899999" | "DE" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // CC + 118(y)xx from outside Germany "+49118" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911800" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49118099" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491180000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+491181" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+4911810" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true @@ -406,6 +451,40 @@ class IsPossibleNumberWithReasonTest extends Specification { "+4911899" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true "+49118999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031180" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311800" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031180000" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031181" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311810" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311833" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118100" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+492031189" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+4920311899" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + "+49203118999" | "FR" | PhoneNumberUtil.ValidationResult.INVALID_LENGTH | true + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511800" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118099" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751180000" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false + "+4917511800000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751181" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511810" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511833" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118100" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751181000" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511810000" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + "+491751189" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+4917511899" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+49175118999" | "FR" | PhoneNumberUtil.ValidationResult.TOO_SHORT | true + "+491751189999" | "FR" | PhoneNumberUtil.ValidationResult.IS_POSSIBLE | false // special for mobile + "+4917511899999" | "FR" | PhoneNumberUtil.ValidationResult.TOO_LONG | true // special for mobile + // end of 118 } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 640c59a..dcc80d1 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -322,7 +322,8 @@ class IsValidNumberTest extends Specification { "118" | "DE" | false | false "1180" | "DE" | false | false "11800" | "DE" | false | false - "118000" | "DE" | true | true + "118000" | "DE" | false | false // since its just reserve + "118099" | "DE" | false | false // since its just reserve "1180000" | "DE" | false | false "1181" | "DE" | false | false "11810" | "DE" | true | true @@ -340,6 +341,7 @@ class IsValidNumberTest extends Specification { "01180" | "DE" | false | false "011800" | "DE" | false | false "0118000" | "DE" | false | false + "0118099" | "DE" | false | false "01180000" | "DE" | false | false "01181" | "DE" | false | false "011810" | "DE" | false | false @@ -354,6 +356,7 @@ class IsValidNumberTest extends Specification { "02031180" | "DE" | false | true "020311800" | "DE" | false | true "0203118000" | "DE" | false | true + "0203118099" | "DE" | false | true "02031180000" | "DE" | false | true "02031181" | "DE" | false | true "020311810" | "DE" | false | true @@ -363,11 +366,32 @@ class IsValidNumberTest extends Specification { "020311899" | "DE" | false | true "0203118999" | "DE" | false | true + // NAC + mobile NDC + 118(y)xx + "0175118" | "DE" | false | false + "01751180" | "DE" | false | false + "017511800" | "DE" | false | false + "0175118000" | "DE" | false | false + "0175118099" | "DE" | false | false + "01751180000" | "DE" | true | false + "017511800000" | "DE" | false | true // special for mobile + "01751181" | "DE" | false | false + "017511810" | "DE" | false | false + "017511833" | "DE" | false | false + "0175118100" | "DE" | false | false + "01751181000" | "DE" | true | false // special for mobile + "017511810000" | "DE" | false | true // special for mobile + "01751189" | "DE" | false | false + "017511899" | "DE" | false | false + "0175118999" | "DE" | false | false + "01751189999" | "DE" | true | false // special for mobile + "017511899999" | "DE" | false | true // special for mobile + // CC + 118(y)xx "+49118" | "DE" | false | false "+491180" | "DE" | false | false "+4911800" | "DE" | false | false "+49118000" | "DE" | false | false + "+49118099" | "DE" | false | false "+491180000" | "DE" | false | false "+491181" | "DE" | false | false "+4911810" | "DE" | false | false @@ -382,6 +406,7 @@ class IsValidNumberTest extends Specification { "+492031180" | "DE" | false | true "+4920311800" | "DE" | false | true "+49203118000" | "DE" | false | true + "+49203118099" | "DE" | false | true "+492031180000" | "DE" | false | true "+492031181" | "DE" | false | true "+4920311810" | "DE" | false | true @@ -391,11 +416,32 @@ class IsValidNumberTest extends Specification { "+4920311899" | "DE" | false | true "+49203118999" | "DE" | false | true + // CC + mobile NDC + 118(y)xx + "+49175118" | "DE" | false | false + "+491751180" | "DE" | false | false + "+4917511800" | "DE" | false | false + "+49175118000" | "DE" | false | false + "+49175118099" | "DE" | false | false + "+491751180000" | "DE" | true | false + "+4917511800000" | "DE" | false | true // special for mobile + "+491751181" | "DE" | false | false + "+4917511810" | "DE" | false | false + "+4917511833" | "DE" | false | false + "+49175118100" | "DE" | false | false + "+491751181000" | "DE" | true | false // special for mobile + "+4917511810000" | "DE" | false | true // special for mobile + "+491751189" | "DE" | false | false + "+4917511899" | "DE" | false | false + "+49175118999" | "DE" | false | false + "+491751189999" | "DE" | true | false // special for mobile + "+4917511899999" | "DE" | false | true // special for mobile + // CC + 118(y)xx from outside Germany "+49118" | "FR" | false | false "+491180" | "FR" | false | false "+4911800" | "FR" | false | false "+49118000" | "FR" | false | false + "+49118099" | "FR" | false | false "+491180000" | "FR" | false | false "+491181" | "FR" | false | false "+4911810" | "FR" | false | false @@ -405,6 +451,40 @@ class IsValidNumberTest extends Specification { "+4911899" | "FR" | false | false "+49118999" | "FR" | false | false + // CC + NDC (e.g. for Duisburg) + 118(y)xx from outside Germany + "+49203118" | "FR" | false | true + "+492031180" | "FR" | false | true + "+4920311800" | "FR" | false | true + "+49203118000" | "FR" | false | true + "+49203118099" | "FR" | false | true + "+492031180000" | "FR" | false | true + "+492031181" | "FR" | false | true + "+4920311810" | "FR" | false | true + "+4920311833" | "FR" | false | true + "+49203118100" | "FR" | false | true + "+492031189" | "FR" | false | true + "+4920311899" | "FR" | false | true + "+49203118999" | "FR" | false | true + + // CC + mobile NDC + 118(y)xx from outside Germany + "+49175118" | "FR" | false | false + "+491751180" | "FR" | false | false + "+4917511800" | "FR" | false | false + "+49175118000" | "FR" | false | false + "+49175118099" | "FR" | false | false + "+491751180000" | "FR" | true | false + "+4917511800000" | "FR" | false | true // special for mobile + "+491751181" | "FR" | false | false + "+4917511810" | "FR" | false | false + "+4917511833" | "FR" | false | false + "+49175118100" | "FR" | false | false + "+491751181000" | "FR" | true | false // special for mobile + "+4917511810000" | "FR" | false | true // special for mobile + "+491751189" | "FR" | false | false + "+4917511899" | "FR" | false | false + "+49175118999" | "FR" | false | false + "+491751189999" | "FR" | true | false // special for mobile + "+4917511899999" | "FR" | false | true // special for mobile // end of 118 } From eeb999ef8434edd8c6b7cb83fef381d8915107b4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 68/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 18a2298..dc2e5e4 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,6 +1220,71 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From bae9cc220a06757121b68988f86e69e43a149159 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 69/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 4 -- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 50d6a1b..f99ac71 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -133,10 +133,6 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { - if (number == null || number.length()==0) { - return PhoneNumberValidationResult.INVALID_LENGTH; - } - PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); // TODO: change parameter regionCode to deviceContext diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index dc2e5e4..676df63 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1285,6 +1285,71 @@ public boolean startsWithNAC() { } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 211067394c54759fb767e1e062af47c441eb217f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 70/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 676df63..d02dbd0 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1324,11 +1324,84 @@ public boolean startsWithIDP() { return false; } + // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" String idp = this.getInternationalDialingPrefix(); return isIDPUsed(this.dialableNumber, idp); } + private int parseCountryCode(boolean alsoFromRegionCode) { + Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); + + // Using PhoneLib to extract Country Code from Number + if (tempNumber!=null) { + int result = tempNumber.getCountryCode(); + if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (alsoFromRegionCode) { + return result; + } else { + return 0; + } + } + if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || + (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { + return result; + } + } + return 0; + } + + public String getCountryCode(boolean alsoFromRegionCode) { + int parsedCountryCode = parseCountryCode(alsoFromRegionCode); + if (parsedCountryCode>0) { + return String.valueOf(parsedCountryCode); + } + + // FallBack Extraction: + String numberWithoutIDP = removeIDP(); + String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); + + if (countryCode.length()>0) { + return countryCode; + } + + if (alsoFromRegionCode) { + int regionCountryCode = getCountryCodeForRegion(this.regionCode); + if (regionCountryCode>0) { + return String.valueOf(regionCountryCode); + } + } + + return ""; + } + + public String removeNAC() { + if (dialableNumber == null) { + return ""; + } + if (startsWithNAC()) { + return dialableNumber.substring(getNationalAccessCode().length()); + } else { + return ""; + } + } + + public String removeIDP() { + if (dialableNumber == null) { + return ""; + } + if (dialableNumber.startsWith("+")) { + return dialableNumber.substring(1); + } + + if (dialableNumber.startsWith(getInternationalDialingPrefix())) { + return dialableNumber.substring(getInternationalDialingPrefix().length()); + } + + return ""; + } + /** * Checks if the number starts with the NAC of the initializing region * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. @@ -1343,11 +1416,9 @@ public boolean startsWithNAC() { if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { return false; - } return dialableNumber.startsWith(nac); - } /** From 0d8d1f63bd56a925b785cff1b2a49bea479cdcd3 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Thu, 30 May 2024 17:47:41 +0200 Subject: [PATCH 71/98] Short Code 110 and 112 are not valid start for fixed line numbers (NDC of a city) but for mobile numbers (NDC of a mobile network) see https://issuetracker.google.com/issues/341947688 - testcases in IsPossibleNumberWithReasonTest and IsValidNumberTest are adapted. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index f99ac71..50d6a1b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -133,6 +133,10 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { + if (number == null || number.length()==0) { + return PhoneNumberValidationResult.INVALID_LENGTH; + } + PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); // TODO: change parameter regionCode to deviceContext From e6ac57898fbe253e30444a297a403c44d58c5286 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 72/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 61e2e20..23a9a39 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -506,4 +506,53 @@ class PhoneNumberValidatorImplTest extends Specification { } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From f8eca8a0918d8cac61cd42af2c4b0a3cdfc3a3b2 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 73/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 23a9a39..244575e 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -529,7 +529,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From fe424c087ac15064b774c54ffdd0d0bb52cabd42 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Tue, 4 Jun 2024 09:38:15 +0200 Subject: [PATCH 74/98] Optimize Validation Code by moving duplicate code structure into checkExitCodeUsingNumber method --- .../PhoneNumberValidatorImpl.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 50d6a1b..959e28e 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -130,6 +130,58 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra } + private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, + ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, + ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, + PhoneNumberValidationResult invalidInitialExitCode, + PhoneNumberValidationResult mainSetResult){ + if (numberplan!=null) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, + mainSetIDPCC, oppositeSetIDPCC, + invalidInitialExitCode, mainSetResult, null); + + if (isShortCodeDirectlyAfterInitalExitCode!=null) { + return isShortCodeDirectlyAfterInitalExitCode; + } + + // Check for NDC after InitalExitCode: + String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); + + if (Objects.equals(ndc, "")) { + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + } + + String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); + // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) + if (numberplan.isNDCOptional(ndc)) { + + PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, + mainSetIDPCCNDC, oppositeSetIDPCCNDC, + PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); + + if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { + return isShortCodeDirectlyAfterInitalExitCodeandNDC; + } + + // when NDC is optional, then number must not start with NAC again. + String nac = wrapper.getNationalAccessCode(); + if (numberWithoutNationDestinationCode.startsWith(nac)) { + return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; + } + } + + if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_SHORT; + } + if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { + return PhoneNumberValidationResult.TOO_LONG; + } + } + return null; + } + + @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { From 94170ee93639a0444c17435bdfa325f0849da0dc Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 8 Jun 2024 17:56:11 +0200 Subject: [PATCH 75/98] Update Comments on 110 & 112 & 115 number checks to explain reason and link to issues reported to google Added new issue for 115 and updated issue status information. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 244575e..fb671c7 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -554,5 +554,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 110 } - } From bcc2d1852b0a69b86fb7aad0d9668a7f474e2370 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 76/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImpl.java | 53 ------------------- .../constants/DeFixedLineNumberPlan.java | 3 -- .../PhoneNumberValidatorImplTest.groovy | 2 +- 3 files changed, 1 insertion(+), 57 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 959e28e..863244c 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -129,59 +129,6 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra return null; } - - private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wrapper, NumberPlan numberplan, String numberWithoutInitalExitCode, - ShortCodeUseable mainSetIDPCC, ShortCodeUseable oppositeSetIDPCC, - ShortCodeUseable mainSetIDPCCNDC, ShortCodeUseable oppositeSetIDPCCNDC, - PhoneNumberValidationResult invalidInitialExitCode, - PhoneNumberValidationResult mainSetResult){ - if (numberplan!=null) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCode = checkShortCodeOverlapping(numberplan, numberWithoutInitalExitCode, - mainSetIDPCC, oppositeSetIDPCC, - invalidInitialExitCode, mainSetResult, null); - - if (isShortCodeDirectlyAfterInitalExitCode!=null) { - return isShortCodeDirectlyAfterInitalExitCode; - } - - // Check for NDC after InitalExitCode: - String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); - - if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? - } - - String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); - // Check for Shortnumber after NDC if NDC is Optional (<=> Fixline) - if (numberplan.isNDCOptional(ndc)) { - - PhoneNumberValidationResult isShortCodeDirectlyAfterInitalExitCodeandNDC = checkShortCodeOverlapping(numberplan, numberWithoutNationDestinationCode, - mainSetIDPCCNDC, oppositeSetIDPCCNDC, - PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE, mainSetResult, PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER); - - if (isShortCodeDirectlyAfterInitalExitCodeandNDC!=null) { - return isShortCodeDirectlyAfterInitalExitCodeandNDC; - } - - // when NDC is optional, then number must not start with NAC again. - String nac = wrapper.getNationalAccessCode(); - if (numberWithoutNationDestinationCode.startsWith(nac)) { - return PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER; - } - } - - if (numberplan.isNumberTooShortForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_SHORT; - } - if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { - return PhoneNumberValidationResult.TOO_LONG; - } - } - return null; - } - - @Override public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number, String regionCode) { diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index e0ea687..6f48a71 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -342,9 +342,6 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn if (nsn.length()<2) { return ""; } - - - } // Geographic Area Codes return GermanAreaCodeExtractor.fromNumber(nsn); diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index fb671c7..0e3237b 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -551,7 +551,7 @@ class PhoneNumberValidatorImplTest extends Specification { "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 + // end of 115 } } From 0c918dc58c1b2afa67a15ab43ae7c1ff3fcef536 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 77/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index d02dbd0..199ac6f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1421,6 +1421,71 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 5ae81bfbcdfbff96dc839826b84ba0a88bc3cd60 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 78/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 266 ------------------ 1 file changed, 266 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 199ac6f..4e132f9 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1175,17 +1175,6 @@ public String getCountryCode(boolean alsoFromRegionCode) { return ""; } - public String removeNAC() { - if (dialableNumber == null) { - return ""; - } - if (startsWithNAC()) { - return dialableNumber.substring(getNationalAccessCode().length()); - } else { - return ""; - } - } - public String removeIDP() { if (dialableNumber == null) { return ""; @@ -1220,162 +1209,6 @@ public boolean startsWithNAC() { return dialableNumber.startsWith(nac); } - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - // TODO: AU => 001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011 ... must be a list and "+" - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - private int parseCountryCode(boolean alsoFromRegionCode) { - Phonenumber.PhoneNumber tempNumber = parseNumber(this.dialableNumber, this.regionCode); - - // Using PhoneLib to extract Country Code from Number - if (tempNumber!=null) { - int result = tempNumber.getCountryCode(); - if (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) { - if (alsoFromRegionCode) { - return result; - } else { - return 0; - } - } - if ((tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD) || - (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN) || - (tempNumber.getCountryCodeSource() == Phonenumber.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN)) { - return result; - } - } - return 0; - } - - public String getCountryCode(boolean alsoFromRegionCode) { - int parsedCountryCode = parseCountryCode(alsoFromRegionCode); - if (parsedCountryCode>0) { - return String.valueOf(parsedCountryCode); - } - - // FallBack Extraction: - String numberWithoutIDP = removeIDP(); - String countryCode = CountryCodeExtractor.fromNumber(numberWithoutIDP); - - if (countryCode.length()>0) { - return countryCode; - } - - if (alsoFromRegionCode) { - int regionCountryCode = getCountryCodeForRegion(this.regionCode); - if (regionCountryCode>0) { - return String.valueOf(regionCountryCode); - } - } - - return ""; - } - public String removeNAC() { if (dialableNumber == null) { return ""; @@ -1387,105 +1220,6 @@ public String removeNAC() { } } - public String removeIDP() { - if (dialableNumber == null) { - return ""; - } - if (dialableNumber.startsWith("+")) { - return dialableNumber.substring(1); - } - - if (dialableNumber.startsWith(getInternationalDialingPrefix())) { - return dialableNumber.substring(getInternationalDialingPrefix().length()); - } - - return ""; - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - } - - return dialableNumber.startsWith(nac); - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 8c1edb791721fa397d2a04639dc345db4cd8d357 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 79/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 0e3237b..e365ba6 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -554,4 +554,53 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 115 } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From 51555f1346e2a60fd3d4b9ccfcbff67f636c0e17 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 80/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index e365ba6..c7d5b89 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -577,7 +577,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From 0b513c5d2dc095dbcc2142826b15874277a25a89 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 81/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImplTest.groovy | 98 ------------------- 1 file changed, 98 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index c7d5b89..5ee4e99 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,102 +505,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } - - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 115 - } - - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 - } - - } From dfc30b42e838c4ac6ff6843c6cca4b22c7f38841 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 82/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../PhoneNumberValidatorImpl.java | 2 +- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 863244c..68c53e6 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -254,7 +254,7 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number // TODO: PhoneNumberValidationResult.INVALID_INTERNATIONAL_DIALING_PREFIX // TODO: PhoneNumberValidationResult.INVALID_RESERVE_NUMBER - return wrapper.validate(); + return wrapper.validate(); } } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 4e132f9..1781892 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,6 +1220,71 @@ public String removeNAC() { } } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 90395cd429fbdd623d228f324a5deaa9ac97e277 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 4 May 2024 14:13:11 +0200 Subject: [PATCH 83/98] Initial testing 5 separated cases 1) USING IDP & CC 1a) From Foreign Country 1b) Within the Country 2) Not Using IDP & CC 2a) Region is not Using NAC 2b) Region may use Nac 2bI) NAC and NDC is used 2bII) No NAC is used --- .../numberplans/PhoneLibWrapper.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 1781892..5612b07 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1285,6 +1285,71 @@ public boolean startsWithNAC() { } + /** + * Checks if a given number starts with the given IDP (or the international IDP short form '+') + * @param value the number to be checked + * @param idp the IDP to be used searched for + * @return if either given IDP or '+' is the beginning of the value + */ + private static boolean isIDPUsed(String value, String idp) { + if (idp == null || idp.length()==0) { + return ("+".equals(value.substring(0, 1))); + } + + return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); + } + + /** + * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region + * @param value the number to be checked + * @param regionCode ISO2 code for the regions number plan used for checking IDP + * @return if either regions IDP or '+' is the beginning of the value + */ + public static boolean startsWithIDP(String value, String regionCode) { + if (value == null || value.length()==0) { + return false; + } + + String idp = getInternationalDialingPrefix(regionCode); + + return isIDPUsed(value, idp); + } + + /** + * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region + * @return if either regions IDP or '+' is the beginning of the value + */ + public boolean startsWithIDP() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + + return isIDPUsed(this.dialableNumber, idp); + } + + /** + * Checks if the number starts with the NAC of the initializing region + * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. + */ + public boolean startsWithNAC() { + if (this.dialableNumber == null || this.dialableNumber.length()==0) { + return false; + } + + String idp = this.getInternationalDialingPrefix(); + String nac = this.getNationalAccessCode(); + + if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { + return false; + + } + + return dialableNumber.startsWith(nac); + + } + /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From b83cfc7f057421ccd1a409d9c17acd93b3123242 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:22 +0200 Subject: [PATCH 84/98] Extend Number Plan to provide multi dimensional short code information. --- .../numberplans/PhoneLibWrapper.java | 130 ------------------ 1 file changed, 130 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 5612b07..4e132f9 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -1220,136 +1220,6 @@ public String removeNAC() { } } - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - - /** - * Checks if a given number starts with the given IDP (or the international IDP short form '+') - * @param value the number to be checked - * @param idp the IDP to be used searched for - * @return if either given IDP or '+' is the beginning of the value - */ - private static boolean isIDPUsed(String value, String idp) { - if (idp == null || idp.length()==0) { - return ("+".equals(value.substring(0, 1))); - } - - return (("+".equals(value.substring(0, 1))) || (value.startsWith(idp))); - } - - /** - * Checks if a given number starts with the IDP (or the international IDP short form '+') of the given region - * @param value the number to be checked - * @param regionCode ISO2 code for the regions number plan used for checking IDP - * @return if either regions IDP or '+' is the beginning of the value - */ - public static boolean startsWithIDP(String value, String regionCode) { - if (value == null || value.length()==0) { - return false; - } - - String idp = getInternationalDialingPrefix(regionCode); - - return isIDPUsed(value, idp); - } - - /** - * Checks if the number starts with the IDP (or the international IDP short form '+') of the initializing region - * @return if either regions IDP or '+' is the beginning of the value - */ - public boolean startsWithIDP() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - - return isIDPUsed(this.dialableNumber, idp); - } - - /** - * Checks if the number starts with the NAC of the initializing region - * Be aware, that some regions have IDP of 00 and NAC of 0 - so overlaping is also checked. - */ - public boolean startsWithNAC() { - if (this.dialableNumber == null || this.dialableNumber.length()==0) { - return false; - } - - String idp = this.getInternationalDialingPrefix(); - String nac = this.getNationalAccessCode(); - - if (idp.startsWith(nac) && dialableNumber.startsWith(idp)) { - return false; - - } - - return dialableNumber.startsWith(nac); - - } - /** * Use PhoneLib to parse a number for a regions code. If any exception occurs, they are logged and null is returned. * @param number the phone number to be parsed From 3d20146bcf0467f48b140b20dc465bf5afdb31ee Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 20 May 2024 21:45:43 +0200 Subject: [PATCH 85/98] Starting Validator. --- .../phonenumbernormalizer/PhoneNumberValidatorImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 68c53e6..8faac91 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -138,9 +138,6 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); - // TODO: change parameter regionCode to deviceContext - NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); - if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used From e0f5c78f304322e79fe361f8b5d355ce2e8067d7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 15:52:24 +0200 Subject: [PATCH 86/98] Adapted 115 Goverment shor code, which is different to 110 & 112 short code because it is usable with NDC and from outside of germany with IDP+CC (for last case IS_POSSIBLE_INTERNATIONAL_ONLY is used). --- .../PhoneNumberValidatorImplTest.groovy | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 5ee4e99..8725479 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,4 +505,53 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } + def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "validate number: $number for country: $regionCode" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "it should validate to: $expectedResult" + result == expectedResult + + where: + // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 + number | regionCode | expectedResult + // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! + "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally + "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code + "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem + "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC within the region + "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) + "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // using IDP+CC from outside the region + "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) + "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve + "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 + "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong + // end of 110 + } + + } From 51bbfd013f6a28266a27b0de23ddc28cdac532e2 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Jun 2024 17:32:15 +0200 Subject: [PATCH 87/98] Optimize Validation Code by moving duplicate code structure into checkShortCodeOverlapping method and introduce ShortCodeUseable enum, to controll the usage of the isUsable... functions of the numberplan object. --- .../phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 8725479..2cfb4af 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -528,7 +528,7 @@ class PhoneNumberValidatorImplTest extends Specification { "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. + "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong // using IDP+CC within the region "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) From c7c8aa444d8f5a5786ea2ec99fa47c46904832a7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sun, 9 Jun 2024 17:58:40 +0200 Subject: [PATCH 88/98] Adding Validation test for 116xxx social service short codes. Adapting Validation Code to handle short code definition via prefix and length (range instead of a single one) --- .../PhoneNumberValidatorImplTest.groovy | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 2cfb4af..5ee4e99 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,53 +505,4 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } - def "validate German Government short code 115 in combination as NDC"(String number, regionCode, expectedResult) { - given: - - when: "validate number: $number for country: $regionCode" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, regionCode) - - then: "it should validate to: $expectedResult" - result == expectedResult - - where: - // see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/115/115_Nummernplan_konsolidiert.pdf?__blob=publicationFile&v=1 - number | regionCode | expectedResult - // short code for German Government (115) is different to 110 & 112, dealable with NDC to reach a specific local one, or IDP+CC from outside of Germany, but not within! - "115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // number is short code, valid only locally - "115556677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // subscriber number starts with short code - "0115" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_ACCESS_CODE // number starts with NAC, normally NDC would follow, but that equals short code => assuming Short Code is intended, which means NAC is the problem - "0115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with NAC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "0175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with NAC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "0203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // number starts with NAC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "0203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with NAC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC within the region - "+49115" | "DE" | PhoneNumberValidationResult.INVALID_COUNTRY_CODE // number starts with IDP+CC, normally NDC would follow, but that equals short code => inside germany explicitly not allowed (see BnetzA) - "+49115 556677" | "DE" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "DE" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "DE" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // using IDP+CC from outside the region - "+49115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE_INTERNATIONAL_ONLY // number starts with IDP+CC, normally NDC would follow, but that equals short code => outside germany explicitly allowed (see BnetzA) - "+49115 556677" | "FR" | PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE // number starts with IDP+CC, rest is longer than short code (see one above), so its 11x NDC which is just reserve - "+49175 115" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555" | "FR" | PhoneNumberValidationResult.TOO_SHORT // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 1155555" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 11555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49175 115555555" | "FR" | PhoneNumberValidationResult.TOO_LONG // number starts with IDP+CC, mandatory mobile NDC follows, so subscriber number is not overlapping with short codes - but SN length for this NDC is 7 - "+49203 115" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // number starts with IDP+CC, optional fixed line NDC follows, SN equals short code and the local service is targeted regardless of caller location. - "+49203 115555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // number starts with IDP+CC, optional fixed line NDC follows, SN starts with short code (overlapping) => assuming NDC is intended, which means SN is wrong - // end of 110 - } - - } From b8b8718c7a7eac71bce1a8889d39d34cead53310 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 5 Oct 2024 23:18:55 +0200 Subject: [PATCH 89/98] Merging 1.3.1 with Validator C --- .../PhoneNumberValidatorImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index 8faac91..ec648c1 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -138,6 +138,9 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneLibWrapper wrapper = new PhoneLibWrapper(number, regionCode); + // TODO: change parameter regionCode to deviceContext + NumberPlan numberplan = NumberPlanFactory.INSTANCE.getNumberPlan(DeviceContextLineType.UNKNOWN, String.valueOf(PhoneLibWrapper.getCountryCodeForRegion(regionCode))); + if (wrapper.startsWithIDP()) { // Country Exit Code is part // IDP indicates CC is used @@ -204,10 +207,10 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number PhoneNumberValidationResult fallBackResult = wrapper.validate(); if ( (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE) || - (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || - // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: - ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) - ) { + (fallBackResult == PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY) || + // short number check e.g. AU 000 is short code which starts with NAC but is not treated as one: + ((fallBackResult == PhoneNumberValidationResult.TOO_SHORT) && (wrapper.isShortNumber())) + ) { return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY; } } else { @@ -254,4 +257,4 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number return wrapper.validate(); } -} +} \ No newline at end of file From f0b0a3a6635298e9148540bbb36ef2d7288ea343 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Wed, 23 Oct 2024 16:12:14 +0200 Subject: [PATCH 90/98] comment adaption --- .../numberplans/constants/DeFixedLineNumberPlan.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 6f48a71..79c2686 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -111,10 +111,8 @@ public class DeFixedLineNumberPlan extends NumberPlan { /* https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/MobileDienste/LaengeRufnummernbloecke/start.html */ /* The following Code is generated by the python script: src/generators/GermanAreaCodeExtractor/mobile.py - it is using a csv of all German fixed line Area Codes. If that gets updated, you can use the script to generate new + it is using a list of all assigned mobile operator NDCs. If that gets updated, you can use the script to generate new code and past it between the comments below. - - TODO: special NDC need to be added to the script (mobile is done) */ /* From d1d73d8f4c13c9e8adfd042913d3646ccf6bcce3 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 8 Nov 2024 08:04:44 +0100 Subject: [PATCH 91/98] Adapt testing expectation to corrected PhoneLib behaviour --- .../PhoneNumberUtil/IsValidNumberTest.groovy | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index dcc80d1..a4fad13 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -81,7 +81,7 @@ class IsValidNumberTest extends Specification { "0175 110" | "DE" | false | false "0175 110555" | "DE" | false | false "0175 1105555" | "DE" | true | false - "0175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 11055555" | "DE" | false | false "0175 110555555" | "DE" | false | false "0203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 "0203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 @@ -90,7 +90,7 @@ class IsValidNumberTest extends Specification { "+49175 110" | "DE" | false | false "+49175 110555" | "DE" | false | false "+49175 1105555" | "DE" | true | false - "+49175 11055555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 11055555" | "DE" | false | false "+49175 110555555" | "DE" | false | false "+49203 110" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 "+49203 110555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 @@ -99,7 +99,7 @@ class IsValidNumberTest extends Specification { "+49175 110" | "FR" | false | false "+49175 110555" | "FR" | false | false "+49175 1105555" | "FR" | true | false - "+49175 11055555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 11055555" | "FR" | false | false "+49175 110555555" | "FR" | false | false "+49203 110" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 110 "+49203 110555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 110 @@ -128,7 +128,7 @@ class IsValidNumberTest extends Specification { "0175 112" | "DE" | false | false "0175 112555" | "DE" | false | false "0175 1125555" | "DE" | true | false - "0175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 11255555" | "DE" | false | false "0175 112555555" | "DE" | false | false "0203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 "0203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 @@ -137,7 +137,7 @@ class IsValidNumberTest extends Specification { "+49175 112" | "DE" | false | false "+49175 112555" | "DE" | false | false "+49175 1125555" | "DE" | true | false - "+49175 11255555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 11255555" | "DE" | false | false "+49175 112555555" | "DE" | false | false "+49203 112" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 "+49203 112555" | "DE" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 @@ -146,7 +146,7 @@ class IsValidNumberTest extends Specification { "+49175 112" | "FR" | false | false "+49175 112555" | "FR" | false | false "+49175 1125555" | "FR" | true | false - "+49175 11255555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 11255555" | "FR" | false | false "+49175 112555555" | "FR" | false | false "+49203 112" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number with NDC must not use 112 "+49203 112555" | "FR" | false | true // see https://issuetracker.google.com/issues/341947688 fixline number must not start with 112 @@ -176,7 +176,7 @@ class IsValidNumberTest extends Specification { "0175 115" | "DE" | false | false "0175 115555" | "DE" | false | false "0175 1155555" | "DE" | true | false - "0175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 11555555" | "DE" | false | false "0175 115555555" | "DE" | false | false "0203 115" | "DE" | true | false // 155 is supporting NDC to reach specific local government hotline: https://www.geoportal.de/Info/tk_05-erreichbarkeit-der-115 "0203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 @@ -185,7 +185,7 @@ class IsValidNumberTest extends Specification { "+49175 115" | "DE" | false | false "+49175 115555" | "DE" | false | false "+49175 1155555" | "DE" | true | false - "+49175 11555555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 11555555" | "DE" | false | false "+49175 115555555" | "DE" | false | false "+49203 115" | "DE" | true | false "+49203 115555" | "DE" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 @@ -194,7 +194,7 @@ class IsValidNumberTest extends Specification { "+49175 115" | "FR" | false | false "+49175 115555" | "FR" | false | false "+49175 1155555" | "FR" | true | false - "+49175 11555555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 11555555" | "FR" | false | false "+49175 115555555" | "FR" | false | false "+49203 115" | "FR" | true | false "+49203 115555" | "FR" | false | true // see https://issuetracker.google.com/issues/345753226 fixline number must not start with 155 @@ -238,7 +238,7 @@ class IsValidNumberTest extends Specification { "0175 116" | "DE" | false | false "0175 116555" | "DE" | false | false "0175 1165555" | "DE" | true | false - "0175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "0175 11655555" | "DE" | false | false "0175 116555555" | "DE" | false | false // NAC + NDC (e.g. for Duisburg) + 116xxx @@ -261,7 +261,7 @@ class IsValidNumberTest extends Specification { "+49175 116" | "DE" | false | false "+49175 116555" | "DE" | false | false "+49175 1165555" | "DE" | true | false - "+49175 11655555" | "DE" | false | true // TODO: ISSUE Mobile number length + "+49175 11655555" | "DE" | false | false "+49175 116555555" | "DE" | false | false // CC + NDC (e.g. for Duisburg) + 116xxx @@ -284,7 +284,7 @@ class IsValidNumberTest extends Specification { "+49175 116" | "FR" | false | false "+49175 116555" | "FR" | false | false "+49175 1165555" | "FR" | true | false - "+49175 11655555" | "FR" | false | true // TODO: ISSUE Mobile number length + "+49175 11655555" | "FR" | false | false "+49175 116555555" | "FR" | false | false // CC + NDC (e.g. for Duisburg) + 116xxx from outside Germany @@ -373,18 +373,18 @@ class IsValidNumberTest extends Specification { "0175118000" | "DE" | false | false "0175118099" | "DE" | false | false "01751180000" | "DE" | true | false - "017511800000" | "DE" | false | true // special for mobile + "017511800000" | "DE" | false | false "01751181" | "DE" | false | false "017511810" | "DE" | false | false "017511833" | "DE" | false | false "0175118100" | "DE" | false | false "01751181000" | "DE" | true | false // special for mobile - "017511810000" | "DE" | false | true // special for mobile + "017511810000" | "DE" | false | false "01751189" | "DE" | false | false "017511899" | "DE" | false | false "0175118999" | "DE" | false | false "01751189999" | "DE" | true | false // special for mobile - "017511899999" | "DE" | false | true // special for mobile + "017511899999" | "DE" | false | false // CC + 118(y)xx "+49118" | "DE" | false | false @@ -423,18 +423,18 @@ class IsValidNumberTest extends Specification { "+49175118000" | "DE" | false | false "+49175118099" | "DE" | false | false "+491751180000" | "DE" | true | false - "+4917511800000" | "DE" | false | true // special for mobile + "+4917511800000" | "DE" | false | false "+491751181" | "DE" | false | false "+4917511810" | "DE" | false | false "+4917511833" | "DE" | false | false "+49175118100" | "DE" | false | false "+491751181000" | "DE" | true | false // special for mobile - "+4917511810000" | "DE" | false | true // special for mobile + "+4917511810000" | "DE" | false | false "+491751189" | "DE" | false | false "+4917511899" | "DE" | false | false "+49175118999" | "DE" | false | false "+491751189999" | "DE" | true | false // special for mobile - "+4917511899999" | "DE" | false | true // special for mobile + "+4917511899999" | "DE" | false | false // CC + 118(y)xx from outside Germany "+49118" | "FR" | false | false @@ -473,18 +473,18 @@ class IsValidNumberTest extends Specification { "+49175118000" | "FR" | false | false "+49175118099" | "FR" | false | false "+491751180000" | "FR" | true | false - "+4917511800000" | "FR" | false | true // special for mobile + "+4917511800000" | "FR" | false | false "+491751181" | "FR" | false | false "+4917511810" | "FR" | false | false "+4917511833" | "FR" | false | false "+49175118100" | "FR" | false | false "+491751181000" | "FR" | true | false // special for mobile - "+4917511810000" | "FR" | false | true // special for mobile + "+4917511810000" | "FR" | false | false "+491751189" | "FR" | false | false "+4917511899" | "FR" | false | false "+49175118999" | "FR" | false | false "+491751189999" | "FR" | true | false // special for mobile - "+4917511899999" | "FR" | false | true // special for mobile + "+4917511899999" | "FR" | false | false // end of 118 } From 8469cbcddbb46e0cb0043cc524e611ce9d086f2f Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 8 Nov 2024 23:05:33 +0100 Subject: [PATCH 92/98] Adding 199 as NDC for National Operator Only. Therefore also adapting the German NDC generating scripts. --- .../GermanAreaCodeExtractor/main.py | 9 +- .../GermanAreaCodeExtractor/mobil.py | 7 +- .../GermanAreaCodeExtractor/mobile_ndcs.html | 1085 +++++++++++++++++ .../PhoneNumberValidatorImpl.java | 10 +- .../numberplans/NumberPlan.java | 4 + .../constants/DeFixedLineNumberPlan.java | 10 +- .../constants/GermanAreaCodeExtractor.java | 36 +- .../PhoneNumberValidatorImplTest.groovy | 54 + 8 files changed, 1189 insertions(+), 26 deletions(-) create mode 100644 src/generators/GermanAreaCodeExtractor/mobile_ndcs.html diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py index 04618cf..63ad020 100644 --- a/src/generators/GermanAreaCodeExtractor/main.py +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -50,6 +50,8 @@ def print_function(leaf, prefix): # Start, creating a dictonary for placing the Numberplan as a tree onkz = {} +add(onkz, "199", "special NDC for German Operators internal use") + # Data from https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vorwahlverzeichnis_ONB.zip.zip?__blob=publicationFile&v=1 # it is linked at https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/ONRufnr/Einteilung_ONB/start.html @@ -75,10 +77,9 @@ def print_function(leaf, prefix): data = data.split("")[0] data = data.split("")[2] - data = data.replace(' ', "") - data = data.replace(' ', "") - data = data.replace(' ', "") - data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") data = data.replace(' ', "") data = data.replace('', "") data = data.replace('', "") diff --git a/src/generators/GermanAreaCodeExtractor/mobil.py b/src/generators/GermanAreaCodeExtractor/mobil.py index 44f774b..0fba83f 100644 --- a/src/generators/GermanAreaCodeExtractor/mobil.py +++ b/src/generators/GermanAreaCodeExtractor/mobil.py @@ -52,10 +52,9 @@ def print_function(leaf, prefix): data = data.split("")[0] data = data.split("")[2] - data = data.replace(' ', "") - data = data.replace(' ', "") - data = data.replace(' ', "") - data = data.replace(' ', "") + data = data.replace('', "") + data = data.replace('', "") + data = data.replace('', "") data = data.replace(' ', "") data = data.replace('', "") data = data.replace('', "") diff --git a/src/generators/GermanAreaCodeExtractor/mobile_ndcs.html b/src/generators/GermanAreaCodeExtractor/mobile_ndcs.html new file mode 100644 index 0000000..bd74d7e --- /dev/null +++ b/src/generators/GermanAreaCodeExtractor/mobile_ndcs.html @@ -0,0 +1,1085 @@ + + + + + + + + + Bundesnetzagentur - +Mobile Dienste belegte RNB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ + + + +
+
+
+
+ + + +
+
+ +
+ +
+ +
+
+ + +

+Zu­ge­teil­te Ruf­num­mern­blö­cke (Mo­bi­le Diens­te) + +

+
Liste der zugeteilten Rufnummernblöcke / Mobile Dienste
RNBUnternehmen
(0)15-019Tismi BV
(0)15-020Legos - Local Exchange Global Operation Services
(0)1511Telekom Deutschland GmbH
(0)1512Telekom Deutschland GmbH
(0)1514Telekom Deutschland GmbH
(0)1515Telekom Deutschland GmbH
(0)1516Telekom Deutschland GmbH
(0)1517Telekom Deutschland GmbH
(0)15-180Telekom Deutschland GmbH
(0)15-181Telekom Deutschland GmbH
(0)15-182Telekom Deutschland GmbH
(0)15-183Telekom Deutschland GmbH
(0)15-310MTEL Deutschland GmbH
(0)1520Vodafone GmbH
(0)1521Lycamobile Europe Ltd.
(0)1522Vodafone GmbH
(0)1523Vodafone GmbH
(0)1525Vodafone GmbH
(0)1526Vodafone GmbH
(0)1529Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH)
(0)15-510Lebara Limited
(0)15-511Lebara Limited
(0)15-5601&1 Mobilfunk GmbH
(0)15-5611&1 Mobilfunk GmbH
(0)15-5621&1 Mobilfunk GmbH
(0)15-5631&1 Mobilfunk GmbH
(0)15-5641&1 Mobilfunk GmbH
(0)15-5651&1 Mobilfunk GmbH
(0)15-5661&1 Mobilfunk GmbH
(0)15-5671&1 Mobilfunk GmbH
(0)15-5681&1 Mobilfunk GmbH
(0)15-5691&1 Mobilfunk GmbH
(0)15-630multiConnect GmbH
(0)15-678Argon Networks UG
(0)15-679Argon Networks UG
(0)15-700Telefónica Germany GmbH & Co. OHG
(0)15-701Telefónica Germany GmbH & Co. OHG
(0)15-702Telefónica Germany GmbH & Co. OHG
(0)15-703Telefónica Germany GmbH & Co. OHG
(0)15-704Telefónica Germany GmbH & Co. OHG
(0)15-706Telefónica Germany GmbH & Co. OHG
(0)1573Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)1575Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)1577Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)1578Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)1579Telefónica Germany GmbH & Co. OHG (Netznutzungsvereinbarung mit Fa. Sipgate Wireless GmbH zuvor Fa. Vintage Wireless Networks Gesellschaft für Telekommunikation mbH),
+(ehem. E-Plus-Mobilfunk GmbH)
(0)15-888TelcoVillage GmbH
(0)1590Telefónica Germany GmbH & Co. OHG
(0)160Telekom Deutschland GmbH
(0)162Vodafone GmbH
(0)163Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)170Telekom Deutschland GmbH
(0)171Telekom Deutschland GmbH
(0)172Vodafone GmbH
(0)173Vodafone GmbH
(0)174Vodafone GmbH
(0)175Telekom Deutschland GmbH
(0)176Telefónica Germany GmbH & Co. OHG
(0)177Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)178Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH)
(0)179Telefónica Germany GmbH & Co. OHG
Liste der Reservierungen von RNB Mobile Dienste
(0)151 Telekom Deutschland GmbH
(0)152 Vodafone GmbH
(0)157 E-Plus Mobilfunk GmbH
(0)159 Telefónica Germany GmbH & Co. OHG

Stand:  20.02.2024

+
+ +
+
+
+
+
+ + +
+ +
+ + + Mastodon + + \ No newline at end of file diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index ec648c1..a8c1a1d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -89,11 +89,19 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra return isShortCodeDirectlyAfterInitalExitCode; } + if (! numberplan.isSupportingNDC()) { + return null; + } + // Check for NDC after InitalExitCode: String ndc = numberplan.getNationalDestinationCodeFromNationalSignificantNumber(numberWithoutInitalExitCode); if (Objects.equals(ndc, "")) { - return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; // TODO: What about a Numberplan without NDCs? + return PhoneNumberValidationResult.INVALID_NATIONAL_DESTINATION_CODE; + } + + if (numberplan.isNDCNationalOperatorOnly(ndc)) { + return PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY; } String numberWithoutNationDestinationCode = numberWithoutInitalExitCode.substring(ndc.length()); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 57fc744..cb2cc35 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -112,10 +112,14 @@ public boolean isNumberTooLongForNationalDestinationCode(String ndc, String numb return ((maxLength != -1) && (maxLength SHORT_NUMBER_CODES = SHORT_NUMBER_CODES_DETAILS.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().length)); + public boolean isNDCNationalOperatorOnly(String ndc) { + return "199".equals(ndc); + } public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { @@ -336,13 +339,6 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn if ((nsn == null) || (nsn.length()<1)) { return ""; } - - if ("1".equals(nsn.substring(0,1))) { - // Non-Geographic Area Codes - if (nsn.length()<2) { - return ""; - } - } // Geographic Area Codes return GermanAreaCodeExtractor.fromNumber(nsn); } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index aedd38b..0b5f370 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -11,7 +11,8 @@ public class GermanAreaCodeExtractor { */ public static Boolean isNDCOptional(String number) { - return ! (number.startsWith("1")); + // primarly this covers mobile numbers + return !(number.startsWith("1")); } /* @@ -52,6 +53,8 @@ private static String fromNumber1(String number) { } switch (number.charAt(0)) { + case '9': + return fromNumber19(number.substring(1)); case '5': return fromNumber15(number.substring(1)); case '6': @@ -63,6 +66,19 @@ private static String fromNumber1(String number) { } } + private static String fromNumber19(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.charAt(0)) { + case '9': + return "199"; // special NDC for German Operators internal use + default: + return ""; + } + } + private static String fromNumber15(String number) { if ((number == null) || (number.length()<1)) { return ""; @@ -222,7 +238,7 @@ private static String fromNumber152(String number) { case '6': return "1526"; // Vodafone GmbH case '9': - return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH ) + return "1529"; // Vodafone GmbH (Netznutzungsvereinbarung mit Fa. TP Germany Operations GmbH ehemals Fa. Truphone GmbH) default: return ""; } @@ -341,13 +357,13 @@ private static String fromNumber157(String number) { case '0': return fromNumber1570(number.substring(1)); case '3': - return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "1573"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) case '5': - return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "1575"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) case '7': - return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "1577"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) case '8': - return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "1578"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) default: return ""; } @@ -426,7 +442,7 @@ private static String fromNumber16(String number) { case '2': return "162"; // Vodafone GmbH case '3': - return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "163"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) default: return ""; } @@ -453,9 +469,9 @@ private static String fromNumber17(String number) { case '6': return "176"; // Telefónica Germany GmbH & Co. OHG case '7': - return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "177"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) case '8': - return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH ) + return "178"; // Telefónica Germany GmbH & Co. OHG (ehem. E-Plus Mobilfunk GmbH) case '9': return "179"; // Telefónica Germany GmbH & Co. OHG default: @@ -21607,4 +21623,4 @@ private static String fromNumber997(String number) { /* End of generated code. */ -} +} \ No newline at end of file diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 5ee4e99..1271005 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,4 +505,58 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } + def "check if original lib fixed isValid for German traffic routing 0199 for internal traffic routing"(String reserve,regionCode) { + given: + String[] numbersToTest = [reserve + "", + reserve + "0", + reserve + "00", + reserve + "000", + reserve + "0000", + reserve + "00000", + reserve + "000000", + reserve + "0000000", + reserve + "00000000", + reserve + "000000000", + reserve + "0000000000", + reserve + "00000000000", + reserve + "000000000000", + reserve + "9", + reserve + "99", + reserve + "999", + reserve + "9999", + reserve + "99999", + reserve + "999999", + reserve + "9999999", + reserve + "99999999", + reserve + "999999999", + reserve + "9999999999", + reserve + "99999999999", + reserve + "999999999999"] + + when: + PhoneNumberValidationResult[] results = [] + for (number in numbersToTest) { + results += target.isPhoneNumberPossibleWithReason(number, regionCode) + } + + + then: + + PhoneNumberValidationResult[] expectedresults = [] + for (int i = 0; i < results.length; i++) { + expectedresults += PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_OPERATOR_ONLY + } + + expectedresults == results + + where: + reserve | regionCode + // 0199 is trafic control: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/Verkehrslenkungsnummern/start.html + // Number Plan https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/Verkehrslenkungsnr/NummernplanVerkehrslenkungsnrn.pdf?__blob=publicationFile&v=1 + // 0199 is not further ruled, so assuming ITU rule of max length 15 with no lower limit, but operator only use + "0199" | "DE" + "+49199" | "DE" + "+49199" | "FR" + } + } From 7ccff3518a0ff31f5242a1aa2b879458d3611bd7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 9 Nov 2024 12:51:06 +0100 Subject: [PATCH 93/98] Adding 700 as NDC for personal numbers. Therefore also adapting the German NDC generating scripts. --- .../GermanAreaCodeExtractor/main.py | 1 + .../constants/DeFixedLineNumberPlan.java | 4 +- .../constants/GermanAreaCodeExtractor.java | 2 + .../PhoneNumberValidatorImplTest.groovy | 50 ++++++++++++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py index 63ad020..d09aeb5 100644 --- a/src/generators/GermanAreaCodeExtractor/main.py +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -51,6 +51,7 @@ def print_function(leaf, prefix): onkz = {} add(onkz, "199", "special NDC for German Operators internal use") +add(onkz, "700", "personal phone numbers") # Data from https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vorwahlverzeichnis_ONB.zip.zip?__blob=publicationFile&v=1 # it is linked at https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/ONRufnr/Einteilung_ONB/start.html diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index e3f98d8..77807f5 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -16,12 +16,10 @@ package de.telekom.phonenumbernormalizer.numberplans.constants; -import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; -import lombok.RequiredArgsConstructor; class NDCDetails { @@ -117,6 +115,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { TODO: special NDC need to be added to the script (mobile is done) */ + Map.entry("700", new NDCDetails(8, 8, false)), // Personal Numbers /* * Generation started */ @@ -194,6 +193,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { /* * Generation ended */ + ); } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index 0b5f370..469707d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -15451,6 +15451,8 @@ private static String fromNumber70(String number) { } switch (number.charAt(0)) { + case '0': + return "700"; // personal phone numbers case '2': return fromNumber702(number.substring(1)); case '3': diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 1271005..e99f973 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -505,7 +505,7 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } - def "check if original lib fixed isValid for German traffic routing 0199 for internal traffic routing"(String reserve,regionCode) { + def "validate German traffic routing 0199 for internal traffic routing"(String reserve,regionCode) { given: String[] numbersToTest = [reserve + "", reserve + "0", @@ -559,4 +559,52 @@ class PhoneNumberValidatorImplTest extends Specification { "+49199" | "FR" } + def "validate German personal 700 range"(String reserve, regionCode, possibleValue) { + given: + String[] numbersToTest = [reserve + "", + reserve + "2", + reserve + "22", + reserve + "223", + reserve + "2233", + reserve + "22334", + reserve + "223344", + reserve + "2233445", + reserve + "22334455", + reserve + "223344556", + reserve + "2233445566"] + + PhoneNumberValidationResult[] expectedResults = [PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + PhoneNumberValidationResult.TOO_SHORT, + possibleValue, + PhoneNumberValidationResult.TOO_LONG, + PhoneNumberValidationResult.TOO_LONG] + + when: + PhoneNumberValidationResult[] results = [] + for (number in numbersToTest) { + results += target.isPhoneNumberPossibleWithReason(number, regionCode) + } + + then: + + expectedResults == results + + where: + reserve | regionCode | possibleValue + // 0700 is personal number range: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0700/0700_node.html + // it has 8-digit long numbers TODO: unclear if those numbers may only be called within Germany (no country code example) + // but general numberplan https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/np_nummernraum.pdf?__blob=publicationFile&v=1 + // indicates it is callable from outside Germany + + "0700" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+49700" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49700" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + } + } From 8d33d005317af7a2b13cd606b65d6c7a9011e014 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Sat, 9 Nov 2024 14:20:10 +0100 Subject: [PATCH 94/98] List all NDC testcases which needs to be added at PhoneNumberValidatorImplTest as TODO entry. --- .../PhoneNumberValidatorImplTest.groovy | 202 ++++++++++++------ 1 file changed, 141 insertions(+), 61 deletions(-) diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index e99f973..bf7f4f2 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -27,67 +27,6 @@ class PhoneNumberValidatorImplTest extends Specification { target = new PhoneNumberValidatorImpl() } - def "check if original lib fixes number starting with NAC digit after optional NDC"(String number, countryCode, expectedResult) { - given: - - - when: - "get number isPossibleNumberWithReason: $number" - - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) - - then: - "it should validate to: $expectedResult" - result == expectedResult - - where: - - number | countryCode | expectedResult - "0203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after NAC+optional NDC number must not start with digit equal to NAC - "+49203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC - "+49203056677" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC - "01750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // after NAC+mandatory NDC number may start with digit equal to NAC - "+491750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // after CC+mandatory NDC number may start with digit equal to NAC - "+491750556677" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // after CCC+mandatory NDC number may start with digit equal to NAC - } - - def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { - given: - - when: - "validate number: $number for country: $countryCode" - PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) - - then: - "it should validate to: $expectedResult" - result == expectedResult - - where: - number | countryCode | expectedResult - null | "DE" | PhoneNumberValidationResult.INVALID_LENGTH - // NDC+ national Romania numbers might be longer than 9 digits - "0040(0176) 3 0 6 9 6541" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0040 176 3 0 6 9 6542" | "DE" | PhoneNumberValidationResult.TOO_LONG - "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG - "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG - "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE - "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY - "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE - "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY - } - def "validate police short code 110 in combination as NDC"(String number, regionCode, expectedResult) { given: @@ -505,6 +444,56 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } + /* + TODO NDC Ranges see equivalent Testcases in IsValidNumberTest + */ + + // TODO: 19222 + + // TODO: 137 + + // TODO: 15 + + // TODO: 15 + voicemail infix + + // TODO: 16 + + // TODO: 16 + voicemail infix + + // TODO: 17 + + // TODO: 17 + voicemail infix + + // TODO: 180 + + // TODO: 180 reserve + + // TODO: 181 VPN + + // TODO: 18(2-9) VPN + + // TODO: 18(2-9) VON nationl only + + // TODO: 18 59995 xxxx + + // TODO: 19(1-4) + + // TODO: 1981 + + // TODO: 1981xx + + // TODO: 1981xx invalid + + // TODO: 1982 + + // TODO: 1986 + + // TODO: 1987 + + // TODO: 1988 + + // TODO: 1989 + def "validate German traffic routing 0199 for internal traffic routing"(String reserve,regionCode) { given: String[] numbersToTest = [reserve + "", @@ -607,4 +596,95 @@ class PhoneNumberValidatorImplTest extends Specification { "+49700" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE } + // TODO: 800 + + // TODO: 900 + + // TODO: 31x + + // TODO: 32 + + // TODO: 32 - low level reserve + + // TODO: 32 - mid level reserve + + // TODO: 32 - high level reserve + + // TODO: DRAMA Numbers + + // TODO: DRAMA Numbers 2 digits range + + // TODO: DRAMA Numbers 3 digits range + + // TODO: NDC 010 - 02999 + + // TODO: NDC 030 - 039999 + + // TODO: NDC 040 - 069 + + // TODO: NDC 0700 - 0999 + + def "validate number starting with NAC digit after optional NDC"(String number, countryCode, expectedResult) { + given: + + + when: + "get number isPossibleNumberWithReason: $number" + + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + + number | countryCode | expectedResult + "0203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after NAC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "+49203056677" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // after CC+optional NDC number must not start with digit equal to NAC + "01750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY // after NAC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE // after CC+mandatory NDC number may start with digit equal to NAC + "+491750556677" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE // after CCC+mandatory NDC number may start with digit equal to NAC + } + + // see "normalizeNumber by RegionCode" in PhoneNumberNormalizerImplTest + def "validate Number by RegionCode"(String number, String countryCode, expectedResult) { + given: + + when: + "validate number: $number for country: $countryCode" + PhoneNumberValidationResult result = target.isPhoneNumberPossibleWithReason(number, countryCode) + + then: + "it should validate to: $expectedResult" + result == expectedResult + + where: + number | countryCode | expectedResult + null | "DE" | PhoneNumberValidationResult.INVALID_LENGTH + // NDC+ national Romania numbers might be longer than 9 digits + "0040(0176) 3 0 6 9 6541" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040 176 3 0 6 9 6542" | "DE" | PhoneNumberValidationResult.TOO_LONG + "004017630696543" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0040-0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "0176 3 0 6 9 6544" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+49203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "0203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "203556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667789" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "556677889" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "5566778899" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "55667788990" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY + "000" | "AU" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + "012345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "+39312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE + "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + } + + } From dcba45cf98eda71e06df4ede2858861c0aa9fdf1 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Fri, 15 Nov 2024 21:51:33 +0100 Subject: [PATCH 95/98] Adding ambulance transport 19222 short code --- .../constants/DeFixedLineNumberPlan.java | 3 +- .../PhoneNumberValidatorImplTest.groovy | 30 +++++++++++++++++++ .../PhoneNumberUtil/IsValidNumberTest.groovy | 1 - 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 77807f5..9019a88 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -99,7 +99,8 @@ public class DeFixedLineNumberPlan extends NumberPlan { "115", new ShortNumberDetails(3, true, true, false, true, false, true, true), "116", new ShortNumberDetails(6, true, false, true, false, false, false, true), "1180", new ShortNumberDetails(6, false, false, false, false, false, false, false), // 1180xx is currently just reserved for future used - "118", new ShortNumberDetails(5, false, false, false, false, false, false, true) // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. + "118", new ShortNumberDetails(5, false, false, false, false, false, false, true), // This covers 1181 - 1189 since 1180 is longer prefix and has its own value. + "19222", new ShortNumberDetails(5, false, true, false, true, false, true, true) ); private static final Map NDC_DETAILS; diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index bf7f4f2..3ad3be3 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -444,6 +444,36 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 118 } + def "validate ambulance transport 19222 short codes in combination as NDC"(String number, regionCode, expectedResult) { + given: + + when: "get number isValid: $number" + + def result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "is number expected: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // prior to mobile, there where 19xxx short codes in fixed line - only 19222 for no emergency ambulance call is still valid + // its a national reserved number, which in contrast to 112 might also be called with NDC to reach a specific ambulance center - not all NDC have a connected 19222. + // for more information see https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vfg_25_2006_konsFassung100823.pdf?__blob=publicationFile&v=3 chapter 7 + "19222" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_LOCAL_ONLY // not valid on mobil but on fixedline + // using 19222 als NDC after NAC is checked by "online services 019xx" + "0203 19222" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0203 19222555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // must not be longer + // using 19222 from DE als NDC after CC is checked by "online services 019xx" + "+49203 19222" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49203 19222555" | "DE" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // must not be longer + // using 19222 from FR als NDC after CC is checked by "online services 019xx" + "+49203 19222" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49203 19222555" | "FR" | PhoneNumberValidationResult.INVALID_PREFIX_OF_SUBSCRIBER_NUMBER // must not be longer + // end of 19222 + } + + /* TODO NDC Ranges see equivalent Testcases in IsValidNumberTest */ diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index a4fad13..266e289 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -510,7 +510,6 @@ class IsValidNumberTest extends Specification { // using 19222 als NDC after NAC is checked by "online services 019xx" "0203 19222" | "DE" | true | false "0203 19222555" | "DE" | false | true // must not be longer - "+4919222" | "DE" | false | false // using 19222 from DE als NDC after CC is checked by "online services 019xx" "+49203 19222" | "DE" | true | false "+49203 19222555" | "DE" | false | true // must not be longer From b75d2a1585ea0a3fce66a0673393c3b07561e3a7 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 18 Nov 2024 10:12:37 +0100 Subject: [PATCH 96/98] Inluded 137 for validation and introduced new mechanism to detect reserved number ranges --- .../GermanAreaCodeExtractor/main.py | 1 + .../PhoneNumberValidatorImpl.java | 15 +- .../numberplans/NumberPlan.java | 2 + .../constants/DeFixedLineNumberPlan.java | 157 +++++++++++++++++- .../constants/GermanAreaCodeExtractor.java | 15 ++ .../PhoneNumberValidatorImplTest.groovy | 157 +++++++++++++++++- .../PhoneNumberUtil/IsValidNumberTest.groovy | 102 +++++++++++- 7 files changed, 441 insertions(+), 8 deletions(-) diff --git a/src/generators/GermanAreaCodeExtractor/main.py b/src/generators/GermanAreaCodeExtractor/main.py index d09aeb5..e371a5b 100644 --- a/src/generators/GermanAreaCodeExtractor/main.py +++ b/src/generators/GermanAreaCodeExtractor/main.py @@ -50,6 +50,7 @@ def print_function(leaf, prefix): # Start, creating a dictonary for placing the Numberplan as a tree onkz = {} +add(onkz, "137", "mass traffic") add(onkz, "199", "special NDC for German Operators internal use") add(onkz, "700", "personal phone numbers") diff --git a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java index a8c1a1d..86203c8 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImpl.java @@ -133,6 +133,7 @@ private PhoneNumberValidationResult checkExitCodeUsingNumber(PhoneLibWrapper wra if (numberplan.isNumberTooLongForNationalDestinationCode(ndc,numberWithoutNationDestinationCode)) { return PhoneNumberValidationResult.TOO_LONG; } + } return null; } @@ -186,6 +187,14 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number return isIDPNumberValid; } + if (numberplan != null) { + PhoneNumberValidationResult specialRuling = numberplan.checkSpecialDefinitions(numberWithoutCountryCode); + if (specialRuling != null) { + return specialRuling; + } + } + + } else { // No Country Exit Code has been used, so no CC is following. if (Objects.equals(wrapper.getNationalAccessCode(), "")) { @@ -209,8 +218,12 @@ public PhoneNumberValidationResult isPhoneNumberPossibleWithReason(String number if (isNACNumberValid != null) { return isNACNumberValid; } - } + PhoneNumberValidationResult specialRuling = numberplan.checkSpecialDefinitions(numberWithOutNac); + if (specialRuling != null) { + return specialRuling; + } + } // As fallback check by libPhone PhoneNumberValidationResult fallBackResult = wrapper.validate(); diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index cb2cc35..815785f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -122,6 +122,8 @@ public boolean isNDCOptional(String ndc) { public boolean isReserved(String number) {return false; } + public PhoneNumberValidationResult checkSpecialDefinitions(String nationalSignificantNumber) {return null; } + public Integer isMatchingLength(String number) {return null;} public boolean isUsableWithIDPandCCfromOutside(String number) { diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 9019a88..6a48a5d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import de.telekom.phonenumbernormalizer.numberplans.NumberPlan; +import de.telekom.phonenumbernormalizer.numberplans.PhoneNumberValidationResult; class NDCDetails { @@ -31,6 +32,13 @@ class NDCDetails { int lengthOfNumberPrefix = 0; // some NDC have different length definition for specific ranges defined by the prefix of a number. + PhoneNumberValidationResult validation; + + public NDCDetails(int min, int max, boolean optional, int prefixLength, PhoneNumberValidationResult defaultValidation) { + this(min, max, optional, prefixLength); + this.validation = defaultValidation; + } + public NDCDetails(int min, int max, boolean optional, int prefixLength) { this.minNumberLength = min; this.maxNumberLength = max; @@ -38,11 +46,17 @@ public NDCDetails(int min, int max, boolean optional, int prefixLength) { this.lengthOfNumberPrefix = prefixLength; } + public NDCDetails(int min, int max, boolean optional, PhoneNumberValidationResult defaultValidation) { + this(min, max, optional); + this.validation = defaultValidation; + } + public NDCDetails(int min, int max, boolean optional) { this.minNumberLength = min; this.maxNumberLength = max; this.isOptional = optional; } + } class ShortNumberDetails { @@ -115,7 +129,7 @@ public class DeFixedLineNumberPlan extends NumberPlan { TODO: special NDC need to be added to the script (mobile is done) */ - + Map.entry("137", new NDCDetails(7, 7, false)), // Mass Trafic Numbers Map.entry("700", new NDCDetails(8, 8, false)), // Personal Numbers /* * Generation started @@ -282,6 +296,7 @@ public boolean isReserved(String number) { numberDetails.usableDirectly); } + @Override public Integer isMatchingLength(String number) { ShortNumberDetails numberDetails = SHORT_NUMBER_CODES_DETAILS.get(startingWithShortNumberKey(number)); @@ -344,4 +359,144 @@ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn return GermanAreaCodeExtractor.fromNumber(nsn); } + @Override + public PhoneNumberValidationResult checkSpecialDefinitions(String nationalSignificantNumber) { + if ((nationalSignificantNumber == null) || (nationalSignificantNumber.length()<3)){ + return null; + } + + switch (nationalSignificantNumber.charAt(0)) { + case '1': + switch (nationalSignificantNumber.charAt(1)) { + case '1': + switch (nationalSignificantNumber.charAt(2)) { + case '5': + return null; + case '6': + return null; + default: + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + case '2': + case '4': + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + case '3': + if (nationalSignificantNumber.charAt(2)=='7') { + if (nationalSignificantNumber.startsWith("1370")) { + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } else { + return null; // mass traffic number + } + } else { + // all 13x where x is not 7 are reserve + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + case '6': + switch (nationalSignificantNumber.charAt(2)) { + case '1': + case '5': + case '6': + case '7': + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + default: + return null; + } + case '9': + switch (nationalSignificantNumber.charAt(2)) { + case '1': + case '2': + case '3': + case '4': + return null; + case '8': + if (nationalSignificantNumber.startsWith("1986115")) { + return PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY; + } + if (nationalSignificantNumber.startsWith("1987")) { + return PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY; + } + if (nationalSignificantNumber.startsWith("1988")) { + return PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY; + } + if (nationalSignificantNumber.startsWith("1989")) { + if (nationalSignificantNumber.startsWith("19890")) { + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + return PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY; + } + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + case '9': + return PhoneNumberValidationResult.IS_POSSIBLE_OPERATOR_ONLY; + default: + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + + default: + return null; + } + case '3': + if (nationalSignificantNumber.charAt(1) == '1') { + switch (nationalSignificantNumber.charAt(2)) { + case '0': + case '1': + return null; + default: + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + } + return null; + case '5': + if (nationalSignificantNumber.charAt(1) == '0') { + switch (nationalSignificantNumber.charAt(2)) { + case '0': + case '1': + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + default: + return null; + } + } + return null; + case '7': + case '8': + if (nationalSignificantNumber.charAt(1) == '0') { + if (nationalSignificantNumber.charAt(2) == '1') { + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + } + } + return null; + case '9': + if (nationalSignificantNumber.charAt(1) == '0') { + switch (nationalSignificantNumber.charAt(2)) { + case '0': + if (nationalSignificantNumber.length() > 3) { + switch (nationalSignificantNumber.charAt(3)) { + case '0': + case '2': + case '4': + case '6': + case '7': + case '8': + case '9': + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + default: + return null; + } + } + return null; + case '1': + case '2': + case '3': + case '4': + case '5': + return PhoneNumberValidationResult.INVALID_RESERVE_NUMBER; + default: + return null; + } + } + return null; + default: + return null; + } + } + } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index 469707d..ab2bfec 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -53,6 +53,8 @@ private static String fromNumber1(String number) { } switch (number.charAt(0)) { + case '3': + return fromNumber13(number.substring(1)); case '9': return fromNumber19(number.substring(1)); case '5': @@ -66,6 +68,19 @@ private static String fromNumber1(String number) { } } + private static String fromNumber13(String number) { + if ((number == null) || (number.length()<1)) { + return ""; + } + + switch (number.charAt(0)) { + case '7': + return "137"; // mass traffic + default: + return ""; + } + } + private static String fromNumber19(String number) { if ((number == null) || (number.length()<1)) { return ""; diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy index 3ad3be3..6d74ee5 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberValidatorImplTest.groovy @@ -473,15 +473,163 @@ class PhoneNumberValidatorImplTest extends Specification { // end of 19222 } + def "validate German mass traffic NDC"(String number, regionCode, expectedResult) { + given: + + when: "get number isValid: $number" + + def result = target.isPhoneNumberPossibleWithReason(number, regionCode) + + then: "is number expected: $expectedResult" + result == expectedResult + + where: + + number | regionCode | expectedResult + // 137 is masstraffic 10 digits + "0137 000 0000" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "0137 000 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 000 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 + // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 + // Zone 1 is valid, but only with exactly 10 digits + "0137 100 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 100 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 100 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 2 is valid, but only with exactly 10 digits + "0137 200 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 200 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 200 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 3 is valid, but only with exactly 10 digits + "0137 300 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 300 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 300 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 4 is valid, but only with exactly 10 digits + "0137 400 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 400 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 400 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 5 is valid, but only with exactly 10 digits + "0137 500 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 500 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 500 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 6 is valid, but only with exactly 10 digits + "0137 600 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 600 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 600 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 7 is valid, but only with exactly 10 digits + "0137 700 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 700 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 700 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 8 is valid, but only with exactly 10 digits + "0137 800 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 800 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 800 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 9 is valid, but only with exactly 10 digits + "0137 900 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY + "0137 900 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "0137 900 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + + // with CC from DE + + // 137 is masstraffic 10 digits + "+49137 000 0000" | "DE" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "+49137 000 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 000 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 + // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 + // Zone 1 is valid, but only with exactly 10 digits + "+49137 100 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 100 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 100 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 2 is valid, but only with exactly 10 digits + "+49137 200 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 200 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 200 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 3 is valid, but only with exactly 10 digits + "+49137 300 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 300 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 300 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 4 is valid, but only with exactly 10 digits + "+49137 400 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 400 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 400 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 5 is valid, but only with exactly 10 digits + "+49137 500 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 500 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 500 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 6 is valid, but only with exactly 10 digits + "+49137 600 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 600 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 600 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 7 is valid, but only with exactly 10 digits + "+49137 700 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 700 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 700 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 8 is valid, but only with exactly 10 digits + "+49137 800 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 800 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 800 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + // Zone 9 is valid, but only with exactly 10 digits + "+49137 900 0000" | "DE" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 900 00000" | "DE" | PhoneNumberValidationResult.TOO_LONG + "+49137 900 000" | "DE" | PhoneNumberValidationResult.TOO_SHORT + + + // with CC from outside DE + + // 137 is masstraffic 10 digits + "+49137 000 0000" | "FR" | PhoneNumberValidationResult.INVALID_RESERVE_NUMBER // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "+49137 000 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 000 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 + // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 + // Zone 1 is valid, but only with exactly 10 digits + "+49137 100 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 100 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 100 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 2 is valid, but only with exactly 10 digits + "+49137 200 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 200 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 200 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 3 is valid, but only with exactly 10 digits + "+49137 300 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 300 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 300 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 4 is valid, but only with exactly 10 digits + "+49137 400 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 400 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 400 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 5 is valid, but only with exactly 10 digits + "+49137 500 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 500 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 500 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 6 is valid, but only with exactly 10 digits + "+49137 600 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 600 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 600 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 7 is valid, but only with exactly 10 digits + "+49137 700 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 700 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 700 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 8 is valid, but only with exactly 10 digits + "+49137 800 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 800 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 800 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + // Zone 9 is valid, but only with exactly 10 digits + "+49137 900 0000" | "FR" | PhoneNumberValidationResult.IS_POSSIBLE + "+49137 900 00000" | "FR" | PhoneNumberValidationResult.TOO_LONG + "+49137 900 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + "+49137 900 000" | "FR" | PhoneNumberValidationResult.TOO_SHORT + + } /* TODO NDC Ranges see equivalent Testcases in IsValidNumberTest */ - // TODO: 19222 - - // TODO: 137 - // TODO: 15 // TODO: 15 + voicemail infix @@ -716,5 +864,6 @@ class PhoneNumberValidatorImplTest extends Specification { "312345678" | "IT" | PhoneNumberValidationResult.IS_POSSIBLE_NATIONAL_ONLY } + // TODO: Reserve NDC like (0)11 where (0)115 and (0)116 is used, or (0)13 where (0)137x is used } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy index 266e289..34c1ac5 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/IsValidNumberTest.groovy @@ -536,8 +536,8 @@ class IsValidNumberTest extends Specification { number | regionCode | expectedResult | expectingFail // 137 is masstraffic 10 digits "0137 000 0000" | "DE" | false | false // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 - "0137 000 00000" | "DE" | false | false // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 - "0137 000 000" | "DE" | false | false // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "0137 000 00000" | "DE" | false | false // too long + "0137 000 000" | "DE" | false | false // too short // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 @@ -578,6 +578,97 @@ class IsValidNumberTest extends Specification { "0137 900 00000" | "DE" | false | false "0137 900 000" | "DE" | false | false + // with CC from DE + + // 137 is masstraffic 10 digits + "+49137 000 0000" | "DE" | false | false // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "+49137 000 00000" | "DE" | false | false // too long + "+49137 000 000" | "DE" | false | false // too short + + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 + // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 + // Zone 1 is valid, but only with exactly 10 digits + "+49137 100 0000" | "DE" | true | false + "+49137 100 00000" | "DE" | false | false + "+49137 100 000" | "DE" | false | false + // Zone 2 is valid, but only with exactly 10 digits + "+49137 200 0000" | "DE" | true | false + "+49137 200 00000" | "DE" | false | false + "+49137 200 000" | "DE" | false | false + // Zone 3 is valid, but only with exactly 10 digits + "+49137 300 0000" | "DE" | true | false + "+49137 300 00000" | "DE" | false | false + "+49137 300 000" | "DE" | false | false + // Zone 4 is valid, but only with exactly 10 digits + "+49137 400 0000" | "DE" | true | false + "+49137 400 00000" | "DE" | false | false + "+49137 400 000" | "DE" | false | false + // Zone 5 is valid, but only with exactly 10 digits + "+49137 500 0000" | "DE" | true | false + "+49137 500 00000" | "DE" | false | false + "+49137 500 000" | "DE" | false | false + // Zone 6 is valid, but only with exactly 10 digits + "+49137 600 0000" | "DE" | true | false + "+49137 600 00000" | "DE" | false | false + "+49137 600 000" | "DE" | false | false + // Zone 7 is valid, but only with exactly 10 digits + "+49137 700 0000" | "DE" | true | false + "+49137 700 00000" | "DE" | false | false + "+49137 700 000" | "DE" | false | false + // Zone 8 is valid, but only with exactly 10 digits + "+49137 800 0000" | "DE" | true | false + "+49137 800 00000" | "DE" | false | false + "+49137 800 000" | "DE" | false | false + // Zone 9 is valid, but only with exactly 10 digits + "+49137 900 0000" | "DE" | true | false + "+49137 900 00000" | "DE" | false | false + "+49137 900 000" | "DE" | false | false + + // with CC from outside DE + + // 137 is masstraffic 10 digits + "+49137 000 0000" | "FR" | false | false // Zone 0 are not assigend https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/freieRNB/0137_MABEZ_FreieRNB.html?nn=326370 + "+49137 000 00000" | "FR" | false | false // too long + "+49137 000 000" | "FR" | false | false // too short + + // https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/0137/0137_Nummernplan.pdf?__blob=publicationFile&v=4 + // within each zone, there are only a few ranges assigned: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/0137/belegteRNB/0137MABEZBelegteRNB_Basepage.html?nn=326370 + // Zone 1 is valid, but only with exactly 10 digits + "+49137 100 0000" | "FR" | true | false + "+49137 100 00000" | "FR" | false | false + "+49137 100 000" | "FR" | false | false + // Zone 2 is valid, but only with exactly 10 digits + "+49137 200 0000" | "FR" | true | false + "+49137 200 00000" | "FR" | false | false + "+49137 200 000" | "FR" | false | false + // Zone 3 is valid, but only with exactly 10 digits + "+49137 300 0000" | "FR" | true | false + "+49137 300 00000" | "FR" | false | false + "+49137 300 000" | "FR" | false | false + // Zone 4 is valid, but only with exactly 10 digits + "+49137 400 0000" | "FR" | true | false + "+49137 400 00000" | "FR" | false | false + "+49137 400 000" | "FR" | false | false + // Zone 5 is valid, but only with exactly 10 digits + "+49137 500 0000" | "FR" | true | false + "+49137 500 00000" | "FR" | false | false + "+49137 500 000" | "FR" | false | false + // Zone 6 is valid, but only with exactly 10 digits + "+49137 600 0000" | "FR" | true | false + "+49137 600 00000" | "FR" | false | false + "+49137 600 000" | "FR" | false | false + // Zone 7 is valid, but only with exactly 10 digits + "+49137 700 0000" | "FR" | true | false + "+49137 700 00000" | "FR" | false | false + "+49137 700 000" | "FR" | false | false + // Zone 8 is valid, but only with exactly 10 digits + "+49137 800 0000" | "FR" | true | false + "+49137 800 00000" | "FR" | false | false + "+49137 800 000" | "FR" | false | false + // Zone 9 is valid, but only with exactly 10 digits + "+49137 900 0000" | "FR" | true | false + "+49137 900 00000" | "FR" | false | false + "+49137 900 000" | "FR" | false | false } def "check if original lib fixed isValid for German Mobile 15 range"(String numberUntilInfix, regionCode, boolean[] expectingFails) { @@ -7512,4 +7603,11 @@ class IsValidNumberTest extends Specification { "+491750556677" | "DE" | true | false // after CC+mandatory NDC number may start with digit equal to NAC "+491750556677" | "FR" | true | false // after CCC+mandatory NDC number may start with digit equal to NAC } + + /* + + TODO: Reserve NDC like (0)11 where (0)115 and (0)116 is used, or (0)13 where (0)137x is used + + + */ } \ No newline at end of file From ea3d10745c77ab7ba3b5427c6ff3a29c9eff1cb4 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 18 Nov 2024 10:15:58 +0100 Subject: [PATCH 97/98] removed abdon approach for reserved number ranges --- .../numberplans/constants/DeFixedLineNumberPlan.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java index 6a48a5d..0f81d4b 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/DeFixedLineNumberPlan.java @@ -32,13 +32,6 @@ class NDCDetails { int lengthOfNumberPrefix = 0; // some NDC have different length definition for specific ranges defined by the prefix of a number. - PhoneNumberValidationResult validation; - - public NDCDetails(int min, int max, boolean optional, int prefixLength, PhoneNumberValidationResult defaultValidation) { - this(min, max, optional, prefixLength); - this.validation = defaultValidation; - } - public NDCDetails(int min, int max, boolean optional, int prefixLength) { this.minNumberLength = min; this.maxNumberLength = max; @@ -46,11 +39,6 @@ public NDCDetails(int min, int max, boolean optional, int prefixLength) { this.lengthOfNumberPrefix = prefixLength; } - public NDCDetails(int min, int max, boolean optional, PhoneNumberValidationResult defaultValidation) { - this(min, max, optional); - this.validation = defaultValidation; - } - public NDCDetails(int min, int max, boolean optional) { this.minNumberLength = min; this.maxNumberLength = max; From efec12bf67bd2592237256f4e920e460d45f7879 Mon Sep 17 00:00:00 2001 From: Emil Thies Date: Mon, 3 Mar 2025 15:57:36 +0100 Subject: [PATCH 98/98] Extend NDC extraction with phonelib RFC3966 formation for not improved number plan adaption. --- .../numberplans/NumberPlan.java | 7 +- .../numberplans/NumberPlanFactory.java | 1 - .../numberplans/PhoneLibWrapper.java | 59 +- .../constants/GermanAreaCodeExtractor.java | 2 +- .../PhoneAreaCodeComponentImplTest.groovy | 14 +- .../PhoneNumberNormalizerImplTest.groovy | 49 +- .../PhoneNumberOfflineGeocoderTest.groovy | 2 + .../PhoneNumberUtil/NormalizationTest.groovy | 8 +- .../PhoneNumberUtil/RFC3966_DE_NDCTest.groovy | 8973 +++++++++++++++++ .../numberplans/NumberPlanTest.groovy | 33 + .../numberplans/PhoneLibWrapperTest.groovy | 72 + .../arealabels/nationallabels/de.json | 3 +- 12 files changed, 9186 insertions(+), 37 deletions(-) create mode 100644 src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/RFC3966_DE_NDCTest.groovy diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java index 815785f..5369272 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlan.java @@ -68,8 +68,8 @@ public static String getCountryCode() { } /** - * A subclass can provide National Destination Code of the rules - not used inside this class, but - * re-usable when adding the subclass to the factory. + * Basically the libphone format of RFC 3966 is used to extract the NDC from it. + * A subclass can provide a more accurate calculation for the National Destination Code. * * @param nsn - National Significant Number (without IDP + CC or NAC as prefix) * @return National Destination Code without leading National Access Code @@ -77,7 +77,8 @@ public static String getCountryCode() { * @see NumberPlanFactory */ public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { - return ""; + PhoneLibWrapper wrapper = new PhoneLibWrapper(nsn, PhoneLibWrapper.getRegionCodeForCountryCode(NumberPlan.getCountryCode())); + return wrapper.getNationalDestinationCode(); } public int getNationDestinationCodeMinimalNumberLength(String ndc, String number) { diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlanFactory.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlanFactory.java index fcfde21..cdca05d 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlanFactory.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/NumberPlanFactory.java @@ -112,5 +112,4 @@ public NumberPlan getNumberPlan(DeviceContextLineType numberPlanType, String cou LOGGER.debug("no number plan for country available"); return null; } - } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java index 4e132f9..f1f04df 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapper.java @@ -942,6 +942,11 @@ public class PhoneLibWrapper { */ private boolean isNormalizingTried = false; + public void tryNormalization() { + this.isNormalizingTried = true; + this.semiNormalizedNumber = PhoneLibWrapper.parseNumber(dialableNumber, regionCode); + } + /** * Initialize the wrapper by giving a phone number to be analyzed against a number plan of a given region * @param number the phone number to be analyzed @@ -960,8 +965,7 @@ public PhoneLibWrapper(String number, String regionCode) { if (!isSpecialFormat(dialableNumber)) { // Number needs normalization: // international prefix is added by the lib even if it's not valid in the number plan. - this.isNormalizingTried = true; - this.semiNormalizedNumber = PhoneLibWrapper.parseNumber(dialableNumber, regionCode); + this.tryNormalization(); } } } @@ -1025,6 +1029,18 @@ public boolean hasNoCountryCodeNorNationalAccessCode() { return hasRegionNationalAccessCode(); } + boolean noSemiNormalizedNumber() { + if (this.dialableNumber==null) { + return true; + } + + if ((! this.isNormalizingTried) && (this.semiNormalizedNumber == null)){ + this.tryNormalization(); + } + + return (this.semiNormalizedNumber == null); + } + /** * Using PhoneLib to get a E164 formatted representation of the given number *

@@ -1035,9 +1051,44 @@ public boolean hasNoCountryCodeNorNationalAccessCode() { * @see PhoneLibWrapper#PhoneLibWrapper(String, String) */ public String getE164Formatted() { + if (this.noSemiNormalizedNumber()) { + return null; + } return phoneUtil.format(this.semiNormalizedNumber, PhoneNumberUtil.PhoneNumberFormat.E164); } + /** + * Using PhoneLib to get a RFC3966 formatted representation of the given number + *

+ * This is a straight invocation, so no compensation of some inaccuracy is done here. + *

+ * @return RFC3966 format of the given phone number + * + * @see PhoneLibWrapper#PhoneLibWrapper(String, String) + */ + public String getRFC3966Formatted() { + if (this.noSemiNormalizedNumber()) { + return null; + } + return phoneUtil.format(this.semiNormalizedNumber, PhoneNumberUtil.PhoneNumberFormat.RFC3966); + } + + + public String getNationalDestinationCode() { + String rfc3966 = this.getRFC3966Formatted(); + if (rfc3966 == null) { + return null; + } + + // e.g. tel:+49-176-30696544 + String[] parts = rfc3966.split("-"); + + if (parts.length>1){ + return parts[1]; + } + return null; + + } /** * If we know the given region for the given number {@link PhoneLibWrapper#hasRegionNationalAccessCode()}, this method checks if the given number does not start with a NAC nor a CC, * so we could permanently add a default NDC and NAC to the given number and for this new value the method directly return a E164 formatted representation. @@ -1055,6 +1106,7 @@ public String extendNumberByDefaultAreaCodeAndCountryCode(String nationalAccessC String extendedNumber = nationalAccessCode + defaultNationalDestinationCode + nationalPhoneNumberWithoutNationalAccessCode; try { + this.isNormalizingTried = false; this.semiNormalizedNumber = phoneUtil.parse(extendedNumber, regionCode); // after area code has been added, we can add the country code by the lib: return getE164Formatted(); @@ -1326,6 +1378,9 @@ static private Phonemetadata.PhoneMetadata getMetadataForRegion(String regionCod * @see PhoneLibWrapper#nationalPhoneNumberWithoutNationalPrefix(Phonenumber.PhoneNumber) */ private String getNationalPhoneNumberWithoutNationalAccessCode() { + if (this.noSemiNormalizedNumber()) { + return null; + } return PhoneLibWrapper.nationalPhoneNumberWithoutNationalPrefix(this.semiNormalizedNumber); } diff --git a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java index ab2bfec..52c767f 100644 --- a/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java +++ b/src/main/java/de/telekom/phonenumbernormalizer/numberplans/constants/GermanAreaCodeExtractor.java @@ -11,7 +11,7 @@ public class GermanAreaCodeExtractor { */ public static Boolean isNDCOptional(String number) { - // primarly this covers mobile numbers + // primarily this covers mobile numbers return !(number.startsWith("1")); } diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneAreaCodeComponentImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneAreaCodeComponentImplTest.groovy index a328ac5..b720537 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneAreaCodeComponentImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneAreaCodeComponentImplTest.groovy @@ -70,9 +70,12 @@ class PhoneAreaCodeComponentImplTest extends Specification { then: "It should return the area name: ${expectedResult}" - result.isPresent() == true - result.get() == expectedResult - + if (expectedResult == null) { + result.isPresent() == false + } else { + result.isPresent() == true + result.get() == expectedResult + } where: nationalNumber | regionCode | expectedResult "201" | "DE" | "Essen" @@ -81,6 +84,11 @@ class PhoneAreaCodeComponentImplTest extends Specification { "60411" | "DE" | "Bottrop" "60412" | "DE" | "XXX" "60413" | "DE" | "Bottrop" + "605" | "DE" | null + "606" | "DE" | null + "6065" | "DE" | null + "6066" | "DE" | "AAA" + "6067" | "DE" | null "205" | "US" | "Alabama" "659" | "US" | "Alabama" "203" | "US" | "Connecticut" diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberNormalizerImplTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberNormalizerImplTest.groovy index 7fdf84b..ba15da8 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberNormalizerImplTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/PhoneNumberNormalizerImplTest.groovy @@ -46,10 +46,10 @@ class PhoneNumberNormalizerImplTest extends Specification { where: number | countryCode | expectedResult null | "DE" | null - "0040(0176) 3 0 6 9 6541" | "DE" | "+4017630696541" - "0040 176 3 0 6 9 6542" | "DE" | "+4017630696542" - "004017630696543" | "DE" | "+4017630696543" - "0040-0176 3 0 6 9 6544" | "DE" | "+4017630696544" + "0723 413 641" | "DE" | "+49723413641" + "0040 723 413 641" | "DE" | "+40723413641" + "+40723413641" | "DE" | "+40723413641" + "0040-723-413-641" | "DE" | "+40723413641" "0176 3 0 6 9 6544" | "DE" | "+4917630696544" "0203556677" | "DE" | "+49203556677" "203556677" | "DE" | "203556677" @@ -82,10 +82,10 @@ class PhoneNumberNormalizerImplTest extends Specification { number | countryCode | expectedResult null | "DE" | null - "0040(0176) 3 0 6 9 6541" | "DE" | "+4017630696541" - "0040 176 3 0 6 9 6542" | "DE" | "+4017630696542" - "004017630696543" | "DE" | "+4017630696543" - "0040-0176 3 0 6 9 6544" | "DE" | "+4017630696544" + "0723 413 641" | "DE" | "+49723413641" + "0040 723 413 641" | "DE" | "+40723413641" + "+40723413641" | "DE" | "+40723413641" + "0040-723-413-641" | "DE" | "+40723413641" "0176 3 0 6 9 6544" | "DE" | "+4917630696544" "0203556677" | "DE" | "+49203556677" "203556677" | "DE" | "203556677" @@ -138,11 +138,12 @@ class PhoneNumberNormalizerImplTest extends Specification { number | countryCode | areaCode |expectedResult //Special Case where Number already includes country code with leading + - "+4017630696541" | "49" | "203" | "+4017630696541" - "(+40)17630696541" | "49" | "203" | "+4017630696541" - "(+40)(176)30696541" | "49" | "203" | "+4017630696541" - "(+40)176/30696541" | "49" | "203" | "+4017630696541" - "(+40)176-30696541" | "49" | "203" | "+4017630696541" + "+49723 413 641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+49723413641" + "+40723413641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+40723413641" + "(+40)723413641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+40723413641" + "(+40)(723)413641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+40723413641" + "(+40)723/413641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+40723413641" + "(+40)723-413641" | DeviceContext.UNKNOWN_VALUE | DeviceContext.UNKNOWN_VALUE | "+40723413641" //Special Case areaCode is unknown "0203556677" | "49" | DeviceContext.UNKNOWN_VALUE | "+49203556677" "203556677" | "49" | DeviceContext.UNKNOWN_VALUE | "203556677" @@ -168,10 +169,13 @@ class PhoneNumberNormalizerImplTest extends Specification { "0203556677" | "xxx" | DeviceContext.UNKNOWN_VALUE | "+49203556677" "203556677" | "xxx" | DeviceContext.UNKNOWN_VALUE | "203556677" //New Logic, if Country and Area Code is present for normalization: - "0040(0176) 3 0 6 9 6541" | "49" | "203" | "+4017630696541" - "0040 176 3 0 6 9 6542" | "49" | "203" | "+4017630696542" - "004017630696543" | "49" | "203" | "+4017630696543" - "0040-0176 3 0 6 9 6544" | "49" | "203" | "+4017630696544" + "0723 413 641" | "49" | "203" | "+49723413641" + "+49723 413 641" | "49" | "203" | "+49723413641" + "+40723413641" | "49" | "203" | "+40723413641" + "(+40)723413641" | "49" | "203" | "+40723413641" + "(+40)(723)413641" | "49" | "203" | "+40723413641" + "(+40)723/413641" | "49" | "203" | "+40723413641" + "(+40)723-413641" | "49" | "203" | "+40723413641" "0176 3 0 6 9 6544" | "49" | "203" | "+4917630696544" "0203556677" | "49" | "203" | "+49203556677" "203556677" | "49" | "203" | "+49203203556677" @@ -220,11 +224,12 @@ class PhoneNumberNormalizerImplTest extends Specification { "000" | "61" | "222" | "000" "012345678" | "39" | "222" | "+39012345678" "312345678" | "39" | "222" | "+39312345678" - //Default Behavior if no device Context is present - "0040(0176) 3 0 6 9 6541" | null | null | "+4017630696541" - "0040 176 3 0 6 9 6542" | null | null | "+4017630696542" - "004017630696543" | null | null | "+4017630696543" - "0040-0176 3 0 6 9 6544" | null | null | "+4017630696544" + "+49723 413 641" | null | null | "+49723413641" + "+40723413641" | null | null | "+40723413641" + "(+40)723413641" | null | null | "+40723413641" + "(+40)(723)413641" | null | null | "+40723413641" + "(+40)723/413641" | null | null | "+40723413641" + "(+40)723-413641" | null | null | "+40723413641" "0176 3 0 6 9 6544" | null | null | "+4917630696544" "0203556677" | null | null | "+49203556677" "203556677" | null | null | "203556677" diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberOfflineGeocoderTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberOfflineGeocoderTest.groovy index 7cd3626..608db84 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberOfflineGeocoderTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberOfflineGeocoderTest.groovy @@ -68,6 +68,7 @@ class PhoneNumberOfflineGeocoderTest extends Specification { "201" | "Essen" | false "202" | "Wuppertal" | false "203" | "Duisburg" | false + "204" | null | true "2041" | "Bottrop" | false "2043" | "Gladbeck" | false "2045" | "Bottrop Kirchhellen" | false @@ -75,6 +76,7 @@ class PhoneNumberOfflineGeocoderTest extends Specification { "2052" | "Velbert Langenberg" | false "2053" | "Velbert Neviges" | false "2054" | "Essen Kettwig" | false + "2055" | null | true "2056" | "Heiligenhaus" | false "2058" | "Wülfrath" | false "2064" | "Dinslaken" | false diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/NormalizationTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/NormalizationTest.groovy index 9c8489f..1caa1b3 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/NormalizationTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/NormalizationTest.groovy @@ -73,10 +73,10 @@ class NormalizationTest extends Specification { where: number | regionCode | expectedResult | expectingFail - "0040(0176) 3 0 6 9 6541" | "DE" | "+4017630696541" | false - "0040 176 3 0 6 9 6542" | "DE" | "+4017630696542" | false - "004017630696543" | "DE" | "+4017630696543" | false - "0040-0176 3 0 6 9 6544" | "DE" | "+4017630696544" | false + "0723 413 641" | "DE" | "+49723413641" | false + "0040 723 413 641" | "DE" | "+40723413641" | false + "+40723413641" | "DE" | "+40723413641" | false + "0040-723-413-641" | "DE" | "+40723413641" | false "0176 3 0 6 9 6544" | "DE" | "+4917630696544" | false "0203556677" | "DE" | "+49203556677" | false "203556677" | "DE" | "203556677" | true diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/RFC3966_DE_NDCTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/RFC3966_DE_NDCTest.groovy new file mode 100644 index 0000000..ff911f2 --- /dev/null +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/extern/libphonenumber/PhoneNumberUtil/RFC3966_DE_NDCTest.groovy @@ -0,0 +1,8973 @@ +/* + * Copyright © 2024 Deutsche Telekom AG (opensource@telekom.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.telekom.phonenumbernormalizer.extern.libphonenumber.PhoneNumberUtil + +import com.google.i18n.phonenumbers.PhoneNumberUtil +import com.google.i18n.phonenumbers.Phonenumber +import spock.lang.Specification + +import java.util.logging.Logger + + +// Plain Number Format: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/NP_Nummernraum.pdf?__blob=publicationFile&v=6 +// NDC with labels: https://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000510006PDFE.pdf +// Overview of special number ranges: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/start.html + +// Version 5.V.2020 of BenetzA number plan + + +class RFC3966_DE_NDCTest extends Specification { + + PhoneNumberUtil phoneUtil + + Logger logger = Logger.getLogger(RFC3966_DE_NDCTest.class.toString()) + + static final boolean LOGONLYUNEXPECTED = true + + def "setup"() { + this.phoneUtil = PhoneNumberUtil.getInstance() + System.setProperty("java.util.logging.SimpleFormatter.format", + "%4\$-7s: %5\$s %n") + } + + def logResult(result, expectedResult, expectingFail, number, regionCode) { + if (result != expectedResult) { + if (expectingFail) { + if (!LOGONLYUNEXPECTED) { + logger.info("RFC3966 is still not correctly extracting NDC from $number for region $regionCode, by giving class $result instead of class $expectedResult ") + } + } else { + logger.warning("RFC3966 is still not correctly extracting NDC from $number for region $regionCode, by giving class $result instead of class $expectedResult ") + } + } else { + if (expectingFail) { + logger.info("RFC3966 is now correctly extracting NDC from $number for region $regionCode, by giving class $expectedResult") + } + } + return true + } + + + def extractONKZ(String number, String regionCode) { + Phonenumber.PhoneNumber phoneNumber = phoneUtil.parse(number, regionCode) + String r = phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.RFC3966) + String[] rs = r.split("-") + String onkz = null; + if (rs.length>1) { + onkz = rs[1] + } + return onkz; + } + + def "check if original lib fixed RFC3966 for invalid German NDC 010 - 02999"(String number, regionCode, expectedResult, expectingFail) { + given: + + String[] numbersToTest = [ + number + "556", + number + "5566", + number + "55667", + number + "556677", + number + "5566778", + number + "55667788"] + + if (expectingFail == true) { + expectingFail = [true, true, true, true, true, true, true, true, true] + } + + if (expectingFail == false) { + expectingFail = [false, false, false, false, false, false, false, false, false] + } + + + when: + "get number RFC3966: $number" + String[] results = [] + for (int i = 0; i < numbersToTest.length; i++) { + String onkz = extractONKZ(numbersToTest[i], regionCode) + String eResult = number.substring(1) + if (onkz == null) { + results += "0" + } else { + if (eResult == onkz) { + results += "1" + } else { + results += "2" + } + + } + } + + then: + "is number expected: $expectedResult" + boolean extracted = false; + for (int i = 0; i < results.length; i++) { + + this.logResult(results[i], expectedResult, expectingFail[i], numbersToTest[i], regionCode) + } + + + where: + + number | regionCode | expectedResult | expectingFail + // short numbers which are reached internationally are also registered as NDC + // TODO: 010 is operator selection see https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/010/010xy_node.html ... will be canceled 31.12.2024 + "010" | "DE" | "0" | true + // --- + // 0110 is checked in Emergency short codes see above + // --- + "0111" | "DE" | "0" | true + // --- + // 0112 is checked in Emergency short codes see above + // --- + "0113" | "DE" | "0" | true + "0114" | "DE" | "0" | true + // --- + // 0115 is checked in German Government short codes see above + // --- + // --- + // 0116 is checked in EU social short codes see above + // --- + "0117" | "DE" | "0" | true + // --- + // 0118 is checked in German call assistant services see above + // --- + "0119" | "DE" | "0" | true + "012" | "DE" | "0" | true + "0120" | "DE" | "0" | true + "0121" | "DE" | "0" | true + "0122" | "DE" | "0" | true + "0123" | "DE" | "0" | true + "0124" | "DE" | "0" | true + "0125" | "DE" | "0" | true + "0126" | "DE" | "0" | true + "0127" | "DE" | "0" | true + "0128" | "DE" | "0" | true + "0129" | "DE" | "0" | true + "0130" | "DE" | "0" | true + "0131" | "DE" | "0" | true + "0132" | "DE" | "0" | true + "0133" | "DE" | "0" | true + "0134" | "DE" | "0" | true + "0135" | "DE" | "0" | true + "0136" | "DE" | "0" | true + // --- + // 0137 is checked in Mass Traffic see above + // --- + "0138" | "DE" | "0" | true + "0139" | "DE" | "0" | true + "014" | "DE" | "0" | true + "0140" | "DE" | "0" | true + "0141" | "DE" | "0" | true + "0142" | "DE" | "0" | true + "0143" | "DE" | "0" | true + "0144" | "DE" | "0" | true + "0145" | "DE" | "0" | true + "0146" | "DE" | "0" | true + "0147" | "DE" | "0" | true + "0148" | "DE" | "0" | true + "0149" | "DE" | "0" | true + // --- + // 015x is checked in Mobile 15 and 15 voicemail see above + // --- + // --- + // 016x: + // 0160, 0162, 0163 are checked in Mobile 16 and 16 voicemail + // 0161, 0165, 0166, 0167 are checked in Reserve 16 + // 0168, 0169 are checked in eMessage 16 - see https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/Funkruf/start.html and https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/np_nummernraum.pdf?__blob=publicationFile&v=1 + // TODO: 0164 eMessage length definition needed + // --- + // --- + // 017x is checked in Mobile 17 and 17 voicemail see above + // --- + // --- + // 0180 is checked in Service Numbers 0180 and its reserve + // --- + // --- + // 0181 is checked in international VPN 0181 + // --- + // --- + // 018(2-9) is checked in German national VPN 018(2-9) range and that it is only reachable nationally + // --- + "0190" | "DE" | "0" | true // Reserve - previously premium rate numbers, which were relocated to 0900 + // --- + // 019(1-4) is checked in German Online Services 019(1-4) inc. historic + // --- + "0195" | "DE" | "0" | true // Reserve + "0196" | "DE" | "0" | true // Reserve + "0197" | "DE" | "0" | true // Reserve + // --- + // Traffic management numbers are only valid between operators - so not for end customers to call + // --- + "01980" | "DE" | "0" | true // Reserve + // --- + // 01981 is checked in German traffic routing 01981 of mobile Emergency calls + // --- + // --- + // 01982 is checked in German traffic routing 01982 for emergency calls + // --- + "01983" | "DE" | "0" | true // Reserve + "01984" | "DE" | "0" | true // Reserve + "01985" | "DE" | "0" | true // Reserve + // --- + // 01986 is checked in German traffic routing 01986 for public service calls 115 + // --- + // --- + // 01987 is checked in German traffic routing 01987 for public EU service calls 116xyz + // --- + // --- + // 01988 is checked in German traffic routing 01988 for international freecalls + // --- + // --- + // 01989 is checked in Assistant Service Routing + // --- + // --- + // 0199 is checked in operator internal network traffic routing + // --- + // invalid area code for germany - using Invalid_Lenth, because its neither to long or short, but just NDC is not valid. + "0200" | "DE" | "0" | true + // 0201 is Essen + // 0202 is Wuppertal + // 0203 is Duisburg + "02040" | "DE" | "0" | true + // 02041 is Bottrop + "02042" | "DE" | "0" | true + // 02043 is Gladbeck + "02044" | "DE" | "0" | true + // 02045 is Bottrop-Kirchhellen + "02046" | "DE" | "0" | true + "02047" | "DE" | "0" | true + "02048" | "DE" | "0" | true + "02049" | "DE" | "0" | true + "02050" | "DE" | "0" | true + // 02051 till 02054 are in use + "02055" | "DE" | "0" | true + // 02056 is Heiligenhausen + "02057" | "DE" | "0" | true + // 02058 is Wülfrath + "02059" | "DE" | "0" | true + "02060" | "DE" | "0" | true + "02061" | "DE" | "0" | true + "02062" | "DE" | "0" | true + "02063" | "DE" | "0" | true + // 02064 till 02066 is in use + "02067" | "DE" | "0" | true + "02068" | "DE" | "0" | true + "02069" | "DE" | "0" | true + "0207" | "DE" | "0" | true + // 0208 & 0209 is in use + "02100" | "DE" | "0" | true + "02101" | "DE" | "0" | true + // 02102 till 02104 is in use + "02105" | "DE" | "0" | true + "02106" | "DE" | "0" | true + "02107" | "DE" | "0" | true + "02108" | "DE" | "0" | true + "02109" | "DE" | "0" | true + // special case 0212 for Solingen also covers 02129 for Haan Rheinl since Solingen may not use numbers starting with 9 + "02130" | "DE" | "0" | true + // 02131 till 02133 is in use + "02134" | "DE" | "0" | true + "02135" | "DE" | "0" | true + "02136" | "DE" | "0" | true + // 02137 is Neuss-Norf + "02138" | "DE" | "0" | true + "02139" | "DE" | "0" | true + // 0214 is Leverkusen + // 02150 till 02154 is in use + "02155" | "DE" | "0" | true + // 02156 till 02159 is in use + "02160" | "DE" | "0" | true + // 02161 till 02166 is in use + "02167" | "DE" | "0" | true + "02168" | "DE" | "0" | true + "02169" | "DE" | "0" | true + "02170" | "DE" | "0" | true + // 02171 is Leverkusen-Opladen + "02172" | "DE" | "0" | true + // 02173 till 02175 is in use + "02176" | "DE" | "0" | true + "02177" | "DE" | "0" | true + "02178" | "DE" | "0" | true + "02179" | "DE" | "0" | true + "02180" | "DE" | "0" | true + // 02181 till 02183 is in use + "02184" | "DE" | "0" | true + "02185" | "DE" | "0" | true + "02186" | "DE" | "0" | true + "02187" | "DE" | "0" | true + "02188" | "DE" | "0" | true + "02189" | "DE" | "0" | true + "02190" | "DE" | "0" | true + // 02191 till 02193 is in use + "02194" | "DE" | "0" | true + // 02195 till 02196 is in use + "02197" | "DE" | "0" | true + "02198" | "DE" | "0" | true + "02199" | "DE" | "0" | true + "02200" | "DE" | "0" | true + "02201" | "DE" | "0" | true + // 02202 till 02208 is in use + "02209" | "DE" | "0" | true + // 0221 is Köln + "02220" | "DE" | "0" | true + "02221" | "DE" | "0" | true + // 02222 till 02228 is in use + "02229" | "DE" | "0" | true + "02230" | "DE" | "0" | true + "02231" | "DE" | "0" | true + // 02232 till 02238 is in use + "02239" | "DE" | "0" | true + "02240" | "DE" | "0" | true + // 02241 till 02248 is in use + "02249" | "DE" | "0" | true + "02250" | "DE" | "0" | true + // 02251 till 02257 is in use + "02258" | "DE" | "0" | true + "02259" | "DE" | "0" | true + "02260" | "DE" | "0" | true + // 02261 till 02269 is in use + "02270" | "DE" | "0" | true + // 02271 till 02275 is in use + "02276" | "DE" | "0" | true + "02277" | "DE" | "0" | true + "02278" | "DE" | "0" | true + "02279" | "DE" | "0" | true + // 0228 is Bonn + "02290" | "DE" | "0" | true + // 02291 till 02297 is in use + "02298" | "DE" | "0" | true + "02299" | "DE" | "0" | true + "02300" | "DE" | "0" | true + // 02301 till 02309 is in use + // 0231 is Dortmund + "02320" | "DE" | "0" | true + "02321" | "DE" | "0" | true + "02322" | "DE" | "0" | true + // 02323 till 02325 is in use + "02326" | "DE" | "0" | true + // 02327 is Bochum-Wattenscheid + "02328" | "DE" | "0" | true + "02329" | "DE" | "0" | true + // 02330 till 02339 is in use + // 0234 is Bochum + "02350" | "DE" | "0" | true + // 02351 till 02355 is in use + "02356" | "DE" | "0" | true + // 02357 till 02358 is in use + // 02360 till 02369 is in use + "02370" | "DE" | "0" | true + // 02371 till 02375 is in use + "02376" | "DE" | "0" | true + // 02377 till 02379 is in use + "02380" | "DE" | "0" | true + // 02381 till 02385 is in use + "02386" | "DE" | "0" | true + // 02387 till 02389 is in use + "02390" | "DE" | "0" | true + // 02391 till 02395 is in use + "02396" | "DE" | "0" | true + "02397" | "DE" | "0" | true + "02398" | "DE" | "0" | true + "02399" | "DE" | "0" | true + "02400" | "DE" | "0" | true + // 02401 till 02409 is in use + // 0241 is Aachen + "02420" | "DE" | "0" | true + // 02421 till 02429 is in use + "02430" | "DE" | "0" | true + // 02431 till 02436 is in use + "02437" | "DE" | "0" | true + "02438" | "DE" | "0" | true + "02439" | "DE" | "0" | true + // 02440 till 02441 is in use + "02442" | "DE" | "0" | true + // 02443 till 02449 is in use + "02450" | "DE" | "0" | true + // 02451 till 02456 is in use + "02457" | "DE" | "0" | true + "02458" | "DE" | "0" | true + "02459" | "DE" | "0" | true + "02460" | "DE" | "0" | true + // 02461 till 02465 is in use + "02466" | "DE" | "0" | true + "02467" | "DE" | "0" | true + "02468" | "DE" | "0" | true + "02469" | "DE" | "0" | true + "02470" | "DE" | "0" | true + // 02471 till 02474 is in use + "02475" | "DE" | "0" | true + "02476" | "DE" | "0" | true + "02477" | "DE" | "0" | true + "02478" | "DE" | "0" | true + "02479" | "DE" | "0" | true + "02480" | "DE" | "0" | true + "02481" | "DE" | "0" | true + // 02482 is Hellenthal + "02483" | "DE" | "0" | true + // 02484 till 02486 is in use + "02487" | "DE" | "0" | true + "02488" | "DE" | "0" | true + "02489" | "DE" | "0" | true + "0249" | "DE" | "0" | true + "02500" | "DE" | "0" | true + // 02501 till 02502 is in use + "02503" | "DE" | "0" | true + // 02504 till 02509 is in use + // 0251 is Münster + // 02520 till 02529 is in use + "02530" | "DE" | "0" | true + "02531" | "DE" | "0" | true + // 02532 till 02536 is in use + "02531" | "DE" | "0" | true + // 02538 is Drensteinfurt-Rinkerode + "02539" | "DE" | "0" | true + "02540" | "DE" | "0" | true + // 02541 till 02543 is in use + "02544" | "DE" | "0" | true + // 02545 till 02548 is in use + "02549" | "DE" | "0" | true + "02550" | "DE" | "0" | true + // 02551 till 02558 is in use + "02559" | "DE" | "0" | true + "02560" | "DE" | "0" | true + // 02561 till 02568 is in use + "02569" | "DE" | "0" | true + "02570" | "DE" | "0" | true + // 02571 till 02575 is in use + "02576" | "DE" | "0" | true + "02577" | "DE" | "0" | true + "02578" | "DE" | "0" | true + "02579" | "DE" | "0" | true + "02580" | "DE" | "0" | true + // 02581 till 02588 is in use + "02589" | "DE" | "0" | true + // 02590 till 02599 is in use + "02600" | "DE" | "0" | true + // 02601 till 02608 is in use + "02609" | "DE" | "0" | true + // 0261 is Koblenz am Rhein + // 02620 till 02628 is in use + "02629" | "DE" | "0" | true + // 02630 till 02639 is in use + "02640" | "DE" | "0" | true + // 02641 till 02647 is in use + "02648" | "DE" | "0" | true + "02649" | "DE" | "0" | true + "02650" | "DE" | "0" | true + // 02651 till 02657 is in use + "02658" | "DE" | "0" | true + "02659" | "DE" | "0" | true + "02660" | "DE" | "0" | true + // 02661 till 02664 is in use + "02665" | "DE" | "0" | true + // 02666 till 02667 is in use + "02668" | "DE" | "0" | true + "02669" | "DE" | "0" | true + "02670" | "DE" | "0" | true + // 02671 till 02678 is in use + "02679" | "DE" | "0" | true + // 02680 till 02689 is in use + "02690" | "DE" | "0" | true + // 02691 till 02697 is in use + "02698" | "DE" | "0" | true + "02699" | "DE" | "0" | true + // 0271 is Siegen + "02720" | "DE" | "0" | true + // 02721 till 02725 is in use + "02726" | "DE" | "0" | true + "02727" | "DE" | "0" | true + "02728" | "DE" | "0" | true + "02729" | "DE" | "0" | true + "02730" | "DE" | "0" | true + "02731" | "DE" | "0" | true + // 02731 till 02739 is in use + "02740" | "DE" | "0" | true + // 02741 till 02745 is in use + "02746" | "DE" | "0" | true + // 02747 is Molzhain + "02748" | "DE" | "0" | true + "02749" | "DE" | "0" | true + // 02750 till 02755 is in use + "02756" | "DE" | "0" | true + "02757" | "DE" | "0" | true + // 02758 till 02759 is in use + "02760" | "DE" | "0" | true + // 02761 till 02764 is in use + "02765" | "DE" | "0" | true + "02766" | "DE" | "0" | true + "02767" | "DE" | "0" | true + "02768" | "DE" | "0" | true + "02769" | "DE" | "0" | true + // 02770 till 02779 is in use + "02780" | "DE" | "0" | true + // 02781 till 02784 is in use + "02785" | "DE" | "0" | true + "02786" | "DE" | "0" | true + "02787" | "DE" | "0" | true + "02788" | "DE" | "0" | true + "02789" | "DE" | "0" | true + "0279" | "DE" | "0" | true + "02790" | "DE" | "0" | true + "02791" | "DE" | "0" | true + "02792" | "DE" | "0" | true + "02793" | "DE" | "0" | true + "02794" | "DE" | "0" | true + "02795" | "DE" | "0" | true + "02796" | "DE" | "0" | true + "02797" | "DE" | "0" | true + "02798" | "DE" | "0" | true + "02799" | "DE" | "0" | true + "02800" | "DE" | "0" | true + // 02801 till 02804 is in use + "02805" | "DE" | "0" | true + "02806" | "DE" | "0" | true + "02807" | "DE" | "0" | true + "02808" | "DE" | "0" | true + "02809" | "DE" | "0" | true + // 0281 is Wesel + "02820" | "DE" | "0" | true + // 02821 till 02828 is in use + "02829" | "DE" | "0" | true + "02830" | "DE" | "0" | true + // 02831 till 02839 is in use + "02840" | "DE" | "0" | true + // 02841 till 02845 is in use + "02846" | "DE" | "0" | true + "02847" | "DE" | "0" | true + "02848" | "DE" | "0" | true + "02849" | "DE" | "0" | true + // 02850 till 02853 is in use + "02854" | "DE" | "0" | true + // 02855 till 02859 is in use + "02860" | "DE" | "0" | true + // 02861 till 02867 is in use + "02868" | "DE" | "0" | true + "02869" | "DE" | "0" | true + "02870" | "DE" | "0" | true + // 02871 till 02874 is in use + "02875" | "DE" | "0" | true + "02876" | "DE" | "0" | true + "02877" | "DE" | "0" | true + "02878" | "DE" | "0" | true + "02879" | "DE" | "0" | true + "0288" | "DE" | "0" | true + "0289" | "DE" | "0" | true + "02900" | "DE" | "0" | true + "02901" | "DE" | "0" | true + // 02902 till 02905 is in use + "02906" | "DE" | "0" | true + "02907" | "DE" | "0" | true + "02908" | "DE" | "0" | true + "02909" | "DE" | "0" | true + // 0291 is Meschede + "02920" | "DE" | "0" | true + // 02921 till 02925 is in use + "02926" | "DE" | "0" | true + // 02927 till 02928 is in use + "02929" | "DE" | "0" | true + "02930" | "DE" | "0" | true + // 02931 till 02935 is in use + "02936" | "DE" | "0" | true + // 02937 till 02938 is in use + "02939" | "DE" | "0" | true + "02940" | "DE" | "0" | true + // 02941 till 02945 is in use + "02946" | "DE" | "0" | true + // 02947 till 02948 is in use + "02949" | "DE" | "0" | true + "02950" | "DE" | "0" | true + // 02951 till 02955 is in use + "02956" | "DE" | "0" | true + // 02957 till 02958 is in use + "02959" | "DE" | "0" | true + "02960" | "DE" | "0" | true + // 02961 till 02964 is in use + "02965" | "DE" | "0" | true + "02966" | "DE" | "0" | true + "02967" | "DE" | "0" | true + "02968" | "DE" | "0" | true + "02969" | "DE" | "0" | true + "02970" | "DE" | "0" | true + // 02971 till 02975 is in use + "02976" | "DE" | "0" | true + // 02977 is Schmallenberg-Bödefeld + "02978" | "DE" | "0" | true + "02979" | "DE" | "0" | true + "02980" | "DE" | "0" | true + // 02981 till 02985 is in use + "02986" | "DE" | "0" | true + "02987" | "DE" | "0" | true + "02988" | "DE" | "0" | true + "02989" | "DE" | "0" | true + "02990" | "DE" | "0" | true + // 02991 till 02994 is in use + "02995" | "DE" | "0" | true + "02996" | "DE" | "0" | true + "02997" | "DE" | "0" | true + "02998" | "DE" | "0" | true + "02999" | "DE" | "0" | true + } + + def "check if original lib fixed RFC3966 for invalid German NDC 030 - 039999"(String number, regionCode, expectedResult, expectingFail) { + given: + + String[] numbersToTest = [ + number + "556", + number + "5566", + number + "55667", + number + "556677", + number + "5566778", + number + "55667788"] + + if (expectingFail == true) { + expectingFail = [true, true, true, true, true, true, true, true, true] + } + + if (expectingFail == false) { + expectingFail = [false, false, false, false, false, false, false, false, false] + } + + when: "get number RFC3966: $number" + String[] results = [] + for (int i = 0; i < numbersToTest.length; i++) { + String onkz = extractONKZ(numbersToTest[i], regionCode) + String eResult = number.substring(1) + if (onkz == null) { + results += "0" + } else { + if (eResult == onkz) { + results += "1" + } else { + results += "2" + } + + } + } + + + then: "is number expected: $expectedResult" + for (int i = 0; i < results.length; i++) { + this.logResult(results[i], expectedResult, expectingFail[i], numbersToTest[i], regionCode) + } + + + where: + + number | regionCode | expectedResult | expectingFail + // 030 is Berlin + // --- + // 0310 is checked in German test numbers 031x + // 0311 is checked in German test numbers 031x + // 0312 till 0319 is also checked in German test numbers 031x - TODO: by end of 2024 Call By Call is disabled in Germany, to be checked if Testnumbers are dropped then. + "0312" | "DE" | "0" | true + "0313" | "DE" | "0" | true + "0314" | "DE" | "0" | true + "0315" | "DE" | "0" | true + "0316" | "DE" | "0" | true + "0317" | "DE" | "0" | true + "0318" | "DE" | "0" | true + "0319" | "DE" | "0" | true + // --- + // --- + // 032 is checked in multiple 032 test (due to different blocks are only in use currently) see above + // --- + "03300" | "DE" | "0" | true + // 03301 till 03304 is in use + "033050" | "DE" | "0" | true + // 033051 till 033056 is in use + "033057" | "DE" | "0" | true + "033058" | "DE" | "0" | true + "033059" | "DE" | "0" | true + // 03306 till 03307 is in use + // 033080 is Marienthal Kreis Oberhavel + "033081" | "DE" | "0" | true + // 033082 till 033089 is in use + "033090" | "DE" | "0" | true + "033091" | "DE" | "0" | true + "033092" | "DE" | "0" | true + // 033093 till 033094 is in use + "033095" | "DE" | "0" | true + "033096" | "DE" | "0" | true + "033097" | "DE" | "0" | true + "033098" | "DE" | "0" | true + "033099" | "DE" | "0" | true + // 0331 is Potsdam + // 033200 till 033209 is in use + // 03321 is Nauen Brandenburg + // 03322 is Falkensee + // 033230 till 033235 is in use + "033236" | "DE" | "0" | true + // 033237 till 033239 is in use + "03324" | "DE" | "0" | true + "03325" | "DE" | "0" | true + "03326" | "DE" | "0" | true + // 03327 till 03329 is in use + "03330" | "DE" | "0" | true + // 03331 till 03332 is in use + "033330" | "DE" | "0" | true + // 033331 till 033338 is in use + "033339" | "DE" | "0" | true + // 03334 till 03335 is in use + "033360" | "DE" | "0" | true + // 033361 till 033369 is in use + // 03337 till 03338 is in use + "033390" | "DE" | "0" | true + "033391" | "DE" | "0" | true + "033392" | "DE" | "0" | true + // 033393 till 033398 is in use + "033399" | "DE" | "0" | true + "03340" | "DE" | "0" | true + // 03341 till 03342 is in use + "033430" | "DE" | "0" | true + "033431" | "DE" | "0" | true + // 033432 till 033439 is in use + // 03344 is Bad Freienwalde + "033450" | "DE" | "0" | true + // 033451 till 033452 is in use + "033453" | "DE" | "0" | true + // 033454 is Wölsickendorf/Wollenberg + "033455" | "DE" | "0" | true + // 033456 till 033458 is in use + "033459" | "DE" | "0" | true + // 03346 is Seelow + // 033470 is Lietzen + "033471" | "DE" | "0" | true + // 033472 till 033479 is in use + // 0335 is Frankfurt (Oder) + "033600" | "DE" | "0" | true + // 033601 till 033609 is in use + // 03361 till 03362 is in use + "033630" | "DE" | "0" | true + // 033631 till 033638 is in use + "033639" | "DE" | "0" | true + // 03364 is Eisenhüttenstadt + "033650" | "DE" | "0" | true + "033651" | "DE" | "0" | true + // 033652 till 033657 is in use + "033658" | "DE" | "0" | true + "033659" | "DE" | "0" | true + // 03366 is Beeskow + "033670" | "DE" | "0" | true + // 033671 till 033679 is in use + "03368" | "DE" | "0" | true + "03369" | "DE" | "0" | true + "033700" | "DE" | "0" | true + // 033701 till 033704 is in use + "033705" | "DE" | "0" | true + "033706" | "DE" | "0" | true + "033707" | "DE" | "0" | true + // 033708 is Rangsdorf + "033709" | "DE" | "0" | true + // 03371 till 03372 is in use + "033730" | "DE" | "0" | true + // 033731 till 033734 is in use + "033735" | "DE" | "0" | true + "033736" | "DE" | "0" | true + "033737" | "DE" | "0" | true + "033738" | "DE" | "0" | true + "033739" | "DE" | "0" | true + "033740" | "DE" | "0" | true + // 033741 till 033748 is in use + "033749" | "DE" | "0" | true + // 03375 is Königs Wusterhausen + // 33760 is Münchehofe Kreis Dahme-Spreewald + "033761" | "DE" | "0" | true + // 033762 till 033769 is in use + // 03377 till 03379 is in use + "03380" | "DE" | "0" | true + // 03381 till 03382 is in use + // 033830 till 033839 is in use + "033840" | "DE" | "0" | true + // 033841 is Belzig + "033842" | "DE" | "0" | true + // 033843 till 033849 is in use + // 03385 till 03386 is in use + // 033870 is Zollchow bei Rathenow + "033871" | "DE" | "0" | true + // 033872 till 033878 is in use + "033879" | "DE" | "0" | true + "03388" | "DE" | "0" | true + "03389" | "DE" | "0" | true + "03390" | "DE" | "0" | true + // 03391 is Neuruppin + // 033920 till 033929 is in use + "033930" | "DE" | "0" | true + // 033931 till 033933 is in use + "033934" | "DE" | "0" | true + "033935" | "DE" | "0" | true + "033936" | "DE" | "0" | true + "033937" | "DE" | "0" | true + "033938" | "DE" | "0" | true + "033939" | "DE" | "0" | true + // 03394 till 03395 is in use + "033960" | "DE" | "0" | true + "033961" | "DE" | "0" | true + // 033962 till 033969 is in use + // 033970 till 033979 is in use + "033980" | "DE" | "0" | true + // 033981 till 033984 is in use + "033985" | "DE" | "0" | true + // 033986 is Falkenhagen Kreis Prignitz + "033987" | "DE" | "0" | true + "033988" | "DE" | "0" | true + // 033989 is Sadenbeck + "03399" | "DE" | "0" | true + // 0340 till 0341 is in use + "034200" | "DE" | "0" | true + "034201" | "DE" | "0" | true + // 034202 till 034208 is in use + "034209" | "DE" | "0" | true + // 03421 is Torgau + "034220" | "DE" | "0" | true + // 034221 till 034224 is in use + "034225" | "DE" | "0" | true + "034226" | "DE" | "0" | true + "034227" | "DE" | "0" | true + "034228" | "DE" | "0" | true + "034229" | "DE" | "0" | true + // 03423 is Eilenburg + "034240" | "DE" | "0" | true + // 034241 till 034244 is in use + "034245" | "DE" | "0" | true + "034246" | "DE" | "0" | true + "034247" | "DE" | "0" | true + "034248" | "DE" | "0" | true + "034249" | "DE" | "0" | true + // 03425 is Wurzen + "034260" | "DE" | "0" | true + // 034261 till 034263 is in use + "03427" | "DE" | "0" | true + "03428" | "DE" | "0" | true + "034290" | "DE" | "0" | true + // 034291 till 034293 is in use + "03430" | "DE" | "0" | true + // 03431 is Döbeln + "034320" | "DE" | "0" | true + // 034321 till 034322 is in use + "034323" | "DE" | "0" | true + // 034324 till 034325 is in use + "034326" | "DE" | "0" | true + // 034327 till 034328 is in use + "034329" | "DE" | "0" | true + // 03433 is Borna Stadt + "034340" | "DE" | "0" | true + // 034341 till 034348 is in use + "034349" | "DE" | "0" | true + // 03435 is Oschatz + "034360" | "DE" | "0" | true + // 034361 till 034364 is in use + "034365" | "DE" | "0" | true + "034366" | "DE" | "0" | true + "034367" | "DE" | "0" | true + "034368" | "DE" | "0" | true + "034369" | "DE" | "0" | true + // 03437 is Grimma + "034380" | "DE" | "0" | true + // 034381 till 034386 is in use + "034387" | "DE" | "0" | true + "034388" | "DE" | "0" | true + "034389" | "DE" | "0" | true + "03439" | "DE" | "0" | true + "03440" | "DE" | "0" | true + // 03441 is Zeitz + "034420" | "DE" | "0" | true + "034421" | "DE" | "0" | true + // 034422 till 034426 is in use + "034427" | "DE" | "0" | true + "034428" | "DE" | "0" | true + "034429" | "DE" | "0" | true + // 03443 is Weissenfels Sachsen-Anhalt + "034440" | "DE" | "0" | true + // 034441 is Hohenmölsen + "034442" | "DE" | "0" | true + // 034443 till 034446 is in use + "034447" | "DE" | "0" | true + "034448" | "DE" | "0" | true + "034449" | "DE" | "0" | true + // 03445 is Naumburg Saale + "034460" | "DE" | "0" | true + // 034461 till 034467 is in use + "034468" | "DE" | "0" | true + "034469" | "DE" | "0" | true + // 03447 till 03448 is in use + "034490" | "DE" | "0" | true + // 034491 till 034498 is in use + "034499" | "DE" | "0" | true + // 0345 is Halle Saale + // 034600 toll 034607 is in use + "034608" | "DE" | "0" | true + // 034609 is Salzmünde + // 03461 till 03462 is in use + "034630" | "DE" | "0" | true + "034631" | "DE" | "0" | true + // 034632 till 034633 is in use + "034634" | "DE" | "0" | true + // 034635 till 034639 is in use + // 03464 is Sangerhausen + "034650" | "DE" | "0" | true + // 034651 till 034654 is in use + "034655" | "DE" | "0" | true + // 034656 is Wallhausen Sachsen-Anhalt + "034657" | "DE" | "0" | true + // 034658 till 034659 is in use + // 03466 is Artern Unstrut + "034670" | "DE" | "0" | true + // 034671 till 034673 is in use + "034674" | "DE" | "0" | true + "034675" | "DE" | "0" | true + "034676" | "DE" | "0" | true + "034677" | "DE" | "0" | true + "034678" | "DE" | "0" | true + "034679" | "DE" | "0" | true + "03468" | "DE" | "0" | true + "034690" | "DE" | "0" | true + // 034691 till 034692 is in use + "034693" | "DE" | "0" | true + "034694" | "DE" | "0" | true + "034695" | "DE" | "0" | true + "034696" | "DE" | "0" | true + "034697" | "DE" | "0" | true + "034698" | "DE" | "0" | true + "034699" | "DE" | "0" | true + "03470" | "DE" | "0" | true + // 03471 is Bernburg Saale + "034720" | "DE" | "0" | true + // 034721 till 034722 is in use + "034723" | "DE" | "0" | true + "034724" | "DE" | "0" | true + "034725" | "DE" | "0" | true + "034726" | "DE" | "0" | true + "034727" | "DE" | "0" | true + "034728" | "DE" | "0" | true + "034729" | "DE" | "0" | true + // 3473 is Aschersleben Sachsen-Anhalt + "034740" | "DE" | "0" | true + // 034741 till 034743 is in use + "034744" | "DE" | "0" | true + // 034745 till 034746 is in use + "034747" | "DE" | "0" | true + "034748" | "DE" | "0" | true + "034749" | "DE" | "0" | true + // 03475 till 03476 is in use + "034770" | "DE" | "0" | true + // 034771 till 034776 is in use + "034777" | "DE" | "0" | true + "034778" | "DE" | "0" | true + // 034779 is Abberode + "034780" | "DE" | "0" | true + // 034781 till 034783 is in use + "034784" | "DE" | "0" | true + // 034785 is Sandersleben + "034786" | "DE" | "0" | true + "034787" | "DE" | "0" | true + "034788" | "DE" | "0" | true + "034789" | "DE" | "0" | true + "03479" | "DE" | "0" | true + "0348" | "DE" | "0" | true + "034900" | "DE" | "0" | true + // 034901 is Roßlau Elbe + "034902" | "DE" | "0" | true + // 034903 till 034907 + "034908" | "DE" | "0" | true + // 034909 is Aken Elbe + // 03491 till 03494 (yes full 03492x is used, too) is in use + "034950" | "DE" | "0" | true + "034951" | "DE" | "0" | true + "034952" | "DE" | "0" | true + // 034953 till 034956 + "034957" | "DE" | "0" | true + "034958" | "DE" | "0" | true + "034959" | "DE" | "0" | true + // 03496 is Köthen Anhalt + "034970" | "DE" | "0" | true + "034971" | "DE" | "0" | true + "034972" | "DE" | "0" | true + // 034973 is Osternienburg + "034974" | "DE" | "0" | true + // 034975 till 034979 is in use + "03498" | "DE" | "0" | true + "03499" | "DE" | "0" | true + "03500" | "DE" | "0" | true + // 03501 is Pirna + "035029" | "DE" | "0" | true + "035030" | "DE" | "0" | true + "035031" | "DE" | "0" | true + // 035032 till 035033 is in use + "035034" | "DE" | "0" | true + "035035" | "DE" | "0" | true + "035036" | "DE" | "0" | true + "035038" | "DE" | "0" | true + "035038" | "DE" | "0" | true + "035039" | "DE" | "0" | true + // 03504 is Dippoldiswalde + "035050" | "DE" | "0" | true + "035051" | "DE" | "0" | true + // 035052 till 035058 + "035059" | "DE" | "0" | true + "03506" | "DE" | "0" | true + "03507" | "DE" | "0" | true + "03508" | "DE" | "0" | true + "03509" | "DE" | "0" | true + // 0351 is Dresden + // 03520x till 03525 is in use (inclusive complete 03524x) + "035260" | "DE" | "0" | true + "035261" | "DE" | "0" | true + "035262" | "DE" | "0" | true + // 035263 till 035268 + "035269" | "DE" | "0" | true + "03527" | "DE" | "0" | true + // 03529 till 03529 is in use + "03530" | "DE" | "0" | true + // 03531 is Finsterwalde + "035320" | "DE" | "0" | true + "035321" | "DE" | "0" | true + // 035322 till 035327 + "035328" | "DE" | "0" | true + // 035329 is Dollenchen + // 03533 is Elsterwerda + "035340" | "DE" | "0" | true + // 035341 till 035343 + "035344" | "DE" | "0" | true + "035345" | "DE" | "0" | true + "035346" | "DE" | "0" | true + "035347" | "DE" | "0" | true + "035348" | "DE" | "0" | true + "035349" | "DE" | "0" | true + // 03535 is Herzberg Elster + "035360" | "DE" | "0" | true + // 035361 till 035365 is in use + "035366" | "DE" | "0" | true + "035367" | "DE" | "0" | true + "035369" | "DE" | "0" | true + "035369" | "DE" | "0" | true + // 03537 is Jessen Elster + "035380" | "DE" | "0" | true + "035381" | "DE" | "0" | true + "035382" | "DE" | "0" | true + // 035383 till 035389 is in use + "03539" | "DE" | "0" | true + "03540" | "DE" | "0" | true + // 03541 till 03542 is in use + "035430" | "DE" | "0" | true + "035431" | "DE" | "0" | true + "035432" | "DE" | "0" | true + // 035433 till 035436 is in use + "035437" | "DE" | "0" | true + "035438" | "DE" | "0" | true + // 035439 is Zinnitz + // 03544 is Luckau Brandenburg + "035450" | "DE" | "0" | true + // 035451 till 035456 is in use + "035457" | "DE" | "0" | true + "035458" | "DE" | "0" | true + "035459" | "DE" | "0" | true + // 03546 is Lübben Spreewald + "035470" | "DE" | "0" | true + // 035471 till 035478 is in use + "035479" | "DE" | "0" | true + "03548" | "DE" | "0" | true + "03549" | "DE" | "0" | true + // 0355 is Cottbus + // 03560x till 03564 is in use + "03565" | "DE" | "0" | true + "03566" | "DE" | "0" | true + "03567" | "DE" | "0" | true + "03568" | "DE" | "0" | true + "035690" | "DE" | "0" | true + // 035691 till 035698 is in use + "035699" | "DE" | "0" | true + "03570" | "DE" | "0" | true + // 03571 is Hoyerswerda + "035720" | "DE" | "0" | true + "035721" | "DE" | "0" | true + // 035722 till 035728 is in use + "035729" | "DE" | "0" | true + // 03573 till 03574 is in use + "035750" | "DE" | "0" | true + // 035751 till 035756 is in use + "035757" | "DE" | "0" | true + "035758" | "DE" | "0" | true + "035759" | "DE" | "0" | true + // 03576 is Weisswasser + "035770" | "DE" | "0" | true + // 035771 till 035775 is in use + "035776" | "DE" | "0" | true + "035777" | "DE" | "0" | true + "035778" | "DE" | "0" | true + "035779" | "DE" | "0" | true + // 03578 is Kamenz + "035790" | "DE" | "0" | true + "035791" | "DE" | "0" | true + // 035792 till 035793 is in use + "035794" | "DE" | "0" | true + // 035795 till 035797 is in use + "035798" | "DE" | "0" | true + "035799" | "DE" | "0" | true + "03580" | "DE" | "0" | true + // 03581 is Görlitz + // 035820 is Zodel + "035821" | "DE" | "0" | true + // 035822 till 035823 is in use + "035824" | "DE" | "0" | true + // 035825 till 035829 is in use + // 03583 is Zittau + "035840" | "DE" | "0" | true + // 035841 till 035844 is in use + "035845" | "DE" | "0" | true + "035846" | "DE" | "0" | true + "035847" | "DE" | "0" | true + "035848" | "DE" | "0" | true + "035849" | "DE" | "0" | true + // 03585 till 03586 is in use + "035870" | "DE" | "0" | true + "035871" | "DE" | "0" | true + // 035872 till 035877 is in use + "035878" | "DE" | "0" | true + "035879" | "DE" | "0" | true + // 03588 is Niesky + "035890" | "DE" | "0" | true + // 035891 till 0358595 is in use + "035896" | "DE" | "0" | true + "035897" | "DE" | "0" | true + "035898" | "DE" | "0" | true + "035899" | "DE" | "0" | true + "03590" | "DE" | "0" | true + // 03591 till 03594 (including total 03593x) is in use + "035950" | "DE" | "0" | true + // 035951 till 035955 is in use + "035956" | "DE" | "0" | true + "035957" | "DE" | "0" | true + "035958" | "DE" | "0" | true + "035959" | "DE" | "0" | true + // 03596 is Neustadt in Sachsen + "035970" | "DE" | "0" | true + // 035971 till 035975 is in use + "035976" | "DE" | "0" | true + "035977" | "DE" | "0" | true + "035978" | "DE" | "0" | true + "035979" | "DE" | "0" | true + "03598" | "DE" | "0" | true + "03599" | "DE" | "0" | true + "03600" | "DE" | "0" | true + // 03601 till 03603 (including total 03602x) is in use + "036040" | "DE" | "0" | true + // 036041 till 036043 is in use + "036044" | "DE" | "0" | true + "036045" | "DE" | "0" | true + "036046" | "DE" | "0" | true + "036047" | "DE" | "0" | true + "036048" | "DE" | "0" | true + "036049" | "DE" | "0" | true + // 03605 till 03606 is in use + "036070" | "DE" | "0" | true + // 036071 till 036072 is in use + "036073" | "DE" | "0" | true + // 036074 till 036077 is in use + "036078" | "DE" | "0" | true + "036079" | "DE" | "0" | true + "036080" | "DE" | "0" | true + // 036081 till 036085 is in use + "036086" | "DE" | "0" | true + // 036087 is Wüstheuterode + "036088" | "DE" | "0" | true + "036089" | "DE" | "0" | true + "03609" | "DE" | "0" | true + // 0361 is Erfurt + // 03620x till 03624 is in use + "036250" | "DE" | "0" | true + "036251" | "DE" | "0" | true + // 036252 till 036259 is in use + "03626" | "DE" | "0" | true + "03627" | "DE" | "0" | true + // 03628 till 03629 is in use + "03630" | "DE" | "0" | true + // 03631 till 03632 is in use + // 036330 till 036338 is in use + "036339" | "DE" | "0" | true + // 03634 till 03637x is in use + "03638" | "DE" | "0" | true + "03639" | "DE" | "0" | true + "03640" | "DE" | "0" | true + // 03641 is Jena + "036420" | "DE" | "0" | true + // 036421 till 036428 is in use + "036429" | "DE" | "0" | true + // 03643 till 03644 is in use + // 036450 till 036454 is in use + "036455" | "DE" | "0" | true + "036456" | "DE" | "0" | true + "036457" | "DE" | "0" | true + // 036458 till 036459 is in use + "036460" | "DE" | "0" | true + // 036461 till 036465 is in use + "036466" | "DE" | "0" | true + "036467" | "DE" | "0" | true + "036468" | "DE" | "0" | true + "036469" | "DE" | "0" | true + // 03647 is Pößneck + "036480" | "DE" | "0" | true + // 036481 till 036484 is in use + "036485" | "DE" | "0" | true + "036486" | "DE" | "0" | true + "036487" | "DE" | "0" | true + "036488" | "DE" | "0" | true + "036489" | "DE" | "0" | true + "03649" | "DE" | "0" | true + // 0365 is Gera + "036600" | "DE" | "0" | true + // 036601 till 036608 is in use + "036609" | "DE" | "0" | true + // 03661 is Greiz + "036620" | "DE" | "0" | true + // 036621 till 036626 is in use + "036627" | "DE" | "0" | true + // 036628 is Zeulenroda + "036629" | "DE" | "0" | true + // 03663 is Schleiz + // 036640 is Remptendorf + "036641" | "DE" | "0" | true + // 036642 till 036649 is in use + "036650" | "DE" | "0" | true + // 036651 till 036653 is in use + "036654" | "DE" | "0" | true + "036655" | "DE" | "0" | true + "036656" | "DE" | "0" | true + "036657" | "DE" | "0" | true + "036658" | "DE" | "0" | true + "036659" | "DE" | "0" | true + "03666" | "DE" | "0" | true + "03667" | "DE" | "0" | true + "03668" | "DE" | "0" | true + "036690" | "DE" | "0" | true + // 036691 till 036695 is in use + "036696" | "DE" | "0" | true + "036697" | "DE" | "0" | true + "036698" | "DE" | "0" | true + "036699" | "DE" | "0" | true + "036700" | "DE" | "0" | true + // 036701 till 036705 is in use + "036706" | "DE" | "0" | true + "036707" | "DE" | "0" | true + "036708" | "DE" | "0" | true + "036709" | "DE" | "0" | true + // 03671 till 03673x is in use + "036740" | "DE" | "0" | true + // 036741 till 03644 is in use + "036745" | "DE" | "0" | true + "036746" | "DE" | "0" | true + "036747" | "DE" | "0" | true + "036748" | "DE" | "0" | true + "036749" | "DE" | "0" | true + // 03675 is Heubisch + "036760" | "DE" | "0" | true + // 036761 till 036762 is in use + "036763" | "DE" | "0" | true + // 036764 is Neuhaus-Schierschnitz + "036765" | "DE" | "0" | true + // 036766 is SChalkau + "036767" | "DE" | "0" | true + "036768" | "DE" | "0" | true + "036769" | "DE" | "0" | true + // 03677 is Ilmenau Thüringen + "036780" | "DE" | "0" | true + // 036781 till 036785 is in use + "036786" | "DE" | "0" | true + "036787" | "DE" | "0" | true + "036788" | "DE" | "0" | true + "036789" | "DE" | "0" | true + // 03679 is Suhl + "03680" | "DE" | "0" | true + // 03681 till 03686 (inlcuding total 03684x) is in use + // 036870 till 036871 is in use + "036872" | "DE" | "0" | true + // 036873 till 036875 is in use + "036876" | "DE" | "0" | true + "036877" | "DE" | "0" | true + // 036878 is Oberland + "036879" | "DE" | "0" | true + "03688" | "DE" | "0" | true + "03689" | "DE" | "0" | true + "03690" | "DE" | "0" | true + // 036891 till 03693 (including total 036892x) is in use + // 0368940 till 0368941 is in use + "036942" | "DE" | "0" | true + // 0368943 till 0368949 is in use + // 03695 is Bad Salzungen + "036960" | "DE" | "0" | true + // 036961 till 036969 is in use + "03697" | "DE" | "0" | true + "03698" | "DE" | "0" | true + "03699" | "DE" | "0" | true + "0370" | "DE" | "0" | true + // 0371 is Chemnitz Sachsen + // 037200 is Wittgensdorf bei Chemnitz + "037201" | "DE" | "0" | true + // 037202 till 03724 is in use + "037205" | "DE" | "0" | true + // 037206 till 037209 is in use + // 03721 till 03727 is in use + "03728" | "DE" | "0" | true + "037290" | "DE" | "0" | true + // 037291 till 037298 is in use + "037299" | "DE" | "0" | true + "03730" | "DE" | "0" | true + // 03731 till 03733 (including total 03732x) is in use + "037340" | "DE" | "0" | true + // 037341 till 037344 is in use + "037345" | "DE" | "0" | true + // 037346 till 037349 is in use + // 03735 till 03737 (including total 03736x) is in use + "037380" | "DE" | "0" | true + // 037381 till 037384 is in use + "037385" | "DE" | "0" | true + "037386" | "DE" | "0" | true + "037387" | "DE" | "0" | true + "037388" | "DE" | "0" | true + "037389" | "DE" | "0" | true + "03739" | "DE" | "0" | true + "03740" | "DE" | "0" | true + // 03741 is Plauen + "037420" | "DE" | "0" | true + // 037421 till 037423 is in use + "037424" | "DE" | "0" | true + "037425" | "DE" | "0" | true + "037426" | "DE" | "0" | true + "037427" | "DE" | "0" | true + "037428" | "DE" | "0" | true + "037429" | "DE" | "0" | true + // 03473x till 03745 is in use + "037460" | "DE" | "0" | true + "037461" | "DE" | "0" | true + // 037462 till 037465 is in use + "037466" | "DE" | "0" | true + // 037467 till 037468 is in use + "037469" | "DE" | "0" | true + "03747" | "DE" | "0" | true + "03748" | "DE" | "0" | true + "03749" | "DE" | "0" | true + // 0375 is Zwickau + // 03760x till 03765 is in use + "03766" | "DE" | "0" | true + "03767" | "DE" | "0" | true + "03768" | "DE" | "0" | true + "03769" | "DE" | "0" | true + "03770" | "DE" | "0" | true + // 03771 till 03774 is in use + "037750" | "DE" | "0" | true + "037751" | "DE" | "0" | true + // 037752 is Eibenstock + "037753" | "DE" | "0" | true + // 037754 till 037757 + "037758" | "DE" | "0" | true + "037759" | "DE" | "0" | true + "03776" | "DE" | "0" | true + "03777" | "DE" | "0" | true + "03778" | "DE" | "0" | true + "03779" | "DE" | "0" | true + "0378" | "DE" | "0" | true + "0379" | "DE" | "0" | true + "0380" | "DE" | "0" | true + // 0381 is Rostock + "038200" | "DE" | "0" | true + // 038201 till 038209 + // 03821 till 03822x + "038230" | "DE" | "0" | true + // 038231 till 038234 + "038235" | "DE" | "0" | true + "038236" | "DE" | "0" | true + "038237" | "DE" | "0" | true + "038238" | "DE" | "0" | true + "038239" | "DE" | "0" | true + "03824" | "DE" | "0" | true + "03825" | "DE" | "0" | true + "03826" | "DE" | "0" | true + "03827" | "DE" | "0" | true + "03828" | "DE" | "0" | true + "038290" | "DE" | "0" | true + "038291" | "DE" | "0" | true + // 038292 till 038297 is in use + "038298" | "DE" | "0" | true + "038299" | "DE" | "0" | true + // 03830x till 03831 is in use + // 038320 till 038328 is in use + "038329" | "DE" | "0" | true + "038330" | "DE" | "0" | true + // 08331 till 038334 is in use + "038335" | "DE" | "0" | true + "038336" | "DE" | "0" | true + "038337" | "DE" | "0" | true + "038338" | "DE" | "0" | true + "038339" | "DE" | "0" | true + // 03834 is Greifswald + "038350" | "DE" | "0" | true + // 038351 till 038356 is in use + "038357" | "DE" | "0" | true + "038358" | "DE" | "0" | true + "038359" | "DE" | "0" | true + // 03836 till 03838 (including total 03837x) is in use + "038390" | "DE" | "0" | true + // 038391 till 038393 is in use + "038394" | "DE" | "0" | true + "038395" | "DE" | "0" | true + "038396" | "DE" | "0" | true + "038397" | "DE" | "0" | true + "038398" | "DE" | "0" | true + "038399" | "DE" | "0" | true + "03840" | "DE" | "0" | true + // 03841 id Neukloster + "038420" | "DE" | "0" | true + "038421" | "DE" | "0" | true + // 038422 till 038429 + // 03843 till 03845x is in use + "038460" | "DE" | "0" | true + // 038461 till 038462 is in use + "038463" | "DE" | "0" | true + // 038464 is Bernitt + "038465" | "DE" | "0" | true + // 038466 is Jürgenshagen + "038467" | "DE" | "0" | true + "038468" | "DE" | "0" | true + "038469" | "DE" | "0" | true + // 03847 is Sternberg + "038480" | "DE" | "0" | true + // 038481 till 038486 is in use + "038487" | "DE" | "0" | true + // 038488 is Demen + "038489" | "DE" | "0" | true + "03849" | "DE" | "0" | true + // 0385 is Schwerin + // 03860 till 03861 is in use + "03862" | "DE" | "0" | true + // 03863 is Crivitz + "03864" | "DE" | "0" | true + // 03865 till 03869 is in use + "03870" | "DE" | "0" | true + // 03871 till 03872x is in use + "038730" | "DE" | "0" | true + // 038731 till 038733 is in use + "038734" | "DE" | "0" | true + // 038735 till 038738 is in use + "038739" | "DE" | "0" | true + // 03874 till 03877 (including total 03875x) is in use + // 038780 till 038785 is in use + "038786" | "DE" | "0" | true + // 038787 till 038789 is in use + "038790" | "DE" | "0" | true + // 038791 till 038794 + "038795" | "DE" | "0" | true + // 038796 till 038797 + "038798" | "DE" | "0" | true + "038799" | "DE" | "0" | true + "03880" | "DE" | "0" | true + // 03881 is Grevesmühlen + "038820" | "DE" | "0" | true + // 038821 till 038828 is in use + "038829" | "DE" | "0" | true + // 03883 is Hagenow + "038840" | "DE" | "0" | true + // 038841 till 038845 is in use + "038846" | "DE" | "0" | true + // 038847 till 038848 is in use + "038849" | "DE" | "0" | true + // 038850 till 038856 is in use + "038857" | "DE" | "0" | true + // 038858 till 038859 is in use + // 03886 is Gadebusch + "038870" | "DE" | "0" | true + // 038871 till 038876 is in use + "038877" | "DE" | "0" | true + "038878" | "DE" | "0" | true + "038879" | "DE" | "0" | true + "03888" | "DE" | "0" | true + "03889" | "DE" | "0" | true + "0389" | "DE" | "0" | true + // 03900x till 03905x (including total 03903x) is in use + "039060" | "DE" | "0" | true + // 039061 till 039062 is in use + "039063" | "DE" | "0" | true + "039064" | "DE" | "0" | true + "039065" | "DE" | "0" | true + "039066" | "DE" | "0" | true + "039067" | "DE" | "0" | true + "039068" | "DE" | "0" | true + "039069" | "DE" | "0" | true + // 03907 till 03909 (including total 03908x) is in use + // 0391 is Magdeburg + // 03920x till 03921 is in use + "039220" | "DE" | "0" | true + // 039221 till 039226 is in use + "039227" | "DE" | "0" | true + "039228" | "DE" | "0" | true + "039229" | "DE" | "0" | true + // 03923 is Zerbst + "039240" | "DE" | "0" | true + // 039241 till 039248 is in use + "0392498" | "DE" | false | true + // 03925 is Stassfurt + "039260" | "DE" | "0" | true + "039261" | "DE" | "0" | true + // 039262 till 039268 is in use + "039269" | "DE" | "0" | true + "03927" | "DE" | "0" | true + // 03928 is Schönebeck Elbe + "039290" | "DE" | "0" | true + // 039291 till 039298 is in use + "039299" | "DE" | "0" | true + "03930" | "DE" | "0" | true + // 03931 is Stendal + // 039320 till 039325 is in use + "039326" | "DE" | "0" | true + // 039327 till 039329 is in use + // 03933 is Genthin + "039340" | "DE" | "0" | true + // 039341 till 039349 is in use + // 03935 is Tangerhütte + "039360" | "DE" | "0" | true + // 039361 till 039366 is in use + "039367" | "DE" | "0" | true + "039368" | "DE" | "0" | true + "039369" | "DE" | "0" | true + // 03937 is Osterburg Altmark + "039380" | "DE" | "0" | true + "039381" | "DE" | "0" | true + // 039382 till 039384 is in use + "039385" | "DE" | "0" | true + // 039386 till 039389 is in use + // total 03939x is in use + // 03940x till 03941 is in use + "039420" | "DE" | "0" | true + // 039421 till 039428 is in use + "039429" | "DE" | "0" | true + // 03943 till 03944 is in use + "039450" | "DE" | "0" | true + // 039451 till 039459 is in use + // 03946 till 03947 is in use + "039480" | "DE" | "0" | true + // 039481 till 039485 is in use + "039486" | "DE" | "0" | true + // 039487 till 039489 is in use + // 03949 is Oschersleben Bode + // 0395 is Zwiedorf + // 039600 till 039608 is in use + "039609" | "DE" | "0" | true + // 03961 till 03969 is in use + "03970" | "DE" | "0" | true + // 03971 is Anklam + "039720" | "DE" | "0" | true + // 039721 till 039724 is in use + "039725" | "DE" | "0" | true + // 039726 till 039728 is in use + "039729" | "DE" | "0" | true + // 03973 till 03974x is in use + "039750" | "DE" | "0" | true + // 039751 till 039754 is in use + "039755" | "DE" | "0" | true + "039756" | "DE" | "0" | true + "039757" | "DE" | "0" | true + "039758" | "DE" | "0" | true + "039759" | "DE" | "0" | true + // 03976 is Torgelow bei Uckermünde + "039770" | "DE" | "0" | true + // 039771 till 039779 is in use + "03980" | "DE" | "0" | true + // 03981 to 03982x is in use + "039830" | "DE" | "0" | true + // 039831 till 039833 is in use + "039834" | "DE" | "0" | true + "039835" | "DE" | "0" | true + "039836" | "DE" | "0" | true + "039837" | "DE" | "0" | true + "039838" | "DE" | "0" | true + "039839" | "DE" | "0" | true + // 03984 is Prenzlau + "039850" | "DE" | "0" | true + // 039851 till 039859 is in use + "039860" | "DE" | "0" | true + // 039861 till 039863 is in use + "039863" | "DE" | "0" | true + "039864" | "DE" | "0" | true + "039865" | "DE" | "0" | true + "039866" | "DE" | "0" | true + "039867" | "DE" | "0" | true + "039868" | "DE" | "0" | true + "039869" | "DE" | "0" | true + // 03987 is Templin + "039880" | "DE" | "0" | true + // 039881 till 039889 is in use + "03989" | "DE" | "0" | true + "03990" | "DE" | "0" | true + // 03991 is Waren Müritz + "039920" | "DE" | "0" | true + // 039921 till 039929 is in use + "039930" | "DE" | "0" | true + // 039931 till 039934 is in use + "039935" | "DE" | "0" | true + "039936" | "DE" | "0" | true + "039937" | "DE" | "0" | true + "039938" | "DE" | "0" | true + "039939" | "DE" | "0" | true + // 03994 is Malchin + "039950" | "DE" | "0" | true + // 039951 till 039957 is in use + "039958" | "DE" | "0" | true + // 039959 is Dargun + // 03996 is Teterow + "039970" | "DE" | "0" | true + // 039971 till 039973 is in use + "039974" | "DE" | "0" | true + // 039975 till 039978 + "039979" | "DE" | "0" | true + // 03998 is Demmin + "039990" | "DE" | "0" | true + // 039991 till 039999 is in use + } + + def "check if original lib fixed RFC3966 for invalid German NDC 040 - 069"(String number, regionCode, expectedResult, expectingFail) { + given: + + String[] numbersToTest = [ + number + "556", + number + "5566", + number + "55667", + number + "556677", + number + "5566778", + number + "55667788"] + + if (expectingFail == true) { + expectingFail = [true, true, true, true, true, true, true, true, true] + } + + if (expectingFail == false) { + expectingFail = [false, false, false, false, false, false, false, false, false] + } + + when: "get number RFC3966: $number" + String[] results = [] + for (int i = 0; i < numbersToTest.length; i++) { + String onkz = extractONKZ(numbersToTest[i], regionCode) + String eResult = number.substring(1) + if (onkz == null) { + results += "0" + } else { + if (eResult == onkz) { + results += "1" + } else { + results += "2" + } + + } + } + + + then: "is number expected: $expectedResult" + for (int i = 0; i < results.length; i++) { + this.logResult(results[i], expectedResult, expectingFail[i], numbersToTest[i], regionCode) + } + + + where: + + number | regionCode | expectedResult | expectingFail + // 040 is Hamburg + "04100" | "DE" | "0" | true + // 04101 till 04109 is in use + "0411" | "DE" | "0" | true + // total 0412x is in use + "04130" | "DE" | "0" | true + // 04131 till 04139 is in use + // 04140 till 04144 is in use + "04145" | "DE" | "0" | true + // 04146 is Stade-Bützfleth + "04147" | "DE" | "0" | true + // 04148 till 04149 is in use + "04150" | "DE" | "0" | true + // 04151 till 04156 is in use + "04157" | "DE" | "0" | true + // 04158 till 04159 is in use + "04160" | "DE" | "0" | true + // 04161 till 04169 is in use + "04170" | "DE" | "0" | true + // 04171 till 04179 is in use + // total 0418x is in sue + "04190" | "DE" | "0" | true + // 04191 till 04195 is in use + "04196" | "DE" | "0" | true + "04197" | "DE" | "0" | true + "04198" | "DE" | "0" | true + "04199" | "DE" | "0" | true + "04200" | "DE" | "0" | true + "04201" | "DE" | "0" | true + // 04202 till 04209 is in use + // 0421 is Bremen + "04220" | "DE" | "0" | true + // 04221 till 04224 is in use + "04225" | "DE" | "0" | true + "04226" | "DE" | "0" | true + "04227" | "DE" | "0" | true + "04228" | "DE" | "0" | true + "04229" | "DE" | "0" | true + // 0423x till 0424x is in use + "04250" | "DE" | "0" | true + // 04251 till 04258 is in use + "04259" | "DE" | "0" | true + // total 0426x is in use + "04270" | "DE" | "0" | true + // 04271 till 04277 is in use + "04278" | "DE" | "0" | true + "04279" | "DE" | "0" | true + "04280" | "DE" | "0" | true + // 04281 till 04289 is in use + "04290" | "DE" | "0" | true + "04291" | "DE" | "0" | true + // 04292 till 04298 is in use + "04299" | "DE" | "0" | true + "04300" | "DE" | "0" | true + "04301" | "DE" | "0" | true + // 04302 till 04303 is in use + "04304" | "DE" | "0" | true + // 04305 is Westensee + "04306" | "DE" | "0" | true + // 04307 till 04308 is in use + "04309" | "DE" | "0" | true + // 0431 till 0433x (including total 0432x) is in use + // 04340 is Achterwehr + "04341" | "DE" | "0" | true + // 04342 till 04346 is in use + "04350" | "DE" | "0" | true + // 04351 till 04358 is in use + "04359" | "DE" | "0" | true + "04360" | "DE" | "0" | true + // 04361 till 04367 is in use + "04368" | "DE" | "0" | true + "04369" | "DE" | "0" | true + "04370" | "DE" | "0" | true + // 04371 till 04372 is in use + "04373" | "DE" | "0" | true + "04374" | "DE" | "0" | true + "04375" | "DE" | "0" | true + "04376" | "DE" | "0" | true + "04377" | "DE" | "0" | true + "04378" | "DE" | "0" | true + "04379" | "DE" | "0" | true + "04380" | "DE" | "0" | true + // 04381 till 04385 is in use + "04386" | "DE" | "0" | true + "04387" | "DE" | "0" | true + "04388" | "DE" | "0" | true + "04389" | "DE" | "0" | true + "04390" | "DE" | "0" | true + "04391" | "DE" | "0" | true + // 04392 till 04394 is in use + "04395" | "DE" | "0" | true + "04396" | "DE" | "0" | true + "04397" | "DE" | "0" | true + "04398" | "DE" | "0" | true + "04399" | "DE" | "0" | true + "04400" | "DE" | "0" | true + // 04401 till 04409 is in use + // 0441 is Oldenburg (Oldb) + "04420" | "DE" | "0" | true + // 04421 till 04423 is in use + "04424" | "DE" | "0" | true + // 04425 till 04426 is in use + "04427" | "DE" | "0" | true + "04428" | "DE" | "0" | true + "04429" | "DE" | "0" | true + "04430" | "DE" | "0" | true + // 04431 till 04435 is in use + "04436" | "DE" | "0" | true + "04437" | "DE" | "0" | true + "04438" | "DE" | "0" | true + "04439" | "DE" | "0" | true + "04440" | "DE" | "0" | true + // 04441 till 04447 is in use + "04448" | "DE" | "0" | true + "04449" | "DE" | "0" | true + "04450" | "DE" | "0" | true + // 04451 till 04456 is in use + "04457" | "DE" | "0" | true + // 04458 is Wiefeldstede-Spohle + "04459" | "DE" | "0" | true + "04460" | "DE" | "0" | true + // 04461 till 04469 is in use + "04470" | "DE" | "0" | true + // 04471 till 04475 is in use + "04476" | "DE" | "0" | true + // 04477 till 04479 is in use + // total 0448x is in use + "04490" | "DE" | "0" | true + // 04491 till 1199 is in use + "04500" | "DE" | "0" | true + // 04501 till 04506 is in use + "04507" | "DE" | "0" | true + // 04508 till 0459 is in use + // 0451 is Lübeck + "04520" | "DE" | "0" | true + // 04521 till 04529 is in use + "04530" | "DE" | "0" | true + // 04531 till 04537 is in use + "04538" | "DE" | "0" | true + // 04539 is Westerau + "04540" | "DE" | "0" | true + // 04541 till 04547 is in use + "04548" | "DE" | "0" | true + "04549" | "DE" | "0" | true + // total 0455x is in use + "04560" | "DE" | "0" | true + // 04561 till 04564 is in use + "0457" | "DE" | "0" | true + "0458" | "DE" | "0" | true + "0459" | "DE" | "0" | true + "04600" | "DE" | "0" | true + "04601" | "DE" | "0" | true + // 04602 till 04609 is in use + // 0461 is Flensburg + "04620" | "DE" | "0" | true + // 04621 till 04627 is in use + "04628" | "DE" | "0" | true + "04629" | "DE" | "0" | true + // total 0463x is in use + "04640" | "DE" | "0" | true + // 04641 till 04644 is in use + "04645" | "DE" | "0" | true + // 04646 is Morkirch + "04647" | "DE" | "0" | true + "04648" | "DE" | "0" | true + "04649" | "DE" | "0" | true + "04650" | "DE" | "0" | true + // 04651 is Sylt + "04652" | "DE" | "0" | true + "04653" | "DE" | "0" | true + "04654" | "DE" | "0" | true + "04655" | "DE" | "0" | true + "04656" | "DE" | "0" | true + "04657" | "DE" | "0" | true + "04658" | "DE" | "0" | true + "04659" | "DE" | "0" | true + "04660" | "DE" | "0" | true + // 04661 till 04668 is in use + "04669" | "DE" | "0" | true + "04670" | "DE" | "0" | true + // 04671 till 04674 is in use + "04675" | "DE" | "0" | true + "04676" | "DE" | "0" | true + "04677" | "DE" | "0" | true + "04678" | "DE" | "0" | true + "04679" | "DE" | "0" | true + "04680" | "DE" | "0" | true + // 04681 till 04684 is in use + "04685" | "DE" | "0" | true + "04686" | "DE" | "0" | true + "04687" | "DE" | "0" | true + "04688" | "DE" | "0" | true + "04689" | "DE" | "0" | true + "04700" | "DE" | "0" | true + "04701" | "DE" | "0" | true + // 04702 till 04708 is in use + "04709" | "DE" | "0" | true + // 0471 is Bremerhaven + "04720" | "DE" | "0" | true + // 04721 till 04725 is in use + "04726" | "DE" | "0" | true + "04727" | "DE" | "0" | true + "04728" | "DE" | "0" | true + "04729" | "DE" | "0" | true + "04730" | "DE" | "0" | true + // 04731 till 04737 is in use + "04738" | "DE" | "0" | true + "04739" | "DE" | "0" | true + // total 0474x is in use + "04750" | "DE" | "0" | true + // 04751 till 04758 is in use + "04759" | "DE" | "0" | true + "04760" | "DE" | "0" | true + // 04761 till 04769 is in use + // total 0477x is in use + "0478" | "DE" | "0" | true + "04790" | "DE" | "0" | true + // 04791 till 04796 is in use + "04800" | "DE" | "0" | true + "04801" | "DE" | "0" | true + // 04802 till 04806 is in use + "04807" | "DE" | "0" | true + "04808" | "DE" | "0" | true + "04809" | "DE" | "0" | true + // 0481 is Heide Holstein + "04820" | "DE" | "0" | true + // 04821 till 04829 is in use + // 04830 is Süderhastedt + "04831" | "DE" | "0" | true + // 04832 till 04839 is in use + "04840" | "DE" | "0" | true + // 04841 till 04849 os in use + "04850" | "DE" | "0" | true + // 04851 till 04859 is in use + "04860" | "DE" | "0" | true + // 04861 till 04865 is in use + "04866" | "DE" | "0" | true + "04867" | "DE" | "0" | true + "04868" | "DE" | "0" | true + "04869" | "DE" | "0" | true + "04870" | "DE" | "0" | true + // 04871 till 04877 is in use + "04878" | "DE" | "0" | true + "04879" | "DE" | "0" | true + "04880" | "DE" | "0" | true + // 04881 till 04885 is in use + "04886" | "DE" | "0" | true + "04887" | "DE" | "0" | true + "04888" | "DE" | "0" | true + "04889" | "DE" | "0" | true + "04890" | "DE" | "0" | true + "04891" | "DE" | "0" | true + // 04892 till 04893 is in use + "04894" | "DE" | "0" | true + "04895" | "DE" | "0" | true + "04896" | "DE" | "0" | true + "04897" | "DE" | "0" | true + "04898" | "DE" | "0" | true + "04899" | "DE" | "0" | true + "04900" | "DE" | "0" | true + "04901" | "DE" | "0" | true + // 04902 till 04903 is in use + "04904" | "DE" | "0" | true + "04905" | "DE" | "0" | true + "04906" | "DE" | "0" | true + "04907" | "DE" | "0" | true + "04908" | "DE" | "0" | true + "04909" | "DE" | "0" | true + // 0491 is Leer Ostfriesland + // total 0492x is in use + "04930" | "DE" | "0" | true + // 04931 till 04936 is in use + "04937" | "DE" | "0" | true + // 04938 till 04939 is in use + "04940" | "DE" | "0" | true + // 04941 till 04948 is in use + "04949" | "DE" | "0" | true + // total 0495x is in use + "04960" | "DE" | "0" | true + // 04961 till 04968 is in use + "04969" | "DE" | "0" | true + "04970" | "DE" | "0" | true + // 04971 till 04977 is in use + "04978" | "DE" | "0" | true + "04979" | "DE" | "0" | true + "0498" | "DE" | "0" | true + "0499" | "DE" | "0" | true + "0500" | "DE" | "0" | true + "0501" | "DE" | "0" | true + "05020" | "DE" | "0" | true + // 05021 till 05028 is in use + "05029" | "DE" | "0" | true + "05030" | "DE" | "0" | true + // 05031 till 05037 is in use + "05038" | "DE" | "0" | true + "05039" | "DE" | "0" | true + "05040" | "DE" | "0" | true + // 05041 till 05045 is in use + "05046" | "DE" | "0" | true + "05047" | "DE" | "0" | true + "05048" | "DE" | "0" | true + "05049" | "DE" | "0" | true + "05050" | "DE" | "0" | true + // 05051 till 05056 is in use + "05057" | "DE" | "0" | true + "05058" | "DE" | "0" | true + "05058" | "DE" | "0" | true + // 05060 is Bodenburg + "05061" | "DE" | "0" | true + // 05062 till 05069 is in use + "05070" | "DE" | "0" | true + // 05071 till 05074 is in use + "05075" | "DE" | "0" | true + "05076" | "DE" | "0" | true + "05077" | "DE" | "0" | true + "05078" | "DE" | "0" | true + "05079" | "DE" | "0" | true + "05080" | "DE" | "0" | true + "05081" | "DE" | "0" | true + // 05082 till 05086 is in use + "05087" | "DE" | "0" | true + "05088" | "DE" | "0" | true + "05089" | "DE" | "0" | true + "0509" | "DE" | "0" | true + "05100" | "DE" | "0" | true + // 05101 till 05103 is in use + "05104" | "DE" | "0" | true + // 05105 is Barsinghausen + "05106" | "DE" | "0" | true + "05107" | "DE" | "0" | true + // 05108 till 05109 is in use + // 0511 is Hannover + "05120" | "DE" | "0" | true + // 05121 is Hildesheim + "05122" | "DE" | "0" | true + // 05123 is Schellerten + "05124" | "DE" | "0" | true + "05125" | "DE" | "0" | true + // 05126 till 05129 is in use + // 05130 till 05132 is in use + "05133" | "DE" | "0" | true + "05134" | "DE" | "0" | true + // 05135 till 05139 is in use + "05140" | "DE" | "0" | true + // 05141 till 05149 is in use + "05150" | "DE" | "0" | true + // 05151 till 05159 is in use + "05160" | "DE" | "0" | true + // 05161 till 05168 is in use + "05169" | "DE" | "0" | true + "05170" | "DE" | "0" | true + // 05171 till 05177 is in use + "05178" | "DE" | "0" | true + "05179" | "DE" | "0" | true + "05180" | "DE" | "0" | true + // 05181 till 05187 is in use + "05188" | "DE" | "0" | true + "05189" | "DE" | "0" | true + // total 0519x is in use + "05200" | "DE" | "0" | true + // 05201 till 05209 is in use + // 0521 is Bielefeld + "05220" | "DE" | "0" | true + // 05221 till 05226 is in use + "05227" | "DE" | "0" | true + // 05228 is Vlotho-Exter + "05229" | "DE" | "0" | true + "05230" | "DE" | "0" | true + // 05231 till 05238 is in use + "05239" | "DE" | "0" | true + "05240" | "DE" | "0" | true + // 05241 till 0522 is in use + "05243" | "DE" | "0" | true + // 05244 till 05248 is in use + "05249" | "DE" | "0" | true + // 05250 till 05255 is in use + "05256" | "DE" | "0" | true + // 05257 till 05259 is in use + "05260" | "DE" | "0" | true + // 05261 till 05266 is in use + "05267" | "DE" | "0" | true + "05268" | "DE" | "0" | true + "05269" | "DE" | "0" | true + "05270" | "DE" | "0" | true + // 05271 till 05278 is in use + "05279" | "DE" | "0" | true + "05280" | "DE" | "0" | true + // 05281 till 05286 is in use + "05287" | "DE" | "0" | true + "05288" | "DE" | "0" | true + "05289" | "DE" | "0" | true + "05290" | "DE" | "0" | true + "05291" | "DE" | "0" | true + // 05292 till 05295 is in use + "05296" | "DE" | "0" | true + "05297" | "DE" | "0" | true + "05298" | "DE" | "0" | true + "05299" | "DE" | "0" | true + // total 0530x is in use + // 0531 is Braunschweig + // total 0532x is in use + "05330" | "DE" | "0" | true + // 05331 till 05337 is in use + "05338" | "DE" | "0" | true + // 05339 is Gielde + "05340" | "DE" | "0" | true + // 05341 is Salzgitter + "05342" | "DE" | "0" | true + "05343" | "DE" | "0" | true + // 05344 till 05347 is in use + "05348" | "DE" | "0" | true + "05349" | "DE" | "0" | true + "05350" | "DE" | "0" | true + // 05351 till 05358 is in use + "05359" | "DE" | "0" | true + "05360" | "DE" | "0" | true + // 05361 till 05368 is in use + "05369" | "DE" | "0" | true + "05370" | "DE" | "0" | true + // 05371 till 05379 is in use + "05380" | "DE" | "0" | true + // 05381 till 05384 is in use + "05385" | "DE" | "0" | true + "05386" | "DE" | "0" | true + "05387" | "DE" | "0" | true + "05388" | "DE" | "0" | true + "05389" | "DE" | "0" | true + "0539" | "DE" | "0" | true + "05400" | "DE" | "0" | true + // 05401 till 05407 is in use + "05408" | "DE" | "0" | true + // 05409 is Hilter am Teutoburger Wald + // 0541 Osnabrück + "05420" | "DE" | "0" | true + // 05421 till 05429 is in use + "05430" | "DE" | "0" | true + // 05431 till 05439 is in use + "05440" | "DE" | "0" | true + // 05441 till 05448 is in use + "05449" | "DE" | "0" | true + "05450" | "DE" | "0" | true + // 05451 till 05459 is in use + "05460" | "DE" | "0" | true + // 05461 till 05462 is in use + "05463" | "DE" | "0" | true + // 05464 till 05468 is in use + "05469" | "DE" | "0" | true + "05470" | "DE" | "0" | true + // 05471 till 05476 is in use + "05477" | "DE" | "0" | true + "05478" | "DE" | "0" | true + "05479" | "DE" | "0" | true + "05480" | "DE" | "0" | true + // 05481 till 05485 is in use + "05486" | "DE" | "0" | true + "05487" | "DE" | "0" | true + "05488" | "DE" | "0" | true + "05489" | "DE" | "0" | true + "05490" | "DE" | "0" | true + // 05491 till 05495 is in use + "05496" | "DE" | "0" | true + "05497" | "DE" | "0" | true + "05498" | "DE" | "0" | true + "05499" | "DE" | "0" | true + "05500" | "DE" | "0" | true + "05501" | "DE" | "0" | true + // 05502 till 05509 is in use + // 0551 is Göttingen + // 05520 till 05525 is in use + "05526" | "DE" | "0" | true + // 05527 till 05529 is in use + "05530" | "DE" | "0" | true + // 05531 till 05536 is in use + "05537" | "DE" | "0" | true + "05538" | "DE" | "0" | true + "05539" | "DE" | "0" | true + "05540" | "DE" | "0" | true + // 05541 till 05546 is in use + "05547" | "DE" | "0" | true + "05548" | "DE" | "0" | true + "05549" | "DE" | "0" | true + "05550" | "DE" | "0" | true + // 05551 till 05556 is in use + "05557" | "DE" | "0" | true + "05558" | "DE" | "0" | true + "05559" | "DE" | "0" | true + "05560" | "DE" | "0" | true + // 05561 till 05565 is in use + "05566" | "DE" | "0" | true + "05567" | "DE" | "0" | true + "05568" | "DE" | "0" | true + "05569" | "DE" | "0" | true + "05570" | "DE" | "0" | true + // 05571 till 05574 is in use + "05575" | "DE" | "0" | true + "05576" | "DE" | "0" | true + "05577" | "DE" | "0" | true + "05578" | "DE" | "0" | true + "05579" | "DE" | "0" | true + "05580" | "DE" | "0" | true + "05581" | "DE" | "0" | true + // 05582 till 05586 is in use + "05587" | "DE" | "0" | true + "05588" | "DE" | "0" | true + "05589" | "DE" | "0" | true + "05590" | "DE" | "0" | true + "05591" | "DE" | "0" | true + // 05592 till 05594 is in use + "05595" | "DE" | "0" | true + "05596" | "DE" | "0" | true + "05597" | "DE" | "0" | true + "05598" | "DE" | "0" | true + "05599" | "DE" | "0" | true + "05600" | "DE" | "0" | true + // 05601 till 05609 is in use + // 0561 is Kassel + "05620" | "DE" | "0" | true + // 05621 till 05626 is in use + "05627" | "DE" | "0" | true + "05628" | "DE" | "0" | true + "05629" | "DE" | "0" | true + "05630" | "DE" | "0" | true + // 05631 till 05636 is in use + "05637" | "DE" | "0" | true + "05638" | "DE" | "0" | true + "05639" | "DE" | "0" | true + "05640" | "DE" | "0" | true + // 05641 till 05648 is in use + "05649" | "DE" | "0" | true + // total 0565x is in use + "05660" | "DE" | "0" | true + // 05661 till 05665 is in use + "05666" | "DE" | "0" | true + "05667" | "DE" | "0" | true + "05668" | "DE" | "0" | true + "05669" | "DE" | "0" | true + "05670" | "DE" | "0" | true + // 05671 till 05677 is in use + "05678" | "DE" | "0" | true + "05679" | "DE" | "0" | true + "05680" | "DE" | "0" | true + // 05681 till 05686 + "05687" | "DE" | "0" | true + "05688" | "DE" | "0" | true + "05689" | "DE" | "0" | true + "05690" | "DE" | "0" | true + // 05691 till 05696 is in use + "05697" | "DE" | "0" | true + "05698" | "DE" | "0" | true + "05699" | "DE" | "0" | true + "05700" | "DE" | "0" | true + "05701" | "DE" | "0" | true + // 05702 till 05707 is in use + "05708" | "DE" | "0" | true + "05709" | "DE" | "0" | true + "05700" | "DE" | "0" | true + // 0571 is Minden Westfalen + "05720" | "DE" | "0" | true + // 05721 till 05726 is in use + "05727" | "DE" | "0" | true + "05728" | "DE" | "0" | true + "05729" | "DE" | "0" | true + "05730" | "DE" | "0" | true + // 05731 till 05734 is in use + "05735" | "DE" | "0" | true + "05736" | "DE" | "0" | true + "05737" | "DE" | "0" | true + "05738" | "DE" | "0" | true + "05739" | "DE" | "0" | true + "05740" | "DE" | "0" | true + // 05741 till 05746 is in use + "05747" | "DE" | "0" | true + "05748" | "DE" | "0" | true + "05749" | "DE" | "0" | true + "05750" | "DE" | "0" | true + // 05751 till 05755 is in use + "05756" | "DE" | "0" | true + "05757" | "DE" | "0" | true + "05758" | "DE" | "0" | true + "05759" | "DE" | "0" | true + "05760" | "DE" | "0" | true + // 05761 is Stolzenau + "05762" | "DE" | "0" | true + // 05763 till 05769 is in use + "05770" | "DE" | "0" | true + // 05771 till 05777 is in use + "05778" | "DE" | "0" | true + "05779" | "DE" | "0" | true + "0578" | "DE" | "0" | true + "0579" | "DE" | "0" | true + "05800" | "DE" | "0" | true + "05801" | "DE" | "0" | true + // 05802 till 05808 is in use + "05809" | "DE" | "0" | true + // 0581 is Uelzen + // total 0582x is in use + "05830" | "DE" | "0" | true + // 05831 till 05839 is in use + // 05840 till 05846 is in use + "05847" | "DE" | "0" | true + // 05848 till 05849 is in use + // 05850 till 05855 is in use + "05856" | "DE" | "0" | true + // 05857 till 05859 is in use + "05860" | "DE" | "0" | true + // 05861 till 05865 is in use + "05866" | "DE" | "0" | true + "05867" | "DE" | "0" | true + "05868" | "DE" | "0" | true + "05869" | "DE" | "0" | true + "05870" | "DE" | "0" | true + "05871" | "DE" | "0" | true + // 5872 till 5875 is in use + "05876" | "DE" | "0" | true + "05877" | "DE" | "0" | true + "05878" | "DE" | "0" | true + "05879" | "DE" | "0" | true + "05880" | "DE" | "0" | true + "05881" | "DE" | "0" | true + // 05882 till 05883 is in use + "05884" | "DE" | "0" | true + "05885" | "DE" | "0" | true + "05886" | "DE" | "0" | true + "05887" | "DE" | "0" | true + "05888" | "DE" | "0" | true + "05889" | "DE" | "0" | true + "0589" | "DE" | "0" | true + "05900" | "DE" | "0" | true + // 05901 till 05909 is in use + // 0591 is Lingen (ems) + "05920" | "DE" | "0" | true + // 05921 till 05926 is in use + "05927" | "DE" | "0" | true + "05928" | "DE" | "0" | true + "05929" | "DE" | "0" | true + "05930" | "DE" | "0" | true + // 05931 till 05937 is in use + "05938" | "DE" | "0" | true + // 05939 is Sustrum + "05940" | "DE" | "0" | true + // 05941 till 05948 is in use + "05949" | "DE" | "0" | true + "05950" | "DE" | "0" | true + // 05951 till 05957 is in use + "05958" | "DE" | "0" | true + "05959" | "DE" | "0" | true + "05960" | "DE" | "0" | true + // 05961 till 05966 is in use + "05967" | "DE" | "0" | true + "05968" | "DE" | "0" | true + "05969" | "DE" | "0" | true + "05970" | "DE" | "0" | true + // 05971 is Rheine + "05972" | "DE" | "0" | true + // 05973 is Neuenkirchen Kreis Steinfurt + "05974" | "DE" | "0" | true + // 05975 till 05978 is in use + "05979" | "DE" | "0" | true + "0598" | "DE" | "0" | true + "0599" | "DE" | "0" | true + "06000" | "DE" | "0" | true + "06001" | "DE" | "0" | true + // 06002 till 06004 is in use + "06005" | "DE" | "0" | true + "06006" | "DE" | "0" | true + // 06007 till 06008 is in use + "06009" | "DE" | "0" | true + "0601" | "DE" | "0" | true + // 06020 till 06024 is in use + "06025" | "DE" | "0" | true + // 06026 till 06029 is in use + "06030" | "DE" | "0" | true + // 06031 till 06036 is in use + "06037" | "DE" | "0" | true + "06038" | "DE" | "0" | true + // 06039 is Karben + "06040" | "DE" | "0" | true + // 06041 till 06049 is in use + // total 0605x is in use + "06060" | "DE" | "0" | true + // 06061 till 06063 is in use + "06064" | "DE" | "0" | true + "06065" | "DE" | "0" | true + // 06066 is Michelstadt-Vielbrunn + "06067" | "DE" | "0" | true + // 06068 is Beerfelden + "06070" | "DE" | "0" | true + // 06071 is Dieburg + "06072" | "DE" | "0" | true + // 06073 till 06074 is in use + "06075" | "DE" | "0" | true + "06076" | "DE" | "0" | true + "06077" | "DE" | "0" | true + // 06078 is Gross-Umstadt + "06079" | "DE" | "0" | true + "06080" | "DE" | "0" | true + // 06081 till 06087 is in use + "06088" | "DE" | "0" | true + "06089" | "DE" | "0" | true + "06090" | "DE" | "0" | true + "06091" | "DE" | "0" | true + // 06092 till 06096 is in use + "06097" | "DE" | "0" | true + "06098" | "DE" | "0" | true + "06099" | "DE" | "0" | true + "06100" | "DE" | "0" | true + // 06101 till 06109 is in use + // 0611 is Wiesbaden + // 06120 is Aarbergen + "06121" | "DE" | "0" | true + // 06122 till 06124 is in use + "06125" | "DE" | "0" | true + // 06126 till 06129 is in use + // 06130 till 06136 is in use + "06137" | "DE" | "0" | true + // 06138 till 06139 is in use + "06140" | "DE" | "0" | true + "06141" | "DE" | "0" | true + // 06142 is Rüsselsheim + "06143" | "DE" | "0" | true + // 06144 till 06147 is in use + "06148" | "DE" | "0" | true + "06149" | "DE" | "0" | true + // 06150 till 06152 is in use + "06153" | "DE" | "0" | true + // 06154 till 06155 is in use + "06156" | "DE" | "0" | true + // 06157 till 06159 is in use + "06160" | "DE" | "0" | true + // 06161 till 06167 is in use + "06168" | "DE" | "0" | true + "06169" | "DE" | "0" | true + "06170" | "DE" | "0" | true + // 06171 till 06175 is in use + "06176" | "DE" | "0" | true + "06177" | "DE" | "0" | true + "06178" | "DE" | "0" | true + "06179" | "DE" | "0" | true + "06180" | "DE" | "0" | true + // 06181 till 06188 is in use + "06189" | "DE" | "0" | true + // 06190 is Hattersheim am Main + "06191" | "DE" | "0" | true + // 06192 is Hofheim am Taunus + "06193" | "DE" | "0" | true + "06194" | "DE" | "0" | true + // 06195 till 06196 is in use + "06197" | "DE" | "0" | true + // 06198 is Eppstein + "06199" | "DE" | "0" | true + "06200" | "DE" | "0" | true + // 06201 till 06207 is in use + "06208" | "DE" | "0" | true + // 06209 is Mörlenbach + // 0621 is Mannheim + // 06220 till 06224 is in use + "06225" | "DE" | "0" | true + // 06226 till 06229 is in use + "06230" | "DE" | "0" | true + // 06231 till 06239 is in use + "06240" | "DE" | "0" | true + // 06241 till 06247 is in use + "06248" | "DE" | "0" | true + // 06249 is Guntersblum + "06250" | "DE" | "0" | true + // 06251 till 06258 is in use + "06259" | "DE" | "0" | true + "06260" | "DE" | "0" | true + // 06261 till 06269 is in use + "06270" | "DE" | "0" | true + // 06271 till 06272 is in use + "06273" | "DE" | "0" | true + // 06274 till 06276 is in use + "06277" | "DE" | "0" | true + "06278" | "DE" | "0" | true + "06279" | "DE" | "0" | true + "06280" | "DE" | "0" | true + // 06281 till 06287 is in use + "06288" | "DE" | "0" | true + "06289" | "DE" | "0" | true + "06290" | "DE" | "0" | true + // 06291 till 06298 is in use + "06299" | "DE" | "0" | true + "06300" | "DE" | "0" | true + // 06301 till 06308 is in use + "06309" | "DE" | "0" | true + // 0631 is Kauserslautern + "06320" | "DE" | "0" | true + // 06321 till 06329 is in use + "06330" | "DE" | "0" | true + // 06331 till 06339 is in use + // total 0634x is in use + "06350" | "DE" | "0" | true + // 06351 till 06353 is in use + "06354" | "DE" | "0" | true + // 06355 till 06359 is in use + "06360" | "DE" | "0" | true + // 06361 till 06364 is in use + "06365" | "DE" | "0" | true + "06366" | "DE" | "0" | true + "06367" | "DE" | "0" | true + "06368" | "DE" | "0" | true + "06369" | "DE" | "0" | true + "06370" | "DE" | "0" | true + // 06371 till 06375 is in use + "06376" | "DE" | "0" | true + "06377" | "DE" | "0" | true + "06378" | "DE" | "0" | true + "06379" | "DE" | "0" | true + "06380" | "DE" | "0" | true + // 06381 till 06837 is in use + "06388" | "DE" | "0" | true + "06389" | "DE" | "0" | true + "06390" | "DE" | "0" | true + // 06391 till 06398 is in use + "06399" | "DE" | "0" | true + // 0640x till 0642x is in use + // 06431 till 06436 is in use + "06437" | "DE" | "0" | true + // 06438 till 06439 is in use + // total 0644x is in use + "06450" | "DE" | "0" | true + // 06451 till 06458 is in use + "06459" | "DE" | "0" | true + "06460" | "DE" | "0" | true + // 06461 till 06462 is in use + "06463" | "DE" | "0" | true + // 06464 till 06468 is in use + "06469" | "DE" | "0" | true + "06470" | "DE" | "0" | true + // 06471 till 06479 is in use + "06480" | "DE" | "0" | true + "06481" | "DE" | "0" | true + // 06482 till 06486 is in use + "06487" | "DE" | "0" | true + "06488" | "DE" | "0" | true + "06489" | "DE" | "0" | true + "0649" | "DE" | "0" | true + // 0650x till 0651 is in use + "06520" | "DE" | "0" | true + "06521" | "DE" | "0" | true + // 06522 till 06527 is in use + "06528" | "DE" | "0" | true + "06529" | "DE" | "0" | true + "06530" | "DE" | "0" | true + // 06531 till 06536 is in use + "06537" | "DE" | "0" | true + "06538" | "DE" | "0" | true + "06539" | "DE" | "0" | true + "06540" | "DE" | "0" | true + // 06541 till 06545 is in use + "06546" | "DE" | "0" | true + "06547" | "DE" | "0" | true + "06548" | "DE" | "0" | true + "06549" | "DE" | "0" | true + // total 0655x is in use + "06560" | "DE" | "0" | true + // 06561 till 06569 is in use + "06570" | "DE" | "0" | true + // 06571 till 06575 is in use + "06576" | "DE" | "0" | true + "06577" | "DE" | "0" | true + // 06578 is Salmtal + "06579" | "DE" | "0" | true + // total 0658x is in use + "06590" | "DE" | "0" | true + // 06591 till 06597 is in use + "06598" | "DE" | "0" | true + // 06599 is Wiedenbach bei Gerolstein + "0660" | "DE" | "0" | true + // 0661 till 0662x is in use + // 06630 till 06631 is in use + "06632" | "DE" | "0" | true + // 06633 till 06639 is in use + "06640" | "DE" | "0" | true + // 06641 till 06648 is in use + "06649" | "DE" | "0" | true + // total 0665x is in use + // 06660 till 06661 is in use + "06662" | "DE" | "0" | true + // 06663 till 06669 is in use + // 06670 is Ludwigsau Hessen + "06671" | "DE" | "0" | true + // 06672 till 06678 is in use + "06679" | "DE" | "0" | true + "06680" | "DE" | "0" | true + // 06681 till 06684 is in use + "06685" | "DE" | "0" | true + "06686" | "DE" | "0" | true + "06687" | "DE" | "0" | true + "06688" | "DE" | "0" | true + "06689" | "DE" | "0" | true + "06690" | "DE" | "0" | true + // 06691 till 06698 is in use + "06699" | "DE" | "0" | true + "06700" | "DE" | "0" | true + // 06701 is Sprendlingen Rheinhessen + "06702" | "DE" | "0" | true + // 06703 till 06704 is in use + "06705" | "DE" | "0" | true + // 06706 till 06709 is in use + // 0671 is Bad Kreuznach + "06720" | "DE" | "0" | true + // 06721 till 06728 is in use + "06729" | "DE" | "0" | true + "06730" | "DE" | "0" | true + // 06731 till 06737 is in use + "06738" | "DE" | "0" | true + "06739" | "DE" | "0" | true + "06740" | "DE" | "0" | true + // 06741 till 06747 is in use + "06748" | "DE" | "0" | true + "06749" | "DE" | "0" | true + "06750" | "DE" | "0" | true + // 06751 till 06758 is in use + "06759" | "DE" | "0" | true + "06760" | "DE" | "0" | true + // 06761 till 06766 is in use + "06767" | "DE" | "0" | true + "06768" | "DE" | "0" | true + "06769" | "DE" | "0" | true + "06770" | "DE" | "0" | true + // 06771 till 06776 is in use + "06777" | "DE" | "0" | true + "06778" | "DE" | "0" | true + "06779" | "DE" | "0" | true + "06780" | "DE" | "0" | true + // 06781 to 06789 is in use + "0679" | "DE" | "0" | true + "06800" | "DE" | "0" | true + "06801" | "DE" | "0" | true + // 06802 till 06806 is in use + "06807" | "DE" | "0" | true + "06808" | "DE" | "0" | true + // 06809 is Grossrosseln + // 0681 is Saarbrücken + "06820" | "DE" | "0" | true + // 06821 is Neunkirchen Saar + "06822" | "DE" | "0" | true + "06823" | "DE" | "0" | true + // 06824 till 06827 is in use + "06828" | "DE" | "0" | true + "06829" | "DE" | "0" | true + "06830" | "DE" | "0" | true + // 06831 till 06838 is in use + "06839" | "DE" | "0" | true + "06840" | "DE" | "0" | true + // 06841 till 06844 is in use + "06845" | "DE" | "0" | true + "06846" | "DE" | "0" | true + "06847" | "DE" | "0" | true + // 06848 till 06849 is in use + "06850" | "DE" | "0" | true + // 06851 till 06858 is in use + "06859" | "DE" | "0" | true + "06860" | "DE" | "0" | true + // 06861 is Merzig + "06862" | "DE" | "0" | true + "06863" | "DE" | "0" | true + // 06864 till 06869 is in use + "06870" | "DE" | "0" | true + // 06871 till 06876 is in use + "06877" | "DE" | "0" | true + "06878" | "DE" | "0" | true + "06879" | "DE" | "0" | true + "06880" | "DE" | "0" | true + // 06881 is Lebach + "06882" | "DE" | "0" | true + "06883" | "DE" | "0" | true + "06884" | "DE" | "0" | true + "06885" | "DE" | "0" | true + "06886" | "DE" | "0" | true + // 06887 rill 06888 is in use + "06889" | "DE" | "0" | true + "06890" | "DE" | "0" | true + "06891" | "DE" | "0" | true + "06892" | "DE" | "0" | true + // 06893 till 06894 is in use + "06895" | "DE" | "0" | true + "06896" | "DE" | "0" | true + // 06897 till 06898 is in use + "06899" | "DE" | "0" | true + // 069 is Frankfurt am Mai + } + + def "check if original lib fixed RFC3966 for invalid German NDC 0700 - 0999"(String number, regionCode, expectedResult, expectingFail) { + given: + + String[] numbersToTest = [ + number + "556", + number + "5566", + number + "55667", + number + "556677", + number + "5566778", + number + "55667788"] + + if (expectingFail == true) { + expectingFail = [true, true, true, true, true, true, true, true, true] + } + + if (expectingFail == false) { + expectingFail = [false, false, false, false, false, false, false, false, false] + } + + when: "get number RFC3966: $number" + String[] results = [] + for (int i = 0; i < numbersToTest.length; i++) { + String onkz = extractONKZ(numbersToTest[i], regionCode) + String eResult = number.substring(1) + if (onkz == null) { + results += "0" + } else { + if (eResult == onkz) { + results += "1" + } else { + results += "2" + } + + } + } + + then: "is number expected: $expectedResult" + for (int i = 0; i < results.length; i++) { + this.logResult(results[i], expectedResult, expectingFail[i], numbersToTest[i], regionCode) + } + + + where: + + number | regionCode | expectedResult | expectingFail + // --- + // 0700 is checked in personal number 0700 see above + // --- + "0701" | "DE" | "0" | true + "07020" | "DE" | "0" | true + // 7021 till 7026 is in use + "07027" | "DE" | "0" | true + "07028" | "DE" | "0" | true + "07029" | "DE" | "0" | true + "07030" | "DE" | "0" | true + // 07031 till 07034 is in use + "07035" | "DE" | "0" | true + "07036" | "DE" | "0" | true + "07037" | "DE" | "0" | true + "07038" | "DE" | "0" | true + "07039" | "DE" | "0" | true + "07040" | "DE" | "0" | true + // 07041 till 07046 is in use + "07047" | "DE" | "0" | true + "07048" | "DE" | "0" | true + "07049" | "DE" | "0" | true + "07050" | "DE" | "0" | true + // 07051 till 07056 is in use + "07057" | "DE" | "0" | true + "07058" | "DE" | "0" | true + "07059" | "DE" | "0" | true + "07060" | "DE" | "0" | true + "07061" | "DE" | "0" | true + // 07062 till 07063 is in use + "07064" | "DE" | "0" | true + "07065" | "DE" | "0" | true + // 07066 is Bad Rappenau-Bonfeld + "07067" | "DE" | "0" | true + "07068" | "DE" | "0" | true + "07069" | "DE" | "0" | true + "07070" | "DE" | "0" | true + // 07071 till 07073 is in use + "07074" | "DE" | "0" | true + "07075" | "DE" | "0" | true + "07076" | "DE" | "0" | true + "07077" | "DE" | "0" | true + "07078" | "DE" | "0" | true + "07079" | "DE" | "0" | true + "07080" | "DE" | "0" | true + // 07081 till 07085 is in use + "07086" | "DE" | "0" | true + "07087" | "DE" | "0" | true + "07088" | "DE" | "0" | true + "07089" | "DE" | "0" | true + "0709" | "DE" | "0" | true + "0710" | "DE" | "0" | true + // 0711 is Stuttgart + "07120" | "DE" | "0" | true + // 07121 till 07129 is in use + // 07130 till 07136 is in use + "07137" | "DE" | "0" | true + // 07138 till 07139 is in use + "07140" | "DE" | "0" | true + // 07141 till 07148 is in use + "07149" | "DE" | "0" | true + "07150" | "DE" | "0" | true + // 07150 till 07154 is in use + "07155" | "DE" | "0" | true + // 07156 till 07159 is in use + "07160" | "DE" | "0" | true + // 07161 till 07166 is in use + "07167" | "DE" | "0" | true + "07168" | "DE" | "0" | true + "07169" | "DE" | "0" | true + "07170" | "DE" | "0" | true + // 07171 till 07176 is in use + "07177" | "DE" | "0" | true + "07178" | "DE" | "0" | true + "07179" | "DE" | "0" | true + "07180" | "DE" | "0" | true + // 07181 till 07184 is in use + "07185" | "DE" | "0" | true + "07186" | "DE" | "0" | true + "07187" | "DE" | "0" | true + "07188" | "DE" | "0" | true + "07189" | "DE" | "0" | true + "07190" | "DE" | "0" | true + // 07191 till 07195 + "07196" | "DE" | "0" | true + "07197" | "DE" | "0" | true + "07198" | "DE" | "0" | true + "07199" | "DE" | "0" | true + "07200" | "DE" | "0" | true + "07201" | "DE" | "0" | true + // 07202 till 07204 is in use + "07205" | "DE" | "0" | true + "07206" | "DE" | "0" | true + "07207" | "DE" | "0" | true + "07208" | "DE" | "0" | true + "07209" | "DE" | "0" | true + // 0721 is Karlsbad + // total 0722x is in use + "07230" | "DE" | "0" | true + // 07231 till 07237 is in use + "07238" | "DE" | "0" | true + "07239" | "DE" | "0" | true + // 07240 is Pfinztal + "07241" | "DE" | "0" | true + // 07242 till 07249 is in use + // 0725x till 0726x is in use + "07270" | "DE" | "0" | true + // 07271 till 07277 is in use + "07278" | "DE" | "0" | true + "07279" | "DE" | "0" | true + "0728" | "DE" | "0" | true + "0729" | "DE" | "0" | true + // 07300 is Roggenburg + "07301" | "DE" | "0" | true + // 0732 till 0739 is in use + // 0731 is Ulm Donau + "07320" | "DE" | "0" | true + // 07321 till 07329 is in use + "07330" | "DE" | "0" | true + // 07331 till 07337 is in use + "07338" | "DE" | "0" | true + "07339" | "DE" | "0" | true + // 07340 is Neenstetten + "07341" | "DE" | "0" | true + "07342" | "DE" | "0" | true + // 07343 till 07348 is in use + "07349" | "DE" | "0" | true + "07350" | "DE" | "0" | true + // 07351 till 07358 is in use + "07359" | "DE" | "0" | true + "07360" | "DE" | "0" | true + // 07361 till 07367 is in use + "07368" | "DE" | "0" | true + "07369" | "DE" | "0" | true + "07370" | "DE" | "0" | true + // 07371 is Riedlingen Württemberg + "07372" | "DE" | "0" | true + // 07373 till 07376 is in use + "07377" | "DE" | "0" | true + "07378" | "DE" | "0" | true + "07379" | "DE" | "0" | true + "07380" | "DE" | "0" | true + // 07381 till 07389 is in use + "07390" | "DE" | "0" | true + // 07391 till 07395 is in use + "07396" | "DE" | "0" | true + "07397" | "DE" | "0" | true + "07398" | "DE" | "0" | true + "07399" | "DE" | "0" | true + "07400" | "DE" | "0" | true + "07401" | "DE" | "0" | true + // 07402 till 07404 is in use + "07405" | "DE" | "0" | true + "07406" | "DE" | "0" | true + "07407" | "DE" | "0" | true + "07408" | "DE" | "0" | true + "07409" | "DE" | "0" | true + // 0741 is Deisslingen + // 07420 is Schramberg + // 07421 till 07429 is in use + "07430" | "DE" | "0" | true + // 07431 till 07436 is in use + "07437" | "DE" | "0" | true + "07438" | "DE" | "0" | true + "07439" | "DE" | "0" | true + // total 0744x is in use + "07450" | "DE" | "0" | true + // 07451 till 07459 is in use + "07460" | "DE" | "0" | true + // 07461 till 07467 is in use + "07468" | "DE" | "0" | true + "07469" | "DE" | "0" | true + "07470" | "DE" | "0" | true + // 07471 till 07478 is in use + "07479" | "DE" | "0" | true + "07480" | "DE" | "0" | true + "07481" | "DE" | "0" | true + // 07482 till 07486 is in use + "07487" | "DE" | "0" | true + "07488" | "DE" | "0" | true + "07489" | "DE" | "0" | true + "0749" | "DE" | "0" | true + "07500" | "DE" | "0" | true + "07501" | "DE" | "0" | true + // 07502 till 07506 is in use + "07507" | "DE" | "0" | true + "07508" | "DE" | "0" | true + "07509" | "DE" | "0" | true + // 0751 Ravensburg + // 07520 is Bodnegg + "07521" | "DE" | "0" | true + // 07522 is Wangen im Allgäu + "07523" | "DE" | "0" | true + // 07524 till 07525 is in use + "07526" | "DE" | "0" | true + // 07527 till 07529 is in use + "07530" | "DE" | "0" | true + // 07531 till 07534 is in use + "07535" | "DE" | "0" | true + "07536" | "DE" | "0" | true + "07537" | "DE" | "0" | true + "07538" | "DE" | "0" | true + "07539" | "DE" | "0" | true + "07540" | "DE" | "0" | true + // 07541 till 07546 is in use + "07547" | "DE" | "0" | true + "07548" | "DE" | "0" | true + "07549" | "DE" | "0" | true + "07550" | "DE" | "0" | true + // 07551 till 07558 is in use + "07559" | "DE" | "0" | true + "07560" | "DE" | "0" | true + // 07561 till 07569 is in use + // total 0757x is in use + "07580" | "DE" | "0" | true + // 07581 till 07587 is in use + "07588" | "DE" | "0" | true + "07589" | "DE" | "0" | true + "0759" | "DE" | "0" | true + "07600" | "DE" | "0" | true + "07601" | "DE" | "0" | true + // 07602 is Oberried Breisgau + "07603" | "DE" | "0" | true + "07604" | "DE" | "0" | true + "07605" | "DE" | "0" | true + "07606" | "DE" | "0" | true + "07607" | "DE" | "0" | true + "07608" | "DE" | "0" | true + "07609" | "DE" | "0" | true + // 0761 Freiburg im Breisgau + // total 0762x is in use + "07630" | "DE" | "0" | true + // 07631 till 07636 is in use + "07637" | "DE" | "0" | true + "07638" | "DE" | "0" | true + "07639" | "DE" | "0" | true + "07640" | "DE" | "0" | true + // 07641 till 07646 + "07647" | "DE" | "0" | true + "07648" | "DE" | "0" | true + "07649" | "DE" | "0" | true + "07650" | "DE" | "0" | true + // 07651 till 07657 is in use + "07658" | "DE" | "0" | true + "07659" | "DE" | "0" | true + // total 0766x is in use + "07670" | "DE" | "0" | true + // 07671 till 07676 is in use + "07677" | "DE" | "0" | true + "07678" | "DE" | "0" | true + "07679" | "DE" | "0" | true + "07680" | "DE" | "0" | true + // 076781 till 07685 is in use + "07686" | "DE" | "0" | true + "07687" | "DE" | "0" | true + "07688" | "DE" | "0" | true + "07689" | "DE" | "0" | true + "0769" | "DE" | "0" | true + "07700" | "DE" | "0" | true + "07701" | "DE" | "0" | true + // 07702 till 07709 is in use + // 0771 is Donaueschingen + // total 0772x is in use + "07730" | "DE" | "0" | true + // 07731 till 07736 is in use + "07737" | "DE" | "0" | true + // 07738 till 07339 is in use + "07740" | "DE" | "0" | true + // 07741 till 07748 is in use + "07749" | "DE" | "0" | true + "07750" | "DE" | "0" | true + // 07751 is Waldshut + "07752" | "DE" | "0" | true + // 07753 till 07755 is in use + "07756" | "DE" | "0" | true + "07757" | "DE" | "0" | true + "07758" | "DE" | "0" | true + "07759" | "DE" | "0" | true + "07770" | "DE" | "0" | true + // 07771 is Stockach + "07772" | "DE" | "0" | true + // 07773 till 07775 is in use + "07776" | "DE" | "0" | true + // 07777 is Sauldorf + "07778" | "DE" | "0" | true + "07779" | "DE" | "0" | true + "0778" | "DE" | "0" | true + "0779" | "DE" | "0" | true + "07800" | "DE" | "0" | true + "07801" | "DE" | "0" | true + // 07802 till 07808 is in use + "07809" | "DE" | "0" | true + // 0781 is Offenburg + "07820" | "DE" | "0" | true + // 07821 till 07826 is in use + "07827" | "DE" | "0" | true + "07828" | "DE" | "0" | true + "07829" | "DE" | "0" | true + "07830" | "DE" | "0" | true + // 07831 till 07839 is in use + "07840" | "DE" | "0" | true + // 07841 till 07844 is in use + "07845" | "DE" | "0" | true + "07846" | "DE" | "0" | true + "07847" | "DE" | "0" | true + "07848" | "DE" | "0" | true + "07849" | "DE" | "0" | true + "07850" | "DE" | "0" | true + // 07851 till 07854 is in use + "07855" | "DE" | "0" | true + "07856" | "DE" | "0" | true + "07857" | "DE" | "0" | true + "07858" | "DE" | "0" | true + "07859" | "DE" | "0" | true + "0786" | "DE" | "0" | true + "0787" | "DE" | "0" | true + "0788" | "DE" | "0" | true + "0789" | "DE" | "0" | true + "07900" | "DE" | "0" | true + "07901" | "DE" | "0" | true + "07902" | "DE" | "0" | true + // 07903 till 07907 is in use + "07908" | "DE" | "0" | true + "07909" | "DE" | "0" | true + // 0791 is Schwäbisch Hall + "0792" | "DE" | "0" | true + // total 0793x till 0794x is in use + // 07950 till 07955 is in use + "07956" | "DE" | "0" | true + // 07957 till 07959 is in use + "07960" | "DE" | "0" | true + // 07961 till 07967 is in use + "07968" | "DE" | "0" | true + "07969" | "DE" | "0" | true + "07970" | "DE" | "0" | true + // 07971 till 07977 is in use + "07978" | "DE" | "0" | true + "07979" | "DE" | "0" | true + "0798" | "DE" | "0" | true + "0799" | "DE" | "0" | true + // --- + // 0800 is checked with free call 800 range see above + // --- + "0801" | "DE" | "0" | true + // total 0802x is in use + "08030" | "DE" | "0" | true + // 08031 till 08036 is in use + "08037" | "DE" | "0" | true + // 08038 till 08039 is in use + "08040" | "DE" | "0" | true + // 08041 till 08043 is in use + "08044" | "DE" | "0" | true + // 08045 till 08046 is in use + "08047" | "DE" | "0" | true + "08048" | "DE" | "0" | true + "08049" | "DE" | "0" | true + "08050" | "DE" | "0" | true + // 08051 till 08057 is in use + "08058" | "DE" | "0" | true + "08059" | "DE" | "0" | true + "08060" | "DE" | "0" | true + // 08061 till 08067 is in use + "08068" | "DE" | "0" | true + "08069" | "DE" | "0" | true + "08070" | "DE" | "0" | true + // 08071 till 08076 is in use + "08077" | "DE" | "0" | true + "08078" | "DE" | "0" | true + "08079" | "DE" | "0" | true + "08080" | "DE" | "0" | true + // 08081 till 08086 is in use + "08087" | "DE" | "0" | true + "08088" | "DE" | "0" | true + "08089" | "DE" | "0" | true + "08090" | "DE" | "0" | true + // 08091 till 08095 is in use + "08096" | "DE" | "0" | true + "08097" | "DE" | "0" | true + "08098" | "DE" | "0" | true + "08099" | "DE" | "0" | true + "08100" | "DE" | "0" | true + "08101" | "DE" | "0" | true + // 08102 is Höhenkirchen-Siegertsbrunn + "08103" | "DE" | "0" | true + // 08104 till 08106 is in use + "08107" | "DE" | "0" | true + "08108" | "DE" | "0" | true + "08109" | "DE" | "0" | true + // 0811 is Halbergmoos + "08120" | "DE" | "0" | true + // 08121 till 08124 is in use + "08125" | "DE" | "0" | true + "08126" | "DE" | "0" | true + "08127" | "DE" | "0" | true + "08128" | "DE" | "0" | true + "08129" | "DE" | "0" | true + "08130" | "DE" | "0" | true + // 08131 is Dachau + "08132" | "DE" | "0" | true + // 08133 till 08139 is in use + "08140" | "DE" | "0" | true + // 08141 till 08146 is in use + "08147" | "DE" | "0" | true + "08148" | "DE" | "0" | true + "08149" | "DE" | "0" | true + "08150" | "DE" | "0" | true + // 08151 till 08153 is in use + "08154" | "DE" | "0" | true + "08155" | "DE" | "0" | true + "08156" | "DE" | "0" | true + // 08157 till 08158 is in use + "08159" | "DE" | "0" | true + "08160" | "DE" | "0" | true + // 08161 is Freising + "08162" | "DE" | "0" | true + "08163" | "DE" | "0" | true + "08164" | "DE" | "0" | true + // 08165 till 08168 is in use + "08169" | "DE" | "0" | true + // 08170 till 08171 is in use + "08172" | "DE" | "0" | true + "08173" | "DE" | "0" | true + "08174" | "DE" | "0" | true + "08175" | "DE" | "0" | true + // 08176 till 08179 is in use + "0818" | "DE" | "0" | true + "08190" | "DE" | "0" | true + // 08191 till 08196 is in use + "08197" | "DE" | "0" | true + "08198" | "DE" | "0" | true + "08199" | "DE" | "0" | true + "08200" | "DE" | "0" | true + "08201" | "DE" | "0" | true + // 08202 till 08208 is in use + "08209" | "DE" | "0" | true + // 0821 is Augsburg + "08220" | "DE" | "0" | true + // 08221 till 08226 is in use + "08227" | "DE" | "0" | true + "08228" | "DE" | "0" | true + "08229" | "DE" | "0" | true + // 08230 till 08234 is in use + "08235" | "DE" | "0" | true + // 08236 till 08239 is in use + "08240" | "DE" | "0" | true + // 08241 is Buchloe + "08242" | "DE" | "0" | true + // 08243 is Fuchstal + "08244" | "DE" | "0" | true + // 08245 till 08249 is in use + // 08250 till 08254 is in use + "08255" | "DE" | "0" | true + "08256" | "DE" | "0" | true + // 08257 till 08259 is in use + "08260" | "DE" | "0" | true + // 08261 till 08263 is in use + "08264" | "DE" | "0" | true + // 08265 till 08269 is in use + "08270" | "DE" | "0" | true + // 08271 till 08274 is in use + "08275" | "DE" | "0" | true + // 08276 is Baar Schwaben + "08277" | "DE" | "0" | true + "08278" | "DE" | "0" | true + "08279" | "DE" | "0" | true + "08280" | "DE" | "0" | true + // 08281 till 08285 is in use + "08286" | "DE" | "0" | true + "08287" | "DE" | "0" | true + "08288" | "DE" | "0" | true + "08289" | "DE" | "0" | true + "08290" | "DE" | "0" | true + // 08291 till 08296 is in use + "08297" | "DE" | "0" | true + "08298" | "DE" | "0" | true + "08299" | "DE" | "0" | true + "08300" | "DE" | "0" | true + "08301" | "DE" | "0" | true + // 08302 till 08304 is in use + "08305" | "DE" | "0" | true + // 08306 is Ronsberg + "08307" | "DE" | "0" | true + "08308" | "DE" | "0" | true + "08309" | "DE" | "0" | true + // 0831 is Kempten Allgäu + // 08320 till 08328 is in use + "08329" | "DE" | "0" | true + // 08330 till 08338 is in use + "08339" | "DE" | "0" | true + // total 0834x is in use + "0835" | "DE" | "0" | true + "08360" | "DE" | "0" | true + // 08361 till 08369 is in use + // 08370 is Obergünzburg + "08371" | "DE" | "0" | true + // 08372 till 08379 is in use + // total 0838x is in use + "08390" | "DE" | "0" | true + "08391" | "DE" | "0" | true + // 08392 till 08395 is in use + "08396" | "DE" | "0" | true + "08397" | "DE" | "0" | true + "08398" | "DE" | "0" | true + "08399" | "DE" | "0" | true + "08400" | "DE" | "0" | true + "08401" | "DE" | "0" | true + // 08402 till 08407 is in use + "08408" | "DE" | "0" | true + "08409" | "DE" | "0" | true + // 0841 is Ingolstadt Donau + "08420" | "DE" | "0" | true + // 08421 till 08424 is in use + "08425" | "DE" | "0" | true + // 08426 till 08427 is in use + "08428" | "DE" | "0" | true + "08429" | "DE" | "0" | true + "08430" | "DE" | "0" | true + // 08431 till 08435 is in use + "08436" | "DE" | "0" | true + "08437" | "DE" | "0" | true + "08438" | "DE" | "0" | true + "08439" | "DE" | "0" | true + "08440" | "DE" | "0" | true + // 08441 till 08446 is in use + "08447" | "DE" | "0" | true + "08448" | "DE" | "0" | true + "08449" | "DE" | "0" | true + // 08450 is Ingoldstadt-Zuchering + "08451" | "DE" | "0" | true + // 08452 till 08454 is in use + "08455" | "DE" | "0" | true + // 08456 till 08459 is in use + // total 0846x is in use + "0847" | "DE" | "0" | true + "0848" | "DE" | "0" | true + "0849" | "DE" | "0" | true + "08500" | "DE" | "0" | true + // 08501 till 08507 is in use + "08508" | "DE" | "0" | true + // 08509 is Ruderting + // 0851 is Passau + "0852" | "DE" | "0" | true + "08530" | "DE" | "0" | true + // 08531 till 08538 is in use + "08539" | "DE" | "0" | true + "08540" | "DE" | "0" | true + // 08541 till 08549 is in use + // 08550 till 08558 is in use + "08559" | "DE" | "0" | true + "08560" | "DE" | "0" | true + // 08561 till 08565 is in use + "08566" | "DE" | "0" | true + "08567" | "DE" | "0" | true + "08568" | "DE" | "0" | true + "08569" | "DE" | "0" | true + "08570" | "DE" | "0" | true + // 08571 till 08574 is in use + "08575" | "DE" | "0" | true + "08576" | "DE" | "0" | true + "08577" | "DE" | "0" | true + "08578" | "DE" | "0" | true + "08579" | "DE" | "0" | true + "08580" | "DE" | "0" | true + // 08581 till 08586 is in use + "08587" | "DE" | "0" | true + "08588" | "DE" | "0" | true + "08589" | "DE" | "0" | true + "08590" | "DE" | "0" | true + // 08591 till 08593 is in use + "08594" | "DE" | "0" | true + "08595" | "DE" | "0" | true + "08596" | "DE" | "0" | true + "08597" | "DE" | "0" | true + "08598" | "DE" | "0" | true + "08599" | "DE" | "0" | true + "0860" | "DE" | "0" | true + // 0861 is Traunstein + "08620" | "DE" | "0" | true + // 08621 till 08624 is in use + "08625" | "DE" | "0" | true + "08626" | "DE" | "0" | true + "08627" | "DE" | "0" | true + // 08628 till 08629 is in use + // 08630 till 08631 is in use + "08632" | "DE" | "0" | true + // 08633 till 08639 is in use + // 08640 till 08642 is in use + "08643" | "DE" | "0" | true + "08644" | "DE" | "0" | true + "08645" | "DE" | "0" | true + "08646" | "DE" | "0" | true + "08647" | "DE" | "0" | true + "08648" | "DE" | "0" | true + // 08649 is Schleching + // 08650 till 08652 is in use + "08653" | "DE" | "0" | true + // 08654 Freilassing + "08655" | "DE" | "0" | true + // 08656 till 08657 is in use + "08658" | "DE" | "0" | true + "08659" | "DE" | "0" | true + "08660" | "DE" | "0" | true + // 08661 till 08667 is in use + "08668" | "DE" | "0" | true + // 08669 is Traunreut + // 08670 till 08671 is in use + "08672" | "DE" | "0" | true + "08673" | "DE" | "0" | true + "08674" | "DE" | "0" | true + "08675" | "DE" | "0" | true + "08676" | "DE" | "0" | true + // 08677 till 086779 is in use + "08680" | "DE" | "0" | true + // 08681 till 08687 is in use + "08688" | "DE" | "0" | true + "08689" | "DE" | "0" | true + "0869" | "DE" | "0" | true + "08700" | "DE" | "0" | true + "08701" | "DE" | "0" | true + // 08702 till 08709 is in use + // 0871 is Landshut + "08720" | "DE" | "0" | true + // 08721 till 08728 is in use + "08729" | "DE" | "0" | true + "08730" | "DE" | "0" | true + // 08731 till 08735 is in use + "08736" | "DE" | "0" | true + "08737" | "DE" | "0" | true + "08738" | "DE" | "0" | true + "08739" | "DE" | "0" | true + "08740" | "DE" | "0" | true + // 08741 till 08745 is in use + "08746" | "DE" | "0" | true + "08747" | "DE" | "0" | true + "08748" | "DE" | "0" | true + "08749" | "DE" | "0" | true + "08750" | "DE" | "0" | true + // 08751 till 08754 is in use + "08755" | "DE" | "0" | true + // 08756 is Nandlstadt + "08757" | "DE" | "0" | true + "08758" | "DE" | "0" | true + "08759" | "DE" | "0" | true + "08760" | "DE" | "0" | true + // 08761 till 08762 is in use + "08763" | "DE" | "0" | true + // 08764 till 08766 is in use + "08767" | "DE" | "0" | true + "08768" | "DE" | "0" | true + "08769" | "DE" | "0" | true + "08770" | "DE" | "0" | true + // 08771 till 08774 is in use + "08775" | "DE" | "0" | true + "08776" | "DE" | "0" | true + "08777" | "DE" | "0" | true + "08778" | "DE" | "0" | true + "08779" | "DE" | "0" | true + "08780" | "DE" | "0" | true + // 08781 till 08785 is in use + "08786" | "DE" | "0" | true + "08787" | "DE" | "0" | true + "08788" | "DE" | "0" | true + "08789" | "DE" | "0" | true + "0879" | "DE" | "0" | true + "08800" | "DE" | "0" | true + // 08801 till 08803 is in use + "08804" | "DE" | "0" | true + // 08805 till 08809 is in use + // 0881 is Weilheim in Oberbayern + "08820" | "DE" | "0" | true + // 08821 till 08826 is in use + "08827" | "DE" | "0" | true + "08828" | "DE" | "0" | true + "08829" | "DE" | "0" | true + "0883" | "DE" | "0" | true + "08840" | "DE" | "0" | true + // 08841 is Murnau am Staffelsee + "08842" | "DE" | "0" | true + "08843" | "DE" | "0" | true + "08844" | "DE" | "0" | true + // 08845 till 08847 is in use + "08848" | "DE" | "0" | true + "08849" | "DE" | "0" | true + "08850" | "DE" | "0" | true + // 08851 is Kochel am See + "08852" | "DE" | "0" | true + "08853" | "DE" | "0" | true + "08854" | "DE" | "0" | true + "08855" | "DE" | "0" | true + // 08856 till 08858 is in use + "08859" | "DE" | "0" | true + // 08860 till 08862 is in use + "08863" | "DE" | "0" | true + "08864" | "DE" | "0" | true + "08865" | "DE" | "0" | true + "08866" | "DE" | "0" | true + // 08867 till 08869 is in use + "0887" | "DE" | "0" | true + "0888" | "DE" | "0" | true + "0889" | "DE" | "0" | true + // 089 is München + // --- + // TODO start: by Dec 1st of 2024 the ranges 9000 till 09008 will be possible for premium service + "09000" | "DE" | "0" | true + // 09001 Information Service checked in 0900 range test + "09002" | "DE" | "0" | true + // 09003 Entertainment Service checked in 0900 range test + "09004" | "DE" | "0" | true + // 09005 other premium services checked in 0900 range test + "09006" | "DE" | "0" | true + "09007" | "DE" | "0" | true + "09008" | "DE" | "0" | true + // TODO end: by Dec 1st of 2024 the ranges 9000 till 09008 will be possible for premium service + // --- + "09009" | "DE" | "0" | true // see https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Nummerierung/09009/9009_node.html removed block + "0901" | "DE" | "0" | true + "0902" | "DE" | "0" | true + "0903" | "DE" | "0" | true + "0904" | "DE" | "0" | true + "0905" | "DE" | "0" | true + // 0906 is Donauwörth + // 09070 till 09078 is in use + "09079" | "DE" | "0" | true + // total 0908x is in use + // 09090 till 0904 is in use + "09095" | "DE" | "0" | true + "09096" | "DE" | "0" | true + // 09097 is Marxheim + "09098" | "DE" | "0" | true + // 09099 is Kaisheim + "09100" | "DE" | "0" | true + // 09101 till 09107 is in use + "09108" | "DE" | "0" | true + "09109" | "DE" | "0" | true + // 0911 is Nürnberg + // 09120 is Leinburg + "09121" | "DE" | "0" | true + // 09122 till 09123 is in use + "09124" | "DE" | "0" | true + "09125" | "DE" | "0" | true + // 09126 till 09129 is in use + "09130" | "DE" | "0" | true + // 09131 till 09135 is in use + "09136" | "DE" | "0" | true + "09137" | "DE" | "0" | true + "09138" | "DE" | "0" | true + "09139" | "DE" | "0" | true + "09140" | "DE" | "0" | true + // 09141 till 09149 is in use + "09150" | "DE" | "0" | true + // 09151 till 09158 is in use + "09159" | "DE" | "0" | true + "09160" | "DE" | "0" | true + // 09161 till 09167 is in use + "09168" | "DE" | "0" | true + "09169" | "DE" | "0" | true + // 0917x till 0919x is in use + "09200" | "DE" | "0" | true + // 09201 till 09209 is in use + // 0921 is Bayreuth + // 09220 till 09223 is in use + "09224" | "DE" | "0" | true + // 09225 is Stadtsteinach + "09226" | "DE" | "0" | true + // 09227 till 09229 is in use + "09230" | "DE" | "0" | true + // 09231 till 09236 is in use + "09237" | "DE" | "0" | true + // 09238 is Röslau + "09239" | "DE" | "0" | true + "09240" | "DE" | "0" | true + // 09241 till 09246 is in use + "09247" | "DE" | "0" | true + "09248" | "DE" | "0" | true + "09249" | "DE" | "0" | true + "09250" | "DE" | "0" | true + // 09251 till 09257 is in use + "09258" | "DE" | "0" | true + "09259" | "DE" | "0" | true + // 0926x till 0928x is in use + "09290" | "DE" | "0" | true + "09291" | "DE" | "0" | true + // 09292 till 09295 is in use + "09296" | "DE" | "0" | true + "09297" | "DE" | "0" | true + "09298" | "DE" | "0" | true + "09300" | "DE" | "0" | true + "09301" | "DE" | "0" | true + // 09302 till 09303 is in use + "09304" | "DE" | "0" | true + // 09305 till 09307 is in use + "09308" | "DE" | "0" | true + "09309" | "DE" | "0" | true + // 0931 is Würzburg + "09320" | "DE" | "0" | true + // 09321 is Kitzingen + "09322" | "DE" | "0" | true + // 09323 till 09326 is in use + "09327" | "DE" | "0" | true + "09328" | "DE" | "0" | true + "09329" | "DE" | "0" | true + "09330" | "DE" | "0" | true + // 09331 till 09339 is in use + // 0934x till 0935x is in use + // 09360 is Thüngen + "09361" | "DE" | "0" | true + "09362" | "DE" | "0" | true + // 09363 till 09367 is in use + "09368" | "DE" | "0" | true + // 09369 is Uettingen + "09370" | "DE" | "0" | true + // 09371 till 09378 is in use + "09379" | "DE" | "0" | true + "09380" | "DE" | "0" | true + // 09381 till 09386 is in use + "09387" | "DE" | "0" | true + "09388" | "DE" | "0" | true + "09389" | "DE" | "0" | true + "09390" | "DE" | "0" | true + // 09391 till 09398 is in use + "09399" | "DE" | "0" | true + "09400" | "DE" | "0" | true + // 09401 till 09409 is in use + // 0941 is Regensburg + // 09420 till 09424 is in use + "09425" | "DE" | "0" | true + // 09426 till 09429 is in use + "09430" | "DE" | "0" | true + // 09431 is Schwandorf + "09432" | "DE" | "0" | true + // 09433 till 09436 is in use + "09437" | "DE" | "0" | true + // 09438 till 09439 is in use + "09440" | "DE" | "0" | true + // 09441 till 09448 is in use + "09449" | "DE" | "0" | true + "09450" | "DE" | "0" | true + // 09451 till 09454 is in use + "09455" | "DE" | "0" | true + "09456" | "DE" | "0" | true + "09457" | "DE" | "0" | true + "09458" | "DE" | "0" | true + "09459" | "DE" | "0" | true + "09460" | "DE" | "0" | true + // 09461 till 09649 is in use + "09470" | "DE" | "0" | true + // 09471 till 09474 is in use + "09475" | "DE" | "0" | true + "09476" | "DE" | "0" | true + "09477" | "DE" | "0" | true + "09478" | "DE" | "0" | true + "09479" | "DE" | "0" | true + // 09480 till 09482 is in use + "09483" | "DE" | "0" | true + // 09484 is Brennberg + "09485" | "DE" | "0" | true + "09486" | "DE" | "0" | true + "09487" | "DE" | "0" | true + "09488" | "DE" | "0" | true + "09489" | "DE" | "0" | true + "09490" | "DE" | "0" | true + // 09491 till 09493 is in use + "09494" | "DE" | "0" | true + // 09495 is Breitenbrunn Oberfalz + "09496" | "DE" | "0" | true + // 09497 till 09499 is in use + "09500" | "DE" | "0" | true + "09501" | "DE" | "0" | true + // 09502 till 09505 is in use + "09506" | "DE" | "0" | true + "09507" | "DE" | "0" | true + "09508" | "DE" | "0" | true + "09509" | "DE" | "0" | true + // 0951 is Bamberg + "09520" | "DE" | "0" | true + // 09521 till 09529 is in use + "09530" | "DE" | "0" | true + // 09531 till 09536 is in use + "09537" | "DE" | "0" | true + "09538" | "DE" | "0" | true + "09539" | "DE" | "0" | true + "09540" | "DE" | "0" | true + "09541" | "DE" | "0" | true + // 09542 till 09549 is in use + "09550" | "DE" | "0" | true + // 09551 till 09556 is in use + "09557" | "DE" | "0" | true + "09558" | "DE" | "0" | true + "09559" | "DE" | "0" | true + // total 0956x is in use + "09570" | "DE" | "0" | true + // 09571 till 09576 is in use + "09577" | "DE" | "0" | true + "09578" | "DE" | "0" | true + "09579" | "DE" | "0" | true + "0958" | "DE" | "0" | true + "0959" | "DE" | "0" | true + "09600" | "DE" | "0" | true + "09601" | "DE" | "0" | true + // 09602 till 09608 is in use + "09609" | "DE" | "0" | true + // 0961 is Weiden in der Oberfalz + "09620" | "DE" | "0" | true + // 09621 till 09622 is in use + "09623" | "DE" | "0" | true + // 09624 till 09628 is in use + "09629" | "DE" | "0" | true + "09630" | "DE" | "0" | true + // 09631 till 09639 is in use + "09640" | "DE" | "0" | true + // 09641 till 09648 is in use + "09649" | "DE" | "0" | true + "09650" | "DE" | "0" | true + // 09651 till 09659 is in use + "09660" | "DE" | "0" | true + // 09661 till 09666 is in use + "09667" | "DE" | "0" | true + "09668" | "DE" | "0" | true + "09669" | "DE" | "0" | true + "09670" | "DE" | "0" | true + // 09671 till 09677 is in use + "09678" | "DE" | "0" | true + "09679" | "DE" | "0" | true + "09680" | "DE" | "0" | true + // 09681 till 09683 is in use + "09684" | "DE" | "0" | true + "09685" | "DE" | "0" | true + "09686" | "DE" | "0" | true + "09687" | "DE" | "0" | true + "09688" | "DE" | "0" | true + "09689" | "DE" | "0" | true + "0969" | "DE" | "0" | true + "09700" | "DE" | "0" | true + // 09701 is Sandberg Unterfranken + "09702" | "DE" | "0" | true + "09703" | "DE" | "0" | true + // 09704 is Euerdorf + "09705" | "DE" | "0" | true + "09706" | "DE" | "0" | true + "09707" | "DE" | "0" | true + // 09708 is Bad Bocklet + // total 0972x is in use + "09730" | "DE" | "0" | true + "09731" | "DE" | "0" | true + // 09732 till 09738 is in use + "09739" | "DE" | "0" | true + "09740" | "DE" | "0" | true + // 09741 till 09742 is in use + "09743" | "DE" | "0" | true + // 09744 till 09749 is in use + "0975" | "DE" | "0" | true + "09760" | "DE" | "0" | true + // 09761 till 09766 is in use + "09767" | "DE" | "0" | true + "09768" | "DE" | "0" | true + "09769" | "DE" | "0" | true + "09770" | "DE" | "0" | true + // 09771 till 09779 is in use + "0978" | "DE" | "0" | true + "0979" | "DE" | "0" | true + "09800" | "DE" | "0" | true + "09801" | "DE" | "0" | true + // 09802 till 09805 + "09806" | "DE" | "0" | true + "09807" | "DE" | "0" | true + "09808" | "DE" | "0" | true + "09809" | "DE" | "0" | true + // 0981 is Ansbach + // 09820 is Lehrberg + "09821" | "DE" | "0" | true + // 09822 till 09829 is in use + "09830" | "DE" | "0" | true + // 09831 till 09837 s in use + "09838" | "DE" | "0" | true + "09839" | "DE" | "0" | true + "09840" | "DE" | "0" | true + // 09841 till 09848 is in use + "09849" | "DE" | "0" | true + "09850" | "DE" | "0" | true + // 09851 till 09857 is in use + "09858" | "DE" | "0" | true + "09859" | "DE" | "0" | true + "09860" | "DE" | "0" | true + // 09861 is Rothenburg ob der Tauber + "09862" | "DE" | "0" | true + "09863" | "DE" | "0" | true + "09864" | "DE" | "0" | true + // 09865 is Adelshofen Mittelfranken + "09866" | "DE" | "0" | true + // 09867 till 09869 is in use + "09870" | "DE" | "0" | true + // 09871 till 09876 is in use + "09877" | "DE" | "0" | true + "09878" | "DE" | "0" | true + "09879" | "DE" | "0" | true + "0988" | "DE" | "0" | true + "0989" | "DE" | "0" | true + "09900" | "DE" | "0" | true + // 09901 is Hengersberg Bayern + "09902" | "DE" | "0" | true + // 09903 till 09908 is in use + "09909" | "DE" | "0" | true + // 0991 is Deggendorf + // total 0992x is in use + "09930" | "DE" | "0" | true + // 09931 till 09933 is in use + "09934" | "DE" | "0" | true + // 09935 till 09938 is in use + "09939" | "DE" | "0" | true + "09940" | "DE" | "0" | true + // 09941 till 09948 is in use + "09949" | "DE" | "0" | true + "09950" | "DE" | "0" | true + // 09951 till 09956 is in use + "09957" | "DE" | "0" | true + "09958" | "DE" | "0" | true + "09959" | "DE" | "0" | true + "09960" | "DE" | "0" | true + // 09961 till 09966 is in use + "09967" | "DE" | "0" | true + "09968" | "DE" | "0" | true + "09969" | "DE" | "0" | true + "09970" | "DE" | "0" | true + // 09971 till 09978 is in use + "09979" | "DE" | "0" | true + "0998" | "DE" | "0" | true + "0999" | "DE" | "0" | true + } + + def "check if original lib fixed RFC3966 for valid German NDC"(String number, expectingFail) { + given: + String numberToTest = "0" + number + "555123" + expectingFail = false + + when: + String result = "0" + String onkz = extractONKZ(numberToTest, "DE") + if (onkz != null) { + if (number == onkz) { + result = "1" + } else { + result = "2" + } + } + + then: + if (result != "1") { + this.logResult(result, number, expectingFail, numberToTest, "DE") + } + + + where: + // BNetzA 27.07.2022: https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/Vorwahlverzeichnis_ONB.zip.html + // ITU 14.09.2022: https://www.itu.int/oth/T0202000051/ennumber | expectingFail + number | expectingFail + "201"| false + "202"| false + "203"| false + "2041"| false + "2043"| false + "2045"| false + "2051"| false + "2052"| false + "2053"| false + "2054"| false + "2056"| false + "2058"| false + "2064"| false + "2065"| false + "2066"| false + "208"| false + "209"| false + "2102"| false + "2103"| false + "2104"| false + "211"| false + "212"| false + "2129"| false + "2131"| false + "2132"| false + "2133"| false + "2137"| false + "214"| false + "2150"| false + "2151"| false + "2152"| false + "2153"| false + "2154"| false + "2156"| false + "2157"| false + "2158"| false + "2159"| false + "2161"| false + "2162"| false + "2163"| false + "2164"| false + "2165"| false + "2166"| false + "2171"| false + "2173"| false + "2174"| false + "2175"| false + "2181"| false + "2182"| false + "2183"| false + "2191"| false + "2192"| false + "2193"| false + "2195"| false + "2196"| false + "2202"| false + "2203"| false + "2204"| false + "2205"| false + "2206"| false + "2207"| false + "2208"| false + "221"| false + "2222"| false + "2223"| false + "2224"| false + "2225"| false + "2226"| false + "2227"| false + "2228"| false + "2232"| false + "2233"| false + "2234"| false + "2235"| false + "2236"| false + "2237"| false + "2238"| false + "2241"| false + "2242"| false + "2243"| false + "2244"| false + "2245"| false + "2246"| false + "2247"| false + "2248"| false + "2251"| false + "2252"| false + "2253"| false + "2254"| false + "2255"| false + "2256"| false + "2257"| false + "2261"| false + "2262"| false + "2263"| false + "2264"| false + "2265"| false + "2266"| false + "2267"| false + "2268"| false + "2269"| false + "2271"| false + "2272"| false + "2273"| false + "2274"| false + "2275"| false + "228"| false + "2291"| false + "2292"| false + "2293"| false + "2294"| false + "2295"| false + "2296"| false + "2297"| false + "2301"| false + "2302"| false + "2303"| false + "2304"| false + "2305"| false + "2306"| false + "2307"| false + "2308"| false + "2309"| false + "231"| false + "2323"| false + "2324"| false + "2325"| false + "2327"| false + "2330"| false + "2331"| false + "2332"| false + "2333"| false + "2334"| false + "2335"| false + "2336"| false + "2337"| false + "2338"| false + "2339"| false + "234"| false + "2351"| false + "2352"| false + "2353"| false + "2354"| false + "2355"| false + "2357"| false + "2358"| false + "2359"| false + "2360"| false + "2361"| false + "2362"| false + "2363"| false + "2364"| false + "2365"| false + "2366"| false + "2367"| false + "2368"| false + "2369"| false + "2371"| false + "2372"| false + "2373"| false + "2374"| false + "2375"| false + "2377"| false + "2378"| false + "2379"| false + "2381"| false + "2382"| false + "2383"| false + "2384"| false + "2385"| false + "2387"| false + "2388"| false + "2389"| false + "2391"| false + "2392"| false + "2393"| false + "2394"| false + "2395"| false + "2401"| false + "2402"| false + "2403"| false + "2404"| false + "2405"| false + "2406"| false + "2407"| false + "2408"| false + "2409"| false + "241"| false + "2421"| false + "2422"| false + "2423"| false + "2424"| false + "2425"| false + "2426"| false + "2427"| false + "2428"| false + "2429"| false + "2431"| false + "2432"| false + "2433"| false + "2434"| false + "2435"| false + "2436"| false + "2440"| false + "2441"| false + "2443"| false + "2444"| false + "2445"| false + "2446"| false + "2447"| false + "2448"| false + "2449"| false + "2451"| false + "2452"| false + "2453"| false + "2454"| false + "2455"| false + "2456"| false + "2461"| false + "2462"| false + "2463"| false + "2464"| false + "2465"| false + "2471"| false + "2472"| false + "2473"| false + "2474"| false + "2482"| false + "2484"| false + "2485"| false + "2486"| false + "2501"| false + "2502"| false + "2504"| false + "2505"| false + "2506"| false + "2507"| false + "2508"| false + "2509"| false + "251"| false + "2520"| false + "2521"| false + "2522"| false + "2523"| false + "2524"| false + "2525"| false + "2526"| false + "2527"| false + "2528"| false + "2529"| false + "2532"| false + "2533"| false + "2534"| false + "2535"| false + "2536"| false + "2538"| false + "2541"| false + "2542"| false + "2543"| false + "2545"| false + "2546"| false + "2547"| false + "2548"| false + "2551"| false + "2552"| false + "2553"| false + "2554"| false + "2555"| false + "2556"| false + "2557"| false + "2558"| false + "2561"| false + "2562"| false + "2563"| false + "2564"| false + "2565"| false + "2566"| false + "2567"| false + "2568"| false + "2571"| false + "2572"| false + "2573"| false + "2574"| false + "2575"| false + "2581"| false + "2582"| false + "2583"| false + "2584"| false + "2585"| false + "2586"| false + "2587"| false + "2588"| false + "2590"| false + "2591"| false + "2592"| false + "2593"| false + "2594"| false + "2595"| false + "2596"| false + "2597"| false + "2598"| false + "2599"| false + "2601"| false + "2602"| false + "2603"| false + "2604"| false + "2605"| false + "2606"| false + "2607"| false + "2608"| false + "261"| false + "2620"| false + "2621"| false + "2622"| false + "2623"| false + "2624"| false + "2625"| false + "2626"| false + "2627"| false + "2628"| false + "2630"| false + "2631"| false + "2632"| false + "2633"| false + "2634"| false + "2635"| false + "2636"| false + "2637"| false + "2638"| false + "2639"| false + "2641"| false + "2642"| false + "2643"| false + "2644"| false + "2645"| false + "2646"| false + "2647"| false + "2651"| false + "2652"| false + "2653"| false + "2654"| false + "2655"| false + "2656"| false + "2657"| false + "2661"| false + "2662"| false + "2663"| false + "2664"| false + "2666"| false + "2667"| false + "2671"| false + "2672"| false + "2673"| false + "2674"| false + "2675"| false + "2676"| false + "2677"| false + "2678"| false + "2680"| false + "2681"| false + "2682"| false + "2683"| false + "2684"| false + "2685"| false + "2686"| false + "2687"| false + "2688"| false + "2689"| false + "2691"| false + "2692"| false + "2693"| false + "2694"| false + "2695"| false + "2696"| false + "2697"| false + "271"| false + "2721"| false + "2722"| false + "2723"| false + "2724"| false + "2725"| false + "2732"| false + "2733"| false + "2734"| false + "2735"| false + "2736"| false + "2737"| false + "2738"| false + "2739"| false + "2741"| false + "2742"| false + "2743"| false + "2744"| false + "2745"| false + "2747"| false + "2750"| false + "2751"| false + "2752"| false + "2753"| false + "2754"| false + "2755"| false + "2758"| false + "2759"| false + "2761"| false + "2762"| false + "2763"| false + "2764"| false + "2770"| false + "2771"| false + "2772"| false + "2773"| false + "2774"| false + "2775"| false + "2776"| false + "2777"| false + "2778"| false + "2779"| false + "2801"| false + "2802"| false + "2803"| false + "2804"| false + "281"| false + "2821"| false + "2822"| false + "2823"| false + "2824"| false + "2825"| false + "2826"| false + "2827"| false + "2828"| false + "2831"| false + "2832"| false + "2833"| false + "2834"| false + "2835"| false + "2836"| false + "2837"| false + "2838"| false + "2839"| false + "2841"| false + "2842"| false + "2843"| false + "2844"| false + "2845"| false + "2850"| false + "2851"| false + "2852"| false + "2853"| false + "2855"| false + "2856"| false + "2857"| false + "2858"| false + "2859"| false + "2861"| false + "2862"| false + "2863"| false + "2864"| false + "2865"| false + "2866"| false + "2867"| false + "2871"| false + "2872"| false + "2873"| false + "2874"| false + "2902"| false + "2903"| false + "2904"| false + "2905"| false + "291"| false + "2921"| false + "2922"| false + "2923"| false + "2924"| false + "2925"| false + "2927"| false + "2928"| false + "2931"| false + "2932"| false + "2933"| false + "2934"| false + "2935"| false + "2937"| false + "2938"| false + "2941"| false + "2942"| false + "2943"| false + "2944"| false + "2945"| false + "2947"| false + "2948"| false + "2951"| false + "2952"| false + "2953"| false + "2954"| false + "2955"| false + "2957"| false + "2958"| false + "2961"| false + "2962"| false + "2963"| false + "2964"| false + "2971"| false + "2972"| false + "2973"| false + "2974"| false + "2975"| false + "2977"| false + "2981"| false + "2982"| false + "2983"| false + "2984"| false + "2985"| false + "2991"| false + "2992"| false + "2993"| false + "2994"| false + "30"| false + "3301"| false + "3302"| false + "3303"| false + "3304"| false + "33051"| false + "33052"| false + "33053"| false + "33054"| false + "33055"| false + "33056"| false + "3306"| false + "3307"| false + "33080"| false + "33082"| false + "33083"| false + "33084"| false + "33085"| false + "33086"| false + "33087"| false + "33088"| false + "33089"| false + "33093"| false + "33094"| false + "331"| false + "33200"| false + "33201"| false + "33202"| false + "33203"| false + "33204"| false + "33205"| false + "33206"| false + "33207"| false + "33208"| false + "33209"| false + "3321"| false + "3322"| false + "33230"| false + "33231"| false + "33232"| false + "33233"| false + "33234"| false + "33235"| false + "33237"| false + "33238"| false + "33239"| false + "3327"| false + "3328"| false + "3329"| false + "3331"| false + "3332"| false + "33331"| false + "33332"| false + "33333"| false + "33334"| false + "33335"| false + "33336"| false + "33337"| false + "33338"| false + "3334"| false + "3335"| false + "33361"| false + "33362"| false + "33363"| false + "33364"| false + "33365"| false + "33366"| false + "33367"| false + "33368"| false + "33369"| false + "3337"| false + "3338"| false + "33393"| false + "33394"| false + "33395"| false + "33396"| false + "33397"| false + "33398"| false + "3341"| false + "3342"| false + "33432"| false + "33433"| false + "33434"| false + "33435"| false + "33436"| false + "33437"| false + "33438"| false + "33439"| false + "3344"| false + "33451"| false + "33452"| false + "33454"| false + "33456"| false + "33457"| false + "33458"| false + "3346"| false + "33470"| false + "33472"| false + "33473"| false + "33474"| false + "33475"| false + "33476"| false + "33477"| false + "33478"| false + "33479"| false + "335"| false + "33601"| false + "33602"| false + "33603"| false + "33604"| false + "33605"| false + "33606"| false + "33607"| false + "33608"| false + "33609"| false + "3361"| false + "3362"| false + "33631"| false + "33632"| false + "33633"| false + "33634"| false + "33635"| false + "33636"| false + "33637"| false + "33638"| false + "3364"| false + "33652"| false + "33653"| false + "33654"| false + "33655"| false + "33656"| false + "33657"| false + "3366"| false + "33671"| false + "33672"| false + "33673"| false + "33674"| false + "33675"| false + "33676"| false + "33677"| false + "33678"| false + "33679"| false + "33701"| false + "33702"| false + "33703"| false + "33704"| false + "33708"| false + "3371"| false + "3372"| false + "33731"| false + "33732"| false + "33733"| false + "33734"| false + "33741"| false + "33742"| false + "33743"| false + "33744"| false + "33745"| false + "33746"| false + "33747"| false + "33748"| false + "3375"| false + "33760"| false + "33762"| false + "33763"| false + "33764"| false + "33765"| false + "33766"| false + "33767"| false + "33768"| false + "33769"| false + "3377"| false + "3378"| false + "3379"| false + "3381"| false + "3382"| false + "33830"| false + "33831"| false + "33832"| false + "33833"| false + "33834"| false + "33835"| false + "33836"| false + "33837"| false + "33838"| false + "33839"| false + "33841"| false + "33843"| false + "33844"| false + "33845"| false + "33846"| false + "33847"| false + "33848"| false + "33849"| false + "3385"| false + "3386"| false + "33870"| false + "33872"| false + "33873"| false + "33874"| false + "33875"| false + "33876"| false + "33877"| false + "33878"| false + "3391"| false + "33920"| false + "33921"| false + "33922"| false + "33923"| false + "33924"| false + "33925"| false + "33926"| false + "33927"| false + "33928"| false + "33929"| false + "33931"| false + "33932"| false + "33933"| false + "3394"| false + "3395"| false + "33962"| false + "33963"| false + "33964"| false + "33965"| false + "33966"| false + "33967"| false + "33968"| false + "33969"| false + "33970"| false + "33971"| false + "33972"| false + "33973"| false + "33974"| false + "33975"| false + "33976"| false + "33977"| false + "33978"| false + "33979"| false + "33981"| false + "33982"| false + "33983"| false + "33984"| false + "33986"| false + "33989"| false + "340"| false + "341"| false + "34202"| false + "34203"| false + "34204"| false + "34205"| false + "34206"| false + "34207"| false + "34208"| false + "3421"| false + "34221"| false + "34222"| false + "34223"| false + "34224"| false + "3423"| false + "34241"| false + "34242"| false + "34243"| false + "34244"| false + "3425"| false + "34261"| false + "34262"| false + "34263"| false + "34291"| false + "34292"| false + "34293"| false + "34294"| false + "34295"| false + "34296"| false + "34297"| false + "34298"| false + "34299"| false + "3431"| false + "34321"| false + "34322"| false + "34324"| false + "34325"| false + "34327"| false + "34328"| false + "3433"| false + "34341"| false + "34342"| false + "34343"| false + "34344"| false + "34345"| false + "34346"| false + "34347"| false + "34348"| false + "3435"| false + "34361"| false + "34362"| false + "34363"| false + "34364"| false + "3437"| false + "34381"| false + "34382"| false + "34383"| false + "34384"| false + "34385"| false + "34386"| false + "3441"| false + "34422"| false + "34423"| false + "34424"| false + "34425"| false + "34426"| false + "3443"| false + "34441"| false + "34443"| false + "34444"| false + "34445"| false + "34446"| false + "3445"| false + "34461"| false + "34462"| false + "34463"| false + "34464"| false + "34465"| false + "34466"| false + "34467"| false + "3447"| false + "3448"| false + "34491"| false + "34492"| false + "34493"| false + "34494"| false + "34495"| false + "34496"| false + "34497"| false + "34498"| false + "345"| false + "34600"| false + "34601"| false + "34602"| false + "34603"| false + "34604"| false + "34605"| false + "34606"| false + "34607"| false + "34609"| false + "3461"| false + "3462"| false + "34632"| false + "34633"| false + "34635"| false + "34636"| false + "34637"| false + "34638"| false + "34639"| false + "3464"| false + "34651"| false + "34652"| false + "34653"| false + "34654"| false + "34656"| false + "34658"| false + "34659"| false + "3466"| false + "34671"| false + "34672"| false + "34673"| false + "34691"| false + "34692"| false + "3471"| false + "34721"| false + "34722"| false + "3473"| false + "34741"| false + "34742"| false + "34743"| false + "34745"| false + "34746"| false + "3475"| false + "3476"| false + "34771"| false + "34772"| false + "34773"| false + "34774"| false + "34775"| false + "34776"| false + "34779"| false + "34781"| false + "34782"| false + "34783"| false + "34785"| false + "34901"| false + "34903"| false + "34904"| false + "34905"| false + "34906"| false + "34907"| false + "34909"| false + "3491"| false + "34920"| false + "34921"| false + "34922"| false + "34923"| false + "34924"| false + "34925"| false + "34926"| false + "34927"| false + "34928"| false + "34929"| false + "3493"| false + "3494"| false + "34953"| false + "34954"| false + "34955"| false + "34956"| false + "3496"| false + "34973"| false + "34975"| false + "34976"| false + "34977"| false + "34978"| false + "34979"| false + "3501"| false + "35020"| false + "35021"| false + "35022"| false + "35023"| false + "35024"| false + "35025"| false + "35026"| false + "35027"| false + "35028"| false + "35032"| false + "35033"| false + "3504"| false + "35052"| false + "35053"| false + "35054"| false + "35055"| false + "35056"| false + "35057"| false + "35058"| false + "351"| false + "35200"| false + "35201"| false + "35202"| false + "35203"| false + "35204"| false + "35205"| false + "35206"| false + "35207"| false + "35208"| false + "35209"| false + "3521"| false + "3522"| false + "3523"| false + "35240"| false + "35241"| false + "35242"| false + "35243"| false + "35244"| false + "35245"| false + "35246"| false + "35247"| false + "35248"| false + "35249"| false + "3525"| false + "35263"| false + "35264"| false + "35265"| false + "35266"| false + "35267"| false + "35268"| false + "3528"| false + "3529"| false + "3531"| false + "35322"| false + "35323"| false + "35324"| false + "35325"| false + "35326"| false + "35327"| false + "35329"| false + "3533"| false + "35341"| false + "35342"| false + "35343"| false + "3535"| false + "35361"| false + "35362"| false + "35363"| false + "35364"| false + "35365"| false + "3537"| false + "35383"| false + "35384"| false + "35385"| false + "35386"| false + "35387"| false + "35388"| false + "35389"| false + "3541"| false + "3542"| false + "35433"| false + "35434"| false + "35435"| false + "35436"| false + "35439"| false + "3544"| false + "35451"| false + "35452"| false + "35453"| false + "35454"| false + "35455"| false + "35456"| false + "3546"| false + "35471"| false + "35472"| false + "35473"| false + "35474"| false + "35475"| false + "35476"| false + "35477"| false + "35478"| false + "355"| false + "35600"| false + "35601"| false + "35602"| false + "35603"| false + "35604"| false + "35605"| false + "35606"| false + "35607"| false + "35608"| false + "35609"| false + "3561"| false + "3562"| false + "3563"| false + "3564"| false + "35691"| false + "35692"| false + "35693"| false + "35694"| false + "35695"| false + "35696"| false + "35697"| false + "35698"| false + "3571"| false + "35722"| false + "35723"| false + "35724"| false + "35725"| false + "35726"| false + "35727"| false + "35728"| false + "3573"| false + "3574"| false + "35751"| false + "35752"| false + "35753"| false + "35754"| false + "35755"| false + "35756"| false + "3576"| false + "35771"| false + "35772"| false + "35773"| false + "35774"| false + "35775"| false + "3578"| false + "35792"| false + "35793"| false + "35795"| false + "35796"| false + "35797"| false + "3581"| false + "35820"| false + "35822"| false + "35823"| false + "35825"| false + "35826"| false + "35827"| false + "35828"| false + "35829"| false + "3583"| false + "35841"| false + "35842"| false + "35843"| false + "35844"| false + "3585"| false + "3586"| false + "35872"| false + "35873"| false + "35874"| false + "35875"| false + "35876"| false + "35877"| false + "3588"| false + "35891"| false + "35892"| false + "35893"| false + "35894"| false + "35895"| false + "3591"| false + "3592"| false + "35930"| false + "35931"| false + "35932"| false + "35933"| false + "35934"| false + "35935"| false + "35936"| false + "35937"| false + "35938"| false + "35939"| false + "3594"| false + "35951"| false + "35952"| false + "35953"| false + "35954"| false + "35955"| false + "3596"| false + "35971"| false + "35973"| false + "35974"| false + "35975"| false + "3601"| false + "36020"| false + "36021"| false + "36022"| false + "36023"| false + "36024"| false + "36025"| false + "36026"| false + "36027"| false + "36028"| false + "36029"| false + "3603"| false + "36041"| false + "36042"| false + "36043"| false + "3605"| false + "3606"| false + "36071"| false + "36072"| false + "36074"| false + "36075"| false + "36076"| false + "36077"| false + "36081"| false + "36082"| false + "36083"| false + "36084"| false + "36085"| false + "36087"| false + "361"| false + "36200"| false + "36201"| false + "36202"| false + "36203"| false + "36204"| false + "36205"| false + "36206"| false + "36207"| false + "36208"| false + "36209"| false + "3621"| false + "3622"| false + "3623"| false + "3624"| false + "36252"| false + "36253"| false + "36254"| false + "36255"| false + "36256"| false + "36257"| false + "36258"| false + "36259"| false + "3628"| false + "3629"| false + "3631"| false + "3632"| false + "36330"| false + "36331"| false + "36332"| false + "36333"| false + "36334"| false + "36335"| false + "36336"| false + "36337"| false + "36338"| false + "3634"| false + "3635"| false + "3636"| false + "36370"| false + "36371"| false + "36372"| false + "36373"| false + "36374"| false + "36375"| false + "36376"| false + "36377"| false + "36378"| false + "36379"| false + "3641"| false + "36421"| false + "36422"| false + "36423"| false + "36424"| false + "36425"| false + "36426"| false + "36427"| false + "36428"| false + "3643"| false + "3644"| false + "36450"| false + "36451"| false + "36452"| false + "36453"| false + "36454"| false + "36458"| false + "36459"| false + "36461"| false + "36462"| false + "36463"| false + "36464"| false + "36465"| false + "3647"| false + "36481"| false + "36482"| false + "36483"| false + "36484"| false + "365"| false + "36601"| false + "36602"| false + "36603"| false + "36604"| false + "36605"| false + "36606"| false + "36607"| false + "36608"| false + "3661"| false + "36621"| false + "36622"| false + "36623"| false + "36624"| false + "36625"| false + "36626"| false + "36628"| false + "3663"| false + "36640"| false + "36642"| false + "36643"| false + "36644"| false + "36645"| false + "36646"| false + "36647"| false + "36648"| false + "36649"| false + "36651"| false + "36652"| false + "36653"| false + "36691"| false + "36692"| false + "36693"| false + "36694"| false + "36695"| false + "36701"| false + "36702"| false + "36703"| false + "36704"| false + "36705"| false + "3671"| false + "3672"| false + "36730"| false + "36731"| false + "36732"| false + "36733"| false + "36734"| false + "36735"| false + "36736"| false + "36737"| false + "36738"| false + "36739"| false + "36741"| false + "36742"| false + "36743"| false + "36744"| false + "3675"| false + "36761"| false + "36762"| false + "36764"| false + "36766"| false + "3677"| false + "36781"| false + "36782"| false + "36783"| false + "36784"| false + "36785"| false + "3679"| false + "3681"| false + "3682"| false + "3683"| false + "36840"| false + "36841"| false + "36842"| false + "36843"| false + "36844"| false + "36845"| false + "36846"| false + "36847"| false + "36848"| false + "36849"| false + "3685"| false + "3686"| false + "36870"| false + "36871"| false + "36873"| false + "36874"| false + "36875"| false + "36878"| false + "3691"| false + "36920"| false + "36921"| false + "36922"| false + "36923"| false + "36924"| false + "36925"| false + "36926"| false + "36927"| false + "36928"| false + "36929"| false + "3693"| false + "36940"| false + "36941"| false + "36943"| false + "36944"| false + "36945"| false + "36946"| false + "36947"| false + "36948"| false + "36949"| false + "3695"| false + "36961"| false + "36962"| false + "36963"| false + "36964"| false + "36965"| false + "36966"| false + "36967"| false + "36968"| false + "36969"| false + "371"| false + "37200"| false + "37202"| false + "37203"| false + "37204"| false + "37206"| false + "37207"| false + "37208"| false + "37209"| false + "3721"| false + "3722"| false + "3723"| false + "3724"| false + "3725"| false + "3726"| false + "3727"| false + "37291"| false + "37292"| false + "37293"| false + "37294"| false + "37295"| false + "37296"| false + "37297"| false + "37298"| false + "3731"| false + "37320"| false + "37321"| false + "37322"| false + "37323"| false + "37324"| false + "37325"| false + "37326"| false + "37327"| false + "37328"| false + "37329"| false + "3733"| false + "37341"| false + "37342"| false + "37343"| false + "37344"| false + "37346"| false + "37347"| false + "37348"| false + "37349"| false + "3735"| false + "37360"| false + "37361"| false + "37362"| false + "37363"| false + "37364"| false + "37365"| false + "37366"| false + "37367"| false + "37368"| false + "37369"| false + "3737"| false + "37381"| false + "37382"| false + "37383"| false + "37384"| false + "3741"| false + "37421"| false + "37422"| false + "37423"| false + "37430"| false + "37431"| false + "37432"| false + "37433"| false + "37434"| false + "37435"| false + "37436"| false + "37437"| false + "37438"| false + "37439"| false + "3744"| false + "3745"| false + "37462"| false + "37463"| false + "37464"| false + "37465"| false + "37467"| false + "37468"| false + "375"| false + "37600"| false + "37601"| false + "37602"| false + "37603"| false + "37604"| false + "37605"| false + "37606"| false + "37607"| false + "37608"| false + "37609"| false + "3761"| false + "3762"| false + "3763"| false + "3764"| false + "3765"| false + "3771"| false + "3772"| false + "3773"| false + "3774"| false + "37752"| false + "37754"| false + "37755"| false + "37756"| false + "37757"| false + "381"| false + "38201"| false + "38202"| false + "38203"| false + "38204"| false + "38205"| false + "38206"| false + "38207"| false + "38208"| false + "38209"| false + "3821"| false + "38220"| false + "38221"| false + "38222"| false + "38223"| false + "38224"| false + "38225"| false + "38226"| false + "38227"| false + "38228"| false + "38229"| false + "38231"| false + "38232"| false + "38233"| false + "38234"| false + "38292"| false + "38293"| false + "38294"| false + "38295"| false + "38296"| false + "38297"| false + "38300"| false + "38301"| false + "38302"| false + "38303"| false + "38304"| false + "38305"| false + "38306"| false + "38307"| false + "38308"| false + "38309"| false + "3831"| false + "38320"| false + "38321"| false + "38322"| false + "38323"| false + "38324"| false + "38325"| false + "38326"| false + "38327"| false + "38328"| false + "38331"| false + "38332"| false + "38333"| false + "38334"| false + "3834"| false + "38351"| false + "38352"| false + "38353"| false + "38354"| false + "38355"| false + "38356"| false + "3836"| false + "38370"| false + "38371"| false + "38372"| false + "38373"| false + "38374"| false + "38375"| false + "38376"| false + "38377"| false + "38378"| false + "38379"| false + "3838"| false + "38391"| false + "38392"| false + "38393"| false + "3841"| false + "38422"| false + "38423"| false + "38424"| false + "38425"| false + "38426"| false + "38427"| false + "38428"| false + "38429"| false + "3843"| false + "3844"| false + "38450"| false + "38451"| false + "38452"| false + "38453"| false + "38454"| false + "38455"| false + "38456"| false + "38457"| false + "38458"| false + "38459"| false + "38461"| false + "38462"| false + "38464"| false + "38466"| false + "3847"| false + "38481"| false + "38482"| false + "38483"| false + "38484"| false + "38485"| false + "38486"| false + "38488"| false + "385"| false + "3860"| false + "3861"| false + "3863"| false + "3865"| false + "3866"| false + "3867"| false + "3868"| false + "3869"| false + "3871"| false + "38720"| false + "38721"| false + "38722"| false + "38723"| false + "38724"| false + "38725"| false + "38726"| false + "38727"| false + "38728"| false + "38729"| false + "38731"| false + "38732"| false + "38733"| false + "38735"| false + "38736"| false + "38737"| false + "38738"| false + "3874"| false + "38750"| false + "38751"| false + "38752"| false + "38753"| false + "38754"| false + "38755"| false + "38756"| false + "38757"| false + "38758"| false + "38759"| false + "3876"| false + "3877"| false + "38780"| false + "38781"| false + "38782"| false + "38783"| false + "38784"| false + "38785"| false + "38787"| false + "38788"| false + "38789"| false + "38791"| false + "38792"| false + "38793"| false + "38794"| false + "38796"| false + "38797"| false + "3881"| false + "38821"| false + "38822"| false + "38823"| false + "38824"| false + "38825"| false + "38826"| false + "38827"| false + "38828"| false + "3883"| false + "38841"| false + "38842"| false + "38843"| false + "38844"| false + "38845"| false + "38847"| false + "38848"| false + "38850"| false + "38851"| false + "38852"| false + "38853"| false + "38854"| false + "38855"| false + "38856"| false + "38858"| false + "38859"| false + "3886"| false + "38871"| false + "38872"| false + "38873"| false + "38874"| false + "38875"| false + "38876"| false + "39000"| false + "39001"| false + "39002"| false + "39003"| false + "39004"| false + "39005"| false + "39006"| false + "39007"| false + "39008"| false + "39009"| false + "3901"| false + "3902"| false + "39030"| false + "39031"| false + "39032"| false + "39033"| false + "39034"| false + "39035"| false + "39036"| false + "39037"| false + "39038"| false + "39039"| false + "3904"| false + "39050"| false + "39051"| false + "39052"| false + "39053"| false + "39054"| false + "39055"| false + "39056"| false + "39057"| false + "39058"| false + "39059"| false + "39061"| false + "39062"| false + "3907"| false + "39080"| false + "39081"| false + "39082"| false + "39083"| false + "39084"| false + "39085"| false + "39086"| false + "39087"| false + "39088"| false + "39089"| false + "3909"| false + "391"| false + "39200"| false + "39201"| false + "39202"| false + "39203"| false + "39204"| false + "39205"| false + "39206"| false + "39207"| false + "39208"| false + "39209"| false + "3921"| false + "39221"| false + "39222"| false + "39223"| false + "39224"| false + "39225"| false + "39226"| false + "3923"| false + "39241"| false + "39242"| false + "39243"| false + "39244"| false + "39245"| false + "39246"| false + "39247"| false + "39248"| false + "3925"| false + "39262"| false + "39263"| false + "39264"| false + "39265"| false + "39266"| false + "39267"| false + "39268"| false + "3928"| false + "39291"| false + "39292"| false + "39293"| false + "39294"| false + "39295"| false + "39296"| false + "39297"| false + "39298"| false + "3931"| false + "39320"| false + "39321"| false + "39322"| false + "39323"| false + "39324"| false + "39325"| false + "39327"| false + "39328"| false + "39329"| false + "3933"| false + "39341"| false + "39342"| false + "39343"| false + "39344"| false + "39345"| false + "39346"| false + "39347"| false + "39348"| false + "39349"| false + "3935"| false + "39361"| false + "39362"| false + "39363"| false + "39364"| false + "39365"| false + "39366"| false + "3937"| false + "39382"| false + "39383"| false + "39384"| false + "39386"| false + "39387"| false + "39388"| false + "39389"| false + "39390"| false + "39391"| false + "39392"| false + "39393"| false + "39394"| false + "39395"| false + "39396"| false + "39397"| false + "39398"| false + "39399"| false + "39400"| false + "39401"| false + "39402"| false + "39403"| false + "39404"| false + "39405"| false + "39406"| false + "39407"| false + "39408"| false + "39409"| false + "3941"| false + "39421"| false + "39422"| false + "39423"| false + "39424"| false + "39425"| false + "39426"| false + "39427"| false + "39428"| false + "3943"| false + "3944"| false + "39451"| false + "39452"| false + "39453"| false + "39454"| false + "39455"| false + "39456"| false + "39457"| false + "39458"| false + "39459"| false + "3946"| false + "3947"| false + "39481"| false + "39482"| false + "39483"| false + "39484"| false + "39485"| false + "39487"| false + "39488"| false + "39489"| false + "3949"| false + "395"| false + "39600"| false + "39601"| false + "39602"| false + "39603"| false + "39604"| false + "39605"| false + "39606"| false + "39607"| false + "39608"| false + "3961"| false + "3962"| false + "3963"| false + "3964"| false + "3965"| false + "3966"| false + "3967"| false + "3968"| false + "3969"| false + "3971"| false + "39721"| false + "39722"| false + "39723"| false + "39724"| false + "39726"| false + "39727"| false + "39728"| false + "3973"| false + "39740"| false + "39741"| false + "39742"| false + "39743"| false + "39744"| false + "39745"| false + "39746"| false + "39747"| false + "39748"| false + "39749"| false + "39751"| false + "39752"| false + "39753"| false + "39754"| false + "3976"| false + "39771"| false + "39772"| false + "39773"| false + "39774"| false + "39775"| false + "39776"| false + "39777"| false + "39778"| false + "39779"| false + "3981"| false + "39820"| false + "39821"| false + "39822"| false + "39823"| false + "39824"| false + "39825"| false + "39826"| false + "39827"| false + "39828"| false + "39829"| false + "39831"| false + "39832"| false + "39833"| false + "3984"| false + "39851"| false + "39852"| false + "39853"| false + "39854"| false + "39855"| false + "39856"| false + "39857"| false + "39858"| false + "39859"| false + "39861"| false + "39862"| false + "39863"| false + "3987"| false + "39881"| false + "39882"| false + "39883"| false + "39884"| false + "39885"| false + "39886"| false + "39887"| false + "39888"| false + "39889"| false + "3991"| false + "39921"| false + "39922"| false + "39923"| false + "39924"| false + "39925"| false + "39926"| false + "39927"| false + "39928"| false + "39929"| false + "39931"| false + "39932"| false + "39933"| false + "39934"| false + "3994"| false + "39951"| false + "39952"| false + "39953"| false + "39954"| false + "39955"| false + "39956"| false + "39957"| false + "39959"| false + "3996"| false + "39971"| false + "39972"| false + "39973"| false + "39975"| false + "39976"| false + "39977"| false + "39978"| false + "3998"| false + "39991"| false + "39992"| false + "39993"| false + "39994"| false + "39995"| false + "39996"| false + "39997"| false + "39998"| false + "39999"| false + "40"| false + "4101"| false + "4102"| false + "4103"| false + "4104"| false + "4105"| false + "4106"| false + "4107"| false + "4108"| false + "4109"| false + "4120"| false + "4121"| false + "4122"| false + "4123"| false + "4124"| false + "4125"| false + "4126"| false + "4127"| false + "4128"| false + "4129"| false + "4131"| false + "4132"| false + "4133"| false + "4134"| false + "4135"| false + "4136"| false + "4137"| false + "4138"| false + "4139"| false + "4140"| false + "4141"| false + "4142"| false + "4143"| false + "4144"| false + "4146"| false + "4148"| false + "4149"| false + "4151"| false + "4152"| false + "4153"| false + "4154"| false + "4155"| false + "4156"| false + "4158"| false + "4159"| false + "4161"| false + "4162"| false + "4163"| false + "4164"| false + "4165"| false + "4166"| false + "4167"| false + "4168"| false + "4169"| false + "4171"| false + "4172"| false + "4173"| false + "4174"| false + "4175"| false + "4176"| false + "4177"| false + "4178"| false + "4179"| false + "4180"| false + "4181"| false + "4182"| false + "4183"| false + "4184"| false + "4185"| false + "4186"| false + "4187"| false + "4188"| false + "4189"| false + "4191"| false + "4192"| false + "4193"| false + "4194"| false + "4195"| false + "4202"| false + "4203"| false + "4204"| false + "4205"| false + "4206"| false + "4207"| false + "4208"| false + "4209"| false + "421"| false + "4221"| false + "4222"| false + "4223"| false + "4224"| false + "4230"| false + "4231"| false + "4232"| false + "4233"| false + "4234"| false + "4235"| false + "4236"| false + "4237"| false + "4238"| false + "4239"| false + "4240"| false + "4241"| false + "4242"| false + "4243"| false + "4244"| false + "4245"| false + "4246"| false + "4247"| false + "4248"| false + "4249"| false + "4251"| false + "4252"| false + "4253"| false + "4254"| false + "4255"| false + "4256"| false + "4257"| false + "4258"| false + "4260"| false + "4261"| false + "4262"| false + "4263"| false + "4264"| false + "4265"| false + "4266"| false + "4267"| false + "4268"| false + "4269"| false + "4271"| false + "4272"| false + "4273"| false + "4274"| false + "4275"| false + "4276"| false + "4277"| false + "4281"| false + "4282"| false + "4283"| false + "4284"| false + "4285"| false + "4286"| false + "4287"| false + "4288"| false + "4289"| false + "4292"| false + "4293"| false + "4294"| false + "4295"| false + "4296"| false + "4297"| false + "4298"| false + "4302"| false + "4303"| false + "4305"| false + "4307"| false + "4308"| false + "431"| false + "4320"| false + "4321"| false + "4322"| false + "4323"| false + "4324"| false + "4326"| false + "4327"| false + "4328"| false + "4329"| false + "4330"| false + "4331"| false + "4332"| false + "4333"| false + "4334"| false + "4335"| false + "4336"| false + "4337"| false + "4338"| false + "4339"| false + "4340"| false + "4342"| false + "4343"| false + "4344"| false + "4346"| false + "4347"| false + "4348"| false + "4349"| false + "4351"| false + "4352"| false + "4353"| false + "4354"| false + "4355"| false + "4356"| false + "4357"| false + "4358"| false + "4361"| false + "4362"| false + "4363"| false + "4364"| false + "4365"| false + "4366"| false + "4367"| false + "4371"| false + "4372"| false + "4381"| false + "4382"| false + "4383"| false + "4384"| false + "4385"| false + "4392"| false + "4393"| false + "4394"| false + "4401"| false + "4402"| false + "4403"| false + "4404"| false + "4405"| false + "4406"| false + "4407"| false + "4408"| false + "4409"| false + "441"| false + "4421"| false + "4422"| false + "4423"| false + "4425"| false + "4426"| false + "4431"| false + "4432"| false + "4433"| false + "4434"| false + "4435"| false + "4441"| false + "4442"| false + "4443"| false + "4444"| false + "4445"| false + "4446"| false + "4447"| false + "4451"| false + "4452"| false + "4453"| false + "4454"| false + "4455"| false + "4456"| false + "4458"| false + "4461"| false + "4462"| false + "4463"| false + "4464"| false + "4465"| false + "4466"| false + "4467"| false + "4468"| false + "4469"| false + "4471"| false + "4472"| false + "4473"| false + "4474"| false + "4475"| false + "4477"| false + "4478"| false + "4479"| false + "4480"| false + "4481"| false + "4482"| false + "4483"| false + "4484"| false + "4485"| false + "4486"| false + "4487"| false + "4488"| false + "4489"| false + "4491"| false + "4492"| false + "4493"| false + "4494"| false + "4495"| false + "4496"| false + "4497"| false + "4498"| false + "4499"| false + "4501"| false + "4502"| false + "4503"| false + "4504"| false + "4505"| false + "4506"| false + "4508"| false + "4509"| false + "451"| false + "4521"| false + "4522"| false + "4523"| false + "4524"| false + "4525"| false + "4526"| false + "4527"| false + "4528"| false + "4529"| false + "4531"| false + "4532"| false + "4533"| false + "4534"| false + "4535"| false + "4536"| false + "4537"| false + "4539"| false + "4541"| false + "4542"| false + "4543"| false + "4544"| false + "4545"| false + "4546"| false + "4547"| false + "4550"| false + "4551"| false + "4552"| false + "4553"| false + "4554"| false + "4555"| false + "4556"| false + "4557"| false + "4558"| false + "4559"| false + "4561"| false + "4562"| false + "4563"| false + "4564"| false + "4602"| false + "4603"| false + "4604"| false + "4605"| false + "4606"| false + "4607"| false + "4608"| false + "4609"| false + "461"| false + "4621"| false + "4622"| false + "4623"| false + "4624"| false + "4625"| false + "4626"| false + "4627"| false + "4630"| false + "4631"| false + "4632"| false + "4633"| false + "4634"| false + "4635"| false + "4636"| false + "4637"| false + "4638"| false + "4639"| false + "4641"| false + "4642"| false + "4643"| false + "4644"| false + "4646"| false + "4651"| false + "4661"| false + "4662"| false + "4663"| false + "4664"| false + "4665"| false + "4666"| false + "4667"| false + "4668"| false + "4671"| false + "4672"| false + "4673"| false + "4674"| false + "4681"| false + "4682"| false + "4683"| false + "4684"| false + "4702"| false + "4703"| false + "4704"| false + "4705"| false + "4706"| false + "4707"| false + "4708"| false + "471"| false + "4721"| false + "4722"| false + "4723"| false + "4724"| false + "4725"| false + "4731"| false + "4732"| false + "4733"| false + "4734"| false + "4735"| false + "4736"| false + "4737"| false + "4740"| false + "4741"| false + "4742"| false + "4743"| false + "4744"| false + "4745"| false + "4746"| false + "4747"| false + "4748"| false + "4749"| false + "4751"| false + "4752"| false + "4753"| false + "4754"| false + "4755"| false + "4756"| false + "4757"| false + "4758"| false + "4761"| false + "4762"| false + "4763"| false + "4764"| false + "4765"| false + "4766"| false + "4767"| false + "4768"| false + "4769"| false + "4770"| false + "4771"| false + "4772"| false + "4773"| false + "4774"| false + "4775"| false + "4776"| false + "4777"| false + "4778"| false + "4779"| false + "4791"| false + "4792"| false + "4793"| false + "4794"| false + "4795"| false + "4796"| false + "4802"| false + "4803"| false + "4804"| false + "4805"| false + "4806"| false + "481"| false + "4821"| false + "4822"| false + "4823"| false + "4824"| false + "4825"| false + "4826"| false + "4827"| false + "4828"| false + "4829"| false + "4830"| false + "4832"| false + "4833"| false + "4834"| false + "4835"| false + "4836"| false + "4837"| false + "4838"| false + "4839"| false + "4841"| false + "4842"| false + "4843"| false + "4844"| false + "4845"| false + "4846"| false + "4847"| false + "4848"| false + "4849"| false + "4851"| false + "4852"| false + "4853"| false + "4854"| false + "4855"| false + "4856"| false + "4857"| false + "4858"| false + "4859"| false + "4861"| false + "4862"| false + "4863"| false + "4864"| false + "4865"| false + "4871"| false + "4872"| false + "4873"| false + "4874"| false + "4875"| false + "4876"| false + "4877"| false + "4881"| false + "4882"| false + "4883"| false + "4884"| false + "4885"| false + "4892"| false + "4893"| false + "4902"| false + "4903"| false + "491"| false + "4920"| false + "4921"| false + "4922"| false + "4923"| false + "4924"| false + "4925"| false + "4926"| false + "4927"| false + "4928"| false + "4929"| false + "4931"| false + "4932"| false + "4933"| false + "4934"| false + "4935"| false + "4936"| false + "4938"| false + "4939"| false + "4941"| false + "4942"| false + "4943"| false + "4944"| false + "4945"| false + "4946"| false + "4947"| false + "4948"| false + "4950"| false + "4951"| false + "4952"| false + "4953"| false + "4954"| false + "4955"| false + "4956"| false + "4957"| false + "4958"| false + "4959"| false + "4961"| false + "4962"| false + "4963"| false + "4964"| false + "4965"| false + "4966"| false + "4967"| false + "4968"| false + "4971"| false + "4972"| false + "4973"| false + "4974"| false + "4975"| false + "4976"| false + "4977"| false + "5021"| false + "5022"| false + "5023"| false + "5024"| false + "5025"| false + "5026"| false + "5027"| false + "5028"| false + "5031"| false + "5032"| false + "5033"| false + "5034"| false + "5035"| false + "5036"| false + "5037"| false + "5041"| false + "5042"| false + "5043"| false + "5044"| false + "5045"| false + "5051"| false + "5052"| false + "5053"| false + "5054"| false + "5055"| false + "5056"| false + "5060"| false + "5062"| false + "5063"| false + "5064"| false + "5065"| false + "5066"| false + "5067"| false + "5068"| false + "5069"| false + "5071"| false + "5072"| false + "5073"| false + "5074"| false + "5082"| false + "5083"| false + "5084"| false + "5085"| false + "5086"| false + "5101"| false + "5102"| false + "5103"| false + "5105"| false + "5108"| false + "5109"| false + "511"| false + "5121"| false + "5123"| false + "5126"| false + "5127"| false + "5128"| false + "5129"| false + "5130"| false + "5131"| false + "5132"| false + "5135"| false + "5136"| false + "5137"| false + "5138"| false + "5139"| false + "5141"| false + "5142"| false + "5143"| false + "5144"| false + "5145"| false + "5146"| false + "5147"| false + "5148"| false + "5149"| false + "5151"| false + "5152"| false + "5153"| false + "5154"| false + "5155"| false + "5156"| false + "5157"| false + "5158"| false + "5159"| false + "5161"| false + "5162"| false + "5163"| false + "5164"| false + "5165"| false + "5166"| false + "5167"| false + "5168"| false + "5171"| false + "5172"| false + "5173"| false + "5174"| false + "5175"| false + "5176"| false + "5177"| false + "5181"| false + "5182"| false + "5183"| false + "5184"| false + "5185"| false + "5186"| false + "5187"| false + "5190"| false + "5191"| false + "5192"| false + "5193"| false + "5194"| false + "5195"| false + "5196"| false + "5197"| false + "5198"| false + "5199"| false + "5201"| false + "5202"| false + "5203"| false + "5204"| false + "5205"| false + "5206"| false + "5207"| false + "5208"| false + "5209"| false + "521"| false + "5221"| false + "5222"| false + "5223"| false + "5224"| false + "5225"| false + "5226"| false + "5228"| false + "5231"| false + "5232"| false + "5233"| false + "5234"| false + "5235"| false + "5236"| false + "5237"| false + "5238"| false + "5241"| false + "5242"| false + "5244"| false + "5245"| false + "5246"| false + "5247"| false + "5248"| false + "5250"| false + "5251"| false + "5252"| false + "5253"| false + "5254"| false + "5255"| false + "5257"| false + "5258"| false + "5259"| false + "5261"| false + "5262"| false + "5263"| false + "5264"| false + "5265"| false + "5266"| false + "5271"| false + "5272"| false + "5273"| false + "5274"| false + "5275"| false + "5276"| false + "5277"| false + "5278"| false + "5281"| false + "5282"| false + "5283"| false + "5284"| false + "5285"| false + "5286"| false + "5292"| false + "5293"| false + "5294"| false + "5295"| false + "5300"| false + "5301"| false + "5302"| false + "5303"| false + "5304"| false + "5305"| false + "5306"| false + "5307"| false + "5308"| false + "5309"| false + "531"| false + "5320"| false + "5321"| false + "5322"| false + "5323"| false + "5324"| false + "5325"| false + "5326"| false + "5327"| false + "5328"| false + "5329"| false + "5331"| false + "5332"| false + "5333"| false + "5334"| false + "5335"| false + "5336"| false + "5337"| false + "5339"| false + "5341"| false + "5344"| false + "5345"| false + "5346"| false + "5347"| false + "5351"| false + "5352"| false + "5353"| false + "5354"| false + "5355"| false + "5356"| false + "5357"| false + "5358"| false + "5361"| false + "5362"| false + "5363"| false + "5364"| false + "5365"| false + "5366"| false + "5367"| false + "5368"| false + "5371"| false + "5372"| false + "5373"| false + "5374"| false + "5375"| false + "5376"| false + "5377"| false + "5378"| false + "5379"| false + "5381"| false + "5382"| false + "5383"| false + "5384"| false + "5401"| false + "5402"| false + "5403"| false + "5404"| false + "5405"| false + "5406"| false + "5407"| false + "5409"| false + "541"| false + "5421"| false + "5422"| false + "5423"| false + "5424"| false + "5425"| false + "5426"| false + "5427"| false + "5428"| false + "5429"| false + "5431"| false + "5432"| false + "5433"| false + "5434"| false + "5435"| false + "5436"| false + "5437"| false + "5438"| false + "5439"| false + "5441"| false + "5442"| false + "5443"| false + "5444"| false + "5445"| false + "5446"| false + "5447"| false + "5448"| false + "5451"| false + "5452"| false + "5453"| false + "5454"| false + "5455"| false + "5456"| false + "5457"| false + "5458"| false + "5459"| false + "5461"| false + "5462"| false + "5464"| false + "5465"| false + "5466"| false + "5467"| false + "5468"| false + "5471"| false + "5472"| false + "5473"| false + "5474"| false + "5475"| false + "5476"| false + "5481"| false + "5482"| false + "5483"| false + "5484"| false + "5485"| false + "5491"| false + "5492"| false + "5493"| false + "5494"| false + "5495"| false + "5502"| false + "5503"| false + "5504"| false + "5505"| false + "5506"| false + "5507"| false + "5508"| false + "5509"| false + "551"| false + "5520"| false + "5521"| false + "5522"| false + "5523"| false + "5524"| false + "5525"| false + "5527"| false + "5528"| false + "5529"| false + "5531"| false + "5532"| false + "5533"| false + "5534"| false + "5535"| false + "5536"| false + "5541"| false + "5542"| false + "5543"| false + "5544"| false + "5545"| false + "5546"| false + "5551"| false + "5552"| false + "5553"| false + "5554"| false + "5555"| false + "5556"| false + "5561"| false + "5562"| false + "5563"| false + "5564"| false + "5565"| false + "5571"| false + "5572"| false + "5573"| false + "5574"| false + "5582"| false + "5583"| false + "5584"| false + "5585"| false + "5586"| false + "5592"| false + "5593"| false + "5594"| false + "5601"| false + "5602"| false + "5603"| false + "5604"| false + "5605"| false + "5606"| false + "5607"| false + "5608"| false + "5609"| false + "561"| false + "5621"| false + "5622"| false + "5623"| false + "5624"| false + "5625"| false + "5626"| false + "5631"| false + "5632"| false + "5633"| false + "5634"| false + "5635"| false + "5636"| false + "5641"| false + "5642"| false + "5643"| false + "5644"| false + "5645"| false + "5646"| false + "5647"| false + "5648"| false + "5650"| false + "5651"| false + "5652"| false + "5653"| false + "5654"| false + "5655"| false + "5656"| false + "5657"| false + "5658"| false + "5659"| false + "5661"| false + "5662"| false + "5663"| false + "5664"| false + "5665"| false + "5671"| false + "5672"| false + "5673"| false + "5674"| false + "5675"| false + "5676"| false + "5677"| false + "5681"| false + "5682"| false + "5683"| false + "5684"| false + "5685"| false + "5686"| false + "5691"| false + "5692"| false + "5693"| false + "5694"| false + "5695"| false + "5696"| false + "5702"| false + "5703"| false + "5704"| false + "5705"| false + "5706"| false + "5707"| false + "571"| false + "5721"| false + "5722"| false + "5723"| false + "5724"| false + "5725"| false + "5726"| false + "5731"| false + "5732"| false + "5733"| false + "5734"| false + "5741"| false + "5742"| false + "5743"| false + "5744"| false + "5745"| false + "5746"| false + "5751"| false + "5752"| false + "5753"| false + "5754"| false + "5755"| false + "5761"| false + "5763"| false + "5764"| false + "5765"| false + "5766"| false + "5767"| false + "5768"| false + "5769"| false + "5771"| false + "5772"| false + "5773"| false + "5774"| false + "5775"| false + "5776"| false + "5777"| false + "5802"| false + "5803"| false + "5804"| false + "5805"| false + "5806"| false + "5807"| false + "5808"| false + "581"| false + "5820"| false + "5821"| false + "5822"| false + "5823"| false + "5824"| false + "5825"| false + "5826"| false + "5827"| false + "5828"| false + "5829"| false + "5831"| false + "5832"| false + "5833"| false + "5834"| false + "5835"| false + "5836"| false + "5837"| false + "5838"| false + "5839"| false + "5840"| false + "5841"| false + "5842"| false + "5843"| false + "5844"| false + "5845"| false + "5846"| false + "5848"| false + "5849"| false + "5850"| false + "5851"| false + "5852"| false + "5853"| false + "5854"| false + "5855"| false + "5857"| false + "5858"| false + "5859"| false + "5861"| false + "5862"| false + "5863"| false + "5864"| false + "5865"| false + "5872"| false + "5873"| false + "5874"| false + "5875"| false + "5882"| false + "5883"| false + "5901"| false + "5902"| false + "5903"| false + "5904"| false + "5905"| false + "5906"| false + "5907"| false + "5908"| false + "5909"| false + "591"| false + "5921"| false + "5922"| false + "5923"| false + "5924"| false + "5925"| false + "5926"| false + "5931"| false + "5932"| false + "5933"| false + "5934"| false + "5935"| false + "5936"| false + "5937"| false + "5939"| false + "5941"| false + "5942"| false + "5943"| false + "5944"| false + "5945"| false + "5946"| false + "5947"| false + "5948"| false + "5951"| false + "5952"| false + "5953"| false + "5954"| false + "5955"| false + "5956"| false + "5957"| false + "5961"| false + "5962"| false + "5963"| false + "5964"| false + "5965"| false + "5966"| false + "5971"| false + "5973"| false + "5975"| false + "5976"| false + "5977"| false + "5978"| false + "6002"| false + "6003"| false + "6004"| false + "6007"| false + "6008"| false + "6020"| false + "6021"| false + "6022"| false + "6023"| false + "6024"| false + "6026"| false + "6027"| false + "6028"| false + "6029"| false + "6031"| false + "6032"| false + "6033"| false + "6034"| false + "6035"| false + "6036"| false + "6039"| false + "6041"| false + "6042"| false + "6043"| false + "6044"| false + "6045"| false + "6046"| false + "6047"| false + "6048"| false + "6049"| false + "6050"| false + "6051"| false + "6052"| false + "6053"| false + "6054"| false + "6055"| false + "6056"| false + "6057"| false + "6058"| false + "6059"| false + "6061"| false + "6062"| false + "6063"| false + "6066"| false + "6068"| false + "6071"| false + "6073"| false + "6074"| false + "6078"| false + "6081"| false + "6082"| false + "6083"| false + "6084"| false + "6085"| false + "6086"| false + "6087"| false + "6092"| false + "6093"| false + "6094"| false + "6095"| false + "6096"| false + "6101"| false + "6102"| false + "6103"| false + "6104"| false + "6105"| false + "6106"| false + "6107"| false + "6108"| false + "6109"| false + "611"| false + "6120"| false + "6122"| false + "6123"| false + "6124"| false + "6126"| false + "6127"| false + "6128"| false + "6129"| false + "6130"| false + "6131"| false + "6132"| false + "6133"| false + "6134"| false + "6135"| false + "6136"| false + "6138"| false + "6139"| false + "6142"| false + "6144"| false + "6145"| false + "6146"| false + "6147"| false + "6150"| false + "6151"| false + "6152"| false + "6154"| false + "6155"| false + "6157"| false + "6158"| false + "6159"| false + "6161"| false + "6162"| false + "6163"| false + "6164"| false + "6165"| false + "6166"| false + "6167"| false + "6171"| false + "6172"| false + "6173"| false + "6174"| false + "6175"| false + "6181"| false + "6182"| false + "6183"| false + "6184"| false + "6185"| false + "6186"| false + "6187"| false + "6188"| false + "6190"| false + "6192"| false + "6195"| false + "6196"| false + "6198"| false + "6201"| false + "6202"| false + "6203"| false + "6204"| false + "6205"| false + "6206"| false + "6207"| false + "6209"| false + "621"| false + "6220"| false + "6221"| false + "6222"| false + "6223"| false + "6224"| false + "6226"| false + "6227"| false + "6228"| false + "6229"| false + "6231"| false + "6232"| false + "6233"| false + "6234"| false + "6235"| false + "6236"| false + "6237"| false + "6238"| false + "6239"| false + "6241"| false + "6242"| false + "6243"| false + "6244"| false + "6245"| false + "6246"| false + "6247"| false + "6249"| false + "6251"| false + "6252"| false + "6253"| false + "6254"| false + "6255"| false + "6256"| false + "6257"| false + "6258"| false + "6261"| false + "6262"| false + "6263"| false + "6264"| false + "6265"| false + "6266"| false + "6267"| false + "6268"| false + "6269"| false + "6271"| false + "6272"| false + "6274"| false + "6275"| false + "6276"| false + "6281"| false + "6282"| false + "6283"| false + "6284"| false + "6285"| false + "6286"| false + "6287"| false + "6291"| false + "6292"| false + "6293"| false + "6294"| false + "6295"| false + "6296"| false + "6297"| false + "6298"| false + "6301"| false + "6302"| false + "6303"| false + "6304"| false + "6305"| false + "6306"| false + "6307"| false + "6308"| false + "631"| false + "6321"| false + "6322"| false + "6323"| false + "6324"| false + "6325"| false + "6326"| false + "6327"| false + "6328"| false + "6329"| false + "6331"| false + "6332"| false + "6333"| false + "6334"| false + "6335"| false + "6336"| false + "6337"| false + "6338"| false + "6339"| false + "6340"| false + "6341"| false + "6342"| false + "6343"| false + "6344"| false + "6345"| false + "6346"| false + "6347"| false + "6348"| false + "6349"| false + "6351"| false + "6352"| false + "6353"| false + "6355"| false + "6356"| false + "6357"| false + "6358"| false + "6359"| false + "6361"| false + "6362"| false + "6363"| false + "6364"| false + "6371"| false + "6372"| false + "6373"| false + "6374"| false + "6375"| false + "6381"| false + "6382"| false + "6383"| false + "6384"| false + "6385"| false + "6386"| false + "6387"| false + "6391"| false + "6392"| false + "6393"| false + "6394"| false + "6395"| false + "6396"| false + "6397"| false + "6398"| false + "6400"| false + "6401"| false + "6402"| false + "6403"| false + "6404"| false + "6405"| false + "6406"| false + "6407"| false + "6408"| false + "6409"| false + "641"| false + "6420"| false + "6421"| false + "6422"| false + "6423"| false + "6424"| false + "6425"| false + "6426"| false + "6427"| false + "6428"| false + "6429"| false + "6430"| false + "6431"| false + "6432"| false + "6433"| false + "6434"| false + "6435"| false + "6436"| false + "6438"| false + "6439"| false + "6440"| false + "6441"| false + "6442"| false + "6443"| false + "6444"| false + "6445"| false + "6446"| false + "6447"| false + "6449"| false + "6451"| false + "6452"| false + "6453"| false + "6454"| false + "6455"| false + "6456"| false + "6457"| false + "6458"| false + "6461"| false + "6462"| false + "6464"| false + "6465"| false + "6466"| false + "6467"| false + "6468"| false + "6471"| false + "6472"| false + "6473"| false + "6474"| false + "6475"| false + "6476"| false + "6477"| false + "6478"| false + "6479"| false + "6482"| false + "6483"| false + "6484"| false + "6485"| false + "6486"| false + "6500"| false + "6501"| false + "6502"| false + "6503"| false + "6504"| false + "6505"| false + "6506"| false + "6507"| false + "6508"| false + "6509"| false + "651"| false + "6522"| false + "6523"| false + "6524"| false + "6525"| false + "6526"| false + "6527"| false + "6531"| false + "6532"| false + "6533"| false + "6534"| false + "6535"| false + "6536"| false + "6541"| false + "6542"| false + "6543"| false + "6544"| false + "6545"| false + "6550"| false + "6551"| false + "6552"| false + "6553"| false + "6554"| false + "6555"| false + "6556"| false + "6557"| false + "6558"| false + "6559"| false + "6561"| false + "6562"| false + "6563"| false + "6564"| false + "6565"| false + "6566"| false + "6567"| false + "6568"| false + "6569"| false + "6571"| false + "6572"| false + "6573"| false + "6574"| false + "6575"| false + "6578"| false + "6580"| false + "6581"| false + "6582"| false + "6583"| false + "6584"| false + "6585"| false + "6586"| false + "6587"| false + "6588"| false + "6589"| false + "6591"| false + "6592"| false + "6593"| false + "6594"| false + "6595"| false + "6596"| false + "6597"| false + "6599"| false + "661"| false + "6620"| false + "6621"| false + "6622"| false + "6623"| false + "6624"| false + "6625"| false + "6626"| false + "6627"| false + "6628"| false + "6629"| false + "6630"| false + "6631"| false + "6633"| false + "6634"| false + "6635"| false + "6636"| false + "6637"| false + "6638"| false + "6639"| false + "6641"| false + "6642"| false + "6643"| false + "6644"| false + "6645"| false + "6646"| false + "6647"| false + "6648"| false + "6650"| false + "6651"| false + "6652"| false + "6653"| false + "6654"| false + "6655"| false + "6656"| false + "6657"| false + "6658"| false + "6659"| false + "6660"| false + "6661"| false + "6663"| false + "6664"| false + "6665"| false + "6666"| false + "6667"| false + "6668"| false + "6669"| false + "6670"| false + "6672"| false + "6673"| false + "6674"| false + "6675"| false + "6676"| false + "6677"| false + "6678"| false + "6681"| false + "6682"| false + "6683"| false + "6684"| false + "6691"| false + "6692"| false + "6693"| false + "6694"| false + "6695"| false + "6696"| false + "6697"| false + "6698"| false + "6701"| false + "6703"| false + "6704"| false + "6706"| false + "6707"| false + "6708"| false + "6709"| false + "671"| false + "6721"| false + "6722"| false + "6723"| false + "6724"| false + "6725"| false + "6726"| false + "6727"| false + "6728"| false + "6731"| false + "6732"| false + "6733"| false + "6734"| false + "6735"| false + "6736"| false + "6737"| false + "6741"| false + "6742"| false + "6743"| false + "6744"| false + "6745"| false + "6746"| false + "6747"| false + "6751"| false + "6752"| false + "6753"| false + "6754"| false + "6755"| false + "6756"| false + "6757"| false + "6758"| false + "6761"| false + "6762"| false + "6763"| false + "6764"| false + "6765"| false + "6766"| false + "6771"| false + "6772"| false + "6773"| false + "6774"| false + "6775"| false + "6776"| false + "6781"| false + "6782"| false + "6783"| false + "6784"| false + "6785"| false + "6786"| false + "6787"| false + "6788"| false + "6789"| false + "6802"| false + "6803"| false + "6804"| false + "6805"| false + "6806"| false + "6809"| false + "681"| false + "6821"| false + "6824"| false + "6825"| false + "6826"| false + "6827"| false + "6831"| false + "6832"| false + "6833"| false + "6834"| false + "6835"| false + "6836"| false + "6837"| false + "6838"| false + "6841"| false + "6842"| false + "6843"| false + "6844"| false + "6848"| false + "6849"| false + "6851"| false + "6852"| false + "6853"| false + "6854"| false + "6855"| false + "6856"| false + "6857"| false + "6858"| false + "6861"| false + "6864"| false + "6865"| false + "6866"| false + "6867"| false + "6868"| false + "6869"| false + "6871"| false + "6872"| false + "6873"| false + "6874"| false + "6875"| false + "6876"| false + "6881"| false + "6887"| false + "6888"| false + "6893"| false + "6894"| false + "6897"| false + "6898"| false + "69"| false + "7021"| false + "7022"| false + "7023"| false + "7024"| false + "7025"| false + "7026"| false + "7031"| false + "7032"| false + "7033"| false + "7034"| false + "7041"| false + "7042"| false + "7043"| false + "7044"| false + "7045"| false + "7046"| false + "7051"| false + "7052"| false + "7053"| false + "7054"| false + "7055"| false + "7056"| false + "7062"| false + "7063"| false + "7066"| false + "7071"| false + "7072"| false + "7073"| false + "7081"| false + "7082"| false + "7083"| false + "7084"| false + "7085"| false + "711"| false + "7121"| false + "7122"| false + "7123"| false + "7124"| false + "7125"| false + "7126"| false + "7127"| false + "7128"| false + "7129"| false + "7130"| false + "7131"| false + "7132"| false + "7133"| false + "7134"| false + "7135"| false + "7136"| false + "7138"| false + "7139"| false + "7141"| false + "7142"| false + "7143"| false + "7144"| false + "7145"| false + "7146"| false + "7147"| false + "7148"| false + "7150"| false + "7151"| false + "7152"| false + "7153"| false + "7154"| false + "7156"| false + "7157"| false + "7158"| false + "7159"| false + "7161"| false + "7162"| false + "7163"| false + "7164"| false + "7165"| false + "7166"| false + "7171"| false + "7172"| false + "7173"| false + "7174"| false + "7175"| false + "7176"| false + "7181"| false + "7182"| false + "7183"| false + "7184"| false + "7191"| false + "7192"| false + "7193"| false + "7194"| false + "7195"| false + "7202"| false + "7203"| false + "7204"| false + "721"| false + "7220"| false + "7221"| false + "7222"| false + "7223"| false + "7224"| false + "7225"| false + "7226"| false + "7227"| false + "7228"| false + "7229"| false + "7231"| false + "7232"| false + "7233"| false + "7234"| false + "7235"| false + "7236"| false + "7237"| false + "7240"| false + "7242"| false + "7243"| false + "7244"| false + "7245"| false + "7246"| false + "7247"| false + "7248"| false + "7249"| false + "7250"| false + "7251"| false + "7252"| false + "7253"| false + "7254"| false + "7255"| false + "7256"| false + "7257"| false + "7258"| false + "7259"| false + "7260"| false + "7261"| false + "7262"| false + "7263"| false + "7264"| false + "7265"| false + "7266"| false + "7267"| false + "7268"| false + "7269"| false + "7271"| false + "7272"| false + "7273"| false + "7274"| false + "7275"| false + "7276"| false + "7277"| false + "7300"| false + "7302"| false + "7303"| false + "7304"| false + "7305"| false + "7306"| false + "7307"| false + "7308"| false + "7309"| false + "731"| false + "7321"| false + "7322"| false + "7323"| false + "7324"| false + "7325"| false + "7326"| false + "7327"| false + "7328"| false + "7329"| false + "7331"| false + "7332"| false + "7333"| false + "7334"| false + "7335"| false + "7336"| false + "7337"| false + "7340"| false + "7343"| false + "7344"| false + "7345"| false + "7346"| false + "7347"| false + "7348"| false + "7351"| false + "7352"| false + "7353"| false + "7354"| false + "7355"| false + "7356"| false + "7357"| false + "7358"| false + "7361"| false + "7362"| false + "7363"| false + "7364"| false + "7365"| false + "7366"| false + "7367"| false + "7371"| false + "7373"| false + "7374"| false + "7375"| false + "7376"| false + "7381"| false + "7382"| false + "7383"| false + "7384"| false + "7385"| false + "7386"| false + "7387"| false + "7388"| false + "7389"| false + "7391"| false + "7392"| false + "7393"| false + "7394"| false + "7395"| false + "7402"| false + "7403"| false + "7404"| false + "741"| false + "7420"| false + "7422"| false + "7423"| false + "7424"| false + "7425"| false + "7426"| false + "7427"| false + "7428"| false + "7429"| false + "7431"| false + "7432"| false + "7433"| false + "7434"| false + "7435"| false + "7436"| false + "7440"| false + "7441"| false + "7442"| false + "7443"| false + "7444"| false + "7445"| false + "7446"| false + "7447"| false + "7448"| false + "7449"| false + "7451"| false + "7452"| false + "7453"| false + "7454"| false + "7455"| false + "7456"| false + "7457"| false + "7458"| false + "7459"| false + "7461"| false + "7462"| false + "7463"| false + "7464"| false + "7465"| false + "7466"| false + "7467"| false + "7471"| false + "7472"| false + "7473"| false + "7474"| false + "7475"| false + "7476"| false + "7477"| false + "7478"| false + "7482"| false + "7483"| false + "7484"| false + "7485"| false + "7486"| false + "7502"| false + "7503"| false + "7504"| false + "7505"| false + "7506"| false + "751"| false + "7520"| false + "7522"| false + "7524"| false + "7525"| false + "7527"| false + "7528"| false + "7529"| false + "7531"| false + "7532"| false + "7533"| false + "7534"| false + "7541"| false + "7542"| false + "7543"| false + "7544"| false + "7545"| false + "7546"| false + "7551"| false + "7552"| false + "7553"| false + "7554"| false + "7555"| false + "7556"| false + "7557"| false + "7558"| false + "7561"| false + "7562"| false + "7563"| false + "7564"| false + "7565"| false + "7566"| false + "7567"| false + "7568"| false + "7569"| false + "7570"| false + "7571"| false + "7572"| false + "7573"| false + "7574"| false + "7575"| false + "7576"| false + "7577"| false + "7578"| false + "7579"| false + "7581"| false + "7582"| false + "7583"| false + "7584"| false + "7585"| false + "7586"| false + "7587"| false + "7602"| false + "761"| false + "7620"| false + "7621"| false + "7622"| false + "7623"| false + "7624"| false + "7625"| false + "7626"| false + "7627"| false + "7628"| false + "7629"| false + "7631"| false + "7632"| false + "7633"| false + "7634"| false + "7635"| false + "7636"| false + "7641"| false + "7642"| false + "7643"| false + "7644"| false + "7645"| false + "7646"| false + "7651"| false + "7652"| false + "7653"| false + "7654"| false + "7655"| false + "7656"| false + "7657"| false + "7660"| false + "7661"| false + "7662"| false + "7663"| false + "7664"| false + "7665"| false + "7666"| false + "7667"| false + "7668"| false + "7669"| false + "7671"| false + "7672"| false + "7673"| false + "7674"| false + "7675"| false + "7676"| false + "7681"| false + "7682"| false + "7683"| false + "7684"| false + "7685"| false + "7702"| false + "7703"| false + "7704"| false + "7705"| false + "7706"| false + "7707"| false + "7708"| false + "7709"| false + "771"| false + "7720"| false + "7721"| false + "7722"| false + "7723"| false + "7724"| false + "7725"| false + "7726"| false + "7727"| false + "7728"| false + "7729"| false + "7731"| false + "7732"| false + "7733"| false + "7734"| false + "7735"| false + "7736"| false + "7738"| false + "7739"| false + "7741"| false + "7742"| false + "7743"| false + "7744"| false + "7745"| false + "7746"| false + "7747"| false + "7748"| false + "7751"| false + "7753"| false + "7754"| false + "7755"| false + "7761"| false + "7762"| false + "7763"| false + "7764"| false + "7765"| false + "7771"| false + "7773"| false + "7774"| false + "7775"| false + "7777"| false + "7802"| false + "7803"| false + "7804"| false + "7805"| false + "7806"| false + "7807"| false + "7808"| false + "781"| false + "7821"| false + "7822"| false + "7823"| false + "7824"| false + "7825"| false + "7826"| false + "7831"| false + "7832"| false + "7833"| false + "7834"| false + "7835"| false + "7836"| false + "7837"| false + "7838"| false + "7839"| false + "7841"| false + "7842"| false + "7843"| false + "7844"| false + "7851"| false + "7852"| false + "7853"| false + "7854"| false + "7903"| false + "7904"| false + "7905"| false + "7906"| false + "7907"| false + "791"| false + "7930"| false + "7931"| false + "7932"| false + "7933"| false + "7934"| false + "7935"| false + "7936"| false + "7937"| false + "7938"| false + "7939"| false + "7940"| false + "7941"| false + "7942"| false + "7943"| false + "7944"| false + "7945"| false + "7946"| false + "7947"| false + "7948"| false + "7949"| false + "7950"| false + "7951"| false + "7952"| false + "7953"| false + "7954"| false + "7955"| false + "7957"| false + "7958"| false + "7959"| false + "7961"| false + "7962"| false + "7963"| false + "7964"| false + "7965"| false + "7966"| false + "7967"| false + "7971"| false + "7972"| false + "7973"| false + "7974"| false + "7975"| false + "7976"| false + "7977"| false + "8020"| false + "8021"| false + "8022"| false + "8023"| false + "8024"| false + "8025"| false + "8026"| false + "8027"| false + "8028"| false + "8029"| false + "8031"| false + "8032"| false + "8033"| false + "8034"| false + "8035"| false + "8036"| false + "8038"| false + "8039"| false + "8041"| false + "8042"| false + "8043"| false + "8045"| false + "8046"| false + "8051"| false + "8052"| false + "8053"| false + "8054"| false + "8055"| false + "8056"| false + "8057"| false + "8061"| false + "8062"| false + "8063"| false + "8064"| false + "8065"| false + "8066"| false + "8067"| false + "8071"| false + "8072"| false + "8073"| false + "8074"| false + "8075"| false + "8076"| false + "8081"| false + "8082"| false + "8083"| false + "8084"| false + "8085"| false + "8086"| false + "8091"| false + "8092"| false + "8093"| false + "8094"| false + "8095"| false + "8102"| false + "8104"| false + "8105"| false + "8106"| false + "811"| false + "8121"| false + "8122"| false + "8123"| false + "8124"| false + "8131"| false + "8133"| false + "8134"| false + "8135"| false + "8136"| false + "8137"| false + "8138"| false + "8139"| false + "8141"| false + "8142"| false + "8143"| false + "8144"| false + "8145"| false + "8146"| false + "8151"| false + "8152"| false + "8153"| false + "8157"| false + "8158"| false + "8161"| false + "8165"| false + "8166"| false + "8167"| false + "8168"| false + "8170"| false + "8171"| false + "8176"| false + "8177"| false + "8178"| false + "8179"| false + "8191"| false + "8192"| false + "8193"| false + "8194"| false + "8195"| false + "8196"| false + "8202"| false + "8203"| false + "8204"| false + "8205"| false + "8206"| false + "8207"| false + "8208"| false + "821"| false + "8221"| false + "8222"| false + "8223"| false + "8224"| false + "8225"| false + "8226"| false + "8230"| false + "8231"| false + "8232"| false + "8233"| false + "8234"| false + "8236"| false + "8237"| false + "8238"| false + "8239"| false + "8241"| false + "8243"| false + "8245"| false + "8246"| false + "8247"| false + "8248"| false + "8249"| false + "8250"| false + "8251"| false + "8252"| false + "8253"| false + "8254"| false + "8257"| false + "8258"| false + "8259"| false + "8261"| false + "8262"| false + "8263"| false + "8265"| false + "8266"| false + "8267"| false + "8268"| false + "8269"| false + "8271"| false + "8272"| false + "8273"| false + "8274"| false + "8276"| false + "8281"| false + "8282"| false + "8283"| false + "8284"| false + "8285"| false + "8291"| false + "8292"| false + "8293"| false + "8294"| false + "8295"| false + "8296"| false + "8302"| false + "8303"| false + "8304"| false + "8306"| false + "831"| false + "8320"| false + "8321"| false + "8322"| false + "8323"| false + "8324"| false + "8325"| false + "8326"| false + "8327"| false + "8328"| false + "8330"| false + "8331"| false + "8332"| false + "8333"| false + "8334"| false + "8335"| false + "8336"| false + "8337"| false + "8338"| false + "8340"| false + "8341"| false + "8342"| false + "8343"| false + "8344"| false + "8345"| false + "8346"| false + "8347"| false + "8348"| false + "8349"| false + "8361"| false + "8362"| false + "8363"| false + "8364"| false + "8365"| false + "8366"| false + "8367"| false + "8368"| false + "8369"| false + "8370"| false + "8372"| false + "8373"| false + "8374"| false + "8375"| false + "8376"| false + "8377"| false + "8378"| false + "8379"| false + "8380"| false + "8381"| false + "8382"| false + "8383"| false + "8384"| false + "8385"| false + "8386"| false + "8387"| false + "8388"| false + "8389"| false + "8392"| false + "8393"| false + "8394"| false + "8395"| false + "8402"| false + "8403"| false + "8404"| false + "8405"| false + "8406"| false + "8407"| false + "841"| false + "8421"| false + "8422"| false + "8423"| false + "8424"| false + "8426"| false + "8427"| false + "8431"| false + "8432"| false + "8433"| false + "8434"| false + "8435"| false + "8441"| false + "8442"| false + "8443"| false + "8444"| false + "8445"| false + "8446"| false + "8450"| false + "8452"| false + "8453"| false + "8454"| false + "8456"| false + "8457"| false + "8458"| false + "8459"| false + "8460"| false + "8461"| false + "8462"| false + "8463"| false + "8464"| false + "8465"| false + "8466"| false + "8467"| false + "8468"| false + "8469"| false + "8501"| false + "8502"| false + "8503"| false + "8504"| false + "8505"| false + "8506"| false + "8507"| false + "8509"| false + "851"| false + "8531"| false + "8532"| false + "8533"| false + "8534"| false + "8535"| false + "8536"| false + "8537"| false + "8538"| false + "8541"| false + "8542"| false + "8543"| false + "8544"| false + "8545"| false + "8546"| false + "8547"| false + "8548"| false + "8549"| false + "8550"| false + "8551"| false + "8552"| false + "8553"| false + "8554"| false + "8555"| false + "8556"| false + "8557"| false + "8558"| false + "8561"| false + "8562"| false + "8563"| false + "8564"| false + "8565"| false + "8571"| false + "8572"| false + "8573"| false + "8574"| false + "8581"| false + "8582"| false + "8583"| false + "8584"| false + "8585"| false + "8586"| false + "8591"| false + "8592"| false + "8593"| false + "861"| false + "8621"| false + "8622"| false + "8623"| false + "8624"| false + "8628"| false + "8629"| false + "8630"| false + "8631"| false + "8633"| false + "8634"| false + "8635"| false + "8636"| false + "8637"| false + "8638"| false + "8639"| false + "8640"| false + "8641"| false + "8642"| false + "8649"| false + "8650"| false + "8651"| false + "8652"| false + "8654"| false + "8656"| false + "8657"| false + "8661"| false + "8662"| false + "8663"| false + "8664"| false + "8665"| false + "8666"| false + "8667"| false + "8669"| false + "8670"| false + "8671"| false + "8677"| false + "8678"| false + "8679"| false + "8681"| false + "8682"| false + "8683"| false + "8684"| false + "8685"| false + "8686"| false + "8687"| false + "8702"| false + "8703"| false + "8704"| false + "8705"| false + "8706"| false + "8707"| false + "8708"| false + "8709"| false + "871"| false + "8721"| false + "8722"| false + "8723"| false + "8724"| false + "8725"| false + "8726"| false + "8727"| false + "8728"| false + "8731"| false + "8732"| false + "8733"| false + "8734"| false + "8735"| false + "8741"| false + "8742"| false + "8743"| false + "8744"| false + "8745"| false + "8751"| false + "8752"| false + "8753"| false + "8754"| false + "8756"| false + "8761"| false + "8762"| false + "8764"| false + "8765"| false + "8766"| false + "8771"| false + "8772"| false + "8773"| false + "8774"| false + "8781"| false + "8782"| false + "8783"| false + "8784"| false + "8785"| false + "8801"| false + "8802"| false + "8803"| false + "8805"| false + "8806"| false + "8807"| false + "8808"| false + "8809"| false + "881"| false + "8821"| false + "8822"| false + "8823"| false + "8824"| false + "8825"| false + "8841"| false + "8845"| false + "8846"| false + "8847"| false + "8851"| false + "8856"| false + "8857"| false + "8858"| false + "8860"| false + "8861"| false + "8862"| false + "8867"| false + "8868"| false + "8869"| false + "89"| false + "906"| false + "9070"| false + "9071"| false + "9072"| false + "9073"| false + "9074"| false + "9075"| false + "9076"| false + "9077"| false + "9078"| false + "9080"| false + "9081"| false + "9082"| false + "9083"| false + "9084"| false + "9085"| false + "9086"| false + "9087"| false + "9088"| false + "9089"| false + "9090"| false + "9091"| false + "9092"| false + "9093"| false + "9094"| false + "9097"| false + "9099"| false + "9101"| false + "9102"| false + "9103"| false + "9104"| false + "9105"| false + "9106"| false + "9107"| false + "911"| false + "9120"| false + "9122"| false + "9123"| false + "9126"| false + "9127"| false + "9128"| false + "9129"| false + "9131"| false + "9132"| false + "9133"| false + "9134"| false + "9135"| false + "9141"| false + "9142"| false + "9143"| false + "9144"| false + "9145"| false + "9146"| false + "9147"| false + "9148"| false + "9149"| false + "9151"| false + "9152"| false + "9153"| false + "9154"| false + "9155"| false + "9156"| false + "9157"| false + "9158"| false + "9161"| false + "9162"| false + "9163"| false + "9164"| false + "9165"| false + "9166"| false + "9167"| false + "9170"| false + "9171"| false + "9172"| false + "9173"| false + "9174"| false + "9175"| false + "9176"| false + "9177"| false + "9178"| false + "9179"| false + "9180"| false + "9181"| false + "9182"| false + "9183"| false + "9184"| false + "9185"| false + "9186"| false + "9187"| false + "9188"| false + "9189"| false + "9190"| false + "9191"| false + "9192"| false + "9193"| false + "9194"| false + "9195"| false + "9196"| false + "9197"| false + "9198"| false + "9199"| false + "9201"| false + "9202"| false + "9203"| false + "9204"| false + "9205"| false + "9206"| false + "9207"| false + "9208"| false + "9209"| false + "921"| false + "9220"| false + "9221"| false + "9222"| false + "9223"| false + "9225"| false + "9227"| false + "9228"| false + "9229"| false + "9231"| false + "9232"| false + "9233"| false + "9234"| false + "9235"| false + "9236"| false + "9238"| false + "9241"| false + "9242"| false + "9243"| false + "9244"| false + "9245"| false + "9246"| false + "9251"| false + "9252"| false + "9253"| false + "9254"| false + "9255"| false + "9256"| false + "9257"| false + "9260"| false + "9261"| false + "9262"| false + "9263"| false + "9264"| false + "9265"| false + "9266"| false + "9267"| false + "9268"| false + "9269"| false + "9270"| false + "9271"| false + "9272"| false + "9273"| false + "9274"| false + "9275"| false + "9276"| false + "9277"| false + "9278"| false + "9279"| false + "9280"| false + "9281"| false + "9282"| false + "9283"| false + "9284"| false + "9285"| false + "9286"| false + "9287"| false + "9288"| false + "9289"| false + "9292"| false + "9293"| false + "9294"| false + "9295"| false + "9302"| false + "9303"| false + "9305"| false + "9306"| false + "9307"| false + "931"| false + "9321"| false + "9323"| false + "9324"| false + "9325"| false + "9326"| false + "9331"| false + "9332"| false + "9333"| false + "9334"| false + "9335"| false + "9336"| false + "9337"| false + "9338"| false + "9339"| false + "9340"| false + "9341"| false + "9342"| false + "9343"| false + "9344"| false + "9345"| false + "9346"| false + "9347"| false + "9348"| false + "9349"| false + "9350"| false + "9351"| false + "9352"| false + "9353"| false + "9354"| false + "9355"| false + "9356"| false + "9357"| false + "9358"| false + "9359"| false + "9360"| false + "9363"| false + "9364"| false + "9365"| false + "9366"| false + "9367"| false + "9369"| false + "9371"| false + "9372"| false + "9373"| false + "9374"| false + "9375"| false + "9376"| false + "9377"| false + "9378"| false + "9381"| false + "9382"| false + "9383"| false + "9384"| false + "9385"| false + "9386"| false + "9391"| false + "9392"| false + "9393"| false + "9394"| false + "9395"| false + "9396"| false + "9397"| false + "9398"| false + "9401"| false + "9402"| false + "9403"| false + "9404"| false + "9405"| false + "9406"| false + "9407"| false + "9408"| false + "9409"| false + "941"| false + "9420"| false + "9421"| false + "9422"| false + "9423"| false + "9424"| false + "9426"| false + "9427"| false + "9428"| false + "9429"| false + "9431"| false + "9433"| false + "9434"| false + "9435"| false + "9436"| false + "9438"| false + "9439"| false + "9441"| false + "9442"| false + "9443"| false + "9444"| false + "9445"| false + "9446"| false + "9447"| false + "9448"| false + "9451"| false + "9452"| false + "9453"| false + "9454"| false + "9461"| false + "9462"| false + "9463"| false + "9464"| false + "9465"| false + "9466"| false + "9467"| false + "9468"| false + "9469"| false + "9471"| false + "9472"| false + "9473"| false + "9474"| false + "9480"| false + "9481"| false + "9482"| false + "9484"| false + "9491"| false + "9492"| false + "9493"| false + "9495"| false + "9497"| false + "9498"| false + "9499"| false + "9502"| false + "9503"| false + "9504"| false + "9505"| false + "951"| false + "9521"| false + "9522"| false + "9523"| false + "9524"| false + "9525"| false + "9526"| false + "9527"| false + "9528"| false + "9529"| false + "9531"| false + "9532"| false + "9533"| false + "9534"| false + "9535"| false + "9536"| false + "9542"| false + "9543"| false + "9544"| false + "9545"| false + "9546"| false + "9547"| false + "9548"| false + "9549"| false + "9551"| false + "9552"| false + "9553"| false + "9554"| false + "9555"| false + "9556"| false + "9560"| false + "9561"| false + "9562"| false + "9563"| false + "9564"| false + "9565"| false + "9566"| false + "9567"| false + "9568"| false + "9569"| false + "9571"| false + "9572"| false + "9573"| false + "9574"| false + "9575"| false + "9576"| false + "9602"| false + "9603"| false + "9604"| false + "9605"| false + "9606"| false + "9607"| false + "9608"| false + "961"| false + "9621"| false + "9622"| false + "9624"| false + "9625"| false + "9626"| false + "9627"| false + "9628"| false + "9631"| false + "9632"| false + "9633"| false + "9634"| false + "9635"| false + "9636"| false + "9637"| false + "9638"| false + "9639"| false + "9641"| false + "9642"| false + "9643"| false + "9644"| false + "9645"| false + "9646"| false + "9647"| false + "9648"| false + "9651"| false + "9652"| false + "9653"| false + "9654"| false + "9655"| false + "9656"| false + "9657"| false + "9658"| false + "9659"| false + "9661"| false + "9662"| false + "9663"| false + "9664"| false + "9665"| false + "9666"| false + "9671"| false + "9672"| false + "9673"| false + "9674"| false + "9675"| false + "9676"| false + "9677"| false + "9681"| false + "9682"| false + "9683"| false + "9701"| false + "9704"| false + "9708"| false + "971"| false + "9720"| false + "9721"| false + "9722"| false + "9723"| false + "9724"| false + "9725"| false + "9726"| false + "9727"| false + "9728"| false + "9729"| false + "9732"| false + "9733"| false + "9734"| false + "9735"| false + "9736"| false + "9737"| false + "9738"| false + "9741"| false + "9742"| false + "9744"| false + "9745"| false + "9746"| false + "9747"| false + "9748"| false + "9749"| false + "9761"| false + "9762"| false + "9763"| false + "9764"| false + "9765"| false + "9766"| false + "9771"| false + "9772"| false + "9773"| false + "9774"| false + "9775"| false + "9776"| false + "9777"| false + "9778"| false + "9779"| false + "9802"| false + "9803"| false + "9804"| false + "9805"| false + "981"| false + "9820"| false + "9822"| false + "9823"| false + "9824"| false + "9825"| false + "9826"| false + "9827"| false + "9828"| false + "9829"| false + "9831"| false + "9832"| false + "9833"| false + "9834"| false + "9835"| false + "9836"| false + "9837"| false + "9841"| false + "9842"| false + "9843"| false + "9844"| false + "9845"| false + "9846"| false + "9847"| false + "9848"| false + "9851"| false + "9852"| false + "9853"| false + "9854"| false + "9855"| false + "9856"| false + "9857"| false + "9861"| false + "9865"| false + "9867"| false + "9868"| false + "9869"| false + "9871"| false + "9872"| false + "9873"| false + "9874"| false + "9875"| false + "9876"| false + "9901"| false + "9903"| false + "9904"| false + "9905"| false + "9906"| false + "9907"| false + "9908"| false + "991"| false + "9920"| false + "9921"| false + "9922"| false + "9923"| false + "9924"| false + "9925"| false + "9926"| false + "9927"| false + "9928"| false + "9929"| false + "9931"| false + "9932"| false + "9933"| false + "9935"| false + "9936"| false + "9937"| false + "9938"| false + "9941"| false + "9942"| false + "9943"| false + "9944"| false + "9945"| false + "9946"| false + "9947"| false + "9948"| false + "9951"| false + "9952"| false + "9953"| false + "9954"| false + "9955"| false + "9956"| false + "9961"| false + "9962"| false + "9963"| false + "9964"| false + "9965"| false + "9966"| false + "9971"| false + "9972"| false + "9973"| false + "9974"| false + "9975"| false + "9976"| false + "9977"| false + "9978"| false + + } + +} \ No newline at end of file diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/NumberPlanTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/NumberPlanTest.groovy index a5fb111..18eb45f 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/NumberPlanTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/NumberPlanTest.groovy @@ -24,6 +24,7 @@ class NumberPlanTest extends Specification { NumberPlan nullTarget NumberPlan target2 NumberPlan invalidTarget3 + NumberPlan target3 def short_numbers def short_numbers2 @@ -37,6 +38,23 @@ class NumberPlanTest extends Specification { return short_numbers } } + + target3 = new NumberPlan() { + @Override + protected Map getShortNumberCodes() { + return null + } + + @Override + public String getNationalDestinationCodeFromNationalSignificantNumber(String nsn) { + PhoneLibWrapper wrapper = new PhoneLibWrapper(nsn, PhoneLibWrapper.getRegionCodeForCountryCode("49")); + return wrapper.getNationalDestinationCode(); + } + } + + + + nullTarget = new NumberPlan() { @Override protected Map getShortNumberCodes() { @@ -61,6 +79,21 @@ class NumberPlanTest extends Specification { } } + def "getNationalDestinationCodeFromNationalSignificantNumber"(number, expectedResult) { + given: + + when: + String result = target3.getNationalDestinationCodeFromNationalSignificantNumber(number) + + then: + assert result == expectedResult + + where: + number | expectedResult + "0203556677" | "203" + + } + def "matchShortNumber "(number, expectedResult) { given: diff --git a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy index a3171ca..3ff09ae 100644 --- a/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy +++ b/src/test/groovy/de/telekom/phonenumbernormalizer/numberplans/PhoneLibWrapperTest.groovy @@ -98,6 +98,78 @@ class PhoneLibWrapperTest extends Specification { "01139312345678"| "US" | "312345678" //Italy called from North America } + def "getE164Formatted"(number, regionCode, expectedResult) { + given: + target = new PhoneLibWrapper(number, regionCode) + + when: + def result = target.getE164Formatted() + + then: + result == expectedResult + + where: + number | regionCode | expectedResult + null | "DE" | null + "0723 413 641" | "DE" | "+49723413641" + "0040 723 413 641" | "DE" | "+40723413641" + "+40723413641" | "DE" | "+40723413641" + "0040-723-413-641" | "DE" | "+40723413641" + "0176 3 0 6 9 6544" | "DE" | "+4917630696544" + "0203556677" | "DE" | "+49203556677" + "0305556677" | "DE" | "+49305556677" + "012345678" | "IT" | "+39012345678" + "312345678" | "IT" | "+39312345678" + } + + def "getRFC3966Formatted"(number, regionCode, expectedResult) { + given: + target = new PhoneLibWrapper(number, regionCode) + + when: + def result = target.getRFC3966Formatted() + + then: + result == expectedResult + + where: + number | regionCode | expectedResult + null | "DE" | null + "0723 413 641" | "DE" | "tel:+49-7234-13641" + "0040 723 413 641" | "DE" | "tel:+40-723-413-641" + "+40723413641" | "DE" | "tel:+40-723-413-641" + "0040-723-413-641" | "DE" | "tel:+40-723-413-641" + "0176 3 0 6 9 6544" | "DE" | "tel:+49-176-30696544" + "0203556677" | "DE" | "tel:+49-203-556677" + "0305556677" | "DE" | "tel:+49-30-5556677" + "012345678" | "IT" | "tel:+39-0123-45678" + "312345678" | "IT" | "tel:+39-312-345-678" + } + + def "getNationalDestinationCode"(number, regionCode, expectedResult) { + given: + target = new PhoneLibWrapper(number, regionCode) + + when: + def result = target.getNationalDestinationCode() + + then: + result == expectedResult + + where: + number | regionCode | expectedResult + null | "DE" | null + "0723 413 641" | "DE" | "7234" + "0040 723 413 641" | "DE" | "723" + "+40723413641" | "DE" | "723" + "0040-723-413-641" | "DE" | "723" + "0176 3 0 6 9 6544" | "DE" | "176" + "0203556677" | "DE" | "203" + "0305556677" | "DE" | "30" + "012345678" | "IT" | "0123" + "312345678" | "IT" | "312" + } + def "isNormalizingTried"( number, regionCode, expectedResult) { given: target = new PhoneLibWrapper(number, regionCode) diff --git a/src/test/resources/arealabels/nationallabels/de.json b/src/test/resources/arealabels/nationallabels/de.json index 6ed4c80..2d1baae 100644 --- a/src/test/resources/arealabels/nationallabels/de.json +++ b/src/test/resources/arealabels/nationallabels/de.json @@ -4,6 +4,7 @@ "202": "Wuppertal", "603": "Duisburg", "6041": "Bottrop", - "60412": "XXX" + "60412": "XXX", + "6066": "AAA" } ]