AWS CodeDeploy ile Otomatik Dağıtım: Adım Adım Rehber
Uygulamalarını her deploy ettiğinde SSH ile sunucuya bağlanıp manuel komutlar mı çalıştırıyorsun? Geceleri deployment yapıp bir şeyler bozulunca saatler mi harcıyorsun? AWS CodeDeploy tam da bu derdi çözmek için var. Bugün sıfırdan kurulum yapıp gerçek dünya senaryolarını ele alacağız.
AWS CodeDeploy Nedir ve Neden Kullanmalısın?
CodeDeploy, AWS’nin tam yönetilen deployment servisidir. EC2 instance’larına, on-premise sunuculara, Lambda fonksiyonlarına ve ECS üzerine otomatik kod deployment yapmanı sağlar. Ancak asıl gücü şurada: deployment stratejileri. Rolling update, blue/green deployment gibi stratejilerle production ortamına sıfır kesinti ile uygulama gönderebilirsin.
Manuel deployment’ın en büyük sorunu tutarsızlık. Bir sunucuya deployment yaparken ağ koptu, diğer sunucular eski versiyonda kaldı, trafiğin bir kısmı eski versiyona düşüyor. CodeDeploy bu kaos ortamını ortadan kaldırır ve her şeyi merkezi, tekrarlanabilir ve denetlenebilir hale getirir.
Temel Kavramlar
CodeDeploy’u kullanmadan önce birkaç kavramı kafana oturtman gerekiyor:
- Application: CodeDeploy içindeki en üst seviye kaynak. Deploy edeceğin uygulamayı temsil eder.
- Deployment Group: Hangi instance’lara deploy yapacağını belirler. Tag’lere veya Auto Scaling Group’lara göre gruplandırabilirsin.
- Deployment Configuration: Rolling update oranını, başarı eşiğini belirler. AllAtOnce, HalfAtATime, OneAtATime gibi hazır konfigürasyonlar var.
- AppSpec: Deployment adımlarını tanımlayan YAML veya JSON dosyası. Bu dosya olmadan hiçbir şey çalışmaz.
- Revision: Deploy etmek istediğin kod paketi. S3’te veya GitHub’da olabilir.
Kurulum ve Ön Gereksinimler
IAM Rolleri Oluşturma
CodeDeploy’un çalışabilmesi için iki ayrı IAM rolü gerekir: biri CodeDeploy servisinin EC2’ye erişmesi için, diğeri EC2 instance’ının S3’ten paketi çekebilmesi için.
Önce CodeDeploy servis rolünü oluşturalım:
# CodeDeploy servis rolü için trust policy dosyası oluştur
cat > codedeploy-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "codedeploy.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# Rolü oluştur
aws iam create-role
--role-name CodeDeployServiceRole
--assume-role-policy-document file://codedeploy-trust-policy.json
# AWS yönetilen policy'yi ekle
aws iam attach-role-policy
--role-name CodeDeployServiceRole
--policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole
Şimdi EC2 instance rolünü oluşturalım:
# EC2 için trust policy
cat > ec2-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# EC2 rolünü oluştur
aws iam create-role
--role-name EC2CodeDeployRole
--assume-role-policy-document file://ec2-trust-policy.json
# S3 okuma yetkisi ver
aws iam attach-role-policy
--role-name EC2CodeDeployRole
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
# Instance profile oluştur ve role ekle
aws iam create-instance-profile
--instance-profile-name EC2CodeDeployProfile
aws iam add-role-to-instance-profile
--instance-profile-name EC2CodeDeployProfile
--role-name EC2CodeDeployRole
CodeDeploy Agent Kurulumu
EC2 instance’larına CodeDeploy Agent kurman şart. Agent olmadan deployment çalışmaz. Amazon Linux 2 üzerinde kurulum şöyle yapılır:
# Sistemi güncelle
sudo yum update -y
# CodeDeploy agent için gerekli paketleri yükle
sudo yum install -y ruby wget
# Agent kurulum scriptini indir
cd /home/ec2-user
wget https://aws-codedeploy-eu-west-1.s3.eu-west-1.amazonaws.com/latest/install
# Çalıştırma izni ver ve kur
chmod +x ./install
sudo ./install auto
# Servisi başlat ve etkinleştir
sudo systemctl start codedeploy-agent
sudo systemctl enable codedeploy-agent
# Durumu kontrol et
sudo systemctl status codedeploy-agent
Ubuntu/Debian sistemler için ise şöyle yapabilirsin:
sudo apt-get update
sudo apt-get install -y ruby wget
cd /home/ubuntu
wget https://aws-codedeploy-eu-west-1.s3.eu-west-1.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent start
EC2 Instance Etiketleme
CodeDeploy hangi sunuculara deploy yapacağını tag’lere göre belirler. Bu yüzden instance’larını düzgün etiketlemen kritik:
# Instance'ına tag ekle
aws ec2 create-tags
--resources i-0123456789abcdef0
--tags Key=Environment,Value=Production Key=Application,Value=MyWebApp
# Tag'leri doğrula
aws ec2 describe-tags
--filters "Name=resource-id,Values=i-0123456789abcdef0"
AppSpec Dosyası Hazırlama
AppSpec dosyası, deployment sürecinin tam merkezi. Hangi dosyaların nereye kopyalanacağını ve her aşamada hangi scriptlerin çalışacağını burada tanımlıyorsun.
# appspec.yml
version: 0.0
os: linux
files:
- source: /app
destination: /var/www/myapp
- source: /config/nginx.conf
destination: /etc/nginx/conf.d/myapp.conf
permissions:
- object: /var/www/myapp
owner: www-data
group: www-data
mode: "755"
type:
- directory
- object: /var/www/myapp
owner: www-data
group: www-data
mode: "644"
type:
- file
hooks:
BeforeInstall:
- location: scripts/stop_server.sh
timeout: 30
runas: root
AfterInstall:
- location: scripts/install_dependencies.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start_server.sh
timeout: 30
runas: root
ValidateService:
- location: scripts/validate_service.sh
timeout: 60
runas: root
Hook scriptlerini de hazırlaman lazım:
# scripts/stop_server.sh
#!/bin/bash
set -e
echo "Uygulama durduruluyor..."
if systemctl is-active --quiet myapp; then
systemctl stop myapp
echo "Uygulama durduruldu"
else
echo "Uygulama zaten durumda, devam ediliyor"
fi
# Nginx'i de durdur
if systemctl is-active --quiet nginx; then
systemctl stop nginx
fi
exit 0
# scripts/validate_service.sh
#!/bin/bash
set -e
echo "Servis dogrulanıyor..."
# Uygulamanın ayağa kalkması için bekle
sleep 5
# HTTP kontrolü yap
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health)
if [ "$RESPONSE" = "200" ]; then
echo "Servis basariyla calisiyor. HTTP 200 alindi."
exit 0
else
echo "HATA: Servis yanit vermiyor. HTTP kodu: $RESPONSE"
exit 1
fi
CodeDeploy Application ve Deployment Group Oluşturma
AWS CLI ile her şeyi otomatize edebilirsin:
# Application oluştur
aws deploy create-application
--application-name MyWebApp
--compute-platform Server
--region eu-west-1
# Deployment Group oluştur
aws deploy create-deployment-group
--application-name MyWebApp
--deployment-group-name ProductionGroup
--deployment-config-name CodeDeployDefault.HalfAtATime
--ec2-tag-filters Key=Application,Value=MyWebApp,Type=KEY_AND_VALUE
Key=Environment,Value=Production,Type=KEY_AND_VALUE
--service-role-arn arn:aws:iam::123456789012:role/CodeDeployServiceRole
--auto-rollback-configuration enabled=true,events=DEPLOYMENT_FAILURE
--region eu-west-1
–deployment-config-name parametresi önemli. Hazır seçenekler şunlar:
- CodeDeployDefault.AllAtOnce: Tüm instance’lara aynı anda deploy yapar. Hızlıdır ama risklidir.
- CodeDeployDefault.HalfAtATime: Instance’ların yarısına deploy yapar, başarılı olursa diğer yarısına geçer.
- CodeDeployDefault.OneAtATime: Sırayla tek tek deploy yapar. En güvenlisi ama en yavaşı.
Deployment Paketi Hazırlama ve S3’e Yükleme
Deployment paketi, appspec.yml ve uygulama dosyalarını içeren sıkıştırılmış dosyadır:
# Proje yapısı şöyle olmalı:
# myapp/
# ├── appspec.yml
# ├── app/
# │ ├── index.html
# │ └── app.js
# ├── config/
# │ └── nginx.conf
# └── scripts/
# ├── stop_server.sh
# ├── install_dependencies.sh
# ├── start_server.sh
# └── validate_service.sh
# Paketi oluştur
cd myapp
zip -r ../myapp-v1.2.0.zip . -x "*.git*"
# S3'e yükle
aws s3 cp ../myapp-v1.2.0.zip
s3://my-deployment-bucket/releases/myapp-v1.2.0.zip
--region eu-west-1
# Deployment başlat
aws deploy create-deployment
--application-name MyWebApp
--deployment-group-name ProductionGroup
--s3-location bucket=my-deployment-bucket,bundleType=zip,key=releases/myapp-v1.2.0.zip
--description "v1.2.0 release - yeni ozellikler eklendi"
--region eu-west-1
Gerçek Dünya Senaryosu: CI/CD Pipeline’a Entegrasyon
Pratikte CodeDeploy’u hiç kimse tek başına kullanmaz. GitHub Actions veya Jenkins ile birlikte kullanmak asıl gücü ortaya çıkarır.
Bir GitHub Actions workflow’u şöyle görünebilir:
# .github/workflows/deploy.yml
name: Production Deployment
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kodu cek
uses: actions/checkout@v3
- name: AWS kimlik bilgilerini ayarla
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-west-1
- name: Node.js bagimliliklerini yukle ve test et
run: |
npm install
npm test
- name: Deployment paketini olustur
run: |
VERSION=$(git rev-parse --short HEAD)
zip -r deploy-${VERSION}.zip .
-x "*.git*"
-x "node_modules/*"
-x "*.test.js"
echo "DEPLOY_VERSION=${VERSION}" >> $GITHUB_ENV
- name: S3'e yukle
run: |
aws s3 cp deploy-${DEPLOY_VERSION}.zip
s3://my-deployment-bucket/releases/deploy-${DEPLOY_VERSION}.zip
- name: CodeDeploy deployment baslatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlat
