# Copyright (C) 2011 The Libphonenumber Authors

# 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.

# Generated from:
# http://www.itu.int/oth/T020200005C/en

245320|Bissau
245321|Bissau
245322|Sta. Luzia
245325|Brá
245331|Mansôa
245332|Bigene/Bissorã
245334|Mansaba
245335|Farim
245341|Bafatá
245342|Bambadinca
245351|Gabú
245352|Sonaco
245353|Pirada
245354|Pitche
245370|Buba
245391|Canchungo
245392|Cacheu
245393|S. Domingos
245394|Bula
245396|Ingoré
