split a large sitemap in django
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
My django app sitemap.py looks like so:
class DetailViewSitemap(Sitemap):
priority = 0.8
changefreq = 'hourly'
def items(self):
objs = MyApp.objects.all().distinct('slug')
return objs
..and my models.py convininetlky defines the a method like so:
@models.permalink
def get_absolute_url(self):
try:
return ('detail', [self.slug])
except:
return None
Everything works fine, but I have now realized that google does not allow more than 50k links in a single sitemaps - and unfortunately I have more than 50k links.
So, my question is how can I split my sitemap so that it generated say successive sitemaps on this app? So, I would like something along the lines of:
http://mywebapp.com/sitemap0.xml
http://mywebapp.com/sitemap1.xml
...
.. if this is possible at all!
django django-models
add a comment |
My django app sitemap.py looks like so:
class DetailViewSitemap(Sitemap):
priority = 0.8
changefreq = 'hourly'
def items(self):
objs = MyApp.objects.all().distinct('slug')
return objs
..and my models.py convininetlky defines the a method like so:
@models.permalink
def get_absolute_url(self):
try:
return ('detail', [self.slug])
except:
return None
Everything works fine, but I have now realized that google does not allow more than 50k links in a single sitemaps - and unfortunately I have more than 50k links.
So, my question is how can I split my sitemap so that it generated say successive sitemaps on this app? So, I would like something along the lines of:
http://mywebapp.com/sitemap0.xml
http://mywebapp.com/sitemap1.xml
...
.. if this is possible at all!
django django-models
add a comment |
My django app sitemap.py looks like so:
class DetailViewSitemap(Sitemap):
priority = 0.8
changefreq = 'hourly'
def items(self):
objs = MyApp.objects.all().distinct('slug')
return objs
..and my models.py convininetlky defines the a method like so:
@models.permalink
def get_absolute_url(self):
try:
return ('detail', [self.slug])
except:
return None
Everything works fine, but I have now realized that google does not allow more than 50k links in a single sitemaps - and unfortunately I have more than 50k links.
So, my question is how can I split my sitemap so that it generated say successive sitemaps on this app? So, I would like something along the lines of:
http://mywebapp.com/sitemap0.xml
http://mywebapp.com/sitemap1.xml
...
.. if this is possible at all!
django django-models
My django app sitemap.py looks like so:
class DetailViewSitemap(Sitemap):
priority = 0.8
changefreq = 'hourly'
def items(self):
objs = MyApp.objects.all().distinct('slug')
return objs
..and my models.py convininetlky defines the a method like so:
@models.permalink
def get_absolute_url(self):
try:
return ('detail', [self.slug])
except:
return None
Everything works fine, but I have now realized that google does not allow more than 50k links in a single sitemaps - and unfortunately I have more than 50k links.
So, my question is how can I split my sitemap so that it generated say successive sitemaps on this app? So, I would like something along the lines of:
http://mywebapp.com/sitemap0.xml
http://mywebapp.com/sitemap1.xml
...
.. if this is possible at all!
django django-models
django django-models
asked Mar 16 '15 at 9:49
AJWAJW
1,71073243
1,71073243
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
One way to solve this problem is to break the large sitemap into a group of smaller sitemaps. For instance I have built a separate sitemap for Articles by the first letter of the title. So there will be a sitemap file for every letter in the alpahabet. If you want to use alpahnumeric characters that will also work but in our case alphabet letters works fine. The Python built-in method ascii_lowercase will return an array of alphabet characters that we can loop to build each sitemaps.
from datetime import date
from string import ascii_lowercase
from django.contrib.sitemaps import Sitemap
from .models import Article
def build_sitemaps():
sitemap = {}
for char in ascii_lowercase:
article_sitemap = ArticleSitemap(letter=char)
sitemap[char] = article_sitemap
return sitemap
class ArticleSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def __init__(self, letter='a'):
self.letter = letter.lower()
super(ArticleSitemap, self).__init__()
def items(self):
today = date.today()
return Article.objects.filter(
status=Article.PUBLISHED,
title__istartswith=self.letter,
).exclude(
publish_date__gt=today,
).order_by('-publish_date')
Below I have also added caching of the sitemaps which is really nice. Then add the sitemaps in the urls.py like so:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
from articles.sitemaps import build_sitemaps
urlpatterns = [
url(r'^sitemap.xml$', cache_page(86400)(sitemaps_views.index), {'sitemaps': build_sitemaps()}),
url(r'^sitemap-(?P<section>.+).xml$', cache_page(86400)(sitemaps_views.sitemap), {'sitemaps': build_sitemaps()},
name='django.contrib.sitemaps.views.sitemap'),
]
If you need more code snippets on how to implement it with Sitemap Index, check this post in my website https://www.ronbeltran.com/2018/11/generating-large-xml-sitemaps-django/
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
|
show 2 more comments
Create an index sitemap and Django will automatically paginate the details sitemap like this:
http://mywebapp.com/sitemap-details.xml
http://mywebapp.com/sitemap-details.xml?page=1
...
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f29073721%2fsplit-a-large-sitemap-in-django%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
One way to solve this problem is to break the large sitemap into a group of smaller sitemaps. For instance I have built a separate sitemap for Articles by the first letter of the title. So there will be a sitemap file for every letter in the alpahabet. If you want to use alpahnumeric characters that will also work but in our case alphabet letters works fine. The Python built-in method ascii_lowercase will return an array of alphabet characters that we can loop to build each sitemaps.
from datetime import date
from string import ascii_lowercase
from django.contrib.sitemaps import Sitemap
from .models import Article
def build_sitemaps():
sitemap = {}
for char in ascii_lowercase:
article_sitemap = ArticleSitemap(letter=char)
sitemap[char] = article_sitemap
return sitemap
class ArticleSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def __init__(self, letter='a'):
self.letter = letter.lower()
super(ArticleSitemap, self).__init__()
def items(self):
today = date.today()
return Article.objects.filter(
status=Article.PUBLISHED,
title__istartswith=self.letter,
).exclude(
publish_date__gt=today,
).order_by('-publish_date')
Below I have also added caching of the sitemaps which is really nice. Then add the sitemaps in the urls.py like so:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
from articles.sitemaps import build_sitemaps
urlpatterns = [
url(r'^sitemap.xml$', cache_page(86400)(sitemaps_views.index), {'sitemaps': build_sitemaps()}),
url(r'^sitemap-(?P<section>.+).xml$', cache_page(86400)(sitemaps_views.sitemap), {'sitemaps': build_sitemaps()},
name='django.contrib.sitemaps.views.sitemap'),
]
If you need more code snippets on how to implement it with Sitemap Index, check this post in my website https://www.ronbeltran.com/2018/11/generating-large-xml-sitemaps-django/
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
|
show 2 more comments
One way to solve this problem is to break the large sitemap into a group of smaller sitemaps. For instance I have built a separate sitemap for Articles by the first letter of the title. So there will be a sitemap file for every letter in the alpahabet. If you want to use alpahnumeric characters that will also work but in our case alphabet letters works fine. The Python built-in method ascii_lowercase will return an array of alphabet characters that we can loop to build each sitemaps.
from datetime import date
from string import ascii_lowercase
from django.contrib.sitemaps import Sitemap
from .models import Article
def build_sitemaps():
sitemap = {}
for char in ascii_lowercase:
article_sitemap = ArticleSitemap(letter=char)
sitemap[char] = article_sitemap
return sitemap
class ArticleSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def __init__(self, letter='a'):
self.letter = letter.lower()
super(ArticleSitemap, self).__init__()
def items(self):
today = date.today()
return Article.objects.filter(
status=Article.PUBLISHED,
title__istartswith=self.letter,
).exclude(
publish_date__gt=today,
).order_by('-publish_date')
Below I have also added caching of the sitemaps which is really nice. Then add the sitemaps in the urls.py like so:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
from articles.sitemaps import build_sitemaps
urlpatterns = [
url(r'^sitemap.xml$', cache_page(86400)(sitemaps_views.index), {'sitemaps': build_sitemaps()}),
url(r'^sitemap-(?P<section>.+).xml$', cache_page(86400)(sitemaps_views.sitemap), {'sitemaps': build_sitemaps()},
name='django.contrib.sitemaps.views.sitemap'),
]
If you need more code snippets on how to implement it with Sitemap Index, check this post in my website https://www.ronbeltran.com/2018/11/generating-large-xml-sitemaps-django/
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
|
show 2 more comments
One way to solve this problem is to break the large sitemap into a group of smaller sitemaps. For instance I have built a separate sitemap for Articles by the first letter of the title. So there will be a sitemap file for every letter in the alpahabet. If you want to use alpahnumeric characters that will also work but in our case alphabet letters works fine. The Python built-in method ascii_lowercase will return an array of alphabet characters that we can loop to build each sitemaps.
from datetime import date
from string import ascii_lowercase
from django.contrib.sitemaps import Sitemap
from .models import Article
def build_sitemaps():
sitemap = {}
for char in ascii_lowercase:
article_sitemap = ArticleSitemap(letter=char)
sitemap[char] = article_sitemap
return sitemap
class ArticleSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def __init__(self, letter='a'):
self.letter = letter.lower()
super(ArticleSitemap, self).__init__()
def items(self):
today = date.today()
return Article.objects.filter(
status=Article.PUBLISHED,
title__istartswith=self.letter,
).exclude(
publish_date__gt=today,
).order_by('-publish_date')
Below I have also added caching of the sitemaps which is really nice. Then add the sitemaps in the urls.py like so:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
from articles.sitemaps import build_sitemaps
urlpatterns = [
url(r'^sitemap.xml$', cache_page(86400)(sitemaps_views.index), {'sitemaps': build_sitemaps()}),
url(r'^sitemap-(?P<section>.+).xml$', cache_page(86400)(sitemaps_views.sitemap), {'sitemaps': build_sitemaps()},
name='django.contrib.sitemaps.views.sitemap'),
]
If you need more code snippets on how to implement it with Sitemap Index, check this post in my website https://www.ronbeltran.com/2018/11/generating-large-xml-sitemaps-django/
One way to solve this problem is to break the large sitemap into a group of smaller sitemaps. For instance I have built a separate sitemap for Articles by the first letter of the title. So there will be a sitemap file for every letter in the alpahabet. If you want to use alpahnumeric characters that will also work but in our case alphabet letters works fine. The Python built-in method ascii_lowercase will return an array of alphabet characters that we can loop to build each sitemaps.
from datetime import date
from string import ascii_lowercase
from django.contrib.sitemaps import Sitemap
from .models import Article
def build_sitemaps():
sitemap = {}
for char in ascii_lowercase:
article_sitemap = ArticleSitemap(letter=char)
sitemap[char] = article_sitemap
return sitemap
class ArticleSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def __init__(self, letter='a'):
self.letter = letter.lower()
super(ArticleSitemap, self).__init__()
def items(self):
today = date.today()
return Article.objects.filter(
status=Article.PUBLISHED,
title__istartswith=self.letter,
).exclude(
publish_date__gt=today,
).order_by('-publish_date')
Below I have also added caching of the sitemaps which is really nice. Then add the sitemaps in the urls.py like so:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
from articles.sitemaps import build_sitemaps
urlpatterns = [
url(r'^sitemap.xml$', cache_page(86400)(sitemaps_views.index), {'sitemaps': build_sitemaps()}),
url(r'^sitemap-(?P<section>.+).xml$', cache_page(86400)(sitemaps_views.sitemap), {'sitemaps': build_sitemaps()},
name='django.contrib.sitemaps.views.sitemap'),
]
If you need more code snippets on how to implement it with Sitemap Index, check this post in my website https://www.ronbeltran.com/2018/11/generating-large-xml-sitemaps-django/
edited Nov 16 '18 at 18:54
K.Dᴀᴠɪs
7,290112440
7,290112440
answered Nov 16 '18 at 13:08
Ronnie BeltranRonnie Beltran
3891520
3891520
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
|
show 2 more comments
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
1
1
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
A link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it’s there, then quote the most relevant part of the page you're linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
– Zoe
Nov 16 '18 at 13:10
1
1
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
Also, you need to add disclosure when linking your own website. See how not to be a spammer
– Zoe
Nov 16 '18 at 13:11
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
// , This is definitely not spam, since the content of his link is DIRECTLY RELATED to the question. We need a how to stop robo-flagging link or something, I guess.
– Nathan Basanese
Nov 16 '18 at 18:44
1
1
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
@NathanBasanese whether it's directly related or not, if you post a link to your own site, that post could be considered spam. Because it's relevant I flagged as NAA, not spam. Link-only rules apply either way
– Zoe
Nov 16 '18 at 18:49
1
1
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
@NathanBasanese It is spam when you do not disclose that it's your website before having users redirect there. I think that you forgot to read the link Zoe wrote where it states "...However, you must disclose your affiliation in your answers"
– K.Dᴀᴠɪs
Nov 16 '18 at 18:51
|
show 2 more comments
Create an index sitemap and Django will automatically paginate the details sitemap like this:
http://mywebapp.com/sitemap-details.xml
http://mywebapp.com/sitemap-details.xml?page=1
...
add a comment |
Create an index sitemap and Django will automatically paginate the details sitemap like this:
http://mywebapp.com/sitemap-details.xml
http://mywebapp.com/sitemap-details.xml?page=1
...
add a comment |
Create an index sitemap and Django will automatically paginate the details sitemap like this:
http://mywebapp.com/sitemap-details.xml
http://mywebapp.com/sitemap-details.xml?page=1
...
Create an index sitemap and Django will automatically paginate the details sitemap like this:
http://mywebapp.com/sitemap-details.xml
http://mywebapp.com/sitemap-details.xml?page=1
...
answered Mar 16 '15 at 10:17
catavarancatavaran
33.1k65062
33.1k65062
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f29073721%2fsplit-a-large-sitemap-in-django%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown